diff options
Diffstat (limited to 'SD-VBS/common')
752 files changed, 48920 insertions, 0 deletions
diff --git a/SD-VBS/common/c/calcSobel_dX.c b/SD-VBS/common/c/calcSobel_dX.c new file mode 100644 index 0000000..4be5845 --- /dev/null +++ b/SD-VBS/common/c/calcSobel_dX.c | |||
@@ -0,0 +1,77 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include <stdio.h> | ||
6 | #include <stdlib.h> | ||
7 | #include "sdvbs_common.h" | ||
8 | |||
9 | F2D* calcSobel_dX(F2D* imageIn) | ||
10 | { | ||
11 | int rows, cols; | ||
12 | F2D *kernel_1, *kernel_2; | ||
13 | float temp; | ||
14 | int kernelSize, startCol, endCol, halfKernel, startRow, endRow, i, j, kernelSum; | ||
15 | int k, kernelSum_1, kernelSum_2; | ||
16 | F2D *imageOut, *tempOut; | ||
17 | |||
18 | rows = imageIn->height; | ||
19 | cols = imageIn->width; | ||
20 | |||
21 | imageOut = fSetArray(rows, cols, 0); | ||
22 | tempOut = fSetArray(rows, cols, 0); | ||
23 | kernel_1 = fMallocHandle(1, 3); | ||
24 | kernel_2 = fMallocHandle(1, 3); | ||
25 | |||
26 | asubsref(kernel_1,0) = 1; | ||
27 | asubsref(kernel_1,1) = 2; | ||
28 | asubsref(kernel_1,2) = 1; | ||
29 | |||
30 | kernelSize = 3; | ||
31 | kernelSum_1 = 4; | ||
32 | |||
33 | asubsref(kernel_2,0) = 1; | ||
34 | asubsref(kernel_2,1) = 0; | ||
35 | asubsref(kernel_2,2) = -1; | ||
36 | |||
37 | kernelSum_2 = 2; | ||
38 | |||
39 | startCol = 1; | ||
40 | endCol = cols - 1; | ||
41 | halfKernel = 1; | ||
42 | |||
43 | startRow = 1; | ||
44 | endRow = rows - 1; | ||
45 | |||
46 | for(i=startRow; i<endRow; i++) | ||
47 | { | ||
48 | for(j=startCol; j<endCol; j++) | ||
49 | { | ||
50 | temp = 0; | ||
51 | for(k=-halfKernel; k<=halfKernel; k++) | ||
52 | { | ||
53 | temp += subsref(imageIn,i,j+k) * asubsref(kernel_2,k+halfKernel); | ||
54 | } | ||
55 | subsref(tempOut,i,j) = temp/kernelSum_2; | ||
56 | } | ||
57 | } | ||
58 | |||
59 | for(i=startRow; i<endRow; i++) | ||
60 | { | ||
61 | for(j=startCol; j<endCol; j++) | ||
62 | { | ||
63 | temp = 0; | ||
64 | for(k=-halfKernel; k<=halfKernel; k++) | ||
65 | { | ||
66 | temp += subsref(tempOut,(i+k),j) * asubsref(kernel_1,k+halfKernel); | ||
67 | } | ||
68 | subsref(imageOut,i,j) = temp/(float)kernelSum_1; | ||
69 | } | ||
70 | } | ||
71 | |||
72 | fFreeHandle(tempOut); | ||
73 | fFreeHandle(kernel_1); | ||
74 | fFreeHandle(kernel_2); | ||
75 | return imageOut; | ||
76 | |||
77 | } | ||
diff --git a/SD-VBS/common/c/calcSobel_dY.c b/SD-VBS/common/c/calcSobel_dY.c new file mode 100644 index 0000000..d2ed379 --- /dev/null +++ b/SD-VBS/common/c/calcSobel_dY.c | |||
@@ -0,0 +1,79 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | F2D* calcSobel_dY(F2D* imageIn) | ||
8 | { | ||
9 | int rows, cols; | ||
10 | I2D *kernel_1, *kernel_2; | ||
11 | float temp; | ||
12 | int kernelSize, startCol, endCol, halfKernel, startRow, endRow, i, j, kernelSum; | ||
13 | int k, kernelSum_2, outputRows, outputCols; | ||
14 | F2D *imageOut, *tempOut; | ||
15 | float kernelSum_1; | ||
16 | |||
17 | rows = imageIn->height; | ||
18 | cols = imageIn->width; | ||
19 | |||
20 | // level 1 is the base image. | ||
21 | |||
22 | outputRows = rows; | ||
23 | outputCols = cols; | ||
24 | |||
25 | imageOut = fSetArray(outputRows, outputCols, 0); | ||
26 | tempOut = fSetArray(outputRows, outputCols, 0); | ||
27 | kernel_1 = iMallocHandle(1, 3); | ||
28 | kernel_2 = iMallocHandle(1, 3); | ||
29 | |||
30 | asubsref(kernel_1,0) = 1; | ||
31 | asubsref(kernel_1,1) = 0; | ||
32 | asubsref(kernel_1,2) = -1; | ||
33 | kernelSize = 3; | ||
34 | kernelSum_1 = 2.0; | ||
35 | |||
36 | asubsref(kernel_2,0) = 1; | ||
37 | asubsref(kernel_2,1) = 2; | ||
38 | asubsref(kernel_2,2) = 1; | ||
39 | kernelSum_2 = 4; | ||
40 | |||
41 | startCol = 1; | ||
42 | endCol = cols - 1; | ||
43 | halfKernel = 1; | ||
44 | |||
45 | startRow = 1; | ||
46 | endRow = rows - 1; | ||
47 | |||
48 | for(i=startRow; i<endRow; i++) | ||
49 | { | ||
50 | for(j=startCol; j<endCol; j++) | ||
51 | { | ||
52 | temp = 0; | ||
53 | for(k=-halfKernel; k<=halfKernel; k++) | ||
54 | { | ||
55 | temp += subsref(imageIn,(i+k),j) * asubsref(kernel_1,k+halfKernel); | ||
56 | } | ||
57 | subsref(tempOut,i,j) = temp/kernelSum_1; | ||
58 | } | ||
59 | } | ||
60 | |||
61 | for(i=startRow; i<endRow; i++) | ||
62 | { | ||
63 | for(j=startCol; j<endCol; j++) | ||
64 | { | ||
65 | temp = 0; | ||
66 | for(k=-halfKernel; k<=halfKernel; k++) | ||
67 | { | ||
68 | temp += subsref(tempOut,i,j+k) * asubsref(kernel_2,k+halfKernel); | ||
69 | } | ||
70 | subsref(imageOut,i,j) = temp/(float)kernelSum_2; | ||
71 | } | ||
72 | } | ||
73 | |||
74 | fFreeHandle(tempOut); | ||
75 | iFreeHandle(kernel_1); | ||
76 | iFreeHandle(kernel_2); | ||
77 | return imageOut; | ||
78 | |||
79 | } | ||
diff --git a/SD-VBS/common/c/extra.h b/SD-VBS/common/c/extra.h new file mode 100644 index 0000000..8c67b33 --- /dev/null +++ b/SD-VBS/common/c/extra.h | |||
@@ -0,0 +1,479 @@ | |||
1 | /** | ||
2 | * Copyright 2019 Sims Hill Osborne and 2020 Joshua Bakita | ||
3 | * | ||
4 | * This header provides facilities by which to separably run and time TACLeBench | ||
5 | * To use this for paired task timing, define PAIRED (pass CFLAGS=-DPAIRED to make) | ||
6 | **/ | ||
7 | #define _GNU_SOURCE | ||
8 | #include <fcntl.h> // For O_CREAT and O_RDWR | ||
9 | #include <sched.h> // For sched_yield() | ||
10 | #include <semaphore.h> // For sem_{open, post, wait}() | ||
11 | #include <stdio.h> | ||
12 | #include <stdlib.h> // For exit() | ||
13 | #include <string.h> // For strlen() | ||
14 | #include <sys/mman.h> // For mlockall() | ||
15 | #include <unistd.h> // For ftruncate() | ||
16 | #include <time.h> | ||
17 | |||
18 | // This is only visible if _GNU_SOURCE is defined, and that define does not | ||
19 | // come along to places where this file is included. Address this by manually | ||
20 | // forcing it into the global namespace. | ||
21 | extern int sched_getcpu(); | ||
22 | |||
23 | // These constants correspond to the imx6q-sabredb platform | ||
24 | #define LINE_SIZE 32 | ||
25 | #define L2_SIZE 16*2048*32 | ||
26 | |||
27 | #if __arm__ | ||
28 | #include <unistd.h> | ||
29 | #include <sys/syscall.h> | ||
30 | #endif | ||
31 | |||
32 | #define LITMUS 1 | ||
33 | #define MC2 0 | ||
34 | #define MMDC_PROF 0 | ||
35 | |||
36 | #if LITMUS | ||
37 | #include <litmus.h> | ||
38 | #endif | ||
39 | |||
40 | #if MMDC_PROF | ||
41 | #include "/media/speedy/litmus/tools/mmdc/mmdc.h" | ||
42 | #endif | ||
43 | |||
44 | #if LITMUS | ||
45 | #define SET_UP LOAD_PARAMS SETUP_LITMUS | ||
46 | #else | ||
47 | #define SET_UP LOAD_PARAMS | ||
48 | #endif | ||
49 | |||
50 | #if MMDC_PROF | ||
51 | #define LOAD_PARAMS LOAD_PARAMS_ITRL SETUP_MMDC | ||
52 | #else | ||
53 | #define LOAD_PARAMS LOAD_PARAMS_ITRL | ||
54 | #endif | ||
55 | |||
56 | // Store state globally so that the job can be outside main() | ||
57 | // Arrays use float as a comprimise between overflow and size | ||
58 | // Paired arrays use long longs as precision is more important for those times | ||
59 | #ifdef PAIRED | ||
60 | long long *_rt_start_time; | ||
61 | long long *_rt_end_time; | ||
62 | #else | ||
63 | float *_rt_exec_time; | ||
64 | #endif | ||
65 | #if MMDC_PERF | ||
66 | float *_rt_mmdc_read; | ||
67 | float *_rt_mmdc_write; | ||
68 | #endif | ||
69 | long _rt_jobs_complete; | ||
70 | long _rt_max_jobs; | ||
71 | int _rt_core; | ||
72 | int _rt_will_output; | ||
73 | struct timespec _rt_start, _rt_end; | ||
74 | |||
75 | char *_rt_run_id; | ||
76 | char *_rt_our_prog_name; | ||
77 | char *_rt_other_prog_name; | ||
78 | char *_rt_other_core; | ||
79 | #define _RT_FILENAME_LEN 64 | ||
80 | #define _BILLION (1000*1000*1000) | ||
81 | #ifdef PAIRED | ||
82 | char *_rt_barrier; | ||
83 | sem_t *_rt_first_sem, *_rt_second_sem; | ||
84 | int _rt_lock_id; | ||
85 | #endif | ||
86 | |||
87 | static void _rt_load_params_itrl(int argc, char **argv) { | ||
88 | #ifdef PAIRED | ||
89 | if (argc != 8) { | ||
90 | fprintf(stderr, "Usage: %s <name> <loops> <my core> <other core> <other name> <runID> <lockID>", argv[0]); | ||
91 | fprintf(stderr, " <name> string for logging. Name of this task.\n"); | ||
92 | fprintf(stderr, " <loops> integer number of iterations. -1 for infinite.\n"); | ||
93 | fprintf(stderr, " <my core> UNUSED. Core is now auto-detected.\n"); | ||
94 | fprintf(stderr, " <other core> integer for logging. Core of paired task.\n"); | ||
95 | fprintf(stderr, " <other name> string for logging. Name of paired task.\n"); | ||
96 | fprintf(stderr, " <runID> string to append with .txt to yield output file name.\n"); | ||
97 | fprintf(stderr, " <lockID> 1 to indicate this is pair member 1, otherwise pair member 2.\n"); | ||
98 | exit(1); | ||
99 | } | ||
100 | #else | ||
101 | if (argc != 6) { | ||
102 | fprintf(stderr, "Usage: %s <name> <loops> <my core> <runID> <save results?>\n", argv[0]); | ||
103 | fprintf(stderr, " <name> string for logging. Name of this task.\n"); | ||
104 | fprintf(stderr, " <loops> integer number of iterations. -1 for infinite.\n"); | ||
105 | fprintf(stderr, " <my core> UNUSED. Core is now auto-detected.\n"); | ||
106 | fprintf(stderr, " <runID> string to append with .txt to yield output file name.\n"); | ||
107 | fprintf(stderr, " <save results?> 1 to save results, 0 to discard.\n"); | ||
108 | exit(1); | ||
109 | } | ||
110 | #endif | ||
111 | _rt_our_prog_name = argv[1]; | ||
112 | _rt_max_jobs = atol(argv[2]); | ||
113 | _rt_core = sched_getcpu(); | ||
114 | #ifdef PAIRED | ||
115 | _rt_other_core = argv[4]; | ||
116 | _rt_other_prog_name = argv[5]; | ||
117 | _rt_run_id = argv[6]; | ||
118 | _rt_lock_id = atoi(argv[7]); | ||
119 | // The paired version doesn't support disabling output (legacy compatibility) | ||
120 | _rt_will_output = 1; | ||
121 | #else | ||
122 | _rt_other_core = "none"; | ||
123 | _rt_other_prog_name = "none"; | ||
124 | _rt_run_id = argv[4]; | ||
125 | _rt_will_output = atoi(argv[5]); | ||
126 | #endif /* PAIRED */ | ||
127 | if (_rt_max_jobs < 0 && _rt_will_output != 0) { | ||
128 | fprintf(stderr, "Infinite loops only supported when _rt_will_output is disabled!\n"); | ||
129 | exit(1); | ||
130 | } | ||
131 | if (strlen(_rt_run_id) + 5 > _RT_FILENAME_LEN) { | ||
132 | fprintf(stderr, "Run ID is too large! Keep it to less than %d characters.\n", _RT_FILENAME_LEN); | ||
133 | exit(1); | ||
134 | } | ||
135 | #ifdef PAIRED | ||
136 | _rt_start_time = calloc(_rt_max_jobs * _rt_will_output, sizeof(long long)); | ||
137 | _rt_end_time = calloc(_rt_max_jobs * _rt_will_output, sizeof(long long)); | ||
138 | if (!_rt_end_time || !_rt_start_time) { | ||
139 | perror("Unable to allocate buffers for execution times"); | ||
140 | exit(1); | ||
141 | } | ||
142 | _rt_first_sem = sem_open("/_libextra_first_sem", O_CREAT, 644, 0); | ||
143 | _rt_second_sem = sem_open("/_libextra_second_sem", O_CREAT, 644, 0); | ||
144 | if (_rt_first_sem == SEM_FAILED || _rt_second_sem == SEM_FAILED) { | ||
145 | perror("Error while creating semaphores"); | ||
146 | exit(1); | ||
147 | } | ||
148 | int barrier_file = shm_open("/_libextra_barrier", O_CREAT | O_RDWR, 644); | ||
149 | if (barrier_file == -1) { | ||
150 | perror("Error while creating shared memory for barrier synchronization"); | ||
151 | exit(1); | ||
152 | } | ||
153 | if (ftruncate(barrier_file, 1) == -1) { | ||
154 | perror("Error while setting size of shared memory for barrier synchronization"); | ||
155 | exit(1); | ||
156 | } | ||
157 | _rt_barrier = mmap(NULL, 1, PROT_WRITE, MAP_SHARED, barrier_file, 0); | ||
158 | if (_rt_barrier == MAP_FAILED) { | ||
159 | perror("Error while mapping shared memory for barrier synchronization"); | ||
160 | exit(1); | ||
161 | } | ||
162 | *_rt_barrier = 0; | ||
163 | #else | ||
164 | _rt_exec_time = calloc(_rt_max_jobs * _rt_will_output, sizeof(float)); | ||
165 | if (!_rt_exec_time) { | ||
166 | perror("Unable to allocate buffer for execution times"); | ||
167 | exit(1); | ||
168 | } | ||
169 | #endif /* PAIRED */ | ||
170 | _rt_jobs_complete = 0; | ||
171 | mlockall(MCL_CURRENT || MCL_FUTURE); | ||
172 | } | ||
173 | #define LOAD_PARAMS_ITRL _rt_load_params_itrl(argc, argv); | ||
174 | |||
175 | #define SETUP_MMDC \ | ||
176 | _rt_mmdc_read = calloc(_rt_max_jobs * _rt_will_output, sizeof(float));\ | ||
177 | _rt_mmdc_write = calloc(_rt_max_jobs * _rt_will_output, sizeof(float));\ | ||
178 | if (!_rt_mmdc_read || !_rt_mmdc_write) {\ | ||
179 | perror("Unable to allocate buffer for MMDC data");\ | ||
180 | exit(1);\ | ||
181 | }\ | ||
182 | MMDC_PROFILE_RES_t mmdc_res;\ | ||
183 | memset(&mmdc_res, 0, sizeof(MMDC_PROFILE_RES_t));\ | ||
184 | int fd = open("/dev/mem", O_RDWR, 0);\ | ||
185 | if (fd < 0) {\ | ||
186 | perror("Unable to open /dev/mem");\ | ||
187 | exit(1);\ | ||
188 | }\ | ||
189 | pMMDC_t mmdc = mmap(NULL, 0x4000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, MMDC_P0_IPS_BASE_ADDR);\ | ||
190 | if (mmdc == MAP_FAILED) {\ | ||
191 | perror("Unable to map MMDC address space");\ | ||
192 | exit(1);\ | ||
193 | }\ | ||
194 | mmdc->madpcr1 = axi_arm1;\ | ||
195 | msync(&(mmdc->madpcr1),4,MS_SYNC); | ||
196 | |||
197 | #define SETUP_LITMUS \ | ||
198 | unsigned int wait = 0; \ | ||
199 | if (be_migrate_to_domain(_rt_core) < 0) { \ | ||
200 | perror("Unable to migrate to specified CPU"); \ | ||
201 | exit(1); \ | ||
202 | } \ | ||
203 | struct rt_task rt_param; \ | ||
204 | init_rt_task_param(&rt_param); \ | ||
205 | /* Supposedly the next two parameters are irrelevant when reservations are enabled, but I'm leaving them anyway... */ \ | ||
206 | rt_param.exec_cost = ms2ns(999); \ | ||
207 | rt_param.period = ms2ns(1000); \ | ||
208 | rt_param.priority = LITMUS_HIGHEST_PRIORITY; \ | ||
209 | rt_param.cls = RT_CLASS_HARD; \ | ||
210 | rt_param.release_policy = TASK_PERIODIC; \ | ||
211 | rt_param.budget_policy = NO_ENFORCEMENT; \ | ||
212 | rt_param.cpu = _rt_core; \ | ||
213 | if (set_rt_task_param(gettid(), &rt_param) < 0) { \ | ||
214 | perror("Unable to set real-time parameters"); \ | ||
215 | exit(1); \ | ||
216 | } \ | ||
217 | if (init_litmus() != 0) { \ | ||
218 | perror("init_litmus failed"); \ | ||
219 | exit(1); \ | ||
220 | } \ | ||
221 | MC2_SETUP \ | ||
222 | if (task_mode(LITMUS_RT_TASK) != 0) { \ | ||
223 | perror("Unable to become real-time task"); \ | ||
224 | exit(1); \ | ||
225 | } \ | ||
226 | if (wait && wait_for_ts_release() != 0) { \ | ||
227 | perror("Unable to wait for taskset release"); \ | ||
228 | exit(1); \ | ||
229 | } | ||
230 | |||
231 | #if MC2 | ||
232 | #define MC2_SETUP \ | ||
233 | |||
234 | set_page_color(rt_param.cpu); | ||
235 | #else | ||
236 | #define MC2_SETUP | ||
237 | #endif | ||
238 | |||
239 | #define CLEANUP_LITMUS \ | ||
240 | if (task_mode(BACKGROUND_TASK) != 0) { \ | ||
241 | perror("Unable to become a real-time task"); \ | ||
242 | exit(1); \ | ||
243 | } \ | ||
244 | |||
245 | #if __arm__ | ||
246 | // On ARM, manually flush the cache | ||
247 | #define FLUSH_CACHES \ | ||
248 | volatile uint8_t buffer[L2_SIZE * 4]; \ | ||
249 | for (uint32_t j = 0; j < 4; j++) \ | ||
250 | for (uint32_t i = 0; i < L2_SIZE * 4; i += LINE_SIZE) \ | ||
251 | buffer[i]++; | ||
252 | #else | ||
253 | // On x86 call the wbinvld instruction (it's in a kernel module due to it being ring-0) | ||
254 | #define FLUSH_CACHES \ | ||
255 | FILE *fp = fopen("/proc/wbinvd", "r");\ | ||
256 | if (fp == NULL) {\ | ||
257 | perror("Cache flush module interface cannot be opened");\ | ||
258 | exit(1);\ | ||
259 | }\ | ||
260 | char dummy;\ | ||
261 | if (fread(&dummy, 1, 1, fp) == 0) {\ | ||
262 | perror("Unable to access cache flush module interface");\ | ||
263 | exit(1);\ | ||
264 | }\ | ||
265 | fclose(fp); | ||
266 | #endif | ||
267 | |||
268 | // This semaphore-based synchronization is from Sims | ||
269 | #define FIRST_UNLOCK \ | ||
270 | if (_rt_lock_id == 1) {\ | ||
271 | if (sem_post(_rt_second_sem) != 0) {\ | ||
272 | perror("Unable to unlock second semaphore");\ | ||
273 | exit(1);\ | ||
274 | }\ | ||
275 | } \ | ||
276 | else {\ | ||
277 | if (sem_post(_rt_first_sem) != 0) {\ | ||
278 | perror("Unable to unlock first semaphore");\ | ||
279 | exit(1);\ | ||
280 | }\ | ||
281 | } \ | ||
282 | |||
283 | #define FIRST_LOCK \ | ||
284 | if (_rt_lock_id == 1) {\ | ||
285 | if (sem_wait(_rt_first_sem) != 0) {\ | ||
286 | perror("Unable to wait on first semaphore");\ | ||
287 | exit(1);\ | ||
288 | }\ | ||
289 | }\ | ||
290 | else {\ | ||
291 | if (sem_wait(_rt_second_sem) != 0) {\ | ||
292 | perror("Unable to wait on second semaphore");\ | ||
293 | exit(1);\ | ||
294 | }\ | ||
295 | } | ||
296 | |||
297 | // This ensures a very low difference between pair member start times | ||
298 | #define BARRIER_SYNC \ | ||
299 | if (__sync_bool_compare_and_swap(_rt_barrier, 0, 1)) {\ | ||
300 | while (!__sync_bool_compare_and_swap(_rt_barrier, 0, 0)) {};\ | ||
301 | }\ | ||
302 | else {\ | ||
303 | __sync_bool_compare_and_swap(_rt_barrier, 1, 0);\ | ||
304 | } | ||
305 | |||
306 | // Buffer timing result from a single job | ||
307 | static void _rt_save_job_result() { | ||
308 | if (_rt_jobs_complete >= _rt_max_jobs) { | ||
309 | fprintf(stderr, "Max jobs setting too small! Trying to record job #%ld when we only have space for %ld jobs. Exiting...\n", _rt_jobs_complete, _rt_max_jobs); | ||
310 | exit(1); | ||
311 | } | ||
312 | if (_rt_jobs_complete > -1 && _rt_will_output) { | ||
313 | #ifdef PAIRED | ||
314 | _rt_start_time[_rt_jobs_complete] = _rt_start.tv_sec; | ||
315 | _rt_start_time[_rt_jobs_complete] *= _BILLION; | ||
316 | _rt_start_time[_rt_jobs_complete] += _rt_start.tv_nsec; | ||
317 | _rt_end_time[_rt_jobs_complete] = _rt_end.tv_sec; | ||
318 | _rt_end_time[_rt_jobs_complete] *= _BILLION; | ||
319 | _rt_end_time[_rt_jobs_complete] += _rt_end.tv_nsec; | ||
320 | #else | ||
321 | _rt_exec_time[_rt_jobs_complete] = _rt_end.tv_sec - _rt_start.tv_sec; | ||
322 | _rt_exec_time[_rt_jobs_complete] *= _BILLION; | ||
323 | _rt_exec_time[_rt_jobs_complete] += _rt_end.tv_nsec - _rt_start.tv_nsec; | ||
324 | #endif /* PAIRED */ | ||
325 | #if MMDC_PROF | ||
326 | _rt_mmdc_read[_rt_jobs_complete] = mmdc_res.read_bytes; | ||
327 | _rt_mmdc_write[_rt_jobs_complete] = mmdc_res.write_bytes; | ||
328 | #endif | ||
329 | } | ||
330 | } | ||
331 | |||
332 | // Save all buffered timing results to disk | ||
333 | static void _rt_write_to_file() { | ||
334 | char fileName[_RT_FILENAME_LEN]; | ||
335 | FILE *fp; | ||
336 | munlockall(); | ||
337 | if (!_rt_will_output) | ||
338 | goto out; | ||
339 | strcpy(fileName, _rt_run_id); | ||
340 | strcat(fileName, ".txt"); | ||
341 | fp = fopen(fileName, "a"); | ||
342 | if (fp == NULL) { | ||
343 | perror("Unable to open output file"); | ||
344 | exit(1); | ||
345 | } | ||
346 | // Baseline output uses a similar format with "none" for unused fields | ||
347 | for (int i = 0; i < _rt_jobs_complete; i++){ | ||
348 | fprintf(fp, "%s %s %u %s %ld", _rt_our_prog_name, _rt_other_prog_name, | ||
349 | _rt_core, _rt_other_core, _rt_max_jobs); | ||
350 | #ifdef PAIRED | ||
351 | // For unclear legacy reasons, paired tasks emit sec and ns separately | ||
352 | fprintf(fp, " %lld %lld %lld %lld", | ||
353 | _rt_start_time[i] / _BILLION, _rt_start_time[i] % _BILLION, | ||
354 | _rt_end_time[i] / _BILLION, _rt_end_time[i] % _BILLION); | ||
355 | #else | ||
356 | fprintf(fp, " %.f", _rt_exec_time[i]); | ||
357 | #endif /* PAIRED */ | ||
358 | fprintf(fp, " %s %d %.f %.f\n", _rt_run_id, i, | ||
359 | #if MMDC_PROF | ||
360 | _rt_mmdc_read[i], _rt_mmdc_write[i]); | ||
361 | #else | ||
362 | 0.0, 0.0); | ||
363 | #endif /* MMDC_PROF */ | ||
364 | } | ||
365 | fclose(fp); | ||
366 | out: | ||
367 | #if LITMUS | ||
368 | CLEANUP_LITMUS | ||
369 | #endif /* LITMUS */ | ||
370 | #ifdef PAIRED | ||
371 | munmap(_rt_barrier, 1); | ||
372 | shm_unlink("/_libextra_barrier"); | ||
373 | sem_unlink("/_libextra_first_sem"); | ||
374 | sem_unlink("/_libextra_second_sem"); | ||
375 | free(_rt_start_time); | ||
376 | free(_rt_end_time); | ||
377 | #else | ||
378 | free(_rt_exec_time); | ||
379 | #endif /* PAIRED */ | ||
380 | #if MMDC_PROF | ||
381 | free(_rt_mmdc_read); | ||
382 | free(_rt_mmdc_write); | ||
383 | #endif /* MMDC_PROF */ | ||
384 | } | ||
385 | |||
386 | // Start a job | ||
387 | static void _rt_start_loop() { | ||
388 | #if LITMUS | ||
389 | if (sleep_next_period() != 0) { | ||
390 | perror("Unable to sleep for next period"); | ||
391 | } | ||
392 | #else | ||
393 | sched_yield(); | ||
394 | #endif /* LITMUS */ | ||
395 | #ifdef PAIRED | ||
396 | FIRST_UNLOCK | ||
397 | FIRST_LOCK | ||
398 | #endif /* PAIRED */ | ||
399 | FLUSH_CACHES | ||
400 | #ifdef PAIRED | ||
401 | BARRIER_SYNC | ||
402 | #endif /* PAIRED */ | ||
403 | #if MMDC_PROF | ||
404 | /* This disables profiling, resets the counters, clears the overflow bit, and enables profiling */ | ||
405 | start_mmdc_profiling(mmdc); | ||
406 | #endif /* MMDC_PROF */ | ||
407 | clock_gettime(CLOCK_MONOTONIC, &_rt_start); | ||
408 | } | ||
409 | |||
410 | // Complete a job | ||
411 | static void _rt_stop_loop() { | ||
412 | clock_gettime(CLOCK_MONOTONIC, &_rt_end); | ||
413 | #if MMDC_PROF | ||
414 | /* This freezes the profiling and makes results available */ | ||
415 | pause_mmdc_profiling(mmdc); | ||
416 | get_mmdc_profiling_results(mmdc, &mmdc_res); | ||
417 | #endif /* MMDC_PROF */ | ||
418 | _rt_save_job_result(); | ||
419 | _rt_jobs_complete++; | ||
420 | } | ||
421 | |||
422 | /****** New API ****** | ||
423 | * Intended structure: | ||
424 | * | ||
425 | * |int main(int argc, char **argv) { | ||
426 | * | SET_UP | ||
427 | * | ... | ||
428 | * | for_each_job { | ||
429 | * | tacleInit(); | ||
430 | * | tacleMain(); | ||
431 | * | } | ||
432 | * | WRITE_TO_FILE | ||
433 | * |} | ||
434 | * | ||
435 | * The main() function must call its parameters argc and argv for SET_UP to be | ||
436 | * able to read them. | ||
437 | * Only SET_UP necessarily has to be in main(). | ||
438 | * | ||
439 | * We use some niche C features, here's a quick explaination: | ||
440 | * 1. The && operator doesn't evaluate the right-hand side of the expression | ||
441 | * unless the left side evaluated to true. We use this to only execute | ||
442 | * _rt_start_loop() when the loop will actually run. | ||
443 | * 2. The comma operator executes the first expression and then throws away the | ||
444 | * result. We use this to call our void function from inside a comparison. | ||
445 | */ | ||
446 | #define for_each_job \ | ||
447 | for (; _rt_jobs_complete < _rt_max_jobs && (_rt_start_loop(),1); \ | ||
448 | _rt_stop_loop()) | ||
449 | |||
450 | /****** Legacy API ****** | ||
451 | * Intended structure: | ||
452 | * | ||
453 | * |int main(int argc, char **argv) { | ||
454 | * | SET_UP | ||
455 | * | for (jobsComplete=0; jobsComplete<maxJobs; jobsComplete++){ | ||
456 | * | START_LOOP | ||
457 | * | tacleInit(); | ||
458 | * | tacleMain(); | ||
459 | * | STOP_LOOP | ||
460 | * | } | ||
461 | * | WRITE_TO_FILE | ||
462 | * | tacleReturn | ||
463 | * |} | ||
464 | * | ||
465 | * The main() function must call its parameters argc and argv for SET_UP to be | ||
466 | * able to read them. | ||
467 | */ | ||
468 | static int jobsComplete = 0; | ||
469 | #define START_LOOP _rt_start_loop(); | ||
470 | #define STOP_LOOP _rt_stop_loop(); | ||
471 | #define WRITE_TO_FILE _rt_write_to_file(); | ||
472 | #define maxJobs _rt_max_jobs | ||
473 | // Has been part of STOP_LOOP for quite some time | ||
474 | #define SAVE_RESULTS \ | ||
475 | #warning "The SAVE_RESULTS macro is deprecated and will soon be removed!"; | ||
476 | // Unclear if SLEEP is used anywhere. | ||
477 | #define SLEEP \ | ||
478 | #warning "The SLEEP macro is deprecated and may be removed!" \ | ||
479 | nanosleep((const struct timespec[]){{0, 1000000}}, NULL); | ||
diff --git a/SD-VBS/common/c/fCopy.c b/SD-VBS/common/c/fCopy.c new file mode 100644 index 0000000..f9b844d --- /dev/null +++ b/SD-VBS/common/c/fCopy.c | |||
@@ -0,0 +1,24 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | F2D* fCopy(F2D* in, F2D* out) | ||
8 | { | ||
9 | int i, j; | ||
10 | //F2D* out; | ||
11 | int rows, cols; | ||
12 | |||
13 | rows = in->height; | ||
14 | cols = in->width; | ||
15 | |||
16 | //out = fMallocHandle(rows, cols); | ||
17 | |||
18 | for(i=0; i<rows; i++) { | ||
19 | for(j=0; j<cols; j++) { | ||
20 | subsref(out,i,j) = subsref(in,i,j); | ||
21 | } | ||
22 | } | ||
23 | return out; | ||
24 | } | ||
diff --git a/SD-VBS/common/c/fDeepCopy.c b/SD-VBS/common/c/fDeepCopy.c new file mode 100644 index 0000000..332926e --- /dev/null +++ b/SD-VBS/common/c/fDeepCopy.c | |||
@@ -0,0 +1,24 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | F2D* fDeepCopy(F2D* in) | ||
8 | { | ||
9 | int i, j; | ||
10 | F2D* out; | ||
11 | int rows, cols; | ||
12 | |||
13 | rows = in->height; | ||
14 | cols = in->width; | ||
15 | |||
16 | out = fMallocHandle(rows, cols); | ||
17 | |||
18 | for(i=0; i<rows; i++) { | ||
19 | for(j=0; j<cols; j++) { | ||
20 | subsref(out,i,j) = subsref(in,i,j); | ||
21 | } | ||
22 | } | ||
23 | return out; | ||
24 | } | ||
diff --git a/SD-VBS/common/c/fDeepCopyRange.c b/SD-VBS/common/c/fDeepCopyRange.c new file mode 100644 index 0000000..e9a2b29 --- /dev/null +++ b/SD-VBS/common/c/fDeepCopyRange.c | |||
@@ -0,0 +1,24 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | F2D* fDeepCopyRange(F2D* in, int startRow, int numberRows, int startCol, int numberCols) | ||
8 | { | ||
9 | int i, j, k; | ||
10 | F2D *out; | ||
11 | int rows, cols; | ||
12 | |||
13 | rows = numberRows + startRow; | ||
14 | cols = numberCols + startCol; | ||
15 | out = fMallocHandle(numberRows, numberCols); | ||
16 | |||
17 | k = 0; | ||
18 | for(i=startRow; i<rows; i++) | ||
19 | for(j=startCol; j<cols; j++) | ||
20 | asubsref(out,k++) = subsref(in,i,j); | ||
21 | |||
22 | return out; | ||
23 | |||
24 | } | ||
diff --git a/SD-VBS/common/c/fDivide.c b/SD-VBS/common/c/fDivide.c new file mode 100644 index 0000000..7d7f90a --- /dev/null +++ b/SD-VBS/common/c/fDivide.c | |||
@@ -0,0 +1,23 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | F2D* fDivide(F2D* a, float b) | ||
8 | { | ||
9 | F2D *c; | ||
10 | int i, j, rows, cols; | ||
11 | |||
12 | rows = a->height; | ||
13 | cols = a->width; | ||
14 | |||
15 | c = fMallocHandle(rows, cols); | ||
16 | |||
17 | for(i=0; i<(rows*cols); i++) | ||
18 | { | ||
19 | asubsref(c,i) = asubsref(a,i) / b; | ||
20 | } | ||
21 | |||
22 | return c; | ||
23 | } | ||
diff --git a/SD-VBS/common/c/fFind3.c b/SD-VBS/common/c/fFind3.c new file mode 100644 index 0000000..a783bae --- /dev/null +++ b/SD-VBS/common/c/fFind3.c | |||
@@ -0,0 +1,46 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | F2D* fFind3(F2D* in) | ||
8 | { | ||
9 | int r, k, y, x, i, j; | ||
10 | F2D *points; | ||
11 | |||
12 | y = in->height; | ||
13 | x = in->width; | ||
14 | |||
15 | r = 0; | ||
16 | for(i=0; i<y; i++) | ||
17 | { | ||
18 | for(j=0; j<x; j++) | ||
19 | { | ||
20 | if(subsref(in,i,j) != 0) | ||
21 | r++; | ||
22 | } | ||
23 | } | ||
24 | |||
25 | points = fSetArray(r, 3, 0); | ||
26 | |||
27 | k = 0; | ||
28 | for(j=0; j<x; j++) | ||
29 | { | ||
30 | for(i=0; i<y; i++) | ||
31 | { | ||
32 | if( subsref(in,i,j) != 0) | ||
33 | { | ||
34 | subsref(points,k,0) = j*1.0; | ||
35 | subsref(points,k,1) = i*1.0; | ||
36 | subsref(points,k,2) = subsref(in,i,j); | ||
37 | k++; | ||
38 | } | ||
39 | } | ||
40 | } | ||
41 | |||
42 | return points; | ||
43 | } | ||
44 | |||
45 | |||
46 | |||
diff --git a/SD-VBS/common/c/fFreeHandle.c b/SD-VBS/common/c/fFreeHandle.c new file mode 100644 index 0000000..7616583 --- /dev/null +++ b/SD-VBS/common/c/fFreeHandle.c | |||
@@ -0,0 +1,16 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include <stdio.h> | ||
6 | #include <stdlib.h> | ||
7 | #include "sdvbs_common.h" | ||
8 | |||
9 | void fFreeHandle(F2D* out) | ||
10 | { | ||
11 | if(out != NULL) | ||
12 | free(out); | ||
13 | |||
14 | return; | ||
15 | } | ||
16 | |||
diff --git a/SD-VBS/common/c/fHorzcat.c b/SD-VBS/common/c/fHorzcat.c new file mode 100644 index 0000000..9845e7c --- /dev/null +++ b/SD-VBS/common/c/fHorzcat.c | |||
@@ -0,0 +1,40 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | F2D* fHorzcat(F2D* a, F2D* b) | ||
8 | { | ||
9 | F2D* out_, *out, *c; | ||
10 | int rows=0, cols=0, i, j, k, c_1, c_2, r_3, c_3; | ||
11 | int r_1; | ||
12 | |||
13 | r_1 = a->height; | ||
14 | c_1 = a->width; | ||
15 | cols += c_1; | ||
16 | c_2 = b->width; | ||
17 | cols += c_2; | ||
18 | rows = r_1; | ||
19 | |||
20 | out = fMallocHandle(rows, cols); | ||
21 | |||
22 | for(i=0; i<rows; i++) | ||
23 | { | ||
24 | k = 0; | ||
25 | for(j=0; j<c_1; j++) | ||
26 | { | ||
27 | subsref(out,i,k) = subsref(a,i,j); | ||
28 | k++; | ||
29 | } | ||
30 | for(j=0; j<c_2; j++) | ||
31 | { | ||
32 | subsref(out,i,k) = subsref(b,i,j); | ||
33 | k++; | ||
34 | } | ||
35 | } | ||
36 | |||
37 | return out; | ||
38 | } | ||
39 | |||
40 | |||
diff --git a/SD-VBS/common/c/fMallocHandle.c b/SD-VBS/common/c/fMallocHandle.c new file mode 100644 index 0000000..6ce917c --- /dev/null +++ b/SD-VBS/common/c/fMallocHandle.c | |||
@@ -0,0 +1,18 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include <stdio.h> | ||
6 | #include <stdlib.h> | ||
7 | #include "sdvbs_common.h" | ||
8 | |||
9 | F2D* fMallocHandle(int rows, int cols) | ||
10 | { | ||
11 | int i, j; | ||
12 | F2D* out; | ||
13 | |||
14 | out = (F2D*)malloc(sizeof(F2D) + sizeof(float)*rows*cols); | ||
15 | out->height = rows; | ||
16 | out->width = cols; | ||
17 | return out; | ||
18 | } | ||
diff --git a/SD-VBS/common/c/fMdivide.c b/SD-VBS/common/c/fMdivide.c new file mode 100644 index 0000000..671e7d1 --- /dev/null +++ b/SD-VBS/common/c/fMdivide.c | |||
@@ -0,0 +1,27 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | F2D* fMdivide(F2D* a, F2D* b) | ||
8 | { | ||
9 | F2D *c; | ||
10 | int i, j, rows, cols; | ||
11 | |||
12 | rows = a->height; | ||
13 | cols = a->width; | ||
14 | |||
15 | if(rows != b->height || cols != b->width) | ||
16 | { | ||
17 | printf("fMDivide Mismatch = \nrows: %d\t%d\ncols: %d\t%d\n", rows, b->height, cols, b->width); | ||
18 | return NULL; | ||
19 | } | ||
20 | |||
21 | c = fMallocHandle(rows, cols); | ||
22 | |||
23 | for(i=0; i<(rows*cols); i++) | ||
24 | asubsref(c,i) = asubsref(a,i) / asubsref(b,i); | ||
25 | |||
26 | return c; | ||
27 | } | ||
diff --git a/SD-VBS/common/c/fMinus.c b/SD-VBS/common/c/fMinus.c new file mode 100644 index 0000000..6b4954e --- /dev/null +++ b/SD-VBS/common/c/fMinus.c | |||
@@ -0,0 +1,21 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | F2D* fMinus(F2D* a, F2D* b) | ||
8 | { | ||
9 | F2D *c; | ||
10 | int i, j, rows, cols; | ||
11 | |||
12 | rows = a->height; | ||
13 | cols = a->width; | ||
14 | |||
15 | c = fMallocHandle(rows, cols); | ||
16 | |||
17 | for(i=0; i<(rows*cols); i++) | ||
18 | asubsref(c,i) = asubsref(a,i) - asubsref(b,i); | ||
19 | |||
20 | return c; | ||
21 | } | ||
diff --git a/SD-VBS/common/c/fMtimes.c b/SD-VBS/common/c/fMtimes.c new file mode 100644 index 0000000..c765d2f --- /dev/null +++ b/SD-VBS/common/c/fMtimes.c | |||
@@ -0,0 +1,38 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | F2D* fMtimes(F2D* a, F2D* b) | ||
8 | { | ||
9 | F2D *out; | ||
10 | int m, p, p1, n, i, j, k; | ||
11 | float temp; | ||
12 | |||
13 | m = a->height; | ||
14 | p = a->width; | ||
15 | |||
16 | p1 = b->height; | ||
17 | n = b->width; | ||
18 | |||
19 | out = fMallocHandle(m,n); | ||
20 | |||
21 | for(i=0; i<m; i++) | ||
22 | { | ||
23 | for(j=0; j<n; j++) | ||
24 | { | ||
25 | temp = 0; | ||
26 | for(k=0; k<p; k++) | ||
27 | { | ||
28 | temp += subsref(b,k,j) * subsref(a,i,k); | ||
29 | } | ||
30 | subsref(out,i,j) = temp; | ||
31 | } | ||
32 | } | ||
33 | |||
34 | return out; | ||
35 | } | ||
36 | |||
37 | |||
38 | |||
diff --git a/SD-VBS/common/c/fPlus.c b/SD-VBS/common/c/fPlus.c new file mode 100644 index 0000000..98900eb --- /dev/null +++ b/SD-VBS/common/c/fPlus.c | |||
@@ -0,0 +1,21 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | F2D* fPlus(F2D* a, F2D* b) | ||
8 | { | ||
9 | F2D *c; | ||
10 | int i, j, rows, cols; | ||
11 | |||
12 | rows = a->height; | ||
13 | cols = a->width; | ||
14 | |||
15 | c = fMallocHandle(rows, cols); | ||
16 | |||
17 | for(i=0; i<(rows*cols); i++) { | ||
18 | asubsref(c,i) = asubsref(a,i) + asubsref(b,i); | ||
19 | } | ||
20 | return c; | ||
21 | } | ||
diff --git a/SD-VBS/common/c/fResetArray.c b/SD-VBS/common/c/fResetArray.c new file mode 100644 index 0000000..23a853a --- /dev/null +++ b/SD-VBS/common/c/fResetArray.c | |||
@@ -0,0 +1,19 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include <stdio.h> | ||
6 | #include <stdlib.h> | ||
7 | #include "sdvbs_common.h" | ||
8 | |||
9 | void fResetArray(F2D *out, int rows, int cols, float val) | ||
10 | { | ||
11 | int i, j; | ||
12 | |||
13 | for(i=0; i<rows; i++) { | ||
14 | for(j=0; j<cols; j++) { | ||
15 | subsref(out,i,j) = val; | ||
16 | } | ||
17 | } | ||
18 | |||
19 | } | ||
diff --git a/SD-VBS/common/c/fResetHandle.c b/SD-VBS/common/c/fResetHandle.c new file mode 100644 index 0000000..da1a8f2 --- /dev/null +++ b/SD-VBS/common/c/fResetHandle.c | |||
@@ -0,0 +1,19 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include <stdio.h> | ||
6 | #include <stdlib.h> | ||
7 | #include "sdvbs_common.h" | ||
8 | |||
9 | F2D* fResetHandle(F2D* out, int rows, int cols) | ||
10 | { | ||
11 | int i, j; | ||
12 | //F2D* out; | ||
13 | |||
14 | //out = (F2D*)malloc(sizeof(F2D) + sizeof(float)*rows*cols); | ||
15 | out->height = rows; | ||
16 | out->width = cols; | ||
17 | //printf("fmalloc happened\n"); | ||
18 | return out; | ||
19 | } | ||
diff --git a/SD-VBS/common/c/fReshape.c b/SD-VBS/common/c/fReshape.c new file mode 100644 index 0000000..a078826 --- /dev/null +++ b/SD-VBS/common/c/fReshape.c | |||
@@ -0,0 +1,27 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | F2D* fReshape(F2D* in, int rows, int cols) | ||
8 | { | ||
9 | F2D *out; | ||
10 | int i, j, k; | ||
11 | int r, c; | ||
12 | |||
13 | r = in->height; | ||
14 | c = in->width; | ||
15 | |||
16 | out = fMallocHandle(rows, cols); | ||
17 | |||
18 | k = 0; | ||
19 | for(i=0; i<c; i++) { | ||
20 | for(j=0; j<r; j++) { | ||
21 | asubsref(out,k++) = subsref(in,j,i); | ||
22 | } | ||
23 | } | ||
24 | return out; | ||
25 | } | ||
26 | |||
27 | |||
diff --git a/SD-VBS/common/c/fResortIndices.c b/SD-VBS/common/c/fResortIndices.c new file mode 100644 index 0000000..d4d1cda --- /dev/null +++ b/SD-VBS/common/c/fResortIndices.c | |||
@@ -0,0 +1,77 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | I2D* fResortIndices(F2D* input, int dim, F2D* in, I2D* ind) | ||
8 | { | ||
9 | int rows, cols; | ||
10 | //F2D *in; | ||
11 | int i, j, k; | ||
12 | //I2D *ind; | ||
13 | |||
14 | rows = input->height; | ||
15 | cols = input->width; | ||
16 | |||
17 | in = fCopy(input, in); | ||
18 | //ind = iMallocHandle(rows,cols); | ||
19 | |||
20 | for(i=0; i<cols; i++) { | ||
21 | for(j=0; j<rows; j++) { | ||
22 | subsref(ind,j,i) = 0; | ||
23 | } | ||
24 | } | ||
25 | |||
26 | if(dim == 1) | ||
27 | { | ||
28 | for(k=0; k<rows; k++) | ||
29 | { | ||
30 | for(i=0; i<cols; i++) | ||
31 | { | ||
32 | float localMax = subsref(in,k,i); | ||
33 | int localIndex = i; | ||
34 | subsref(ind,k,i) = i; | ||
35 | for(j=0; j<cols; j++) | ||
36 | { | ||
37 | if(localMax < subsref(in,k,j)) | ||
38 | { | ||
39 | subsref(ind,k,i) = j; | ||
40 | localMax = subsref(in,k,j); | ||
41 | localIndex = j; | ||
42 | } | ||
43 | } | ||
44 | subsref(in,k,localIndex) = 0; | ||
45 | } | ||
46 | } | ||
47 | |||
48 | //fFreeHandle(in); | ||
49 | return ind; | ||
50 | } | ||
51 | |||
52 | for(k=0; k<cols; k++) | ||
53 | { | ||
54 | for(i=0; i<rows; i++) | ||
55 | { | ||
56 | float localMax = subsref(in,i,k); | ||
57 | int localIndex = i; | ||
58 | subsref(ind,i,k) = i; | ||
59 | for(j=0; j<rows; j++) | ||
60 | { | ||
61 | if(localMax < subsref(in,j,k)) | ||
62 | { | ||
63 | subsref(ind,i,k) = j; | ||
64 | localMax = subsref(in,j,k); | ||
65 | localIndex = j; | ||
66 | } | ||
67 | } | ||
68 | subsref(in,localIndex,k) = 0; | ||
69 | } | ||
70 | } | ||
71 | |||
72 | //fFreeHandle(in); | ||
73 | return ind; | ||
74 | } | ||
75 | |||
76 | |||
77 | |||
diff --git a/SD-VBS/common/c/fSelfCheck.c b/SD-VBS/common/c/fSelfCheck.c new file mode 100644 index 0000000..fe146b5 --- /dev/null +++ b/SD-VBS/common/c/fSelfCheck.c | |||
@@ -0,0 +1,59 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | int fSelfCheck(F2D* in1, char* path, float tol) | ||
8 | { | ||
9 | int r1, c1, ret=1; | ||
10 | float *buffer; | ||
11 | FILE* fd; | ||
12 | int count=0, i, j; | ||
13 | char file[256]; | ||
14 | |||
15 | r1 = in1->height; | ||
16 | c1 = in1->width; | ||
17 | |||
18 | buffer = (float*)malloc(sizeof(float)*r1*c1); | ||
19 | |||
20 | sprintf(file, "%s", path); | ||
21 | fd = fopen(file, "r"); | ||
22 | |||
23 | if(fd == NULL) | ||
24 | { | ||
25 | printf("Error: Expected file not opened %s\n", file); | ||
26 | return -1; | ||
27 | } | ||
28 | |||
29 | while(!feof(fd)) | ||
30 | { | ||
31 | fscanf(fd, "%f", &buffer[count]); | ||
32 | count++; | ||
33 | } | ||
34 | count--; | ||
35 | |||
36 | if(count != (r1*c1)) | ||
37 | { | ||
38 | printf("Checking error: dimensions mismatch. Expected = %d, Observed = %d \n", count, (r1*c1)); | ||
39 | return -1; | ||
40 | } | ||
41 | |||
42 | for(i=0; i<r1*c1; i++) | ||
43 | { | ||
44 | float inVal = asubsref(in1,i); | ||
45 | |||
46 | if( (inVal-buffer[i])>tol || (buffer[i]-inVal)>tol ) | ||
47 | { | ||
48 | printf("Mismatch %d: (%f, %f)\n", i, buffer[i], inVal); | ||
49 | return -1; | ||
50 | } | ||
51 | } | ||
52 | |||
53 | fclose(fd); | ||
54 | printf("Verification\t\t- Successful\n"); | ||
55 | free(buffer); | ||
56 | return ret; | ||
57 | } | ||
58 | |||
59 | |||
diff --git a/SD-VBS/common/c/fSetArray.c b/SD-VBS/common/c/fSetArray.c new file mode 100644 index 0000000..cd8269b --- /dev/null +++ b/SD-VBS/common/c/fSetArray.c | |||
@@ -0,0 +1,22 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include <stdio.h> | ||
6 | #include <stdlib.h> | ||
7 | #include "sdvbs_common.h" | ||
8 | |||
9 | F2D* fSetArray(int rows, int cols, float val) | ||
10 | { | ||
11 | int i, j; | ||
12 | F2D *out; | ||
13 | out = fMallocHandle(rows, cols); | ||
14 | |||
15 | for(i=0; i<rows; i++) { | ||
16 | for(j=0; j<cols; j++) { | ||
17 | subsref(out,i,j) = val; | ||
18 | } | ||
19 | } | ||
20 | return out; | ||
21 | |||
22 | } | ||
diff --git a/SD-VBS/common/c/fSort.c b/SD-VBS/common/c/fSort.c new file mode 100644 index 0000000..8aef21f --- /dev/null +++ b/SD-VBS/common/c/fSort.c | |||
@@ -0,0 +1,43 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | F2D* fSort(F2D* in, int dim) | ||
8 | { | ||
9 | F2D *sorted; | ||
10 | int rows, cols, i, j, k, temp; | ||
11 | |||
12 | rows = in->height; | ||
13 | cols = in->width; | ||
14 | |||
15 | sorted = fDeepCopy(in); | ||
16 | |||
17 | for(k=0; k<cols; k++) | ||
18 | { | ||
19 | for(i=0; i<rows; i++) | ||
20 | { | ||
21 | for(j=i+1; j<rows; j++) | ||
22 | { | ||
23 | float sik, sjk; | ||
24 | sik = subsref(sorted,i,k); | ||
25 | sjk = subsref(sorted,j,k); | ||
26 | |||
27 | if(sik < sjk) | ||
28 | { | ||
29 | temp = sjk; | ||
30 | sjk = sik; | ||
31 | sik = temp; | ||
32 | } | ||
33 | } | ||
34 | } | ||
35 | } | ||
36 | |||
37 | return sorted; | ||
38 | |||
39 | } | ||
40 | |||
41 | |||
42 | |||
43 | |||
diff --git a/SD-VBS/common/c/fSortIndices.c b/SD-VBS/common/c/fSortIndices.c new file mode 100644 index 0000000..753eda5 --- /dev/null +++ b/SD-VBS/common/c/fSortIndices.c | |||
@@ -0,0 +1,77 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | I2D* fSortIndices(F2D* input, int dim) | ||
8 | { | ||
9 | int rows, cols; | ||
10 | F2D *in; | ||
11 | int i, j, k; | ||
12 | I2D *ind; | ||
13 | |||
14 | rows = input->height; | ||
15 | cols = input->width; | ||
16 | |||
17 | in = fDeepCopy(input); | ||
18 | ind = iMallocHandle(rows,cols); | ||
19 | |||
20 | for(i=0; i<cols; i++) { | ||
21 | for(j=0; j<rows; j++) { | ||
22 | subsref(ind,j,i) = 0; | ||
23 | } | ||
24 | } | ||
25 | |||
26 | if(dim == 1) | ||
27 | { | ||
28 | for(k=0; k<rows; k++) | ||
29 | { | ||
30 | for(i=0; i<cols; i++) | ||
31 | { | ||
32 | float localMax = subsref(in,k,i); | ||
33 | int localIndex = i; | ||
34 | subsref(ind,k,i) = i; | ||
35 | for(j=0; j<cols; j++) | ||
36 | { | ||
37 | if(localMax < subsref(in,k,j)) | ||
38 | { | ||
39 | subsref(ind,k,i) = j; | ||
40 | localMax = subsref(in,k,j); | ||
41 | localIndex = j; | ||
42 | } | ||
43 | } | ||
44 | subsref(in,k,localIndex) = 0; | ||
45 | } | ||
46 | } | ||
47 | |||
48 | fFreeHandle(in); | ||
49 | return ind; | ||
50 | } | ||
51 | |||
52 | for(k=0; k<cols; k++) | ||
53 | { | ||
54 | for(i=0; i<rows; i++) | ||
55 | { | ||
56 | float localMax = subsref(in,i,k); | ||
57 | int localIndex = i; | ||
58 | subsref(ind,i,k) = i; | ||
59 | for(j=0; j<rows; j++) | ||
60 | { | ||
61 | if(localMax < subsref(in,j,k)) | ||
62 | { | ||
63 | subsref(ind,i,k) = j; | ||
64 | localMax = subsref(in,j,k); | ||
65 | localIndex = j; | ||
66 | } | ||
67 | } | ||
68 | subsref(in,localIndex,k) = 0; | ||
69 | } | ||
70 | } | ||
71 | |||
72 | fFreeHandle(in); | ||
73 | return ind; | ||
74 | } | ||
75 | |||
76 | |||
77 | |||
diff --git a/SD-VBS/common/c/fSum.c b/SD-VBS/common/c/fSum.c new file mode 100644 index 0000000..cd9483a --- /dev/null +++ b/SD-VBS/common/c/fSum.c | |||
@@ -0,0 +1,55 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | F2D* fSum(F2D* inMat) | ||
8 | { | ||
9 | F2D *outMat; | ||
10 | int rows, cols, i, j, k; | ||
11 | float temp; | ||
12 | int newRow, newCols; | ||
13 | int Rcols; | ||
14 | |||
15 | rows = inMat->height; | ||
16 | cols = inMat->width; | ||
17 | |||
18 | if(cols == 1 || rows == 1) | ||
19 | Rcols = 1; | ||
20 | else | ||
21 | Rcols = cols; | ||
22 | |||
23 | outMat = fSetArray(1,Rcols,0); | ||
24 | |||
25 | if( cols == 1) | ||
26 | { | ||
27 | temp = 0; | ||
28 | for( j=0; j<rows; j++) | ||
29 | temp = temp + subsref(inMat,j,0); | ||
30 | asubsref(outMat,0) = temp; | ||
31 | } | ||
32 | else if( rows == 1) | ||
33 | { | ||
34 | temp = 0; | ||
35 | for( j=0; j<cols; j++) | ||
36 | temp = temp + asubsref(inMat,j); | ||
37 | asubsref(outMat,0) = temp; | ||
38 | } | ||
39 | else | ||
40 | { | ||
41 | for( i=0; i<cols; i++) | ||
42 | { | ||
43 | temp = 0; | ||
44 | for( j=0; j<rows; j++) | ||
45 | temp = temp + subsref(inMat,j,i); | ||
46 | asubsref(outMat,i) = temp; | ||
47 | } | ||
48 | } | ||
49 | |||
50 | return outMat; | ||
51 | } | ||
52 | |||
53 | |||
54 | |||
55 | |||
diff --git a/SD-VBS/common/c/fSum2.c b/SD-VBS/common/c/fSum2.c new file mode 100644 index 0000000..8078249 --- /dev/null +++ b/SD-VBS/common/c/fSum2.c | |||
@@ -0,0 +1,56 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | F2D* fSum2(F2D* inMat, int dir) | ||
8 | { | ||
9 | F2D *outMat; | ||
10 | int rows, cols, i, j, k; | ||
11 | float temp; | ||
12 | int newRow, newCols; | ||
13 | |||
14 | rows = inMat->height; | ||
15 | cols = inMat->width; | ||
16 | |||
17 | if(dir == 1) | ||
18 | { | ||
19 | newRow = 1; | ||
20 | newCols = cols; | ||
21 | } | ||
22 | else | ||
23 | { | ||
24 | newRow = rows; | ||
25 | newCols = 1; | ||
26 | } | ||
27 | |||
28 | outMat = fSetArray(newRow,newCols,0); | ||
29 | |||
30 | if(dir == 1) | ||
31 | { | ||
32 | for (i=0; i<cols; i++) | ||
33 | { | ||
34 | temp = 0; | ||
35 | for( j=0; j<rows; j++) | ||
36 | temp = temp + subsref(inMat,j,i); | ||
37 | asubsref(outMat,i) = temp; | ||
38 | } | ||
39 | } | ||
40 | else | ||
41 | { | ||
42 | for( i=0; i<rows; i++) | ||
43 | { | ||
44 | temp = 0; | ||
45 | for( j=0; j<cols; j++) | ||
46 | temp = temp + subsref(inMat,i,j); | ||
47 | subsref(outMat,i,0) = temp; | ||
48 | } | ||
49 | } | ||
50 | |||
51 | return outMat; | ||
52 | } | ||
53 | |||
54 | |||
55 | |||
56 | |||
diff --git a/SD-VBS/common/c/fTimes.c b/SD-VBS/common/c/fTimes.c new file mode 100644 index 0000000..bfab489 --- /dev/null +++ b/SD-VBS/common/c/fTimes.c | |||
@@ -0,0 +1,21 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | F2D* fTimes(F2D* a, F2D* b) | ||
8 | { | ||
9 | F2D *c; | ||
10 | int i, j, rows, cols; | ||
11 | |||
12 | rows = a->height; | ||
13 | cols = a->width; | ||
14 | |||
15 | c = fMallocHandle(rows, cols); | ||
16 | |||
17 | for(i=0; i<(rows*cols); i++) | ||
18 | asubsref(c,i) = asubsref(a,i) * asubsref(b,i); | ||
19 | |||
20 | return c; | ||
21 | } | ||
diff --git a/SD-VBS/common/c/fTranspose.c b/SD-VBS/common/c/fTranspose.c new file mode 100644 index 0000000..9611be2 --- /dev/null +++ b/SD-VBS/common/c/fTranspose.c | |||
@@ -0,0 +1,27 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | F2D* fTranspose(F2D* a) | ||
8 | { | ||
9 | F2D *out; | ||
10 | int m, p, p1, n, i, j, k; | ||
11 | float temp; | ||
12 | |||
13 | m = a->height; | ||
14 | n = a->width; | ||
15 | |||
16 | out = fMallocHandle(n, m); | ||
17 | k = 0; | ||
18 | for(i=0; i<n; i++) | ||
19 | { | ||
20 | for(j=0; j<m; j++) | ||
21 | asubsref(out,k++) = subsref(a,j,i); | ||
22 | } | ||
23 | |||
24 | return out; | ||
25 | } | ||
26 | |||
27 | |||
diff --git a/SD-VBS/common/c/fWriteMatrix.c b/SD-VBS/common/c/fWriteMatrix.c new file mode 100644 index 0000000..822af92 --- /dev/null +++ b/SD-VBS/common/c/fWriteMatrix.c | |||
@@ -0,0 +1,34 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include <stdio.h> | ||
6 | #include <stdlib.h> | ||
7 | #include "sdvbs_common.h" | ||
8 | |||
9 | void fWriteMatrix(F2D* input, char* inpath) | ||
10 | { | ||
11 | FILE* fp; | ||
12 | char im[100]; | ||
13 | int rows,cols, i, j; | ||
14 | |||
15 | sprintf(im, "%s/expected_C.txt", inpath); | ||
16 | fp = fopen(im, "w"); | ||
17 | |||
18 | rows = input->height; | ||
19 | cols = input->width; | ||
20 | |||
21 | for(i=0; i<rows; i++) | ||
22 | { | ||
23 | for(j=0; j<cols; j++) | ||
24 | { | ||
25 | fprintf(fp, "%f\t", subsref(input, i, j)); | ||
26 | } | ||
27 | fprintf(fp, "\n"); | ||
28 | } | ||
29 | |||
30 | fclose(fp); | ||
31 | } | ||
32 | |||
33 | |||
34 | |||
diff --git a/SD-VBS/common/c/ffConv2.c b/SD-VBS/common/c/ffConv2.c new file mode 100644 index 0000000..450c5d2 --- /dev/null +++ b/SD-VBS/common/c/ffConv2.c | |||
@@ -0,0 +1,47 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | F2D* ffConv2(F2D* a, F2D* b) | ||
8 | { | ||
9 | F2D *c, *out; | ||
10 | int ma, na, mb, nb, ci, cj, i, j, m, n, ri, mm, nn; | ||
11 | int r_index, c_index; | ||
12 | |||
13 | ma = a->height; | ||
14 | na = a->width; | ||
15 | |||
16 | mb = b->height; | ||
17 | nb = b->width; | ||
18 | |||
19 | ci = ma; | ||
20 | cj = na; | ||
21 | |||
22 | c = fSetArray(ci, cj, 0); | ||
23 | |||
24 | r_index = mb/2; | ||
25 | c_index = nb/2; | ||
26 | |||
27 | for(i=0; i<ma; i++) | ||
28 | { | ||
29 | for(j=0; j<na; j++) | ||
30 | { | ||
31 | for(m=0; m<mb; m++) | ||
32 | { | ||
33 | mm = mb-1-m; | ||
34 | for(n=0; n<nb; n++) | ||
35 | { | ||
36 | nn = nb-1-n; | ||
37 | ri = i+m-r_index; | ||
38 | ci = j+n-c_index; | ||
39 | if(ri >=0 && ri < ma && ci >= 0 && ci < na) | ||
40 | subsref(c,i,j) += subsref(a,ri,ci) * subsref(b,mm,nn); | ||
41 | } | ||
42 | } | ||
43 | } | ||
44 | } | ||
45 | |||
46 | return c; | ||
47 | } | ||
diff --git a/SD-VBS/common/c/ffConv2_dY.c b/SD-VBS/common/c/ffConv2_dY.c new file mode 100644 index 0000000..e480eaa --- /dev/null +++ b/SD-VBS/common/c/ffConv2_dY.c | |||
@@ -0,0 +1,52 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | F2D* ffConv2_dY(F2D* a, F2D* b) | ||
8 | { | ||
9 | F2D *c, *out; | ||
10 | int ma, na, mb, nb, ci, cj, i, j, m, n; | ||
11 | int r_index, c_index; | ||
12 | |||
13 | ma = a->height; | ||
14 | na = a->width; | ||
15 | |||
16 | mb = b->height; | ||
17 | nb = b->width; | ||
18 | |||
19 | r_index = ceil((mb + 1.0)/2.0); | ||
20 | c_index = ceil((nb + 1.0)/2.0); | ||
21 | |||
22 | ci = ma+mb-1; | ||
23 | cj = na+nb-1; | ||
24 | |||
25 | c = fSetArray(ci, cj, 0); | ||
26 | |||
27 | for(i=0; i<cj; i++) | ||
28 | { | ||
29 | for(j=0; j<ci; j++) | ||
30 | { | ||
31 | for(m=0; m<na; m++) | ||
32 | { | ||
33 | for(n=0; n<ma; n++) | ||
34 | { | ||
35 | if( (i-m)>=0 && (j-n)>=0 && (i-m)<nb && (j-n)<mb ) | ||
36 | subsref(c,j,i) += subsref(a,n,m) * subsref(b,j-n,i-m); | ||
37 | } | ||
38 | } | ||
39 | } | ||
40 | } | ||
41 | |||
42 | out = fMallocHandle(ma, na); | ||
43 | for(i=0; i<ma; i++) | ||
44 | { | ||
45 | for(j=0; j<na; j++) | ||
46 | { | ||
47 | subsref(out,i,j) = subsref(c,(i+r_index-1),(j+c_index-1)); | ||
48 | } | ||
49 | } | ||
50 | |||
51 | return out; | ||
52 | } | ||
diff --git a/SD-VBS/common/c/ffDivide.c b/SD-VBS/common/c/ffDivide.c new file mode 100644 index 0000000..0607d0b --- /dev/null +++ b/SD-VBS/common/c/ffDivide.c | |||
@@ -0,0 +1,21 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | F2D* ffDivide(F2D* a, F2D* b) | ||
8 | { | ||
9 | F2D *c; | ||
10 | int i, j, rows, cols; | ||
11 | |||
12 | rows = a->height; | ||
13 | cols = a->width; | ||
14 | |||
15 | c = fMallocHandle(rows, cols); | ||
16 | |||
17 | for(i=0; i<(rows*cols); i++) | ||
18 | asubsref(c,i) = asubsref(a,i) / asubsref(b,i); | ||
19 | |||
20 | return c; | ||
21 | } | ||
diff --git a/SD-VBS/common/c/ffTimes.c b/SD-VBS/common/c/ffTimes.c new file mode 100644 index 0000000..8ef84b8 --- /dev/null +++ b/SD-VBS/common/c/ffTimes.c | |||
@@ -0,0 +1,21 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | F2D* ffTimes(F2D* a, float b) | ||
8 | { | ||
9 | F2D *c; | ||
10 | int i, j, rows, cols; | ||
11 | |||
12 | rows = a->height; | ||
13 | cols = a->width; | ||
14 | |||
15 | c = fMallocHandle(rows, cols); | ||
16 | |||
17 | for(i=0; i<(rows*cols); i++) | ||
18 | asubsref(c,i) = asubsref(a,i) * b; | ||
19 | |||
20 | return c; | ||
21 | } | ||
diff --git a/SD-VBS/common/c/ffVertcat.c b/SD-VBS/common/c/ffVertcat.c new file mode 100644 index 0000000..00fa74b --- /dev/null +++ b/SD-VBS/common/c/ffVertcat.c | |||
@@ -0,0 +1,36 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | F2D* ffVertcat(F2D* matrix1, F2D* matrix2) | ||
8 | { | ||
9 | F2D *outMatrix; | ||
10 | int row1, col1, row2, col2, i, j, k; | ||
11 | |||
12 | row1 = matrix1->height; | ||
13 | col1 = matrix1->width; | ||
14 | |||
15 | row2 = matrix2->height; | ||
16 | col2 = matrix2->width; | ||
17 | |||
18 | outMatrix = fMallocHandle(row1+row2, col1); | ||
19 | |||
20 | for( i=0; i<col1; i++) | ||
21 | { | ||
22 | for (j=0; j<row1; j++) | ||
23 | { | ||
24 | subsref(outMatrix,j,i) = subsref(matrix1,j,i); | ||
25 | } | ||
26 | for( k=0; k<row2; k++) | ||
27 | { | ||
28 | subsref(outMatrix,(k+row1),i) = subsref(matrix2,k,i); | ||
29 | } | ||
30 | } | ||
31 | |||
32 | return outMatrix; | ||
33 | |||
34 | } | ||
35 | |||
36 | |||
diff --git a/SD-VBS/common/c/ffiConv2.c b/SD-VBS/common/c/ffiConv2.c new file mode 100644 index 0000000..83c7466 --- /dev/null +++ b/SD-VBS/common/c/ffiConv2.c | |||
@@ -0,0 +1,54 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | F2D* ffiConv2(F2D* a, I2D* b) | ||
8 | { | ||
9 | F2D *c; | ||
10 | F2D *out; | ||
11 | int ma, na, mb, nb, ci, cj, i, j, m, n; | ||
12 | int r_index, c_index; | ||
13 | |||
14 | ma = a->height; | ||
15 | na = a->width; | ||
16 | |||
17 | mb = b->height; | ||
18 | nb = b->width; | ||
19 | |||
20 | r_index = ceil((mb + 1.0)/2.0); | ||
21 | c_index = ceil((nb + 1.0)/2.0); | ||
22 | |||
23 | ci = ma+mb-1; | ||
24 | cj = na+nb-1; | ||
25 | |||
26 | c = fSetArray(ci, cj, 0); | ||
27 | |||
28 | for(i=0; i<ci; i++) | ||
29 | { | ||
30 | for(j=0; j<cj; j++) | ||
31 | { | ||
32 | for(m=0; m<ma; m++) | ||
33 | { | ||
34 | for(n=0; n<na; n++) | ||
35 | { | ||
36 | if( (i-m)>=0 && (j-n)>=0 && (i-m)<mb && (j-n)<nb ) | ||
37 | subsref(c,i,j) += subsref(a,m,n) * subsref(b,(i-m),(j-n)); | ||
38 | } | ||
39 | } | ||
40 | |||
41 | } | ||
42 | } | ||
43 | |||
44 | out = fMallocHandle(ma, na); | ||
45 | for(i=0; i<ma; i++) | ||
46 | { | ||
47 | for(j=0; j<na; j++) | ||
48 | { | ||
49 | subsref(out,i,j) = subsref(c,(i+r_index-1),(j+c_index-1)); | ||
50 | } | ||
51 | } | ||
52 | |||
53 | return out; | ||
54 | } | ||
diff --git a/SD-VBS/common/c/fiConv2.c b/SD-VBS/common/c/fiConv2.c new file mode 100644 index 0000000..87fc4ec --- /dev/null +++ b/SD-VBS/common/c/fiConv2.c | |||
@@ -0,0 +1,54 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | F2D* fiConv2(I2D* a, F2D* b) | ||
8 | { | ||
9 | F2D *c; | ||
10 | F2D *out; | ||
11 | int ma, na, mb, nb, ci, cj, i, j, m, n; | ||
12 | int r_index, c_index; | ||
13 | |||
14 | ma = a->height; | ||
15 | na = a->width; | ||
16 | |||
17 | mb = b->height; | ||
18 | nb = b->width; | ||
19 | |||
20 | r_index = ceil((mb + 1.0)/2.0); | ||
21 | c_index = ceil((nb + 1.0)/2.0); | ||
22 | |||
23 | ci = ma+mb-1; | ||
24 | cj = na+nb-1; | ||
25 | |||
26 | c = fSetArray(ci, cj, 0); | ||
27 | |||
28 | for(i=0; i<ci; i++) | ||
29 | { | ||
30 | for(j=0; j<cj; j++) | ||
31 | { | ||
32 | for(m=0; m<ma; m++) | ||
33 | { | ||
34 | for(n=0; n<na; n++) | ||
35 | { | ||
36 | if( (i-m)>=0 && (j-n)>=0 && (i-m)<mb && (j-n)<nb ) | ||
37 | subsref(c,i,j) += subsref(a,m,n) * subsref(b,(i-m),(j-n)); | ||
38 | } | ||
39 | } | ||
40 | |||
41 | } | ||
42 | } | ||
43 | |||
44 | out = fMallocHandle(ma, na); | ||
45 | for(i=0; i<ma; i++) | ||
46 | { | ||
47 | for(j=0; j<na; j++) | ||
48 | { | ||
49 | subsref(out,i,j) = subsref(c,(i+r_index-1),(j+c_index-1)); | ||
50 | } | ||
51 | } | ||
52 | |||
53 | return out; | ||
54 | } | ||
diff --git a/SD-VBS/common/c/fiCopy.c b/SD-VBS/common/c/fiCopy.c new file mode 100644 index 0000000..27c164c --- /dev/null +++ b/SD-VBS/common/c/fiCopy.c | |||
@@ -0,0 +1,23 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | void fiCopy(F2D* out, I2D* in) | ||
8 | { | ||
9 | int i, j; | ||
10 | //F2D *out; | ||
11 | int rows, cols; | ||
12 | |||
13 | rows = in->height; | ||
14 | cols = in->width; | ||
15 | |||
16 | //out = fMallocHandle(rows, cols); | ||
17 | |||
18 | for(i=0; i<rows; i++) | ||
19 | for(j=0; j<cols; j++) | ||
20 | subsref(out,i,j) = subsref(in,i,j) + 0.0; | ||
21 | |||
22 | //return out; | ||
23 | } | ||
diff --git a/SD-VBS/common/c/fiDeepCopy.c b/SD-VBS/common/c/fiDeepCopy.c new file mode 100644 index 0000000..7058945 --- /dev/null +++ b/SD-VBS/common/c/fiDeepCopy.c | |||
@@ -0,0 +1,23 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | F2D* fiDeepCopy(I2D* in) | ||
8 | { | ||
9 | int i, j; | ||
10 | F2D *out; | ||
11 | int rows, cols; | ||
12 | |||
13 | rows = in->height; | ||
14 | cols = in->width; | ||
15 | |||
16 | out = fMallocHandle(rows, cols); | ||
17 | |||
18 | for(i=0; i<rows; i++) | ||
19 | for(j=0; j<cols; j++) | ||
20 | subsref(out,i,j) = subsref(in,i,j) + 0.0; | ||
21 | |||
22 | return out; | ||
23 | } | ||
diff --git a/SD-VBS/common/c/horzcat.c b/SD-VBS/common/c/horzcat.c new file mode 100644 index 0000000..2041396 --- /dev/null +++ b/SD-VBS/common/c/horzcat.c | |||
@@ -0,0 +1,48 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | F2D* horzcat(F2D* a, F2D* b, F2D* c) | ||
8 | { | ||
9 | F2D *out; | ||
10 | int rows=0, cols=0, i, j, k, c_1, c_2, r_3, c_3; | ||
11 | |||
12 | c_1 = a->width; | ||
13 | cols += c_1; | ||
14 | |||
15 | c_2 = b->width; | ||
16 | cols += c_2; | ||
17 | |||
18 | r_3 = c->height; | ||
19 | c_3 = c->width; | ||
20 | cols += c_3; | ||
21 | rows = r_3; | ||
22 | |||
23 | out = fMallocHandle(rows, cols); | ||
24 | |||
25 | for(i=0; i<rows; i++) | ||
26 | { | ||
27 | k = 0; | ||
28 | for(j=0; j<c_1; j++) | ||
29 | { | ||
30 | subsref(out,i,k) = subsref(a,i,j); | ||
31 | k++; | ||
32 | } | ||
33 | for(j=0; j<c_2; j++) | ||
34 | { | ||
35 | subsref(out,i,k) = subsref(b,i,j); | ||
36 | k++; | ||
37 | } | ||
38 | for(j=0; j<c_3; j++) | ||
39 | { | ||
40 | subsref(out,i,k) = subsref(c,i,j); | ||
41 | k++; | ||
42 | } | ||
43 | } | ||
44 | |||
45 | return out; | ||
46 | } | ||
47 | |||
48 | |||
diff --git a/SD-VBS/common/c/iCheck.c b/SD-VBS/common/c/iCheck.c new file mode 100644 index 0000000..707d04a --- /dev/null +++ b/SD-VBS/common/c/iCheck.c | |||
@@ -0,0 +1,18 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | int iCheck(I2D* in1, I2D* in2){ | ||
8 | if(in1->width != in2 -> width || in1->height != in2->height) return 0; | ||
9 | for(int i = 0; i < in1->width;i++){ | ||
10 | for(int j = 0; j < in1->height;j++){ | ||
11 | if(subsref(in1,i,j) != subsref(in2,i,j)) return 0; | ||
12 | } | ||
13 | } | ||
14 | return 1; | ||
15 | |||
16 | } | ||
17 | |||
18 | |||
diff --git a/SD-VBS/common/c/iDeepCopy.c b/SD-VBS/common/c/iDeepCopy.c new file mode 100644 index 0000000..8d56680 --- /dev/null +++ b/SD-VBS/common/c/iDeepCopy.c | |||
@@ -0,0 +1,23 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | I2D* iDeepCopy(I2D* in) | ||
8 | { | ||
9 | int i, j; | ||
10 | I2D* out; | ||
11 | int rows, cols; | ||
12 | |||
13 | rows = in->height; | ||
14 | cols = in->width; | ||
15 | |||
16 | out = iMallocHandle(rows, cols); | ||
17 | |||
18 | for(i=0; i<rows; i++) | ||
19 | for(j=0; j<cols; j++) | ||
20 | subsref(out,i,j) = subsref(in,i,j); | ||
21 | |||
22 | return out; | ||
23 | } | ||
diff --git a/SD-VBS/common/c/iDeepCopyRange.c b/SD-VBS/common/c/iDeepCopyRange.c new file mode 100644 index 0000000..f3fa6e3 --- /dev/null +++ b/SD-VBS/common/c/iDeepCopyRange.c | |||
@@ -0,0 +1,23 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | I2D* iDeepCopyRange(I2D* in, int startRow, int numberRows, int startCol, int numberCols) | ||
8 | { | ||
9 | int i, j, k; | ||
10 | I2D *out; | ||
11 | int rows, cols; | ||
12 | |||
13 | rows = numberRows + startRow; | ||
14 | cols = numberCols + startCol; | ||
15 | out = iMallocHandle(numberRows, numberCols); | ||
16 | |||
17 | k = 0; | ||
18 | for(i=startRow; i<rows; i++) | ||
19 | for(j=startCol; j<cols; j++) | ||
20 | asubsref(out,k++) = subsref(in,i,j); | ||
21 | |||
22 | return out; | ||
23 | } | ||
diff --git a/SD-VBS/common/c/iFreeHandle.c b/SD-VBS/common/c/iFreeHandle.c new file mode 100644 index 0000000..c45db21 --- /dev/null +++ b/SD-VBS/common/c/iFreeHandle.c | |||
@@ -0,0 +1,16 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include <stdio.h> | ||
6 | #include <stdlib.h> | ||
7 | #include "sdvbs_common.h" | ||
8 | |||
9 | void iFreeHandle(I2D* out) | ||
10 | { | ||
11 | if(out != NULL) | ||
12 | free(out); | ||
13 | |||
14 | return; | ||
15 | } | ||
16 | |||
diff --git a/SD-VBS/common/c/iHorzcat.c b/SD-VBS/common/c/iHorzcat.c new file mode 100644 index 0000000..ac1c4ea --- /dev/null +++ b/SD-VBS/common/c/iHorzcat.c | |||
@@ -0,0 +1,41 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | I2D* iHorzcat(I2D* a, I2D* b) | ||
8 | { | ||
9 | I2D *out, *c; | ||
10 | int rows=0, cols=0, i, j, k, c_1, c_2, r_3, c_3; | ||
11 | int r_1; | ||
12 | |||
13 | r_1 = a->height; | ||
14 | c_1 = a->width; | ||
15 | cols += c_1; | ||
16 | |||
17 | c_2 = b->width; | ||
18 | cols += c_2; | ||
19 | rows = r_1; | ||
20 | |||
21 | out = iMallocHandle(rows, cols); | ||
22 | |||
23 | for(i=0; i<rows; i++) | ||
24 | { | ||
25 | k = 0; | ||
26 | for(j=0; j<c_1; j++) | ||
27 | { | ||
28 | subsref(out,i,k) = subsref(a,i,j); | ||
29 | k++; | ||
30 | } | ||
31 | for(j=0; j<c_2; j++) | ||
32 | { | ||
33 | subsref(out,i,k) = subsref(b,i,j); | ||
34 | k++; | ||
35 | } | ||
36 | } | ||
37 | |||
38 | return out; | ||
39 | } | ||
40 | |||
41 | |||
diff --git a/SD-VBS/common/c/iMallocHandle.c b/SD-VBS/common/c/iMallocHandle.c new file mode 100644 index 0000000..afebf86 --- /dev/null +++ b/SD-VBS/common/c/iMallocHandle.c | |||
@@ -0,0 +1,20 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include <stdio.h> | ||
6 | #include <stdlib.h> | ||
7 | #include "sdvbs_common.h" | ||
8 | |||
9 | I2D* iMallocHandle(int rows, int cols) | ||
10 | { | ||
11 | int i, j; | ||
12 | I2D* out; | ||
13 | |||
14 | out = (I2D*)malloc(sizeof(I2D) + sizeof(int)*rows*cols); | ||
15 | out->height = rows; | ||
16 | out->width = cols; | ||
17 | //printf("imalloc happened\n"); | ||
18 | return out; | ||
19 | } | ||
20 | |||
diff --git a/SD-VBS/common/c/iMinus.c b/SD-VBS/common/c/iMinus.c new file mode 100644 index 0000000..a0ed908 --- /dev/null +++ b/SD-VBS/common/c/iMinus.c | |||
@@ -0,0 +1,21 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | I2D* iMinus(I2D* a, I2D* b) | ||
8 | { | ||
9 | I2D *c; | ||
10 | int i, j, rows, cols; | ||
11 | |||
12 | rows = a->height; | ||
13 | cols = a->width; | ||
14 | |||
15 | c = iMallocHandle(rows, cols); | ||
16 | |||
17 | for(i=0; i<(rows*cols); i++) | ||
18 | asubsref(c,i) = asubsref(a,i) - asubsref(b,i); | ||
19 | |||
20 | return c; | ||
21 | } | ||
diff --git a/SD-VBS/common/c/iResetArray.c b/SD-VBS/common/c/iResetArray.c new file mode 100644 index 0000000..3659d15 --- /dev/null +++ b/SD-VBS/common/c/iResetArray.c | |||
@@ -0,0 +1,22 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include <stdio.h> | ||
6 | #include <stdlib.h> | ||
7 | #include "sdvbs_common.h" | ||
8 | |||
9 | void iResetArray(I2D* out, int rows, int cols, int val) | ||
10 | { | ||
11 | int i, j; | ||
12 | //I2D *out; | ||
13 | //out = iMallocHandle(rows, cols); | ||
14 | |||
15 | for(i=0; i<rows; i++) { | ||
16 | for(j=0; j<cols; j++) { | ||
17 | subsref(out,i,j) = val; | ||
18 | } | ||
19 | } | ||
20 | //return out; | ||
21 | |||
22 | } | ||
diff --git a/SD-VBS/common/c/iReshape.c b/SD-VBS/common/c/iReshape.c new file mode 100644 index 0000000..511a8ed --- /dev/null +++ b/SD-VBS/common/c/iReshape.c | |||
@@ -0,0 +1,25 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | I2D* iReshape(I2D* in, int rows, int cols) | ||
8 | { | ||
9 | I2D *out; | ||
10 | int i, j, k; | ||
11 | int r, c; | ||
12 | |||
13 | r = in->height; | ||
14 | c = in->width; | ||
15 | |||
16 | out = iMallocHandle(rows, cols); | ||
17 | |||
18 | k = 0; | ||
19 | for(i=0; i<c; i++) | ||
20 | for(j=0; j<r; j++) | ||
21 | asubsref(out,k++) = subsref(in,j,i); | ||
22 | |||
23 | return out; | ||
24 | } | ||
25 | |||
diff --git a/SD-VBS/common/c/iSetArray.c b/SD-VBS/common/c/iSetArray.c new file mode 100644 index 0000000..205bd13 --- /dev/null +++ b/SD-VBS/common/c/iSetArray.c | |||
@@ -0,0 +1,22 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include <stdio.h> | ||
6 | #include <stdlib.h> | ||
7 | #include "sdvbs_common.h" | ||
8 | |||
9 | I2D* iSetArray(int rows, int cols, int val) | ||
10 | { | ||
11 | int i, j; | ||
12 | I2D *out; | ||
13 | out = iMallocHandle(rows, cols); | ||
14 | |||
15 | for(i=0; i<rows; i++) { | ||
16 | for(j=0; j<cols; j++) { | ||
17 | subsref(out,i,j) = val; | ||
18 | } | ||
19 | } | ||
20 | return out; | ||
21 | |||
22 | } | ||
diff --git a/SD-VBS/common/c/iSort.c b/SD-VBS/common/c/iSort.c new file mode 100644 index 0000000..5dbdfb9 --- /dev/null +++ b/SD-VBS/common/c/iSort.c | |||
@@ -0,0 +1,43 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | I2D* iSort(I2D* in, int dim) | ||
8 | { | ||
9 | I2D *sorted; | ||
10 | int rows, cols, i, j, k, temp; | ||
11 | |||
12 | rows = in->height; | ||
13 | cols = in->width; | ||
14 | |||
15 | sorted = iDeepCopy(in); | ||
16 | |||
17 | for(k=0; k<cols; k++) | ||
18 | { | ||
19 | for(i=0; i<rows; i++) | ||
20 | { | ||
21 | for(j=i+1; j<rows; j++) | ||
22 | { | ||
23 | int sik, sjk; | ||
24 | sik = subsref(sorted,i,k); | ||
25 | sjk = subsref(sorted,j,k); | ||
26 | |||
27 | if(sik < sjk) | ||
28 | { | ||
29 | temp = sjk; | ||
30 | sjk = sik; | ||
31 | sik = temp; | ||
32 | } | ||
33 | } | ||
34 | } | ||
35 | } | ||
36 | |||
37 | return sorted; | ||
38 | |||
39 | } | ||
40 | |||
41 | |||
42 | |||
43 | |||
diff --git a/SD-VBS/common/c/iSortIndices.c b/SD-VBS/common/c/iSortIndices.c new file mode 100644 index 0000000..5939c32 --- /dev/null +++ b/SD-VBS/common/c/iSortIndices.c | |||
@@ -0,0 +1,47 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | I2D* iSortIndices(I2D* in, int dim) | ||
8 | { | ||
9 | I2D *sorted; | ||
10 | int rows, cols, i, j, k, temp; | ||
11 | I2D *ind; | ||
12 | |||
13 | rows = in->height; | ||
14 | cols = in->width; | ||
15 | |||
16 | sorted = iDeepCopy(in); | ||
17 | ind = iMallocHandle(rows, cols); | ||
18 | |||
19 | for(i=0; i<cols; i++) | ||
20 | for(j=0; j<rows; j++) | ||
21 | subsref(ind,j,i) = 0; | ||
22 | |||
23 | for(k=0; k<cols; k++) | ||
24 | { | ||
25 | for(i=0; i<rows; i++) | ||
26 | { | ||
27 | int localMax = subsref(in,i,k); | ||
28 | int localIndex = i; | ||
29 | subsref(ind,i,k) = i; | ||
30 | for(j=0; j<rows; j++) | ||
31 | { | ||
32 | if(localMax < subsref(in,j,k)) | ||
33 | { | ||
34 | subsref(ind,i,k) = j; | ||
35 | localMax = subsref(in,j,k); | ||
36 | localIndex = j; | ||
37 | } | ||
38 | } | ||
39 | subsref(in,localIndex,k) = 0; | ||
40 | } | ||
41 | } | ||
42 | |||
43 | return ind; | ||
44 | } | ||
45 | |||
46 | |||
47 | |||
diff --git a/SD-VBS/common/c/iTimes.c b/SD-VBS/common/c/iTimes.c new file mode 100644 index 0000000..479c39d --- /dev/null +++ b/SD-VBS/common/c/iTimes.c | |||
@@ -0,0 +1,22 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | I2D* iTimes(I2D* a, I2D* b) | ||
8 | { | ||
9 | I2D *c; | ||
10 | int i, j, rows, cols; | ||
11 | |||
12 | rows = a->height; | ||
13 | cols = a->width; | ||
14 | |||
15 | c = iMallocHandle(rows, cols); | ||
16 | |||
17 | for(i=0; i<(rows*cols); i++) | ||
18 | asubsref(c,i) = asubsref(a,i) * asubsref(b,i); | ||
19 | |||
20 | return c; | ||
21 | } | ||
22 | |||
diff --git a/SD-VBS/common/c/iTranspose.c b/SD-VBS/common/c/iTranspose.c new file mode 100644 index 0000000..79b65d2 --- /dev/null +++ b/SD-VBS/common/c/iTranspose.c | |||
@@ -0,0 +1,26 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | I2D* iTranspose(I2D* a) | ||
8 | { | ||
9 | I2D *out; | ||
10 | int m, p, p1, n, i, j, k; | ||
11 | int temp; | ||
12 | |||
13 | m = a->height; | ||
14 | n = a->width; | ||
15 | |||
16 | out = iMallocHandle(n, m); | ||
17 | k = 0; | ||
18 | for(i=0; i<n; i++) | ||
19 | { | ||
20 | for(j=0; j<m; j++) | ||
21 | asubsref(out,k++) = subsref(a,j,i); | ||
22 | } | ||
23 | |||
24 | return out; | ||
25 | } | ||
26 | |||
diff --git a/SD-VBS/common/c/iVertcat.c b/SD-VBS/common/c/iVertcat.c new file mode 100644 index 0000000..2c2d857 --- /dev/null +++ b/SD-VBS/common/c/iVertcat.c | |||
@@ -0,0 +1,34 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | I2D* iVertcat(I2D* matrix1, I2D* matrix2) | ||
8 | { | ||
9 | I2D *outMatrix; | ||
10 | int row1, col1, row2, col2, i, j, k; | ||
11 | |||
12 | row1 = matrix1->height; | ||
13 | col1 = matrix1->width; | ||
14 | |||
15 | row2 = matrix2->height; | ||
16 | col2 = matrix2->width; | ||
17 | |||
18 | outMatrix = iMallocHandle(row1+row2, col1); | ||
19 | |||
20 | for( i=0; i<col1; i++) | ||
21 | { | ||
22 | for (j=0; j<row1; j++) | ||
23 | { | ||
24 | subsref(outMatrix,j,i) = subsref(matrix1,j,i); | ||
25 | } | ||
26 | for( k=0; k<row2; k++) | ||
27 | { | ||
28 | subsref(outMatrix,(k+row1),i) = subsref(matrix2,k,i); | ||
29 | } | ||
30 | } | ||
31 | return outMatrix; | ||
32 | } | ||
33 | |||
34 | |||
diff --git a/SD-VBS/common/c/ifDeepCopy.c b/SD-VBS/common/c/ifDeepCopy.c new file mode 100644 index 0000000..a899340 --- /dev/null +++ b/SD-VBS/common/c/ifDeepCopy.c | |||
@@ -0,0 +1,25 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include <math.h> | ||
6 | #include "sdvbs_common.h" | ||
7 | |||
8 | I2D* ifDeepCopy(F2D* in) | ||
9 | { | ||
10 | int i, j; | ||
11 | I2D *out; | ||
12 | int rows, cols; | ||
13 | |||
14 | rows = in->height; | ||
15 | cols = in->width; | ||
16 | |||
17 | out = iMallocHandle(rows, cols); | ||
18 | |||
19 | for(i=0; i<rows; i++) | ||
20 | for(j=0; j<cols; j++) | ||
21 | subsref(out,i,j) = (int)(subsref(in,i,j)); | ||
22 | |||
23 | return out; | ||
24 | |||
25 | } | ||
diff --git a/SD-VBS/common/c/ifMtimes.c b/SD-VBS/common/c/ifMtimes.c new file mode 100644 index 0000000..15b3631 --- /dev/null +++ b/SD-VBS/common/c/ifMtimes.c | |||
@@ -0,0 +1,38 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | F2D* ifMtimes(I2D* a, F2D* b) | ||
8 | { | ||
9 | F2D *out; | ||
10 | int m, p, p1, n, i, j, k; | ||
11 | float temp; | ||
12 | |||
13 | m = a->height; | ||
14 | p = a->width; | ||
15 | |||
16 | p1 = b->height; | ||
17 | n = b->width; | ||
18 | |||
19 | out = fMallocHandle(m,n); | ||
20 | |||
21 | for(i=0; i<m; i++) | ||
22 | { | ||
23 | for(j=0; j<n; j++) | ||
24 | { | ||
25 | temp = 0; | ||
26 | for(k=0; k<p; k++) | ||
27 | { | ||
28 | temp += subsref(b,k,j) * subsref(a,i,k); | ||
29 | } | ||
30 | subsref(out,i,j) = temp; | ||
31 | } | ||
32 | } | ||
33 | |||
34 | return out; | ||
35 | } | ||
36 | |||
37 | |||
38 | |||
diff --git a/SD-VBS/common/c/iiConv2.c b/SD-VBS/common/c/iiConv2.c new file mode 100644 index 0000000..436b206 --- /dev/null +++ b/SD-VBS/common/c/iiConv2.c | |||
@@ -0,0 +1,55 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | I2D* iiConv2(I2D* a, I2D* b) | ||
8 | { | ||
9 | I2D *c; | ||
10 | I2D *out; | ||
11 | int ma, na, mb, nb, ci, cj, i, j, m, n; | ||
12 | int r_index, c_index; | ||
13 | |||
14 | ma = a->height; | ||
15 | na = a->width; | ||
16 | |||
17 | mb = b->height; | ||
18 | nb = b->width; | ||
19 | |||
20 | r_index = ceil((mb + 1.0)/2.0); | ||
21 | c_index = ceil((nb + 1.0)/2.0); | ||
22 | |||
23 | ci = ma+mb-1; | ||
24 | cj = na+nb-1; | ||
25 | |||
26 | c = iSetArray(ci, cj, 0); | ||
27 | |||
28 | for(i=0; i<ci; i++) | ||
29 | { | ||
30 | for(j=0; j<cj; j++) | ||
31 | { | ||
32 | for(m=0; m<ma; m++) | ||
33 | { | ||
34 | for(n=0; n<na; n++) | ||
35 | { | ||
36 | if( (i-m)>=0 && (j-n)>=0 && (i-m)<mb && (j-n)<nb ) | ||
37 | subsref(c,i,j) += subsref(a,m,n) * subsref(b,i-m,j-n); | ||
38 | } | ||
39 | } | ||
40 | |||
41 | } | ||
42 | } | ||
43 | |||
44 | out = iMallocHandle(ma, na); | ||
45 | for(i=0; i<ma; i++) | ||
46 | { | ||
47 | for(j=0; j<na; j++) | ||
48 | { | ||
49 | subsref(out,i,j) = subsref(c,(i+r_index-1),(j+c_index-1)); | ||
50 | } | ||
51 | } | ||
52 | |||
53 | |||
54 | return out; | ||
55 | } | ||
diff --git a/SD-VBS/common/c/imageBlur.c b/SD-VBS/common/c/imageBlur.c new file mode 100644 index 0000000..8e3ad92 --- /dev/null +++ b/SD-VBS/common/c/imageBlur.c | |||
@@ -0,0 +1,67 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | F2D* imageBlur(I2D* imageIn) | ||
8 | { | ||
9 | int rows, cols; | ||
10 | F2D *imageOut, *tempOut; | ||
11 | float temp; | ||
12 | I2D *kernel; | ||
13 | int k, kernelSize, startCol, endCol, halfKernel, startRow, endRow, i, j, kernelSum; | ||
14 | |||
15 | rows = imageIn->height; | ||
16 | cols = imageIn->width; | ||
17 | |||
18 | imageOut = fSetArray(rows, cols, 0); | ||
19 | tempOut = fSetArray(rows, cols, 0); | ||
20 | kernel = iMallocHandle(1, 5); | ||
21 | |||
22 | asubsref(kernel,0) = 1; | ||
23 | asubsref(kernel,1) = 4; | ||
24 | asubsref(kernel,2) = 6; | ||
25 | asubsref(kernel,3) = 4; | ||
26 | asubsref(kernel,4) = 1; | ||
27 | kernelSize = 5; | ||
28 | kernelSum = 16; | ||
29 | |||
30 | startCol = 2; | ||
31 | endCol = cols - 2; | ||
32 | halfKernel = 2; | ||
33 | |||
34 | startRow = 2; | ||
35 | endRow = rows - 2; | ||
36 | |||
37 | for(i=startRow; i<endRow; i++){ | ||
38 | for(j=startCol; j<endCol; j++) | ||
39 | { | ||
40 | temp = 0; | ||
41 | for(k=-halfKernel; k<=halfKernel; k++) | ||
42 | { | ||
43 | temp += subsref(imageIn,i,j+k) * asubsref(kernel,k+halfKernel); | ||
44 | } | ||
45 | subsref(tempOut,i,j) = temp/kernelSum; | ||
46 | } | ||
47 | } | ||
48 | |||
49 | for(i=startRow; i<endRow; i++) | ||
50 | { | ||
51 | for(j=startCol; j<endCol; j++) | ||
52 | { | ||
53 | temp = 0; | ||
54 | for(k=-halfKernel; k<=halfKernel; k++) | ||
55 | { | ||
56 | temp += subsref(tempOut,(i+k),j) * asubsref(kernel,k+halfKernel); | ||
57 | } | ||
58 | subsref(imageOut,i,j) = temp/kernelSum; | ||
59 | } | ||
60 | } | ||
61 | |||
62 | fFreeHandle(tempOut); | ||
63 | iFreeHandle(kernel); | ||
64 | return imageOut; | ||
65 | } | ||
66 | |||
67 | |||
diff --git a/SD-VBS/common/c/imageReblur.c b/SD-VBS/common/c/imageReblur.c new file mode 100644 index 0000000..1755f67 --- /dev/null +++ b/SD-VBS/common/c/imageReblur.c | |||
@@ -0,0 +1,67 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | F2D* imageReblur(I2D* imageIn, F2D* imageOut, F2D* tempOut, I2D* kernel) | ||
8 | { | ||
9 | int rows, cols; | ||
10 | //F2D *imageOut, *tempOut; | ||
11 | float temp; | ||
12 | //I2D *kernel; | ||
13 | int k, kernelSize, startCol, endCol, halfKernel, startRow, endRow, i, j, kernelSum; | ||
14 | |||
15 | rows = imageIn->height; | ||
16 | cols = imageIn->width; | ||
17 | |||
18 | fResetArray(imageOut, rows, cols, 0); | ||
19 | fResetArray(tempOut, rows, cols, 0); | ||
20 | //kernel = iMallocHandle(1, 5); | ||
21 | |||
22 | asubsref(kernel,0) = 1; | ||
23 | asubsref(kernel,1) = 4; | ||
24 | asubsref(kernel,2) = 6; | ||
25 | asubsref(kernel,3) = 4; | ||
26 | asubsref(kernel,4) = 1; | ||
27 | kernelSize = 5; | ||
28 | kernelSum = 16; | ||
29 | |||
30 | startCol = 2; | ||
31 | endCol = cols - 2; | ||
32 | halfKernel = 2; | ||
33 | |||
34 | startRow = 2; | ||
35 | endRow = rows - 2; | ||
36 | |||
37 | for(i=startRow; i<endRow; i++){ | ||
38 | for(j=startCol; j<endCol; j++) | ||
39 | { | ||
40 | temp = 0; | ||
41 | for(k=-halfKernel; k<=halfKernel; k++) | ||
42 | { | ||
43 | temp += subsref(imageIn,i,j+k) * asubsref(kernel,k+halfKernel); | ||
44 | } | ||
45 | subsref(tempOut,i,j) = temp/kernelSum; | ||
46 | } | ||
47 | } | ||
48 | |||
49 | for(i=startRow; i<endRow; i++) | ||
50 | { | ||
51 | for(j=startCol; j<endCol; j++) | ||
52 | { | ||
53 | temp = 0; | ||
54 | for(k=-halfKernel; k<=halfKernel; k++) | ||
55 | { | ||
56 | temp += subsref(tempOut,(i+k),j) * asubsref(kernel,k+halfKernel); | ||
57 | } | ||
58 | subsref(imageOut,i,j) = temp/kernelSum; | ||
59 | } | ||
60 | } | ||
61 | |||
62 | //fFreeHandle(tempOut); | ||
63 | //iFreeHandle(kernel); | ||
64 | return imageOut; | ||
65 | } | ||
66 | |||
67 | |||
diff --git a/SD-VBS/common/c/imageResize.c b/SD-VBS/common/c/imageResize.c new file mode 100644 index 0000000..72c0881 --- /dev/null +++ b/SD-VBS/common/c/imageResize.c | |||
@@ -0,0 +1,78 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | F2D* imageResize(F2D* imageIn) | ||
8 | { | ||
9 | int m, k, rows, cols; | ||
10 | F2D *imageOut; | ||
11 | I2D *kernel; | ||
12 | float tempVal; | ||
13 | int kernelSize, startCol, endCol, halfKernel, startRow, endRow, i, j, kernelSum; | ||
14 | int outputRows, outputCols; | ||
15 | F2D *temp; | ||
16 | |||
17 | rows = imageIn->height; | ||
18 | cols = imageIn->width; | ||
19 | |||
20 | // level 1 is the base image. | ||
21 | |||
22 | outputRows = floor((rows+1)/2); | ||
23 | outputCols = floor((cols+1)/2); | ||
24 | |||
25 | temp = fSetArray(rows, outputCols, 0); | ||
26 | imageOut = fSetArray(outputRows, outputCols, 0); | ||
27 | kernel = iMallocHandle(1, 5); | ||
28 | |||
29 | asubsref(kernel,0) = 1; | ||
30 | asubsref(kernel,1) = 4; | ||
31 | asubsref(kernel,2) = 6; | ||
32 | asubsref(kernel,3) = 4; | ||
33 | asubsref(kernel,4) = 1; | ||
34 | kernelSize = 5; | ||
35 | kernelSum = 16; | ||
36 | |||
37 | startCol = 2; | ||
38 | endCol = cols - 2; | ||
39 | halfKernel = 2; | ||
40 | |||
41 | startRow = 2; | ||
42 | endRow = rows - 2; | ||
43 | |||
44 | for(i=startRow; i<endRow; i++) | ||
45 | { | ||
46 | m = 0; | ||
47 | for(j=startCol; j<endCol; j+=2) | ||
48 | { | ||
49 | tempVal = 0; | ||
50 | for(k=-halfKernel; k<=halfKernel; k++) | ||
51 | { | ||
52 | tempVal += subsref(imageIn,i,j+k) * asubsref(kernel,k+halfKernel); | ||
53 | } | ||
54 | subsref(temp,i,m) = tempVal/kernelSum; | ||
55 | m = m+1; | ||
56 | } | ||
57 | } | ||
58 | |||
59 | m = 0; | ||
60 | for(i=startRow; i<endRow; i+=2) | ||
61 | { | ||
62 | for(j=0; j<outputCols; j++) | ||
63 | { | ||
64 | tempVal = 0; | ||
65 | for(k=-halfKernel; k<=halfKernel; k++) | ||
66 | { | ||
67 | tempVal += subsref(temp,(i+k),j) * asubsref(kernel,k+halfKernel); | ||
68 | } | ||
69 | subsref(imageOut,m,j) = (tempVal/kernelSum); | ||
70 | } | ||
71 | m = m+1; | ||
72 | } | ||
73 | |||
74 | fFreeHandle(temp); | ||
75 | iFreeHandle(kernel); | ||
76 | return imageOut; | ||
77 | |||
78 | } | ||
diff --git a/SD-VBS/common/c/isMinus.c b/SD-VBS/common/c/isMinus.c new file mode 100644 index 0000000..da0eb89 --- /dev/null +++ b/SD-VBS/common/c/isMinus.c | |||
@@ -0,0 +1,23 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include <stdio.h> | ||
6 | #include <stdlib.h> | ||
7 | #include "sdvbs_common.h" | ||
8 | |||
9 | I2D* isMinus(I2D* a, int b) | ||
10 | { | ||
11 | I2D *c; | ||
12 | int i, j, rows, cols; | ||
13 | |||
14 | rows = a->height; | ||
15 | cols = a->width; | ||
16 | |||
17 | c = iMallocHandle(rows, cols); | ||
18 | |||
19 | for(i=0; i<(rows*cols); i++) | ||
20 | asubsref(c,i) = asubsref(a,i) - b; | ||
21 | |||
22 | return c; | ||
23 | } | ||
diff --git a/SD-VBS/common/c/isPlus.c b/SD-VBS/common/c/isPlus.c new file mode 100644 index 0000000..9c7438f --- /dev/null +++ b/SD-VBS/common/c/isPlus.c | |||
@@ -0,0 +1,22 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | I2D* isPlus(I2D* a, int b) | ||
8 | { | ||
9 | I2D *c; | ||
10 | int i, j, rows, cols; | ||
11 | |||
12 | rows = a->height; | ||
13 | cols = a->width; | ||
14 | |||
15 | c = iMallocHandle(rows, cols); | ||
16 | |||
17 | for(i=0; i<(rows*cols); i++) | ||
18 | asubsref(c,i) = asubsref(a,i) + b; | ||
19 | |||
20 | return c; | ||
21 | } | ||
22 | |||
diff --git a/SD-VBS/common/c/photonEndTiming.c b/SD-VBS/common/c/photonEndTiming.c new file mode 100644 index 0000000..b15c4de --- /dev/null +++ b/SD-VBS/common/c/photonEndTiming.c | |||
@@ -0,0 +1,22 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | /** C File **/ | ||
6 | #include <stdio.h> | ||
7 | #include <stdlib.h> | ||
8 | #include <string.h> | ||
9 | #include <assert.h> | ||
10 | #include <math.h> | ||
11 | #include "timingUtils.h" | ||
12 | #include "sdvbs_common.h" | ||
13 | |||
14 | unsigned int * photonEndTiming() | ||
15 | { | ||
16 | static unsigned int *array; | ||
17 | array = (unsigned int*)malloc(sizeof(unsigned int)*2); | ||
18 | |||
19 | magic_timing_begin(array[0], array[1]); | ||
20 | return array; | ||
21 | } | ||
22 | |||
diff --git a/SD-VBS/common/c/photonPrintTiming.c b/SD-VBS/common/c/photonPrintTiming.c new file mode 100644 index 0000000..06df530 --- /dev/null +++ b/SD-VBS/common/c/photonPrintTiming.c | |||
@@ -0,0 +1,22 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | /** C File **/ | ||
6 | #include <stdio.h> | ||
7 | #include <stdlib.h> | ||
8 | #include <string.h> | ||
9 | #include <assert.h> | ||
10 | #include <math.h> | ||
11 | #include "timingUtils.h" | ||
12 | #include "sdvbs_common.h" | ||
13 | |||
14 | void photonPrintTiming(unsigned int * elapsed) | ||
15 | { | ||
16 | if(elapsed[1] == 0) | ||
17 | printf("Cycles elapsed\t\t- %u\n\n", elapsed[0]); | ||
18 | else | ||
19 | printf("Cycles elapsed\t\t- %u%u\n\n", elapsed[1], elapsed[0]); | ||
20 | } | ||
21 | |||
22 | /** End of C Code **/ | ||
diff --git a/SD-VBS/common/c/photonReportTiming.c b/SD-VBS/common/c/photonReportTiming.c new file mode 100644 index 0000000..c41d103 --- /dev/null +++ b/SD-VBS/common/c/photonReportTiming.c | |||
@@ -0,0 +1,28 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | /** C File **/ | ||
6 | #include <stdio.h> | ||
7 | #include <stdlib.h> | ||
8 | #include <string.h> | ||
9 | #include <assert.h> | ||
10 | #include <math.h> | ||
11 | #include "timingUtils.h" | ||
12 | #include "sdvbs_common.h" | ||
13 | |||
14 | unsigned int * photonReportTiming(unsigned int* startCycles,unsigned int* endCycles) | ||
15 | { | ||
16 | |||
17 | static unsigned int *elapsed; | ||
18 | elapsed = (unsigned int*)malloc(sizeof(unsigned int)*2); | ||
19 | unsigned long long start = (((unsigned long long)0x0) | startCycles[0]) << 32 | startCycles[1]; | ||
20 | unsigned long long end = (((unsigned long long)0x0) | endCycles[0]) << 32 | endCycles[1]; | ||
21 | unsigned long long diff = end - start; | ||
22 | elapsed[0] = (unsigned int)(diff >> 32); | ||
23 | elapsed[1] = (unsigned int)(diff & 0xffffffff); | ||
24 | return elapsed; | ||
25 | |||
26 | } | ||
27 | |||
28 | /** End of C Code **/ | ||
diff --git a/SD-VBS/common/c/photonStartTiming.c b/SD-VBS/common/c/photonStartTiming.c new file mode 100644 index 0000000..0d0b2b1 --- /dev/null +++ b/SD-VBS/common/c/photonStartTiming.c | |||
@@ -0,0 +1,23 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | /** C File **/ | ||
6 | #include <stdio.h> | ||
7 | #include <stdlib.h> | ||
8 | #include <string.h> | ||
9 | #include <assert.h> | ||
10 | #include <math.h> | ||
11 | #include "timingUtils.h" | ||
12 | #include "sdvbs_common.h" | ||
13 | |||
14 | unsigned int* photonStartTiming() | ||
15 | { | ||
16 | static unsigned int *array; | ||
17 | |||
18 | array = (unsigned int*)malloc(sizeof(unsigned int)*2); | ||
19 | magic_timing_begin(array[0], array[1]); | ||
20 | return array; | ||
21 | } | ||
22 | |||
23 | /** End of C Code **/ | ||
diff --git a/SD-VBS/common/c/randWrapper.c b/SD-VBS/common/c/randWrapper.c new file mode 100644 index 0000000..cadcc32 --- /dev/null +++ b/SD-VBS/common/c/randWrapper.c | |||
@@ -0,0 +1,30 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | F2D* randWrapper(int m, int n) | ||
8 | { | ||
9 | F2D *out; | ||
10 | float seed; | ||
11 | int i,j; | ||
12 | |||
13 | out = fSetArray(m, n, 0); | ||
14 | seed = 0.9; | ||
15 | |||
16 | for(i=0; i<m; i++) | ||
17 | { | ||
18 | for(j=0; j<n; j++) | ||
19 | { | ||
20 | if(i<j) | ||
21 | subsref(out,i,j) = seed * ((i+1.0)/(j+1.0)); | ||
22 | else | ||
23 | subsref(out,i,j) = seed * ((j+1.0)/(i+1.0)); | ||
24 | } | ||
25 | } | ||
26 | |||
27 | return out; | ||
28 | } | ||
29 | |||
30 | |||
diff --git a/SD-VBS/common/c/randnWrapper.c b/SD-VBS/common/c/randnWrapper.c new file mode 100644 index 0000000..4701b0e --- /dev/null +++ b/SD-VBS/common/c/randnWrapper.c | |||
@@ -0,0 +1,40 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | #include <math.h> | ||
7 | F2D* randnWrapper(int m, int n) | ||
8 | { | ||
9 | F2D *out; | ||
10 | float seed; | ||
11 | int i,j; | ||
12 | |||
13 | out = fSetArray(m, n, 0); | ||
14 | seed = 0.9; | ||
15 | |||
16 | for(i=0; i<m; i++) | ||
17 | { | ||
18 | for(j=0; j<n; j++) | ||
19 | { | ||
20 | if(i<j) | ||
21 | subsref(out,i,j) = seed * ((i+1.0)/(j+1.0)); | ||
22 | else | ||
23 | subsref(out,i,j) = seed * ((j+1.0)/(i+1.0)); | ||
24 | } | ||
25 | } | ||
26 | |||
27 | for(i=0; i<m ;i++) | ||
28 | { | ||
29 | for(j=0; j<n; j++) | ||
30 | { | ||
31 | float w; | ||
32 | w = subsref(out,i,j); | ||
33 | w = ((-2.0 * log(w))/w); | ||
34 | subsref(out,i,j) = w; | ||
35 | } | ||
36 | } | ||
37 | |||
38 | return out; | ||
39 | } | ||
40 | |||
diff --git a/SD-VBS/common/c/readFile.c b/SD-VBS/common/c/readFile.c new file mode 100644 index 0000000..2c16abd --- /dev/null +++ b/SD-VBS/common/c/readFile.c | |||
@@ -0,0 +1,42 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "sdvbs_common.h" | ||
6 | |||
7 | F2D* readFile(unsigned char* fileName) | ||
8 | { | ||
9 | FILE* fp; | ||
10 | F2D *fill; | ||
11 | float temp; | ||
12 | int rows, cols; | ||
13 | int i, j; | ||
14 | |||
15 | fp = fopen(fileName, "r"); | ||
16 | if(fp == NULL) | ||
17 | { | ||
18 | printf("Error in file %s\n", fileName); | ||
19 | return NULL; | ||
20 | } | ||
21 | |||
22 | fscanf(fp, "%d", &cols); | ||
23 | fscanf(fp, "%d", &rows); | ||
24 | |||
25 | fill = fSetArray(rows, cols, 0); | ||
26 | |||
27 | for(i=0; i<rows; i++) | ||
28 | { | ||
29 | for(j=0; j<cols; j++) | ||
30 | { | ||
31 | fscanf(fp, "%f", &(subsref(fill,i,j)) ); | ||
32 | } | ||
33 | } | ||
34 | |||
35 | fclose(fp); | ||
36 | return fill; | ||
37 | } | ||
38 | |||
39 | |||
40 | |||
41 | |||
42 | |||
diff --git a/SD-VBS/common/c/readImage.c b/SD-VBS/common/c/readImage.c new file mode 100644 index 0000000..a4dd990 --- /dev/null +++ b/SD-VBS/common/c/readImage.c | |||
@@ -0,0 +1,112 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include <stdio.h> | ||
6 | #include <stdlib.h> | ||
7 | #include "sdvbs_common.h" | ||
8 | |||
9 | I2D* readImage(const char* pathName) | ||
10 | { | ||
11 | // Reading BMP image | ||
12 | char signature[2]; | ||
13 | int file_size; | ||
14 | short int reserved1; | ||
15 | short int reserved2; | ||
16 | int loc_of_bitmap; | ||
17 | |||
18 | int size_of_infoheader; | ||
19 | int width; | ||
20 | int height; | ||
21 | short int number_of_planes; | ||
22 | short int bits_per_pixel; | ||
23 | |||
24 | int compression_method; | ||
25 | int bytes_of_bitmap; | ||
26 | int hori_reso; | ||
27 | int vert_reso; | ||
28 | int no_of_colors; | ||
29 | int no_of_imp_colors; | ||
30 | |||
31 | int nI,nJ; | ||
32 | int pixSize; | ||
33 | |||
34 | unsigned char tempb,tempg,tempr,tempjunk[12]; | ||
35 | int ta; | ||
36 | I2D* srcImage; | ||
37 | |||
38 | FILE *input; | ||
39 | input = fopen(pathName,"rb"); | ||
40 | if(input == NULL) | ||
41 | { | ||
42 | perror("File pointer error"); | ||
43 | return NULL; | ||
44 | } | ||
45 | else | ||
46 | { | ||
47 | //start of header information | ||
48 | fread(&signature,sizeof(signature),1,input); | ||
49 | fread(&file_size,sizeof(file_size),1,input); | ||
50 | fread(&reserved1,sizeof(reserved1),1,input); | ||
51 | fread(&reserved2,sizeof(reserved2),1,input); | ||
52 | fread(&loc_of_bitmap,sizeof(loc_of_bitmap),1,input); | ||
53 | |||
54 | fread(&size_of_infoheader,sizeof(size_of_infoheader),1,input); | ||
55 | fread(&width,sizeof(width),1,input); // Reads the width of the image | ||
56 | fread(&height,sizeof(height),1,input); // Reads the height of the image | ||
57 | fread(&number_of_planes,sizeof(number_of_planes),1,input); | ||
58 | fread(&bits_per_pixel,sizeof(bits_per_pixel),1,input); | ||
59 | fread(&compression_method,sizeof(compression_method),1,input); | ||
60 | fread(&bytes_of_bitmap,sizeof(bytes_of_bitmap),1,input); | ||
61 | |||
62 | fread(&hori_reso,sizeof(hori_reso),1,input); | ||
63 | fread(&vert_reso,sizeof(vert_reso),1,input); | ||
64 | fread(&no_of_colors,sizeof(no_of_colors),1,input); | ||
65 | fread(&no_of_imp_colors,sizeof(no_of_imp_colors),1,input); | ||
66 | //end of header information | ||
67 | |||
68 | srcImage = iMallocHandle(height, width); | ||
69 | |||
70 | // Conditions to check whether the BMP is interleaved and handling few exceptions | ||
71 | if(srcImage->height <= 0 || srcImage->width <= 0 || signature[0] != 'B' || signature[1] != 'M' || ( bits_per_pixel !=24 && bits_per_pixel !=8 ) ) | ||
72 | { | ||
73 | printf("ERROR in BMP read: The input file is not in standard BMP format"); | ||
74 | return NULL; | ||
75 | } | ||
76 | fseek(input,loc_of_bitmap,SEEK_SET); | ||
77 | |||
78 | if (bits_per_pixel == 8) | ||
79 | { | ||
80 | for(nI = (height - 1); nI >= 0 ; nI--) | ||
81 | { | ||
82 | for(nJ = 0;nJ < width; nJ++) | ||
83 | { | ||
84 | fread(&tempg,sizeof(unsigned char),1,input); | ||
85 | subsref(srcImage,nI,nJ) = (int)tempg; | ||
86 | } | ||
87 | } | ||
88 | } | ||
89 | else if (bits_per_pixel == 24) | ||
90 | { | ||
91 | for(nI = (height - 1); nI >= 0 ; nI--) | ||
92 | { | ||
93 | for(nJ = 0;nJ < width; nJ++) | ||
94 | { | ||
95 | fread(&tempb,sizeof(unsigned char),1,input); | ||
96 | fread(&tempg,sizeof(unsigned char),1,input); | ||
97 | fread(&tempr,sizeof(unsigned char),1,input); | ||
98 | ta = (3*tempr + 6*tempg + tempb)/10; | ||
99 | ta = tempg; | ||
100 | subsref(srcImage,nI,nJ) = (int)ta; | ||
101 | } | ||
102 | } | ||
103 | } | ||
104 | else | ||
105 | { | ||
106 | return NULL; | ||
107 | } | ||
108 | |||
109 | fclose(input); | ||
110 | return srcImage; | ||
111 | } | ||
112 | } | ||
diff --git a/SD-VBS/common/c/sdvbs_common.h b/SD-VBS/common/c/sdvbs_common.h new file mode 100644 index 0000000..14e28b2 --- /dev/null +++ b/SD-VBS/common/c/sdvbs_common.h | |||
@@ -0,0 +1,139 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #ifndef _SDVBS_COMMON_ | ||
6 | #define _SDVBS_COMMON_ | ||
7 | |||
8 | #include <stdio.h> | ||
9 | #include <stdlib.h> | ||
10 | #include <math.h> | ||
11 | |||
12 | typedef struct | ||
13 | { | ||
14 | int width; | ||
15 | int height; | ||
16 | int data[]; | ||
17 | }I2D; | ||
18 | |||
19 | typedef struct | ||
20 | { | ||
21 | int width; | ||
22 | int height; | ||
23 | unsigned int data[]; | ||
24 | }UI2D; | ||
25 | |||
26 | typedef struct | ||
27 | { | ||
28 | int width; | ||
29 | int height; | ||
30 | float data[]; | ||
31 | }F2D; | ||
32 | |||
33 | #define subsref(a,i,j) a->data[(i) * a->width + (j)] | ||
34 | #define asubsref(a,i) a->data[i] | ||
35 | #define arrayref(a,i) a[i] | ||
36 | |||
37 | /** Image read and write **/ | ||
38 | I2D* readImage(const char* pathName);; | ||
39 | F2D* readFile(unsigned char* fileName); | ||
40 | |||
41 | |||
42 | /** Memory allocation functions **/ | ||
43 | I2D* iMallocHandle(int rows, int cols); | ||
44 | F2D* fMallocHandle(int rows, int cols); | ||
45 | F2D* fResetHandle(F2D* out, int rows, int cols); | ||
46 | UI2D* uiMallocHandle(int rows, int cols); | ||
47 | |||
48 | void iFreeHandle(I2D* out); | ||
49 | void fFreeHandle(F2D* out); | ||
50 | void uiFreeHandle(UI2D* out); | ||
51 | |||
52 | /** Memory copy/set function **/ | ||
53 | I2D* iSetArray(int rows, int cols, int val); | ||
54 | void iResetArray(I2D* out, int rows, int cols, int val); | ||
55 | F2D* fSetArray(int rows, int cols, float val); | ||
56 | void fResetArray(F2D* out, int rows, int cols, float val); | ||
57 | I2D* iDeepCopy(I2D* in); | ||
58 | F2D* fDeepCopy(F2D* in); | ||
59 | F2D* fCopy(F2D* in, F2D* out); | ||
60 | I2D* iDeepCopyRange(I2D* in, int startRow, int numberRows, int startCol, int numberCols); | ||
61 | F2D* fDeepCopyRange(F2D* in, int startRow, int numberRows, int startCol, int numberCols); | ||
62 | F2D* fiDeepCopy(I2D* in); | ||
63 | void fiCopy(F2D* out, I2D* in); | ||
64 | I2D* ifDeepCopy(F2D* in); | ||
65 | |||
66 | |||
67 | /** Matrix operations - concatenation, reshape **/ | ||
68 | F2D* ffVertcat(F2D* matrix1, F2D* matrix2); | ||
69 | I2D* iVertcat(I2D* matrix1, I2D* matrix2); | ||
70 | F2D* fHorzcat(F2D* a, F2D* b); | ||
71 | I2D* iHorzcat(I2D* a, I2D* b); | ||
72 | F2D* horzcat(F2D* a, F2D* b, F2D* c); | ||
73 | F2D* fTranspose(F2D* a); | ||
74 | I2D* iTranspose(I2D* a); | ||
75 | F2D* fReshape(F2D* in, int rows, int cols); | ||
76 | I2D* iReshape(I2D* in, int rows, int cols); | ||
77 | |||
78 | |||
79 | /** Binary Operations **/ | ||
80 | F2D* fDivide(F2D* a, float b); | ||
81 | F2D* fMdivide(F2D* a, F2D* b); | ||
82 | F2D* ffDivide(F2D* a, F2D* b); | ||
83 | F2D* ffTimes(F2D* a, float b); | ||
84 | F2D* fTimes(F2D* a, F2D* b); | ||
85 | I2D* iTimes(I2D* a, I2D* b); | ||
86 | F2D* fMtimes(F2D* a, F2D* b); | ||
87 | F2D* ifMtimes(I2D* a, F2D* b); | ||
88 | F2D* fMinus(F2D* a, F2D* b); | ||
89 | I2D* iMinus(I2D* a, I2D* b); | ||
90 | I2D* isMinus(I2D* a, int b); | ||
91 | F2D* fPlus(F2D* a, F2D* b); | ||
92 | I2D* isPlus(I2D* a, int b); | ||
93 | |||
94 | |||
95 | /** Filtering operations **/ | ||
96 | F2D* calcSobel_dX(F2D* imageIn); | ||
97 | F2D* calcSobel_dY(F2D* imageIn); | ||
98 | F2D* ffConv2(F2D* a, F2D* b); | ||
99 | F2D* fiConv2(I2D* a, F2D* b); | ||
100 | F2D* ffConv2_dY(F2D* a, F2D* b); | ||
101 | F2D* ffiConv2(F2D* a, I2D* b); | ||
102 | I2D* iiConv2(I2D* a, I2D* b); | ||
103 | |||
104 | |||
105 | /** Image Transformations - resize, integration etc **/ | ||
106 | F2D* imageResize(F2D* imageIn); | ||
107 | F2D* imageBlur(I2D* imageIn); | ||
108 | F2D* imageReblur(I2D* imageIn, F2D* imageOut, F2D* tempOut, I2D* kernel); | ||
109 | |||
110 | |||
111 | /** Support functions **/ | ||
112 | F2D* fFind3(F2D* in); | ||
113 | F2D* fSum2(F2D* inMat, int dir); | ||
114 | F2D* fSum(F2D* inMat); | ||
115 | I2D* iSort(I2D* in, int dim); | ||
116 | F2D* fSort(F2D* in, int dim); | ||
117 | I2D* iSortIndices(I2D* in, int dim); | ||
118 | I2D* fSortIndices(F2D* input, int dim); | ||
119 | I2D* fResortIndices(F2D* input, int dim, F2D* in, I2D* ind); | ||
120 | F2D* randnWrapper(int m, int n); | ||
121 | F2D* randWrapper(int m, int n); | ||
122 | |||
123 | |||
124 | /** Checking functions **/ | ||
125 | int selfCheck(I2D* in1, char* path, int tol); | ||
126 | int fSelfCheck(F2D* in1, char* path, float tol); | ||
127 | void writeMatrix(I2D* input, char* inpath); | ||
128 | void fWriteMatrix(F2D* input, char* inpath); | ||
129 | int iCheck(I2D* in1, I2D* in2); | ||
130 | |||
131 | /** Timing functions **/ | ||
132 | unsigned int* photonEndTiming(); | ||
133 | unsigned int* photonStartTiming(); | ||
134 | unsigned int* photonReportTiming(unsigned int* startCycles,unsigned int* endCycles); | ||
135 | void photonPrintTiming(unsigned int * elapsed); | ||
136 | |||
137 | |||
138 | #endif | ||
139 | |||
diff --git a/SD-VBS/common/c/selfCheck.c b/SD-VBS/common/c/selfCheck.c new file mode 100644 index 0000000..e79a6a4 --- /dev/null +++ b/SD-VBS/common/c/selfCheck.c | |||
@@ -0,0 +1,65 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include <stdio.h> | ||
6 | #include <stdlib.h> | ||
7 | #include <math.h> | ||
8 | #include "sdvbs_common.h" | ||
9 | |||
10 | int selfCheck(I2D* in1, char* path, int tol) | ||
11 | { | ||
12 | int r1, c1, ret=1; | ||
13 | FILE* fd; | ||
14 | int count=0, *buffer, i, j; | ||
15 | char file[100]; | ||
16 | int* data = in1->data; | ||
17 | |||
18 | r1 = in1->height; | ||
19 | c1 = in1->width; | ||
20 | |||
21 | buffer = (int*)malloc(sizeof(int)*r1*c1); | ||
22 | |||
23 | sprintf(file, "%s", path); | ||
24 | fd = fopen(file, "r"); | ||
25 | if(fd == NULL) | ||
26 | { | ||
27 | printf("Error: Expected file not opened \n"); | ||
28 | return -1; | ||
29 | } | ||
30 | |||
31 | while(!feof(fd)) | ||
32 | { | ||
33 | fscanf(fd, "%d", &buffer[count]); | ||
34 | count++; | ||
35 | } | ||
36 | count--; | ||
37 | |||
38 | if(count < (r1*c1)) | ||
39 | { | ||
40 | printf("Checking error: dimensions mismatch. Expected = %d, Observed = %d \n", count, (r1*c1)); | ||
41 | return -1; | ||
42 | } | ||
43 | |||
44 | for(i=0; i<r1*c1; i++) | ||
45 | { | ||
46 | if((abs(data[i])-abs(buffer[i]))>tol || (abs(buffer[i])-abs(data[i]))>tol) | ||
47 | { | ||
48 | printf("Checking error: Values mismtach at %d element\n", i); | ||
49 | printf("Expected value = %d, observed = %d\n", buffer[i], data[i] ); | ||
50 | return -1; | ||
51 | } | ||
52 | } | ||
53 | |||
54 | fclose(fd); | ||
55 | free(buffer); | ||
56 | printf("Verification\t\t- Successful\n"); | ||
57 | return ret; | ||
58 | } | ||
59 | |||
60 | |||
61 | |||
62 | |||
63 | |||
64 | |||
65 | |||
diff --git a/SD-VBS/common/c/timingUtils.h b/SD-VBS/common/c/timingUtils.h new file mode 100644 index 0000000..818728f --- /dev/null +++ b/SD-VBS/common/c/timingUtils.h | |||
@@ -0,0 +1,99 @@ | |||
1 | #ifdef GCC | ||
2 | #define magic_timing_begin(cycleLo, cycleHi) {\ | ||
3 | asm volatile( "rdtsc": "=a" (cycleLo), "=d" (cycleHi)); \ | ||
4 | }\ | ||
5 | |||
6 | #define magic_timing_end(cycleLo, cycleHi) {\ | ||
7 | unsigned tempCycleLo, tempCycleHi; \ | ||
8 | asm volatile( "rdtsc": "=a" (tempCycleLo), "=d" (tempCycleHi)); \ | ||
9 | cycleLo = tempCycleLo-cycleLo;\ | ||
10 | cycleHi = tempCycleHi - cycleHi;\ | ||
11 | }\ | ||
12 | |||
13 | |||
14 | |||
15 | #define magic_timing_report(cycleLo, cycleHi) {\ | ||
16 | printf("Timing report: %d %d\n", cycleLo, cycleHi); \ | ||
17 | }\ | ||
18 | |||
19 | |||
20 | |||
21 | |||
22 | #endif | ||
23 | |||
24 | #ifdef METRO | ||
25 | |||
26 | #define magic_timing_begin(cycleLo, cycleHi) {\ | ||
27 | asm volatile( "mfsr $8, CYCLE_LO\n\t" \ | ||
28 | "mfsr $9, CYCLE_HI\n\t" \ | ||
29 | "addu %0, $8, $0\n\t" \ | ||
30 | "addu %1, $9, $0\n\t" \ | ||
31 | :"=r" (cycleLo), "=r" (cycleHi) \ | ||
32 | : \ | ||
33 | :"$8", "$9"\ | ||
34 | );\ | ||
35 | } | ||
36 | |||
37 | #define magic_timing_end(cycleLo, cycleHi) {\ | ||
38 | asm volatile( \ | ||
39 | "mfsr $8, CYCLE_LO\n\t" \ | ||
40 | "mfsr $9, CYCLE_HI\n\t" \ | ||
41 | "subu %0, $8, %0\n\t" \ | ||
42 | "subu %1, $9, %1\n\t" \ | ||
43 | :"=r" (cycleLo), "=r" (cycleHi) \ | ||
44 | : \ | ||
45 | :"$8", "$9"\ | ||
46 | ); \ | ||
47 | } | ||
48 | |||
49 | #define magic_timing_report(cycleLo, cycleHi) {\ | ||
50 | asm volatile( "addu $8, %0, $0\n\t" \ | ||
51 | "mtsr PASS $8\n\t" \ | ||
52 | "mtsr PASS $9\n\t" \ | ||
53 | : \ | ||
54 | :"r" (cycleLo), "r" (cycleHi) \ | ||
55 | : "$8", "$9" \ | ||
56 | );\ | ||
57 | } | ||
58 | |||
59 | //#define metro_magic_timing_report(cycleLo, cycleHi) {\ | ||
60 | // asm volatile( "nop\n\t");\ | ||
61 | //} | ||
62 | |||
63 | #endif | ||
64 | |||
65 | #ifdef BTL | ||
66 | |||
67 | #include "/u/kvs/raw/rawlib/archlib/include/raw.h" | ||
68 | |||
69 | #define magic_timing_begin(cycleLo, cycleHi) {\ | ||
70 | raw_magic_timing_report_begin();\ | ||
71 | } | ||
72 | |||
73 | #define magic_timing_end(cycleLo, cycleHi) {\ | ||
74 | raw_magic_timing_report_end(); \ | ||
75 | } | ||
76 | |||
77 | #define magic_timing_report(cycleLo, cycleHi) {\ | ||
78 | raw_magic_timing_report_print(); \ | ||
79 | } | ||
80 | |||
81 | |||
82 | // | ||
83 | //void metro_magic_timing_begin(int cycleLo, int cycleHi) | ||
84 | //{ | ||
85 | // raw_magic_timing_report_begin(); | ||
86 | //} | ||
87 | // | ||
88 | //void metro_magic_timing_end(int cycleLo, int cycleHi) | ||
89 | //{ | ||
90 | // raw_magic_timing_report_end(); | ||
91 | //} | ||
92 | // | ||
93 | //void metro_magic_timing_report(int cycleLo, int cycleHi) | ||
94 | //{ | ||
95 | // raw_magic_timing_report_print(); | ||
96 | // return; | ||
97 | //} | ||
98 | |||
99 | #endif | ||
diff --git a/SD-VBS/common/c/uiFreeHandle.c b/SD-VBS/common/c/uiFreeHandle.c new file mode 100644 index 0000000..ce64ad9 --- /dev/null +++ b/SD-VBS/common/c/uiFreeHandle.c | |||
@@ -0,0 +1,15 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include <stdio.h> | ||
6 | #include <stdlib.h> | ||
7 | #include "sdvbs_common.h" | ||
8 | |||
9 | void uiFreeHandle(UI2D* out) | ||
10 | { | ||
11 | free(out); | ||
12 | |||
13 | return; | ||
14 | } | ||
15 | |||
diff --git a/SD-VBS/common/c/uiMallocHandle.c b/SD-VBS/common/c/uiMallocHandle.c new file mode 100644 index 0000000..ee26d4c --- /dev/null +++ b/SD-VBS/common/c/uiMallocHandle.c | |||
@@ -0,0 +1,20 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include <stdio.h> | ||
6 | #include <stdlib.h> | ||
7 | #include "sdvbs_common.h" | ||
8 | |||
9 | UI2D* uiMallocHandle(int rows, int cols) | ||
10 | { | ||
11 | int i, j; | ||
12 | UI2D* out; | ||
13 | |||
14 | out = malloc(sizeof(UI2D) + sizeof(unsigned int)*rows*cols); | ||
15 | out->height = rows; | ||
16 | out->width = cols; | ||
17 | printf("uimalloc here\n"); | ||
18 | return out; | ||
19 | } | ||
20 | |||
diff --git a/SD-VBS/common/c/uiResetArray.c b/SD-VBS/common/c/uiResetArray.c new file mode 100644 index 0000000..249e570 --- /dev/null +++ b/SD-VBS/common/c/uiResetArray.c | |||
@@ -0,0 +1,19 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include <stdio.h> | ||
6 | #include <stdlib.h> | ||
7 | #include "sdvbs_common.h" | ||
8 | |||
9 | void uiResetArray(UI2D* out, int rows, int cols, int val) | ||
10 | { | ||
11 | int i, j; | ||
12 | |||
13 | |||
14 | for(i=0; i<rows; i++) | ||
15 | for(j=0; j<cols; j++) | ||
16 | subsref(out,i,j) = val; | ||
17 | |||
18 | |||
19 | } | ||
diff --git a/SD-VBS/common/c/uiSetArray.c b/SD-VBS/common/c/uiSetArray.c new file mode 100644 index 0000000..871a84a --- /dev/null +++ b/SD-VBS/common/c/uiSetArray.c | |||
@@ -0,0 +1,21 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include <stdio.h> | ||
6 | #include <stdlib.h> | ||
7 | #include "sdvbs_common.h" | ||
8 | |||
9 | UI2D* uiSetArray(int rows, int cols, int val) | ||
10 | { | ||
11 | int i, j; | ||
12 | UI2D *out; | ||
13 | out = uiMallocHandle(rows, cols); | ||
14 | |||
15 | for(i=0; i<rows; i++) | ||
16 | for(j=0; j<cols; j++) | ||
17 | subsref(out,i,j) = val; | ||
18 | |||
19 | return out; | ||
20 | |||
21 | } | ||
diff --git a/SD-VBS/common/c/writeMatrix.c b/SD-VBS/common/c/writeMatrix.c new file mode 100644 index 0000000..a457734 --- /dev/null +++ b/SD-VBS/common/c/writeMatrix.c | |||
@@ -0,0 +1,34 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include <stdio.h> | ||
6 | #include <stdlib.h> | ||
7 | #include "sdvbs_common.h" | ||
8 | |||
9 | void writeMatrix(I2D* input, char* inpath) | ||
10 | { | ||
11 | FILE* fp; | ||
12 | char im[100]; | ||
13 | int rows,cols, i, j; | ||
14 | |||
15 | sprintf(im, "%s/expected_C.txt", inpath); | ||
16 | fp = fopen(im, "w"); | ||
17 | |||
18 | rows = input->height; | ||
19 | cols = input->width; | ||
20 | |||
21 | for(i=0; i<rows; i++) | ||
22 | { | ||
23 | for(j=0; j<cols; j++) | ||
24 | { | ||
25 | fprintf(fp, "%d\t", subsref(input, i, j)); | ||
26 | } | ||
27 | fprintf(fp, "\n"); | ||
28 | } | ||
29 | |||
30 | fclose(fp); | ||
31 | } | ||
32 | |||
33 | |||
34 | |||
diff --git a/SD-VBS/common/makefiles/Makefile.common b/SD-VBS/common/makefiles/Makefile.common new file mode 100644 index 0000000..144adb2 --- /dev/null +++ b/SD-VBS/common/makefiles/Makefile.common | |||
@@ -0,0 +1,134 @@ | |||
1 | ################################# | ||
2 | # Author: Sravanthi Kota Venkata | ||
3 | ################################# | ||
4 | SHELL := /bin/bash | ||
5 | |||
6 | # Define MATLAB-PATH with the path to the MATLAB package | ||
7 | MATLAB_PATH = /pkg/bin/matlab | ||
8 | ifeq ($(filter matlab-run,$(MAKECMDGOALS)),matlab-run) | ||
9 | ifneq ($(wildcard $(MATLAB_PATH)),$(MATLAB_PATH)) | ||
10 | $(error Please set the appropriate MATLAB path in MATLAB_PATH variable) | ||
11 | endif | ||
12 | endif | ||
13 | |||
14 | ifeq ($(filter mcc-run,$(MAKECMDGOALS)),mcc-run) | ||
15 | ifneq ($(wildcard $(MATLAB_PATH)),$(MATLAB_PATH)) | ||
16 | $(error Please set the appropriate MATLAB path in MATLAB_PATH variable) | ||
17 | endif | ||
18 | endif | ||
19 | |||
20 | CC=gcc | ||
21 | override CFLAGS += -DGCC -D$(INPUT) -pthread -DCHECK | ||
22 | COMMON_DIR := $(TOP_DIR)/common/c | ||
23 | M_COMMON := $(TOP_DIR)/common/matlab | ||
24 | M_TOOLBOX=$(TOP_DIR)/common/toolbox | ||
25 | TIMING_DIR := $(TOP_DIR)/cycles/$(BMARK) | ||
26 | TIMES_DIR := $(TOP_DIR)/times/$(BMARK) | ||
27 | PRELOAD_TIMES_DIR := $(TOP_DIR)/preload-times/$(BMARK) | ||
28 | MTIMING_DIR := $(TOP_DIR)/cycles/$(BMARK) | ||
29 | BMARK_DIR := $(TOP_DIR)/benchmarks/$(BMARK) | ||
30 | TOOL_DIR := $(TOP_DIR)/tools | ||
31 | LIBLITMUS := /home/litmus/liblitmus | ||
32 | #The options set below and specific to each benchmark. Disparity takes 2 input images, whereas Tracking can take any >1 input images =. | ||
33 | |||
34 | # Variables exported from the benchmark specific Makefiles: | ||
35 | # BMARK | ||
36 | # INPUT - sqcif/qcif/cif | ||
37 | |||
38 | # Matlab source, data and result directory | ||
39 | |||
40 | M_DIR=$(BMARK_DIR)/src/matlab | ||
41 | M_DATA=$(BMARK_DIR)/data/$(INPUT) | ||
42 | M_RESULT=$(BMARK_DIR)/result | ||
43 | |||
44 | # C source, data and result directory | ||
45 | |||
46 | C_DIR=$(BMARK_DIR)/src/c | ||
47 | DATA_DIR=$(BMARK_DIR)/data/$(INPUT) | ||
48 | C_RESULT=$(M_RESULT) | ||
49 | |||
50 | # Source files for C and Common folders | ||
51 | |||
52 | C_SRC := $(wildcard $(C_DIR)/*.c) | ||
53 | COMMON_SRC := $(wildcard $(COMMON_DIR)/*.c) | ||
54 | |||
55 | # RULES | ||
56 | |||
57 | EXE = | ||
58 | INCLUDES = -I$(COMMON_DIR) -I$(C_DIR) -I${LIBLITMUS}/include -I${LIBLITMUS}/arch/arm/include | ||
59 | COMPILE_C = $(CC) $(CFLAGS) $(INCLUDES) -O2 | ||
60 | #COMPILE_C = $(CC) $(CFLAGS) -DGENERATE_OUTPUT -lm -O2 $(INCLUDES) | ||
61 | COMPILE_G = $(CC) $(CFLAGS) -g -lm $(INCLUDES) | ||
62 | COMPILE_PG = $(COMPILE_G) -pg | ||
63 | |||
64 | preload-run: compile | ||
65 | @echo preloaded timing | ||
66 | @echo 3 | tee /proc/sys/vm/drop_caches | ||
67 | @find ./ -iname "*.bmp" -exec sh -c '$(TOOL_DIR)/preload {} &' \; | ||
68 | @find ./ -iname "*.txt" -exec sh -c '$(TOOL_DIR)/preload {} &' \; | ||
69 | mkdir -p $(PRELOAD_TIMES_DIR) | ||
70 | @echo -e "Data set\t\t- $(INPUT)" | ||
71 | (time ./$(BMARK)$(EXE) $(DATA_DIR)) |& tee $(PRELOAD_TIMES_DIR)/T_$(INPUT).txt | ||
72 | @kill -2 `pgrep preload` | ||
73 | |||
74 | time-run: compile | ||
75 | mkdir -p $(TIMES_DIR) | ||
76 | @echo -e "Data set\t\t- $(INPUT)" | ||
77 | @echo 3 | tee /proc/sys/vm/drop_caches | ||
78 | (time ./$(BMARK)$(EXE) $(DATA_DIR)) |& tee $(TIMES_DIR)/T_$(INPUT).txt | ||
79 | |||
80 | c-run: compile | ||
81 | @echo -e "Data set\t\t- $(INPUT)" | ||
82 | mkdir -p $(TIMING_DIR) | ||
83 | @./$(BMARK)$(EXE) $(DATA_DIR) $(C_RESULT) | tee $(TIMING_DIR)/C_$(INPUT).txt | ||
84 | |||
85 | run: compile | ||
86 | @echo -e "Data set\t\t- $(INPUT)" | ||
87 | @./$(BMARK)$(EXE) $(DATA_DIR) $(C_RESULT) | ||
88 | |||
89 | rt-run: compile | ||
90 | @echo -e "Data set\t\t- $(INPUT)" | ||
91 | @./$(BMARK)$(EXE) $(BMARK)-$(INPUT) 5 0 12345 1 | ||
92 | |||
93 | debug: | ||
94 | @echo Running Debug C Version of the benchmark | ||
95 | @$(COMPILE_G) $(COMMON_SRC) $(C_SRC) -o $(BMARK)$(EXE) | ||
96 | @valgrind --leak-check=full ./$(BMARK)$(EXE) $(DATA_DIR) $(C_RESULT) | ||
97 | #@gdb ./$(BMARK)$(EXE) $(DATA_DIR) $(C_RESULT) | ||
98 | |||
99 | profile: compile-prof | ||
100 | @echo -e "Data set\t\t- $(INPUT)" | ||
101 | @./$(BMARK)$(EXE) $(DATA_DIR) $(C_RESULT) | ||
102 | @gprof $(BMARK)$(EXE) | ||
103 | |||
104 | compile-preload: | ||
105 | @$(COMPILE_C) $(TOOL_DIR)\preload.c -o $(TOOL_DIR)\preload | ||
106 | |||
107 | compile: $(C_SRC) | ||
108 | @echo | ||
109 | @echo -e "Benchmark\t\t- $(BMARK)" | ||
110 | @$(COMPILE_C) $(COMMON_SRC) $(C_SRC) -lrt -L$(LIBLITMUS) -llitmus -lm -w -o $(BMARK)$(EXE) | ||
111 | |||
112 | compile-prof: $(C_SRC) | ||
113 | @echo | ||
114 | @echo -e "Benchmark\t\t- $(BMARK)" | ||
115 | @$(COMPILE_PG) $(COMMON_SRC) $(C_SRC) -o $(BMARK)$(EXE) | ||
116 | |||
117 | matlab-run: | ||
118 | @echo | ||
119 | @echo -e "Benchmark\t\t- $(BMARK)" | ||
120 | @echo -e "Data set\t\t- $(INPUT)" | ||
121 | @cd $(M_DIR); $(MATLAB_PATH) -glnx86 -nosplash -nodisplay -r "script_run_profile('$(M_DATA)', '$(M_RESULT)', '$(INPUT)', '$(M_COMMON)', '$(M_TOOLBOX)'); quit" | tee $(MTIMING_DIR)/Matlab_$(INPUT).txt | ||
122 | |||
123 | mcc-run: | ||
124 | @echo Generating a C standalone application | ||
125 | cd $(M_DIR); $(MATLAB_PATH) -nosplash -nodesktop -r "mcc -m -v script_run_profile -d $(M_RESULT); quit" | ||
126 | |||
127 | all: c-run matlab-run mcc-run | ||
128 | |||
129 | clean: | ||
130 | @-rm $(BMARK) | ||
131 | |||
132 | |||
133 | |||
134 | |||
diff --git a/SD-VBS/common/makefiles/Makefile.include b/SD-VBS/common/makefiles/Makefile.include new file mode 100644 index 0000000..f1000b9 --- /dev/null +++ b/SD-VBS/common/makefiles/Makefile.include | |||
@@ -0,0 +1,16 @@ | |||
1 | find-dir-with = $(shell /usr/bin/perl -e 'chomp($$_ = `pwd`); while ($$_ ne "" && ! -e "$$_/$(1)") { m:(.*)/[^/]+/??:; $$_ = $$1; } print;') | ||
2 | |||
3 | # define canonical directories in starsearch | ||
4 | ifndef TOP_DIR | ||
5 | export TOP_DIR := $(call find-dir-with,.SD-VBS) | ||
6 | endif | ||
7 | |||
8 | export MAKEFILE_COMMON_DIR=$(TOP_DIR)/common/makefiles | ||
9 | |||
10 | # backward compatibility | ||
11 | |||
12 | ifeq ($(TOP_DIR),) | ||
13 | $(error file .SD-VBS not found -- try running 'gmake setup' at the top of your source tree) | ||
14 | endif | ||
15 | |||
16 | |||
diff --git a/SD-VBS/common/makefiles/Makefile.recurse b/SD-VBS/common/makefiles/Makefile.recurse new file mode 100644 index 0000000..ed575bb --- /dev/null +++ b/SD-VBS/common/makefiles/Makefile.recurse | |||
@@ -0,0 +1,41 @@ | |||
1 | # This file is included in the makefiles of the non-leaf nodes | ||
2 | # Thus the various targets in this file have to trickle down | ||
3 | # into the subdirectories | ||
4 | # List the subdirectories and call the target for each one of them | ||
5 | |||
6 | ################################################################ | ||
7 | # RECURSE | ||
8 | ################################################################ | ||
9 | # Listing the subdirectories | ||
10 | SUBDIRS = $(patsubst %/Makefile,%,$(wildcard */Makefile)) | ||
11 | |||
12 | RECURSE-DEPENDS = $(patsubst %,%.traverse,$(SUBDIRS)) | ||
13 | |||
14 | all: recurse | ||
15 | |||
16 | debug: recurse | ||
17 | |||
18 | clean: recurse | ||
19 | |||
20 | compile: recurse | ||
21 | |||
22 | c-run: recurse | ||
23 | |||
24 | matlab-run: recurse | ||
25 | |||
26 | mcc-run: recurse | ||
27 | |||
28 | recurse: $(RECURSE-DEPENDS) | ||
29 | |||
30 | time-run: recurse | ||
31 | |||
32 | preload-run: recurse | ||
33 | |||
34 | run: recurse | ||
35 | |||
36 | rt-run: recurse | ||
37 | |||
38 | # MAKECMDGOALS contains the gmake target specified on the command line | ||
39 | # it is defined automatically by gmake | ||
40 | %.traverse: | ||
41 | $(MAKE) -C $* $(MAKECMDGOALS) | ||
diff --git a/SD-VBS/common/support/buildTable.py b/SD-VBS/common/support/buildTable.py new file mode 100644 index 0000000..1a1a6aa --- /dev/null +++ b/SD-VBS/common/support/buildTable.py | |||
@@ -0,0 +1,54 @@ | |||
1 | import re | ||
2 | import sys | ||
3 | import os | ||
4 | |||
5 | def getExprName(fileName): | ||
6 | exprFileName = os.path.basename(fileName) | ||
7 | exprName = re.sub("\.txt", "", exprFileName) | ||
8 | exprName = re.sub("_","\t", exprName, 1) | ||
9 | exprName = re.sub("_", "", exprName) | ||
10 | return(exprName) | ||
11 | |||
12 | def getBmrkName(fileName): | ||
13 | benchmarkDir = os.path.dirname(fileName) | ||
14 | benchmarkName = os.path.basename(benchmarkDir) | ||
15 | return(benchmarkName) | ||
16 | |||
17 | def getCycleCountTup(fileName): | ||
18 | try: | ||
19 | inp = open(fileName, 'r') | ||
20 | except IOError, err: | ||
21 | print "ERROR: Could not open the inputFile:"+fileName | ||
22 | sys.exit(1) | ||
23 | globalTup = None | ||
24 | for currline in inp: | ||
25 | currline = currline.strip() | ||
26 | currline = currline.lower() | ||
27 | if(re.match("cycles elapsed", currline)): | ||
28 | valTup = re.findall("(\d+)", currline) | ||
29 | return(valTup) | ||
30 | |||
31 | if(globalTup != None): | ||
32 | return(globalTup) | ||
33 | else: | ||
34 | print "ERROR: INVALID INPUT FILE:"+fileName | ||
35 | sys.exit(2) | ||
36 | |||
37 | def main(): | ||
38 | if(len(sys.argv)<2): | ||
39 | print "USAGE: "+sys.argv[0]+" <inputFileName>" | ||
40 | sys.exit(1) | ||
41 | |||
42 | fileName = sys.argv[1] | ||
43 | exprName = getExprName(fileName) | ||
44 | benchmarkName = getBmrkName(fileName) | ||
45 | cycleCountTup = getCycleCountTup(fileName) | ||
46 | |||
47 | print "%-20s %-20s %10s\n" % (benchmarkName,exprName,cycleCountTup[0]) | ||
48 | |||
49 | |||
50 | |||
51 | |||
52 | |||
53 | if __name__=="__main__": | ||
54 | main() | ||
diff --git a/SD-VBS/common/support/buildTimeTable.py b/SD-VBS/common/support/buildTimeTable.py new file mode 100644 index 0000000..c718cb2 --- /dev/null +++ b/SD-VBS/common/support/buildTimeTable.py | |||
@@ -0,0 +1,55 @@ | |||
1 | import re | ||
2 | import sys | ||
3 | import os | ||
4 | |||
5 | def getExprName(fileName): | ||
6 | exprFileName = os.path.basename(fileName) | ||
7 | exprName = re.sub("\.txt", "", exprFileName) | ||
8 | exprName = re.sub("_","\t", exprName, 1) | ||
9 | exprName = re.sub("_", "", exprName) | ||
10 | return(exprName) | ||
11 | |||
12 | def getBmrkName(fileName): | ||
13 | benchmarkDir = os.path.dirname(fileName) | ||
14 | benchmarkName = os.path.basename(benchmarkDir) | ||
15 | return(benchmarkName) | ||
16 | |||
17 | def getTimeTup(fileName): | ||
18 | try: | ||
19 | inp = open(fileName, 'r') | ||
20 | except IOError, err: | ||
21 | print "ERROR: Could not open the inputFile:"+fileName | ||
22 | sys.exit(1) | ||
23 | globalTup = None | ||
24 | for currline in inp: | ||
25 | currline = currline.strip() | ||
26 | currline = currline.lower() | ||
27 | if(re.match("real", currline)): | ||
28 | #valTup = re.findall("(\d+)", currline) | ||
29 | |||
30 | return(currline[4:].strip()) | ||
31 | |||
32 | if(globalTup != None): | ||
33 | return(globalTup) | ||
34 | else: | ||
35 | print "ERROR: INVALID INPUT FILE:"+fileName | ||
36 | sys.exit(2) | ||
37 | |||
38 | def main(): | ||
39 | if(len(sys.argv)<2): | ||
40 | print "USAGE: "+sys.argv[0]+" <inputFileName>" | ||
41 | sys.exit(1) | ||
42 | |||
43 | fileName = sys.argv[1] | ||
44 | exprName = getExprName(fileName) | ||
45 | benchmarkName = getBmrkName(fileName) | ||
46 | timeTup = getTimeTup(fileName) | ||
47 | |||
48 | print "%-20s %-20s %10s\n" % (benchmarkName,exprName,timeTup) | ||
49 | |||
50 | |||
51 | |||
52 | |||
53 | |||
54 | if __name__=="__main__": | ||
55 | main() | ||
diff --git a/SD-VBS/common/toolbox/MultiNcut/MNcut.m b/SD-VBS/common/toolbox/MultiNcut/MNcut.m new file mode 100755 index 0000000..5486080 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/MNcut.m | |||
@@ -0,0 +1,93 @@ | |||
1 | function [NcutDiscretes,eigenVectors,eigenValues] = MNcut(I,nsegs); | ||
2 | % | ||
3 | % [NcutDiscrete,eigenVectors,eigenValues] = MNcut(I,nsegs); | ||
4 | % | ||
5 | % | ||
6 | |||
7 | [nr,nc,nb] = size(I); | ||
8 | |||
9 | max_image_size = max(nr,nc); | ||
10 | |||
11 | % modified by song, 06/13/2005 | ||
12 | % test parameters | ||
13 | if (1) % original settings | ||
14 | if (max_image_size>120) & (max_image_size<=500), | ||
15 | % use 3 levels, | ||
16 | data.layers.number=3; | ||
17 | data.layers.dist=3; | ||
18 | data.layers.weight=[3000,4000,10000]; | ||
19 | data.W.scales=[1,2,3];%[1,2,3]; | ||
20 | data.W.radius=[2,3,7];%[2,3,7]; | ||
21 | elseif (max_image_size >500), | ||
22 | % use 4 levels, | ||
23 | data.layers.number=4; | ||
24 | data.layers.dist=3; | ||
25 | data.layers.weight=[3000,4000,10000,20000]; | ||
26 | data.W.scales=[1,2,3,3]; | ||
27 | data.W.radius=[2,3,4,6]; | ||
28 | elseif (max_image_size <=120) | ||
29 | data.layers.number=2; | ||
30 | data.layers.dist=3; | ||
31 | data.layers.weight=[3000,10000]; | ||
32 | data.W.scales=[1,2]; | ||
33 | data.W.radius=[2,6]; | ||
34 | end | ||
35 | else % test setting | ||
36 | if (max_image_size>200) & (max_image_size<=500), | ||
37 | % use 3 levels, | ||
38 | data.layers.number=3; | ||
39 | data.layers.dist=3; | ||
40 | data.layers.weight=[3000,4000,10000]; | ||
41 | data.W.scales=[1,2,3];%[1,2,3]; | ||
42 | data.W.radius=[2,3,7];%[2,3,7]; | ||
43 | elseif (max_image_size >500), | ||
44 | % use 4 levels, | ||
45 | data.layers.number=4; | ||
46 | data.layers.dist=3; | ||
47 | data.layers.weight=[3000,4000,10000,20000]; | ||
48 | data.W.scales=[1,2,3,3]; | ||
49 | data.W.radius=[2,3,4,6]; | ||
50 | elseif (max_image_size <=200) | ||
51 | data.layers.number=2; | ||
52 | data.layers.dist=3; | ||
53 | data.layers.weight=[3000,10000]; | ||
54 | data.W.scales=[1,2]; | ||
55 | data.W.radius=[2,4]; | ||
56 | end | ||
57 | |||
58 | end; | ||
59 | |||
60 | |||
61 | data.W.edgeVariance=0.1; %0.1 | ||
62 | data.W.gridtype='square'; | ||
63 | data.W.sigmaI=0.12;%0.12 | ||
64 | data.W.sigmaX=1000; | ||
65 | data.W.mode='mixed'; | ||
66 | data.W.p=0; | ||
67 | data.W.q=0; | ||
68 | |||
69 | %eigensolver | ||
70 | data.dataGraphCut.offset = 100;% 10; %valeur sur diagonale de W (mieux vaut 10 pour valeurs negatives de W) | ||
71 | data.dataGraphCut.maxiterations=50;% voir | ||
72 | data.dataGraphCut.eigsErrorTolerance=1e-2;%1e-6; | ||
73 | data.dataGraphCut.valeurMin=1e-6;%1e-5;% utilise pour tronquer des valeurs et sparsifier des matrices | ||
74 | data.dataGraphCut.verbose = 0; | ||
75 | |||
76 | data.dataGraphCut.nbEigenValues=max(nsegs); | ||
77 | |||
78 | disp('computeEdge'); | ||
79 | [multiWpp,ConstraintMat, Wind,data,emag,ephase]= computeMultiW (I,data); | ||
80 | |||
81 | disp('Ncut'); | ||
82 | [eigenVectors,eigenValues]= eigSolve (multiWpp,ConstraintMat,data); | ||
83 | |||
84 | %NcutDiscretes = zeros(nr,nc,length(nsegs)); | ||
85 | NcutDiscretes = zeros(nr,nc,(nsegs)); | ||
86 | |||
87 | for j=1:length(nsegs), | ||
88 | nseg = nsegs(j); | ||
89 | [nr,nc,nb] = size(eigenVectors(:,:,1:nseg)); | ||
90 | [NcutDiscrete,evrotated] =discretisation(reshape(eigenVectors(:,:,1:nb),nr*nc,nb),nr,nc); | ||
91 | NcutDiscretes(:,:,j) = NcutDiscrete; | ||
92 | end | ||
93 | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/MNcutDemo.m b/SD-VBS/common/toolbox/MultiNcut/MNcutDemo.m new file mode 100755 index 0000000..972a4eb --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/MNcutDemo.m | |||
@@ -0,0 +1,34 @@ | |||
1 | % MNcutDemo.m | ||
2 | % created by song, 06/13/2005 | ||
3 | % an exmaple of how to use and display MNcut | ||
4 | |||
5 | num_segs = [20]; | ||
6 | imageSize = 800; | ||
7 | |||
8 | img_filename = '/u/ikkjin/Benchmark/stitch/data/test/capitol/img1.jpg'; | ||
9 | |||
10 | I=readimage(img_filename,imageSize); | ||
11 | |||
12 | [SegLabel,eigenVectors,eigenValues]= MNcut(I,num_segs); | ||
13 | |||
14 | for j=1:size(SegLabel,3), | ||
15 | [gx,gy] = gradient(SegLabel(:,:,j)); | ||
16 | bw = (abs(gx)>0.1) + (abs(gy) > 0.1); | ||
17 | |||
18 | figure(1);clf; J1=showmask(double(I),bw); imagesc(J1);axis image; axis off; | ||
19 | set(gca, 'Position', [0 0 1 1]); | ||
20 | |||
21 | % cm = sprintf('print -djpeg %s/file%.4d-%.2d.jpg',OutputDir,id,num_segs(j)); disp(cm);eval(cm); | ||
22 | |||
23 | |||
24 | % figure(10);imagesc(SegLabel(:,:,j));axis image; axis off; | ||
25 | % set(gca, 'Position', [0 0 1 1]); | ||
26 | % cm = sprintf('print -djpeg %s/Seg%.4d-%.2d.jpg',OutputDir,id,num_segs(j));disp(cm);eval(cm); | ||
27 | |||
28 | % pause; | ||
29 | end | ||
30 | |||
31 | % fname = files(id).name; | ||
32 | %cm = sprintf('save %s/SegLabl%.4d.mat I SegLabel fname',OutputDir,id); disp(cm); eval(cm); | ||
33 | %cm = sprintf('save %s/SegEig%.4d.mat eigenVectors eigenValues',OutputDir,id);disp(cm); eval(cm); | ||
34 | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/README.tex b/SD-VBS/common/toolbox/MultiNcut/README.tex new file mode 100755 index 0000000..5970fb2 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/README.tex | |||
@@ -0,0 +1,9 @@ | |||
1 | 1) You need to first compile the .c files,type | ||
2 | |||
3 | >> compileAll('.'); | ||
4 | |||
5 | 2) the top level function is called MNcut.m | ||
6 | |||
7 | |||
8 | |||
9 | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/a_times_b_cmplx.c b/SD-VBS/common/toolbox/MultiNcut/a_times_b_cmplx.c new file mode 100755 index 0000000..25def92 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/a_times_b_cmplx.c | |||
@@ -0,0 +1,405 @@ | |||
1 | /*================================================================ | ||
2 | a_times_b_cmplx.c = used by a couple of mex functions | ||
3 | provide Matrix vector multiplications, | ||
4 | and solve triangular systems | ||
5 | (sparse matrix and full vector) | ||
6 | |||
7 | CSC_CmplxVecMult_CAB_double, CSR_CmplxVecMult_CAB_double, | ||
8 | CSCsymm_CmplxVecMult_CAB_double added by Mirko Visontai (10/24/2003) | ||
9 | |||
10 | *=================================================================*/ | ||
11 | # include "math.h" | ||
12 | |||
13 | |||
14 | /*C<-a*A*B+C*/ | ||
15 | void CSC_VecMult_CaABC_double( | ||
16 | const int m, const int k, const double alpha, | ||
17 | const double *val, const int *indx, | ||
18 | const int *pntrb, | ||
19 | const double *b, | ||
20 | double *c) | ||
21 | { | ||
22 | int i,j,jb,je; | ||
23 | |||
24 | for (i=0;i!=k;i++){ | ||
25 | jb = pntrb[i]; | ||
26 | je = pntrb[i+1]; | ||
27 | for (j=jb;j!=je;j++) | ||
28 | c[indx[j]] += alpha * b[i] * val[j]; | ||
29 | } | ||
30 | } | ||
31 | |||
32 | /*C<-a*A'*B+C*/ | ||
33 | void CSR_VecMult_CaABC_double( | ||
34 | const int k, const int m, const double alpha, | ||
35 | const double *val, const int *indx, | ||
36 | const int *pntrb, | ||
37 | const double *b, | ||
38 | double *c) | ||
39 | { | ||
40 | double t; | ||
41 | const double *pval; | ||
42 | int i,j,jb,je; | ||
43 | |||
44 | pval = val; | ||
45 | for (i=0;i!=m;i++) { | ||
46 | t = 0; | ||
47 | jb = pntrb[i]; | ||
48 | je = pntrb[i+1]; | ||
49 | for (j=jb;j!=je;j++) | ||
50 | t += alpha * b[indx[j]] * (*pval++); | ||
51 | c[i] += t; | ||
52 | } | ||
53 | } | ||
54 | |||
55 | |||
56 | /*C<-A*b */ | ||
57 | void CSC_VecMult_CAB_double( | ||
58 | const int m, const int k, /*nb_rows, nb_columns*/ | ||
59 | const double *val, const int *indx, | ||
60 | const int *pntrb, | ||
61 | const double *b, | ||
62 | double *c | ||
63 | ) | ||
64 | { | ||
65 | int i,j,jb,je; | ||
66 | double *pc=c; | ||
67 | for (i=0;i!=m;i++) *pc++ = 0; | ||
68 | |||
69 | for (i=0;i!=k;i++){ | ||
70 | jb = pntrb[i]; | ||
71 | je = pntrb[i+1]; | ||
72 | for (j=jb;j!=je;j++) | ||
73 | c[indx[j]] += b[i] * val[j]; | ||
74 | } | ||
75 | } | ||
76 | |||
77 | /*C<-A*b (complex)*/ | ||
78 | void CSC_CmplxVecMult_CAB_double( | ||
79 | const int m, const int k, | ||
80 | const double *valr, const double *vali, | ||
81 | const int *indx, | ||
82 | const int *pntrb, | ||
83 | const double *br, const double *bi, | ||
84 | double *cr, double *ci | ||
85 | ) | ||
86 | { | ||
87 | int i,j,jb,je; | ||
88 | double *pcr=cr; | ||
89 | double *pci=ci; | ||
90 | for (i=0;i!=m;i++){ | ||
91 | *pcr++ = 0.0; | ||
92 | *pci++ = 0.0; | ||
93 | } | ||
94 | |||
95 | for (i=0;i!=k;i++){ | ||
96 | jb = pntrb[i]; | ||
97 | je = pntrb[i+1]; | ||
98 | for (j=jb;j!=je;j++){ | ||
99 | cr[indx[j]] += (br[i] * valr[j]) - (bi[i] * vali[j]); | ||
100 | ci[indx[j]] += (br[i] * vali[j]) + (bi[i] * valr[j]); | ||
101 | } | ||
102 | } | ||
103 | } | ||
104 | |||
105 | /*C<-A'*b | ||
106 | plus rapide que CSC_VecMult_CAB_double */ | ||
107 | void CSR_VecMult_CAB_double( | ||
108 | const int k, const int m, | ||
109 | const double *val, const int *indx, | ||
110 | const int *pntrb, | ||
111 | const double *b, | ||
112 | double *c | ||
113 | ) | ||
114 | { | ||
115 | double t; | ||
116 | const double *pval; | ||
117 | double *pc=c; | ||
118 | int i,j,jb,je; | ||
119 | |||
120 | for (i=0;i!=m;i++) *pc++ = 0; | ||
121 | |||
122 | pval = val; | ||
123 | for (i=0;i!=m;i++) { | ||
124 | t = 0; | ||
125 | jb = pntrb[i]; | ||
126 | je = pntrb[i+1]; | ||
127 | for (j=jb;j!=je;j++) | ||
128 | t += b[indx[j]] * (*pval++); | ||
129 | c[i] += t; | ||
130 | } | ||
131 | } | ||
132 | |||
133 | /*C<-A'*b (complex) | ||
134 | plus rapide que CSC_VecMult_CAB_double */ | ||
135 | void CSR_CmplxVecMult_CAB_double( | ||
136 | const int k, const int m, | ||
137 | const double *valr, const double *vali, | ||
138 | const int *indx, | ||
139 | const int *pntrb, | ||
140 | const double *br, const double *bi, | ||
141 | double *cr, double *ci | ||
142 | ) | ||
143 | { | ||
144 | double tr, ti; | ||
145 | const double *pvalr; | ||
146 | const double *pvali; | ||
147 | double *pcr=cr; | ||
148 | double *pci=ci; | ||
149 | int i,j,jb,je; | ||
150 | |||
151 | for (i=0;i!=m;i++){ | ||
152 | *pcr++ = 0.0; | ||
153 | *pci++ = 0.0; | ||
154 | } | ||
155 | |||
156 | pvalr = valr; | ||
157 | pvali = vali; | ||
158 | for (i=0;i!=m;i++) { | ||
159 | tr = 0.0; | ||
160 | ti = 0.0; | ||
161 | jb = pntrb[i]; | ||
162 | je = pntrb[i+1]; | ||
163 | for (j=jb;j!=je;j++){ | ||
164 | tr += (br[indx[j]] * (*pvalr)) - (bi[indx[j]] * (*pvali)); | ||
165 | ti += (br[indx[j]] * (*pvali++)) + (bi[indx[j]] * (*pvalr++)); | ||
166 | } | ||
167 | cr[i] += tr; | ||
168 | ci[i] += ti; | ||
169 | } | ||
170 | } | ||
171 | |||
172 | |||
173 | |||
174 | /* C<-A*b (A is symmetric) */ | ||
175 | void CSRsymm_VecMult_CAB_double( | ||
176 | const int k, const int m, | ||
177 | const double *val, const int *indx, | ||
178 | const int *pntrb, | ||
179 | const double *b, | ||
180 | double *c | ||
181 | ) | ||
182 | { | ||
183 | const double *pval; | ||
184 | double *pc=c; | ||
185 | int i,j; | ||
186 | int jj; | ||
187 | int rpntrb, rpntre; | ||
188 | int index, nvals; | ||
189 | |||
190 | |||
191 | for (i=0;i!=m;i++) *pc++ = 0; | ||
192 | pval = val; | ||
193 | for (j=0;j!=k;j++){ | ||
194 | rpntrb = pntrb[j]; | ||
195 | rpntre = pntrb[j+1]; | ||
196 | for (jj=rpntrb;jj!=rpntre;jj++) { | ||
197 | index = indx[jj]; | ||
198 | if ( index == j ) { | ||
199 | c[j] += b[j] * (*pval++); | ||
200 | continue; | ||
201 | } | ||
202 | if ( index > j ) { | ||
203 | c[index] += b[j] * (*pval); | ||
204 | |||
205 | c[j] += b[index] * (*pval++); | ||
206 | } | ||
207 | else { | ||
208 | pval++; | ||
209 | } | ||
210 | } | ||
211 | } | ||
212 | } | ||
213 | |||
214 | |||
215 | /* C<-A*b (A is symmetric and complex) */ | ||
216 | void CSRsymm_CmplxVecMult_CAB_double( | ||
217 | const int k, const int m, | ||
218 | const double *valr, const double *vali, | ||
219 | const int *indx, | ||
220 | const int *pntrb, | ||
221 | const double *br, const double *bi, | ||
222 | double *cr, double *ci | ||
223 | ) | ||
224 | { | ||
225 | const double *pvalr, *pvali; | ||
226 | double *pcr=cr; | ||
227 | double *pci=ci; | ||
228 | int i,j; | ||
229 | int jj; | ||
230 | int rpntrb, rpntre; | ||
231 | int index, nvals; | ||
232 | |||
233 | |||
234 | for (i=0;i!=m;i++){ | ||
235 | *pcr++ = 0.0; | ||
236 | *pci++ = 0.0; | ||
237 | } | ||
238 | |||
239 | pvalr = valr; | ||
240 | pvali = vali; | ||
241 | for (j=0;j!=k;j++){ | ||
242 | rpntrb = pntrb[j]; | ||
243 | rpntre = pntrb[j+1]; | ||
244 | for (jj=rpntrb;jj!=rpntre;jj++) { | ||
245 | index = indx[jj]; | ||
246 | if ( index == j ) { | ||
247 | cr[j] += (br[j] * (*pvalr)) - (bi[j] * (*pvali)); | ||
248 | ci[j] += (br[j] * (*pvali++)) + (bi[j] * (*pvalr++)); | ||
249 | continue; | ||
250 | } | ||
251 | if ( index > j ) { | ||
252 | cr[index] += (br[j] * (*pvalr)) - (bi[j] * (*pvali)); | ||
253 | ci[index] += (br[j] * (*pvali)) + (bi[j] * (*pvalr)); | ||
254 | |||
255 | cr[j] += (br[index] * (*pvalr)) - (bi[index] * (*pvali)); | ||
256 | ci[j] += (br[index] * (*pvali++)) + (bi[index] * (*pvalr++)); | ||
257 | } | ||
258 | else { | ||
259 | pvalr++; | ||
260 | pvali++; | ||
261 | } | ||
262 | |||
263 | } | ||
264 | } | ||
265 | } | ||
266 | |||
267 | |||
268 | /*C<-A\B; with Lower triangular A*/ | ||
269 | void CSC_VecTriangSlvLD_CAB_double( | ||
270 | const int m, | ||
271 | const double *val, | ||
272 | const int *indx, const int *pntrb, | ||
273 | const double *b, | ||
274 | double *c) | ||
275 | { | ||
276 | int i, j, jb, je; | ||
277 | double *pc=c; | ||
278 | double z; | ||
279 | |||
280 | for (i=0;i!=m;i++){ | ||
281 | *pc = b[i]; | ||
282 | pc++; | ||
283 | } | ||
284 | |||
285 | pc=c; | ||
286 | for (i=0;i!=m;i++) { | ||
287 | jb = pntrb[i]; | ||
288 | je = pntrb[i+1]; | ||
289 | z = pc[i] / val[jb]; | ||
290 | pc[i] = z; | ||
291 | for (j=jb+1;j<je;j++) { | ||
292 | c[indx[j]] -= z*val[j]; | ||
293 | } | ||
294 | } | ||
295 | } | ||
296 | |||
297 | /*C<-A\B; with Upper triangular A*/ | ||
298 | void CSC_VecTriangSlvUD_CAB_double( | ||
299 | const int m, | ||
300 | const double *val, | ||
301 | const int *indx, const int *pntrb, | ||
302 | const double *b, | ||
303 | double *c) | ||
304 | { | ||
305 | int i, j, jb, je, index; | ||
306 | double *pc=c; | ||
307 | double z; | ||
308 | |||
309 | for (i=0;i!=m;i++){ | ||
310 | *pc = b[i]; | ||
311 | pc++; | ||
312 | } | ||
313 | |||
314 | pc=c; | ||
315 | for (i=m-1;i!=-1;i--) { | ||
316 | jb = pntrb[i]; | ||
317 | je = pntrb[i+1]-1; | ||
318 | z = pc[i] /val[je]; | ||
319 | pc[i] = z; | ||
320 | for (j=jb;j<je;j++) { | ||
321 | c[indx[j]] -= z * val[j]; | ||
322 | } | ||
323 | } | ||
324 | } | ||
325 | /*C<-A'\B; where A is upper (little slower than CSC)*/ | ||
326 | void CSR_VecTriangSlvLD_CAB_double( | ||
327 | const int m, | ||
328 | const double *val, | ||
329 | const int *indx, const int *pntrb, | ||
330 | const double *b, | ||
331 | double *c) | ||
332 | { | ||
333 | int i, j, jb, je, index; | ||
334 | double *pc=c; | ||
335 | double z; | ||
336 | double valtmp; | ||
337 | |||
338 | pc=c; | ||
339 | for (i=0;i!=m;i++) { | ||
340 | z = 0; | ||
341 | jb = pntrb[i]; | ||
342 | je = pntrb[i+1]; | ||
343 | for (j=jb;j<je;j++) { | ||
344 | index = indx[j]; | ||
345 | if ( index == i ) { | ||
346 | valtmp = val[j]; | ||
347 | } else { | ||
348 | z += c[index] * val[j]; | ||
349 | } | ||
350 | } | ||
351 | pc[i] = (b[i] - z) / valtmp; | ||
352 | } | ||
353 | } | ||
354 | |||
355 | /*C<-A'\B; where A is lower (little slower than CSC)*/ | ||
356 | void CSR_VecTriangSlvUD_CAB_double( | ||
357 | const int m, | ||
358 | const double *val, | ||
359 | const int *indx, const int *pntrb, | ||
360 | const double *b, | ||
361 | double *c) | ||
362 | { | ||
363 | int i, j, jb, je, index; | ||
364 | double *pc=c; | ||
365 | double valtmp; | ||
366 | double z; | ||
367 | |||
368 | pc=c; | ||
369 | for (i=m-1;i!=-1; i--) { | ||
370 | z = 0; | ||
371 | jb = pntrb[i]; | ||
372 | je = pntrb[i+1]; | ||
373 | for (j=jb+1; j<je; j++) { | ||
374 | z += c[indx[j]] * val[j]; | ||
375 | } | ||
376 | pc[i] = (b[i] - z) / val[jb]; | ||
377 | } | ||
378 | } | ||
379 | |||
380 | /*C<-A*B, where A is (m,k) and B is (k,n)*/ | ||
381 | void CSC_MatMult_CAB_double( | ||
382 | const int m, const int n, const int k, | ||
383 | const double *val, const int *indx, | ||
384 | const int *pntrb, | ||
385 | const double *b, const int ldb, | ||
386 | double *c, const int ldc) | ||
387 | { | ||
388 | int i,j,jb,je; | ||
389 | double *pc=c; | ||
390 | int l; | ||
391 | |||
392 | for (l=0;l!=n;l++) | ||
393 | for (i=0;i!=m;i++) *pc++ = 0; | ||
394 | |||
395 | for (l=0;l!=n;l++) { | ||
396 | for (i=0;i!=k;i++){ | ||
397 | jb = pntrb[i]; | ||
398 | je = pntrb[i+1]; | ||
399 | for (j=jb;j!=je;j++) | ||
400 | c[indx[j]] += b[i] * val[j]; | ||
401 | } | ||
402 | /*c += ldc; b += ldb; */ | ||
403 | c += m; b += m; | ||
404 | } | ||
405 | } | ||
diff --git a/SD-VBS/common/toolbox/MultiNcut/a_times_b_cmplx.dll b/SD-VBS/common/toolbox/MultiNcut/a_times_b_cmplx.dll new file mode 100755 index 0000000..5656f92 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/a_times_b_cmplx.dll | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/a_times_b_cmplx.mexa64 b/SD-VBS/common/toolbox/MultiNcut/a_times_b_cmplx.mexa64 new file mode 100755 index 0000000..1ab8e8c --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/a_times_b_cmplx.mexa64 | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/a_times_b_cmplx.mexglx b/SD-VBS/common/toolbox/MultiNcut/a_times_b_cmplx.mexglx new file mode 100755 index 0000000..4138128 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/a_times_b_cmplx.mexglx | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/a_times_b_cmplx.mexmac b/SD-VBS/common/toolbox/MultiNcut/a_times_b_cmplx.mexmac new file mode 100755 index 0000000..65232e8 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/a_times_b_cmplx.mexmac | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/affinityic.c b/SD-VBS/common/toolbox/MultiNcut/affinityic.c new file mode 100755 index 0000000..d78761b --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/affinityic.c | |||
@@ -0,0 +1,187 @@ | |||
1 | /*================================================================ | ||
2 | * function w = affinityic(emag,ephase,pi,pj,sigma) | ||
3 | * Input: | ||
4 | * emag = edge strength at each pixel | ||
5 | * ephase = edge phase at each pixel | ||
6 | * [pi,pj] = index pair representation for MALTAB sparse matrices | ||
7 | * sigma = sigma for IC energy | ||
8 | * Output: | ||
9 | * w = affinity with IC at [pi,pj] | ||
10 | * | ||
11 | |||
12 | % test sequence | ||
13 | f = synimg(10); | ||
14 | [i,j] = cimgnbmap(size(f),2); | ||
15 | [ex,ey,egx,egy] = quadedgep(f); | ||
16 | a = affinityic(ex,ey,egx,egy,i,j) | ||
17 | show_dist_w(f,a); | ||
18 | |||
19 | * Stella X. Yu, Nov 19, 2001. | ||
20 | *=================================================================*/ | ||
21 | |||
22 | # include "mex.h" | ||
23 | # include "math.h" | ||
24 | |||
25 | void mexFunction( | ||
26 | int nargout, | ||
27 | mxArray *out[], | ||
28 | int nargin, | ||
29 | const mxArray *in[] | ||
30 | ) | ||
31 | { | ||
32 | /* declare variables */ | ||
33 | int nr, nc, np, total; | ||
34 | int i, j, k, ix, iy, jx, jy, ii, jj, iip1, jjp1, iip2, jjp2, step; | ||
35 | double sigma, di, dj, a, z, maxori, phase1, phase2, slope; | ||
36 | int *ir, *jc; | ||
37 | unsigned int *pi,*pj; | ||
38 | /* unsigned long *pi, *pj; */ | ||
39 | double *emag, *ephase, *w; | ||
40 | |||
41 | /* check argument */ | ||
42 | if (nargin<4) { | ||
43 | mexErrMsgTxt("Four input arguments required"); | ||
44 | } | ||
45 | if (nargout>1) { | ||
46 | mexErrMsgTxt("Too many output arguments"); | ||
47 | } | ||
48 | |||
49 | /* get edgel information */ | ||
50 | nr = mxGetM(in[0]); | ||
51 | nc = mxGetN(in[0]); | ||
52 | if ( nr*nc ==0 || nr != mxGetM(in[1]) || nc != mxGetN(in[1]) ) { | ||
53 | mexErrMsgTxt("Edge magnitude and phase shall be of the same image size"); | ||
54 | } | ||
55 | emag = mxGetPr(in[0]); | ||
56 | ephase = mxGetPr(in[1]); | ||
57 | np = nr * nc; | ||
58 | |||
59 | /* get new index pair */ | ||
60 | if (!mxIsUint32(in[2]) | !mxIsUint32(in[3])) { | ||
61 | mexErrMsgTxt("Index pair shall be of type UINT32"); | ||
62 | } | ||
63 | if (mxGetM(in[3]) * mxGetN(in[3]) != np + 1) { | ||
64 | mexErrMsgTxt("Wrong index representation"); | ||
65 | } | ||
66 | pi = mxGetData(in[2]); | ||
67 | pj = mxGetData(in[3]); | ||
68 | |||
69 | /* create output */ | ||
70 | out[0] = mxCreateSparse(np,np,pj[np],mxREAL); | ||
71 | if (out[0]==NULL) { | ||
72 | mexErrMsgTxt("Not enough memory for the output matrix"); | ||
73 | } | ||
74 | w = mxGetPr(out[0]); | ||
75 | ir = mxGetIr(out[0]); | ||
76 | jc = mxGetJc(out[0]); | ||
77 | |||
78 | /* find my sigma */ | ||
79 | if (nargin<5) { | ||
80 | sigma = 0; | ||
81 | for (k=0; k<np; k++) { | ||
82 | if (emag[k]>sigma) { sigma = emag[k]; } | ||
83 | } | ||
84 | sigma = sigma / 6; | ||
85 | /* printf("sigma = %6.5f",sigma); */ | ||
86 | } else { | ||
87 | sigma = mxGetScalar(in[4]); | ||
88 | } | ||
89 | a = 0.5 / (sigma * sigma); | ||
90 | |||
91 | /* computation */ | ||
92 | total = 0; | ||
93 | for (j=0; j<np; j++) { | ||
94 | |||
95 | jc[j] = total; | ||
96 | jx = j / nr; /* col */ | ||
97 | jy = j % nr; /* row */ | ||
98 | |||
99 | for (k=pj[j]; k<pj[j+1]; k++) { | ||
100 | |||
101 | i = pi[k]; | ||
102 | |||
103 | if (i==j) { | ||
104 | maxori = 1; | ||
105 | |||
106 | } else { | ||
107 | |||
108 | ix = i / nr; | ||
109 | iy = i % nr; | ||
110 | |||
111 | /* scan */ | ||
112 | di = (double) (iy - jy); | ||
113 | dj = (double) (ix - jx); | ||
114 | |||
115 | maxori = 0.; | ||
116 | phase1 = ephase[j]; | ||
117 | |||
118 | |||
119 | /* sample in i direction */ | ||
120 | if (abs(di) >= abs(dj)) { | ||
121 | slope = dj / di; | ||
122 | step = (iy>=jy) ? 1 : -1; | ||
123 | |||
124 | iip1 = jy; | ||
125 | jjp1 = jx; | ||
126 | |||
127 | |||
128 | for (ii=0;ii<abs(di);ii++){ | ||
129 | iip2 = iip1 + step; | ||
130 | jjp2 = (int)(0.5 + slope*(iip2-jy) + jx); | ||
131 | |||
132 | phase2 = ephase[iip2+jjp2*nr]; | ||
133 | |||
134 | if (phase1 != phase2) { | ||
135 | z = (emag[iip1+jjp1*nr] + emag[iip2+jjp2*nr]); | ||
136 | if (z > maxori){ | ||
137 | maxori = z; | ||
138 | } | ||
139 | } | ||
140 | |||
141 | iip1 = iip2; | ||
142 | jjp1 = jjp2; | ||
143 | phase1 = phase2; | ||
144 | } | ||
145 | |||
146 | /* sample in j direction */ | ||
147 | } else { | ||
148 | slope = di / dj; | ||
149 | step = (ix>=jx) ? 1: -1; | ||
150 | |||
151 | jjp1 = jx; | ||
152 | iip1 = jy; | ||
153 | |||
154 | |||
155 | for (jj=0;jj<abs(dj);jj++){ | ||
156 | jjp2 = jjp1 + step; | ||
157 | iip2 = (int)(0.5+ slope*(jjp2-jx) + jy); | ||
158 | |||
159 | phase2 = ephase[iip2+jjp2*nr]; | ||
160 | |||
161 | if (phase1 != phase2){ | ||
162 | z = (emag[iip1+jjp1*nr] + emag[iip2+jjp2*nr]); | ||
163 | if (z > maxori){ | ||
164 | maxori = z; | ||
165 | } | ||
166 | |||
167 | } | ||
168 | |||
169 | iip1 = iip2; | ||
170 | jjp1 = jjp2; | ||
171 | phase1 = phase2; | ||
172 | } | ||
173 | } | ||
174 | |||
175 | maxori = 0.5 * maxori; | ||
176 | maxori = exp(-maxori * maxori * a); | ||
177 | } | ||
178 | ir[total] = i; | ||
179 | |||
180 | w[total] = maxori; | ||
181 | total = total + 1; | ||
182 | |||
183 | } /* i */ | ||
184 | } /* j */ | ||
185 | |||
186 | jc[np] = total; | ||
187 | } | ||
diff --git a/SD-VBS/common/toolbox/MultiNcut/affinityic.dll b/SD-VBS/common/toolbox/MultiNcut/affinityic.dll new file mode 100755 index 0000000..67e4d64 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/affinityic.dll | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/affinityic.mexa64 b/SD-VBS/common/toolbox/MultiNcut/affinityic.mexa64 new file mode 100755 index 0000000..2648387 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/affinityic.mexa64 | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/affinityic.mexglx b/SD-VBS/common/toolbox/MultiNcut/affinityic.mexglx new file mode 100755 index 0000000..c296845 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/affinityic.mexglx | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/batch_MNcut.m b/SD-VBS/common/toolbox/MultiNcut/batch_MNcut.m new file mode 100755 index 0000000..d4dcb3c --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/batch_MNcut.m | |||
@@ -0,0 +1,48 @@ | |||
1 | data_dir = '/data/insecure/qihuizhu/baseball/Gray/train/'; | ||
2 | save_dir = '/home/songgang/project/MultiNcut/batch_result_MNcut'; | ||
3 | |||
4 | num_segs = [20]; | ||
5 | imageSize = 200; | ||
6 | |||
7 | |||
8 | filelist = dir(fullfile(data_dir, '*.tif')); | ||
9 | |||
10 | nb_file = max(size(filelist)); | ||
11 | |||
12 | |||
13 | tic; | ||
14 | for ii = 1:nb_file | ||
15 | fprintf(2, 'Segmenting image: %s ...\n', filelist(ii).name); | ||
16 | |||
17 | img_filename = fullfile(data_dir, filelist(ii).name); | ||
18 | I=readimage(img_filename,imageSize); | ||
19 | |||
20 | |||
21 | [SegLabel,eigenVectors,eigenValues]= MNcut(I,num_segs); | ||
22 | |||
23 | for j=1:size(SegLabel,3), | ||
24 | [gx,gy] = gradient(SegLabel(:,:,j)); | ||
25 | bw = (abs(gx)>0.1) + (abs(gy) > 0.1); | ||
26 | |||
27 | figure(1);clf; J1=showmask(double(I),bw); imagesc(J1);axis image; axis off; | ||
28 | set(gca, 'Position', [0 0 1 1]); | ||
29 | set(gca, 'Position', [0 0 1 1]); | ||
30 | [PATHSTR,NAME,EXT,VERSN] = fileparts(filelist(ii).name); | ||
31 | print('-f1', '-djpeg90', fullfile(save_dir, sprintf('%s%s-%d.jpg', NAME,'-out', num_segs(j)))); | ||
32 | |||
33 | |||
34 | % cm = sprintf('print -djpeg %s/file%.4d-%.2d.jpg',OutputDir,id,num_segs(j)); disp(cm);eval(cm); | ||
35 | |||
36 | |||
37 | % figure(10);imagesc(SegLabel(:,:,j));axis image; axis off; | ||
38 | % set(gca, 'Position', [0 0 1 1]); | ||
39 | % cm = sprintf('print -djpeg %s/Seg%.4d-%.2d.jpg',OutputDir,id,num_segs(j));disp(cm);eval(cm); | ||
40 | |||
41 | % keyboard; | ||
42 | end | ||
43 | |||
44 | |||
45 | |||
46 | end; | ||
47 | toc; | ||
48 | fprintf(2, ' %d files done\n', nb_file); | ||
diff --git a/SD-VBS/common/toolbox/MultiNcut/cimgnbmap.c b/SD-VBS/common/toolbox/MultiNcut/cimgnbmap.c new file mode 100755 index 0000000..44af715 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/cimgnbmap.c | |||
@@ -0,0 +1,198 @@ | |||
1 | /*================================================================ | ||
2 | * function [i,j] = cimgnbmap([nr,nc], nb_r, sample_rate) | ||
3 | * computes the neighbourhood index matrix of an image, | ||
4 | * with each neighbourhood sampled. | ||
5 | * Input: | ||
6 | * [nr,nc] = image size | ||
7 | * nb_r = neighbourhood radius, could be [r_i,r_j] for i,j | ||
8 | * sample_rate = sampling rate, default = 1 | ||
9 | * Output: | ||
10 | * [i,j] = each is a column vector, give indices of neighbour pairs | ||
11 | * UINT32 type | ||
12 | * i is of total length of valid elements, 0 for first row | ||
13 | * j is of length nr * nc + 1 | ||
14 | * | ||
15 | * See also: imgnbmap.c, id2cind.m | ||
16 | * | ||
17 | * Examples: | ||
18 | * [i,j] = imgnbmap(10, 20); % [10,10] are assumed | ||
19 | * | ||
20 | * Stella X. Yu, Nov 12, 2001. | ||
21 | |||
22 | % test sequence: | ||
23 | nr = 15; | ||
24 | nc = 15; | ||
25 | nbr = 1; | ||
26 | [i,j] = cimgnbmap([nr,nc], nbr); | ||
27 | mask = csparse(i,j,ones(length(i),1),nr*nc); | ||
28 | show_dist_w(rand(nr,nc),mask) | ||
29 | |||
30 | *=================================================================*/ | ||
31 | |||
32 | # include "mex.h" | ||
33 | # include "math.h" | ||
34 | |||
35 | void mexFunction( | ||
36 | int nargout, | ||
37 | mxArray *out[], | ||
38 | int nargin, | ||
39 | const mxArray *in[] | ||
40 | ) | ||
41 | { | ||
42 | /* declare variables */ | ||
43 | int nr, nc, np, nb, total; | ||
44 | double *dim, sample_rate; | ||
45 | int r_i, r_j, a1, a2, b1, b2, self, neighbor; | ||
46 | int i, j, k, s, t, nsamp, th_rand, no_sample; | ||
47 | /* unsigned long *p, *qi, *qj; */ | ||
48 | unsigned int *p, *qi, *qj; | ||
49 | |||
50 | /* check argument */ | ||
51 | if (nargin < 2) { | ||
52 | mexErrMsgTxt("Two input arguments required"); | ||
53 | } | ||
54 | if (nargout> 2) { | ||
55 | mexErrMsgTxt("Too many output arguments."); | ||
56 | } | ||
57 | |||
58 | /* get image size */ | ||
59 | i = mxGetM(in[0]); | ||
60 | j = mxGetN(in[0]); | ||
61 | dim = mxGetData(in[0]); | ||
62 | nr = (int)dim[0]; | ||
63 | if (j>1 || i>1) { | ||
64 | nc = (int)dim[1]; | ||
65 | } else { | ||
66 | nc = nr; | ||
67 | } | ||
68 | np = nr * nc; | ||
69 | |||
70 | /* get neighbourhood size */ | ||
71 | i = mxGetM(in[1]); | ||
72 | j = mxGetN(in[1]); | ||
73 | dim = mxGetData(in[1]); | ||
74 | r_i = (int)dim[0]; | ||
75 | if (j>1 || i>1) { | ||
76 | r_j = (int)dim[1]; | ||
77 | } else { | ||
78 | r_j = r_i; | ||
79 | } | ||
80 | if (r_i<0) { r_i = 0; } | ||
81 | if (r_j<0) { r_j = 0; } | ||
82 | |||
83 | /* get sample rate */ | ||
84 | if (nargin==3) { | ||
85 | sample_rate = (mxGetM(in[2])==0) ? 1: mxGetScalar(in[2]); | ||
86 | } else { | ||
87 | sample_rate = 1; | ||
88 | } | ||
89 | /* prepare for random number generator */ | ||
90 | if (sample_rate<1) { | ||
91 | srand( (unsigned)time( NULL ) ); | ||
92 | th_rand = (int)ceil((double)RAND_MAX * sample_rate); | ||
93 | no_sample = 0; | ||
94 | } else { | ||
95 | sample_rate = 1; | ||
96 | th_rand = RAND_MAX; | ||
97 | no_sample = 1; | ||
98 | } | ||
99 | |||
100 | /* figure out neighbourhood size */ | ||
101 | |||
102 | nb = (r_i + r_i + 1) * (r_j + r_j + 1); | ||
103 | if (nb>np) { | ||
104 | nb = np; | ||
105 | } | ||
106 | nb = (int)ceil((double)nb * sample_rate); | ||
107 | /*printf("nb=%d\n",nb);*/ | ||
108 | /* intermediate data structure */ | ||
109 | /* p = mxCalloc(np * (nb+1), sizeof(unsigned long)); */ | ||
110 | p = mxCalloc(np * (nb+1), sizeof(unsigned int)); | ||
111 | if (p==NULL) { | ||
112 | mexErrMsgTxt("Not enough space for my computation."); | ||
113 | } | ||
114 | |||
115 | /* computation */ | ||
116 | total = 0; | ||
117 | for (j=0; j<nc; j++) { | ||
118 | /*printf("j=%d\n",j);*/ | ||
119 | for (i=0; i<nr; i++) { | ||
120 | |||
121 | self = i + j * nr; | ||
122 | |||
123 | /* put self in, otherwise the index is not ordered */ | ||
124 | p[self] = p[self] + 1; | ||
125 | p[self+p[self]*np] = self; | ||
126 | |||
127 | /* j range */ | ||
128 | b1 = j; | ||
129 | b2 = j + r_j; | ||
130 | if (b2>=nc) { b2 = nc-1; } | ||
131 | |||
132 | /* i range */ | ||
133 | a1 = i - r_i; | ||
134 | if (a1<0) { a1 = 0; } | ||
135 | a2 = i + r_i; | ||
136 | if (a2>=nr) { a2 = nr-1; } | ||
137 | |||
138 | /* number of more samples needed */ | ||
139 | nsamp = nb - p[self]; | ||
140 | /*if (nsamp<0) | ||
141 | {printf("nsamp=%d\n",nsamp);}*/ | ||
142 | k = 0; | ||
143 | t = b1; | ||
144 | s = i + 1; | ||
145 | if (s>a2) { | ||
146 | s = a1; | ||
147 | t = t + 1; | ||
148 | } | ||
149 | |||
150 | |||
151 | while (k<nsamp && t<=b2) { | ||
152 | |||
153 | if (no_sample || (rand()<th_rand)) { | ||
154 | k = k + 1; | ||
155 | neighbor = s + t * nr; | ||
156 | p[self] = p[self] + 1; | ||
157 | p[self+p[self]*np] = neighbor; | ||
158 | p[neighbor] = p[neighbor] + 1; | ||
159 | p[neighbor+p[neighbor]*np] = self; | ||
160 | } | ||
161 | |||
162 | s = s + 1; | ||
163 | if (s>a2) { | ||
164 | s = a1; | ||
165 | t = t + 1; | ||
166 | } | ||
167 | } /* k */ | ||
168 | total = total + p[self]; | ||
169 | } /* i */ | ||
170 | |||
171 | } /* j */ | ||
172 | |||
173 | /* i, j */ | ||
174 | |||
175 | out[0] = mxCreateNumericMatrix(total, 1, mxUINT32_CLASS, mxREAL); | ||
176 | out[1] = mxCreateNumericMatrix(np+1, 1, mxUINT32_CLASS, mxREAL); | ||
177 | qi = mxGetData(out[0]); | ||
178 | qj = mxGetData(out[1]); | ||
179 | |||
180 | if (out[0]==NULL || out[1]==NULL) { | ||
181 | mexErrMsgTxt("Not enough space for the output matrix."); | ||
182 | } | ||
183 | |||
184 | total = 0; | ||
185 | for (j=0; j<np; j++) { | ||
186 | qj[j] = total; | ||
187 | s = j + np; | ||
188 | for (t=0; t<p[j]; t++) { | ||
189 | qi[total] = p[s]; | ||
190 | total = total + 1; | ||
191 | s = s + np; | ||
192 | } | ||
193 | } | ||
194 | qj[np] = total; | ||
195 | |||
196 | mxFree(p); | ||
197 | |||
198 | } | ||
diff --git a/SD-VBS/common/toolbox/MultiNcut/cimgnbmap.dll b/SD-VBS/common/toolbox/MultiNcut/cimgnbmap.dll new file mode 100755 index 0000000..368d76c --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/cimgnbmap.dll | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/cimgnbmap.mexa64 b/SD-VBS/common/toolbox/MultiNcut/cimgnbmap.mexa64 new file mode 100755 index 0000000..6564652 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/cimgnbmap.mexa64 | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/cimgnbmap.mexglx b/SD-VBS/common/toolbox/MultiNcut/cimgnbmap.mexglx new file mode 100755 index 0000000..655849a --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/cimgnbmap.mexglx | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/cimgnbmap_cross.c b/SD-VBS/common/toolbox/MultiNcut/cimgnbmap_cross.c new file mode 100755 index 0000000..7b1434c --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/cimgnbmap_cross.c | |||
@@ -0,0 +1,197 @@ | |||
1 | /*================================================================ | ||
2 | * function [i,j] = cimgnbmap_cross([nr,nc], nb_r, sample_rate) | ||
3 | * computes the neighbourhood index matrix of an image, | ||
4 | * with each neighbourhood sampled. | ||
5 | * Input: | ||
6 | * [nr,nc] = image size | ||
7 | * nb_r = neighbourhood radius, could be [r_i,r_j] for i,j | ||
8 | * sample_rate = sampling rate, default = 1 | ||
9 | * Output: | ||
10 | * [i,j] = each is a column vector, give indices of neighbour pairs | ||
11 | * UINT32 type | ||
12 | * i is of total length of valid elements, 0 for first row | ||
13 | * j is of length nr * nc + 1 | ||
14 | * | ||
15 | * See also: imgnbmap.c, id2cind.m | ||
16 | * | ||
17 | * Examples: | ||
18 | * [i,j] = imgnbmap(10, 20); % [10,10] are assumed | ||
19 | * | ||
20 | * Stella X. Yu, Nov 12, 2001. | ||
21 | |||
22 | % test sequence: | ||
23 | nr = 15; | ||
24 | nc = 15; | ||
25 | nbr = 1; | ||
26 | [i,j] = cimgnbmap([nr,nc], nbr); | ||
27 | mask = csparse(i,j,ones(length(i),1),nr*nc); | ||
28 | show_dist_w(rand(nr,nc),mask) | ||
29 | |||
30 | *=================================================================*/ | ||
31 | |||
32 | # include "mex.h" | ||
33 | # include "math.h" | ||
34 | |||
35 | void mexFunction( | ||
36 | int nargout, | ||
37 | mxArray *out[], | ||
38 | int nargin, | ||
39 | const mxArray *in[] | ||
40 | ) | ||
41 | { | ||
42 | /* declare variables */ | ||
43 | int nr, nc, np, nb, total; | ||
44 | double *dim, sample_rate; | ||
45 | int r_i, r_j, a1, a2, b1, b2, self, neighbor; | ||
46 | int i, j, k, s, t, nsamp, th_rand, no_sample; | ||
47 | /* unsigned long *p, *qi, *qj; */ | ||
48 | unsigned int *p, *qi, *qj; | ||
49 | |||
50 | /* check argument */ | ||
51 | if (nargin < 2) { | ||
52 | mexErrMsgTxt("Two input arguments required"); | ||
53 | } | ||
54 | if (nargout> 2) { | ||
55 | mexErrMsgTxt("Too many output arguments."); | ||
56 | } | ||
57 | |||
58 | /* get image size */ | ||
59 | i = mxGetM(in[0]); | ||
60 | j = mxGetN(in[0]); | ||
61 | dim = mxGetData(in[0]); | ||
62 | nr = (int)dim[0]; | ||
63 | if (j>1 || i>1) { | ||
64 | nc = (int)dim[1]; | ||
65 | } else { | ||
66 | nc = nr; | ||
67 | } | ||
68 | np = nr * nc; | ||
69 | |||
70 | /* get neighbourhood size */ | ||
71 | i = mxGetM(in[1]); | ||
72 | j = mxGetN(in[1]); | ||
73 | dim = mxGetData(in[1]); | ||
74 | r_i = (int)dim[0]; | ||
75 | if (j>1 || i>1) { | ||
76 | r_j = (int)dim[1]; | ||
77 | } else { | ||
78 | r_j = r_i; | ||
79 | } | ||
80 | if (r_i<0) { r_i = 0; } | ||
81 | if (r_j<0) { r_j = 0; } | ||
82 | |||
83 | /* get sample rate */ | ||
84 | if (nargin==3) { | ||
85 | sample_rate = (mxGetM(in[2])==0) ? 1: mxGetScalar(in[2]); | ||
86 | } else { | ||
87 | sample_rate = 1; | ||
88 | } | ||
89 | /* prepare for random number generator */ | ||
90 | if (sample_rate<1) { | ||
91 | srand( (unsigned)time( NULL ) ); | ||
92 | th_rand = (int)ceil((double)RAND_MAX * sample_rate); | ||
93 | no_sample = 0; | ||
94 | } else { | ||
95 | sample_rate = 1; | ||
96 | th_rand = RAND_MAX; | ||
97 | no_sample = 1; | ||
98 | } | ||
99 | |||
100 | /* figure out neighbourhood size */ | ||
101 | |||
102 | nb = (r_i + r_i) * (r_j + r_j)+1; | ||
103 | if (nb>np) { | ||
104 | nb = np; | ||
105 | } | ||
106 | nb = (int)ceil((double)nb * sample_rate); | ||
107 | /*printf("nb=%d\n",nb);*/ | ||
108 | /* intermediate data structure */ | ||
109 | /* p = mxCalloc(np * (nb+1), sizeof(unsigned long)); */ | ||
110 | p = mxCalloc(np * (nb+1), sizeof(unsigned int)); | ||
111 | if (p==NULL) { | ||
112 | mexErrMsgTxt("Not enough space for my computation."); | ||
113 | } | ||
114 | |||
115 | /* computation */ | ||
116 | total = 0; | ||
117 | for (j=0; j<nc; j++) { | ||
118 | /*printf("j=%d\n",j);*/ | ||
119 | for (i=0; i<nr; i++) { | ||
120 | |||
121 | self = i + j * nr; | ||
122 | |||
123 | /* put self in, otherwise the index is not ordered */ | ||
124 | p[self] = p[self] + 1; | ||
125 | p[self+p[self]*np] = self; | ||
126 | |||
127 | /* j range */ | ||
128 | b1 = j; | ||
129 | b2 = j + r_j; | ||
130 | if (b2>=nc) { b2 = nc-1; } | ||
131 | |||
132 | /* i range */ | ||
133 | /*a1 = i - r_i; | ||
134 | if (a1<0) { a1 = 0; }*/ | ||
135 | a2 = i + r_i; | ||
136 | if (a2>=nr) { a2 = nr-1; } | ||
137 | |||
138 | /* number of more samples needed */ | ||
139 | nsamp = nb - p[self]; | ||
140 | /*if (nsamp<0) | ||
141 | {printf("nsamp=%d\n",nsamp);}*/ | ||
142 | k = 0; | ||
143 | t = b1; | ||
144 | s = i + 1; | ||
145 | if (s>a2) { | ||
146 | s = i; | ||
147 | t = t + 1; | ||
148 | } | ||
149 | |||
150 | |||
151 | while (k<nsamp && t<=b2) { | ||
152 | |||
153 | if (no_sample || (rand()<th_rand)) { | ||
154 | k = k + 1; | ||
155 | neighbor = s + t * nr; | ||
156 | p[self] = p[self] + 1; | ||
157 | p[self+p[self]*np] = neighbor; | ||
158 | p[neighbor] = p[neighbor] + 1; | ||
159 | p[neighbor+p[neighbor]*np] = self; | ||
160 | } | ||
161 | if (s!=i){ | ||
162 | s = s + 1; if (s>a2) { s = i; t = t + 1; | ||
163 | } | ||
164 | } | ||
165 | else {t=t+1;} | ||
166 | } /* k */ | ||
167 | total = total + p[self]; | ||
168 | } /* i */ | ||
169 | |||
170 | } /* j */ | ||
171 | |||
172 | /* i, j */ | ||
173 | |||
174 | out[0] = mxCreateNumericMatrix(total, 1, mxUINT32_CLASS, mxREAL); | ||
175 | out[1] = mxCreateNumericMatrix(np+1, 1, mxUINT32_CLASS, mxREAL); | ||
176 | qi = mxGetData(out[0]); | ||
177 | qj = mxGetData(out[1]); | ||
178 | |||
179 | if (out[0]==NULL || out[1]==NULL) { | ||
180 | mexErrMsgTxt("Not enough space for the output matrix."); | ||
181 | } | ||
182 | |||
183 | total = 0; | ||
184 | for (j=0; j<np; j++) { | ||
185 | qj[j] = total; | ||
186 | s = j + np; | ||
187 | for (t=0; t<p[j]; t++) { | ||
188 | qi[total] = p[s]; | ||
189 | total = total + 1; | ||
190 | s = s + np; | ||
191 | } | ||
192 | } | ||
193 | qj[np] = total; | ||
194 | |||
195 | mxFree(p); | ||
196 | |||
197 | } | ||
diff --git a/SD-VBS/common/toolbox/MultiNcut/cimgnbmap_cross.dll b/SD-VBS/common/toolbox/MultiNcut/cimgnbmap_cross.dll new file mode 100755 index 0000000..d66e578 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/cimgnbmap_cross.dll | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/cimgnbmap_cross.mexa64 b/SD-VBS/common/toolbox/MultiNcut/cimgnbmap_cross.mexa64 new file mode 100755 index 0000000..905aae5 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/cimgnbmap_cross.mexa64 | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/cimgnbmap_cross.mexglx b/SD-VBS/common/toolbox/MultiNcut/cimgnbmap_cross.mexglx new file mode 100755 index 0000000..a7fc50d --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/cimgnbmap_cross.mexglx | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/cimgnbmap_star.c b/SD-VBS/common/toolbox/MultiNcut/cimgnbmap_star.c new file mode 100755 index 0000000..e8a37d6 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/cimgnbmap_star.c | |||
@@ -0,0 +1,294 @@ | |||
1 | /*================================================================ | ||
2 | * function [i,j] = cimgnbmap_star([nr,nc], nb_r, sample_rate) | ||
3 | * computes the neighbourhood index matrix of an image, | ||
4 | * with each neighbourhood sampled. | ||
5 | * Input: | ||
6 | * [nr,nc] = image size | ||
7 | * nb_r = neighbourhood radius, could be [r_i,r_j] for i,j | ||
8 | * sample_rate = sampling rate, default = 1 | ||
9 | |||
10 | * Output: | ||
11 | |||
12 | * [i,j] = each is a column vector, give indices of neighbour pairs | ||
13 | |||
14 | * UINT32 type | ||
15 | |||
16 | * i is of total length of valid elements, 0 for first row | ||
17 | |||
18 | * j is of length nr * nc + 1 | ||
19 | |||
20 | * | ||
21 | |||
22 | * See also: imgnbmap.c, id2cind.m | ||
23 | |||
24 | * | ||
25 | * Examples: | ||
26 | * [i,j] = imgnbmap(10, 20); % [10,10] are assumed | ||
27 | * | ||
28 | * Stella X. Yu, Nov 12, 2001. | ||
29 | |||
30 | % test sequence: | ||
31 | |||
32 | nr = 15; | ||
33 | |||
34 | nc = 15; | ||
35 | |||
36 | nbr = 1; | ||
37 | |||
38 | [i,j] = cimgnbmap([nr,nc], nbr); | ||
39 | |||
40 | mask = csparse(i,j,ones(length(i),1),nr*nc); | ||
41 | |||
42 | show_dist_w(rand(nr,nc),mask) | ||
43 | |||
44 | |||
45 | *=================================================================*/ | ||
46 | |||
47 | # include "mex.h" | ||
48 | |||
49 | # include "math.h" | ||
50 | |||
51 | void mexFunction( | ||
52 | int nargout, | ||
53 | mxArray *out[], | ||
54 | int nargin, | ||
55 | const mxArray *in[] | ||
56 | ) | ||
57 | { | ||
58 | /* declare variables */ | ||
59 | int nr, nc, np, nb, total; | ||
60 | |||
61 | double *dim, sample_rate; | ||
62 | int r_i, r_j, a1, a2, b1, b2, self, neighbor; | ||
63 | int i, j, k, s, t, nsamp, th_rand, no_sample; | ||
64 | /* unsigned long *p, *qi, *qj; */ | ||
65 | unsigned int *p, *qi, *qj; | ||
66 | |||
67 | /* check argument */ | ||
68 | if (nargin < 2) { | ||
69 | mexErrMsgTxt("Two input arguments required"); | ||
70 | } | ||
71 | if (nargout> 2) { | ||
72 | mexErrMsgTxt("Too many output arguments."); | ||
73 | } | ||
74 | |||
75 | |||
76 | /* get image size */ | ||
77 | |||
78 | i = mxGetM(in[0]); | ||
79 | j = mxGetN(in[0]); | ||
80 | dim = mxGetData(in[0]); | ||
81 | nr = (int)dim[0]; | ||
82 | if (j>1 || i>1) { | ||
83 | nc = (int)dim[1]; | ||
84 | } else { | ||
85 | nc = nr; | ||
86 | } | ||
87 | np = nr * nc; | ||
88 | |||
89 | |||
90 | /* get neighbourhood size */ | ||
91 | i = mxGetM(in[1]); | ||
92 | j = mxGetN(in[1]); | ||
93 | dim = mxGetData(in[1]); | ||
94 | r_i = (int)dim[0]; | ||
95 | |||
96 | if (j>1 || i>1) { | ||
97 | r_j = (int)dim[1]; | ||
98 | } else { | ||
99 | r_j = r_i; | ||
100 | } | ||
101 | |||
102 | if (r_i<0) { r_i = 0; } | ||
103 | |||
104 | if (r_j<0) { r_j = 0; } | ||
105 | |||
106 | |||
107 | |||
108 | /* get sample rate */ | ||
109 | |||
110 | if (nargin==3) { | ||
111 | |||
112 | sample_rate = (mxGetM(in[2])==0) ? 1: mxGetScalar(in[2]); | ||
113 | |||
114 | } else { | ||
115 | |||
116 | sample_rate = 1; | ||
117 | |||
118 | } | ||
119 | |||
120 | /* prepare for random number generator */ | ||
121 | if (sample_rate<1) { | ||
122 | srand( (unsigned)time( NULL ) ); | ||
123 | |||
124 | th_rand = (int)ceil((double)RAND_MAX * sample_rate); | ||
125 | no_sample = 0; | ||
126 | } else { | ||
127 | |||
128 | sample_rate = 1; | ||
129 | th_rand = RAND_MAX; | ||
130 | no_sample = 1; | ||
131 | } | ||
132 | |||
133 | |||
134 | /* figure out neighbourhood size */ | ||
135 | |||
136 | nb = (4*r_i) + (4*r_j)+1; | ||
137 | if (nb>np) { | ||
138 | nb = np; | ||
139 | } | ||
140 | nb = (int)ceil((double)nb * sample_rate); | ||
141 | |||
142 | /*printf("nb=%d\n",nb);*/ | ||
143 | |||
144 | /* intermediate data structure */ | ||
145 | |||
146 | /* p = mxCalloc(np * (nb+1), sizeof(unsigned long));*/ | ||
147 | p = mxCalloc(np * (nb+1), sizeof(unsigned int)); | ||
148 | |||
149 | if (p==NULL) { | ||
150 | |||
151 | mexErrMsgTxt("Not enough space for my computation."); | ||
152 | |||
153 | } | ||
154 | |||
155 | |||
156 | |||
157 | /* computation */ | ||
158 | |||
159 | total = 0; | ||
160 | for (j=0; j<nc; j++) { | ||
161 | /*printf("j=%d\n",j);*/ | ||
162 | for (i=0; i<nr; i++) { | ||
163 | |||
164 | |||
165 | self = i + j * nr; | ||
166 | /* put self in, otherwise the index is not ordered */ | ||
167 | p[self] = p[self] + 1; | ||
168 | p[self+p[self]*np] = self; | ||
169 | |||
170 | /* j range */ | ||
171 | b1 = j; | ||
172 | b2 = j + r_j; | ||
173 | if (b2>=nc) { b2 = nc-1; } | ||
174 | |||
175 | |||
176 | /* i range */ | ||
177 | /*a1 = i - r_i; | ||
178 | |||
179 | if (a1<0) { a1 = 0; }*/ | ||
180 | a2 = i + r_i; | ||
181 | if (a2>=nr) { a2 = nr-1; } | ||
182 | |||
183 | |||
184 | /* number of more samples needed */ | ||
185 | |||
186 | nsamp = nb - p[self]; | ||
187 | |||
188 | /*if (nsamp<0) | ||
189 | {printf("nsamp=%d\n",nsamp);}*/ | ||
190 | k = 0; | ||
191 | t = b1; | ||
192 | s = i + 1; | ||
193 | |||
194 | if (s>a2) { | ||
195 | s = i; | ||
196 | t = t + 1; | ||
197 | } | ||
198 | |||
199 | |||
200 | |||
201 | while (k<nsamp && t<=b2) { | ||
202 | |||
203 | |||
204 | if (no_sample || (rand()<th_rand)) { | ||
205 | k = k + 1; | ||
206 | neighbor = s + t * nr; | ||
207 | |||
208 | p[self] = p[self] + 1; | ||
209 | |||
210 | p[self+p[self]*np] = neighbor; | ||
211 | p[neighbor] = p[neighbor] + 1; | ||
212 | |||
213 | p[neighbor+p[neighbor]*np] = self; | ||
214 | } | ||
215 | |||
216 | if (t==b1){ | ||
217 | s = s + 1; | ||
218 | if (s>a2) { | ||
219 | t = t + 1; | ||
220 | if (i+j-t>=0) | ||
221 | {s = i+j-t;} | ||
222 | else | ||
223 | {s=i;} | ||
224 | } | ||
225 | } | ||
226 | else { | ||
227 | if (s==i+j-t) {s=i;} | ||
228 | else{ if (s==i && s+t-j<nr) {s=s+t-j;} | ||
229 | else { | ||
230 | t = t + 1; | ||
231 | if (i+j-t>=0) | ||
232 | {s = i+j-t;} | ||
233 | else | ||
234 | {s=i;} | ||
235 | } | ||
236 | |||
237 | } | ||
238 | } | ||
239 | |||
240 | } /* k */ | ||
241 | |||
242 | total = total + p[self]; | ||
243 | } /* i */ | ||
244 | |||
245 | } /* j */ | ||
246 | |||
247 | |||
248 | |||
249 | /* i, j */ | ||
250 | |||
251 | out[0] = mxCreateNumericMatrix(total, 1, mxUINT32_CLASS, mxREAL); | ||
252 | |||
253 | out[1] = mxCreateNumericMatrix(np+1, 1, mxUINT32_CLASS, mxREAL); | ||
254 | |||
255 | qi = mxGetData(out[0]); | ||
256 | |||
257 | qj = mxGetData(out[1]); | ||
258 | |||
259 | |||
260 | if (out[0]==NULL || out[1]==NULL) { | ||
261 | |||
262 | mexErrMsgTxt("Not enough space for the output matrix."); | ||
263 | |||
264 | } | ||
265 | |||
266 | |||
267 | |||
268 | total = 0; | ||
269 | |||
270 | for (j=0; j<np; j++) { | ||
271 | |||
272 | qj[j] = total; | ||
273 | |||
274 | s = j + np; | ||
275 | |||
276 | for (t=0; t<p[j]; t++) { | ||
277 | |||
278 | qi[total] = p[s]; | ||
279 | |||
280 | total = total + 1; | ||
281 | |||
282 | s = s + np; | ||
283 | |||
284 | } | ||
285 | |||
286 | } | ||
287 | |||
288 | qj[np] = total; | ||
289 | |||
290 | |||
291 | |||
292 | mxFree(p); | ||
293 | |||
294 | } | ||
diff --git a/SD-VBS/common/toolbox/MultiNcut/cimgnbmap_star.dll b/SD-VBS/common/toolbox/MultiNcut/cimgnbmap_star.dll new file mode 100755 index 0000000..a7cddfa --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/cimgnbmap_star.dll | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/cimgnbmap_star.mexa64 b/SD-VBS/common/toolbox/MultiNcut/cimgnbmap_star.mexa64 new file mode 100755 index 0000000..d687d91 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/cimgnbmap_star.mexa64 | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/cimgnbmap_star.mexglx b/SD-VBS/common/toolbox/MultiNcut/cimgnbmap_star.mexglx new file mode 100755 index 0000000..25da17f --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/cimgnbmap_star.mexglx | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/compileAll.m b/SD-VBS/common/toolbox/MultiNcut/compileAll.m new file mode 100755 index 0000000..16fe77b --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/compileAll.m | |||
@@ -0,0 +1,10 @@ | |||
1 | function compileAll(Cdir); | ||
2 | |||
3 | files = dir([Cdir,'/*.c']); | ||
4 | |||
5 | for j=1:length(files), | ||
6 | |||
7 | cm = sprintf('mex %s',files(j).name); | ||
8 | disp(cm); | ||
9 | eval(cm); | ||
10 | end | ||
diff --git a/SD-VBS/common/toolbox/MultiNcut/computeMultiW.m b/SD-VBS/common/toolbox/MultiNcut/computeMultiW.m new file mode 100755 index 0000000..b2cb7ea --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/computeMultiW.m | |||
@@ -0,0 +1,245 @@ | |||
1 | %inputs : image, number of layers, distance defining the subgrid, the edge filter scales for each layer, radius for each layer, | ||
2 | %edge variance for filter, shape of the neighbourhood layout ('square', 'star', 'cross'), sigma for intensity affinity, | ||
3 | % sigma for distance influence in affinity, weight coefficients for Wpps in the multiscale matrix. | ||
4 | %output : multiscale affinity matrix , extern constraint matrix, affinity matrices of each layer seperatly. | ||
5 | |||
6 | |||
7 | function [multiWpp,constraintMat, Wind,data,emag,ephase]= computeMultiW (image,data); | ||
8 | |||
9 | %variables | ||
10 | |||
11 | if isempty(data.layers.number) | ||
12 | n=2; | ||
13 | else | ||
14 | n=data.layers.number; | ||
15 | end | ||
16 | |||
17 | if isempty(data.layers.dist) | ||
18 | dist_grid=3; | ||
19 | else | ||
20 | dist_grid=data.layers.dist; | ||
21 | end | ||
22 | |||
23 | if isempty(data.W.scales) | ||
24 | s=1:n; | ||
25 | elseif (length(data.W.scales)==n) | ||
26 | s=data.W.scales; | ||
27 | else | ||
28 | s=1:n; | ||
29 | end | ||
30 | |||
31 | if isempty(data.W.radius) | ||
32 | r(1)=2; | ||
33 | for i=2:n | ||
34 | r(i)=10; | ||
35 | end | ||
36 | else | ||
37 | r=data.W.radius; | ||
38 | end | ||
39 | |||
40 | |||
41 | if isempty(data.W.edgeVariance) | ||
42 | data.W.edgeVariance=0.1; | ||
43 | end | ||
44 | |||
45 | if isempty(data.W.gridtype) | ||
46 | data.W.gridtype='square'; | ||
47 | end | ||
48 | |||
49 | if isempty(data.W.sigmaI) | ||
50 | data.W.sigmaI=0.12; | ||
51 | end | ||
52 | |||
53 | if isempty(data.W.sigmaX) | ||
54 | data.W.sigmaX=10; | ||
55 | end | ||
56 | |||
57 | if isempty(data.layers.weight) | ||
58 | coef(1)=5; | ||
59 | coef(2:n)=200; | ||
60 | elseif (length(data.layers.weight)==n) | ||
61 | coef=data.layers.weight; | ||
62 | else | ||
63 | coef(1)=5; | ||
64 | coef(2:n)=100; %200 | ||
65 | end | ||
66 | |||
67 | if isempty(data.W.mode) | ||
68 | data.W.mode=mixed; | ||
69 | end | ||
70 | |||
71 | |||
72 | [p1,q1,ignore]=size(image); | ||
73 | image=image(:,:,1); | ||
74 | filter_par = [4,30,4]; %[9,30,4] | ||
75 | [x,y,gx,gy,par,threshold,emag,ephase,g,FIe,FIo,mago] = quadedgep2(image,filter_par,data,0.001); | ||
76 | minW=10^(-2); %-3 | ||
77 | |||
78 | |||
79 | % function [multiWpp,constraintMat,p,q,Wppp,subgrid] = computemultiWpp(n,imageX,r,dist_grid,s,dataWpp,emag,ephase,minW,mode,facteurMul,contrainte,tt,gridtype,colormode,imageOriginale,subgridImageReduite,pG,qG) | ||
80 | |||
81 | p= p1*ones(n,1); | ||
82 | q= q1*ones(n,1); | ||
83 | d= dist_grid*ones(n,1); | ||
84 | d(1)=1; | ||
85 | for (i=2:n) | ||
86 | d(i)=d(i)*3^(i-2); | ||
87 | end | ||
88 | p=ceil(p1./d); | ||
89 | q=ceil(q1./d); | ||
90 | |||
91 | %computation of the subgrids (the first pixel is coded by one). S{i,j}(k) is the index of | ||
92 | %the kth pixel of the jth grid in the ith grid. | ||
93 | |||
94 | for i=1:n-1 | ||
95 | for j=i+1:n | ||
96 | a=[0:p(j)*q(j)-1]; | ||
97 | subgrid{i,j}=p(i)*(floor(a/p(j)))*d(j)/d(i)+(1+mod(a,p(j))*d(j)/d(i)); | ||
98 | end | ||
99 | end | ||
100 | |||
101 | %computation of the independent W matrix for each layer Wind{i} 1=<i=<n. | ||
102 | |||
103 | [w1i,w1j]=cimgnbmap([p1,q1], r(1), 1); | ||
104 | |||
105 | if strcmp(data.W.mode,'mixed') | ||
106 | rMin = 0; | ||
107 | imageXX=double(image(:)); | ||
108 | sigmaI= (std(imageXX(:)) + 1e-10 )* data.W.sigmaI; | ||
109 | Wpp{1} = multiIntensityFirstLayer(double(image),w1i,w1j,rMin,data.W.sigmaX,sigmaI,minW); | ||
110 | Wpp2= affinityic(emag(:,:,s(1)),ephase(:,:,s(1)),w1i,w1j,max(max(emag(:,:,s(1)))) * data.W.edgeVariance); | ||
111 | Wpp{1} = sqrt(Wpp{1} .* Wpp2)+0.1*Wpp2; | ||
112 | |||
113 | elseif strcmp(data.W.mode,'notmixed') | ||
114 | Wpp{1}= affinityic(emag(:,:,s(1)),ephase(:,:,s(1)),w1i,w1j,max(max(emag(:,:,s(1)))) * data.W.edgeVariance); | ||
115 | |||
116 | elseif strcmp(data.W.mode,'intensity') | ||
117 | rMin = 0; | ||
118 | imageXX=double(image(:)); | ||
119 | sigmaI= (std(imageXX(:)) + 1e-10 )* data.W.sigmaI; | ||
120 | Wpp{1} = multiIntensityFirstLayer(double(image),w1i,w1j,rMin,data.W.sigmaX,sigmaI,minW); | ||
121 | |||
122 | end | ||
123 | Wpp{1}=coef(1)*(Wpp{1}+Wpp{1}')/2; | ||
124 | %Wpp{1}= coef(1)*Wpp{1}; | ||
125 | Wind{1}=Wpp{1}; | ||
126 | |||
127 | |||
128 | |||
129 | |||
130 | for i=2:n | ||
131 | if strcmp(data.W.gridtype,'square') | ||
132 | [wwi,wwj]=cimgnbmap([p(i),q(i)], r(i), 1); | ||
133 | elseif strcmp(data.W.gridtype,'star') | ||
134 | [wwi,wwj]=cimgnbmap_star([p(i),q(i)], r(i), 1); | ||
135 | elseif strcmp(data.W.gridtype,'cross') | ||
136 | [wwi,wwj]=cimgnbmap_cross([p(i),q(i)], r(i), 1); | ||
137 | end | ||
138 | wwi=double(wwi); | ||
139 | wiInOriginalImage=(p1*(floor(wwi/p(i)))*d(i))+(1+mod(wwi,p(i))*d(i)); | ||
140 | wiInOriginalImage=(p1*(floor(wwi/p(i)))*d(i))+(1+mod(wwi,p(i))*d(i)); | ||
141 | |||
142 | wiInOriginalImage= uint32(wiInOriginalImage); | ||
143 | |||
144 | if strcmp(data.W.mode,'mixed') | ||
145 | Wpp2= multiAffinityic(emag(:,:,i),ephase(:,:,i),wiInOriginalImage,wwj,subgrid{1,i},p(i),q(i),uint32(wwi),max(max(emag(:,:,i))) * data.W.edgeVariance); | ||
146 | a=floor(d(i)/d(i-1)); | ||
147 | if (mod(a,2)==0) | ||
148 | a=a+1; | ||
149 | end | ||
150 | % Wpp{i} = multiIntensityWppc(double(imageX),wiInOriginalImage,wwj,rMin,dataWpp.sigmaX,sigmaI,minW,subgrid{1,i},p(i),q(i),wi{i}); | ||
151 | |||
152 | Wpp{i} = multiIntensityWppc(double(image),wiInOriginalImage,wwj,rMin,data.W.sigmaX,sigmaI,minW,subgrid{1,i},p(i),q(i),uint32(wwi)); | ||
153 | Wpp{i} = sqrt(Wpp{i} .* Wpp2)+0.1*Wpp2; | ||
154 | elseif strcmp(data.W.mode,'notmixed') | ||
155 | Wpp{i}= multiAffinityic(emag(:,:,i),ephase(:,:,i),wiInOriginalImage,wwj,subgrid{1,i},p(i),q(i),uint32(wwi),max(max(emag(:,:,i))) * data.W.edgeVariance); | ||
156 | elseif strcmp(data.W.mode,'intensity') | ||
157 | Wpp{i} = multiIntensityWppc(double(image),wiInOriginalImage,wwj,rMin,data.W.sigmaX,sigmaI,minW,subgrid{1,i},p(i),q(i),uint32(wwi)); | ||
158 | end | ||
159 | Wpp{i}= coef(i)*(Wpp{i}+Wpp{i}')/2; | ||
160 | |||
161 | %Wpp{i}= coef(i)*Wpp{i}; | ||
162 | Wind{i}=Wpp{i}; | ||
163 | |||
164 | end | ||
165 | |||
166 | %computation of the intern contraint matrices C{i,j}. | ||
167 | |||
168 | for i=1:n-1 | ||
169 | r=floor(d(i+1)/(d(i)*2)); | ||
170 | [wwi,wwj]=cimgnbmap([p(i),q(i)], r, 1); | ||
171 | wi{i}=wwi; | ||
172 | wj{i}=wwj; | ||
173 | end | ||
174 | |||
175 | for i=1:n-1 | ||
176 | for j=i+1:n | ||
177 | C{i,j}=sparse(p(i)*q(i),p(j)*q(j)); | ||
178 | firstPointer=double(wj{i}(subgrid{i,j}))+1; | ||
179 | lastPointer=double(wj{i}(subgrid{i,j}+1)); | ||
180 | invNbNeighbours=1./(lastPointer-firstPointer+1); | ||
181 | for (k=1:p(j)*q(j)) | ||
182 | for (m=firstPointer(k):lastPointer(k)) | ||
183 | C{i,j}(double(wi{i}(m))+1,k)=invNbNeighbours(k); | ||
184 | end | ||
185 | end | ||
186 | end | ||
187 | end | ||
188 | |||
189 | %Assembling the built matrices to make up multiWpp. | ||
190 | for i=1:n | ||
191 | if (i>1) | ||
192 | for j=i-1:-1:1 | ||
193 | Wpp{i}=[C{j,i}',Wpp{i}]; | ||
194 | end | ||
195 | end | ||
196 | if (i<n) | ||
197 | for j=i+1:n | ||
198 | Wpp{i}=[Wpp{i},C{i,j}]; | ||
199 | end | ||
200 | end | ||
201 | end | ||
202 | |||
203 | % %Assembling the built matrices to make up Wpp without intern constrains. | ||
204 | % for i=1:n | ||
205 | % if (i>1) | ||
206 | % for j=i-1:-1:1 | ||
207 | % Wpp{i}=[sparse(p(i)*q(i),p(j)*q(j)),Wpp{i}]; | ||
208 | % end | ||
209 | % end | ||
210 | % if (i<n) | ||
211 | % for j=i+1:n | ||
212 | % Wpp{i}=[Wpp{i},sparse(p(i)*q(i),p(j)*q(j))]; | ||
213 | % end | ||
214 | % end | ||
215 | % end | ||
216 | |||
217 | clear Wind;Wind = 1; | ||
218 | |||
219 | multiWpp=Wpp{1}; clear Wpp{1} | ||
220 | for i=2:n | ||
221 | multiWpp=[multiWpp;Wpp{i}];clear Wpp{i} | ||
222 | end | ||
223 | |||
224 | |||
225 | % Computing the average extern constraint | ||
226 | |||
227 | pq=sum(p(2:n).*q(2:n)); | ||
228 | p2q2=p(2)*q(2); | ||
229 | constraintMat=[-C{1,2};speye(p2q2);sparse(pq-p2q2,p2q2)]; | ||
230 | if n>2 | ||
231 | for i=3:n | ||
232 | piqi=p(i)*q(i); | ||
233 | if i~=n | ||
234 | constraintMat=[constraintMat,[sparse(sum(p(1:i-2).*q(1:i-2)),piqi);-C{i-1,i};speye(piqi);sparse(pq-sum(p(2:i).*q(2:i)),piqi)]]; | ||
235 | else | ||
236 | constraintMat=[constraintMat,[sparse(sum(p(1:i-2).*q(1:i-2)),piqi);-C{i-1,i};speye(piqi)]]; | ||
237 | end | ||
238 | end | ||
239 | end | ||
240 | |||
241 | % saving useful information | ||
242 | %subgrids, p and q | ||
243 | data.subgrid=subgrid; | ||
244 | data.p=p; | ||
245 | data.q=q; | ||
diff --git a/SD-VBS/common/toolbox/MultiNcut/discretisation.m b/SD-VBS/common/toolbox/MultiNcut/discretisation.m new file mode 100755 index 0000000..70b5650 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/discretisation.m | |||
@@ -0,0 +1,49 @@ | |||
1 | function [SegLabel,EigenVectors]=discretisation(EigenVectors,nr,nc) | ||
2 | % | ||
3 | % EigenvectorsDiscrete=discretisation(EigenVectors) | ||
4 | % | ||
5 | % Input: EigenVectors = continuous Ncut vector, size = ndata x nbEigenvectors | ||
6 | % Output EigenvectorsDiscrete = discrete Ncut vector, size = ndata x nbEigenvectors | ||
7 | % | ||
8 | % Timothee Cour, Stella Yu, Jianbo Shi, 2004 | ||
9 | |||
10 | [n,k]=size(EigenVectors); | ||
11 | |||
12 | vm = sqrt(sum(EigenVectors.*EigenVectors,2)); | ||
13 | EigenVectors = EigenVectors./repmat(vm,1,k); | ||
14 | |||
15 | R=zeros(k); | ||
16 | R(:,1)=EigenVectors(1+round(rand(1)*(n-1)),:)'; | ||
17 | c=zeros(n,1); | ||
18 | for j=2:k | ||
19 | c=c+abs(EigenVectors*R(:,j-1)); | ||
20 | [minimum,i]=min(c); | ||
21 | R(:,j)=EigenVectors(i,:)'; | ||
22 | end | ||
23 | |||
24 | lastObjectiveValue=0; | ||
25 | exitLoop=0; | ||
26 | nbIterationsDiscretisation = 0; | ||
27 | nbIterationsDiscretisationMax = 20;%voir | ||
28 | while exitLoop== 0 | ||
29 | nbIterationsDiscretisation = nbIterationsDiscretisation + 1 ; | ||
30 | EigenvectorsDiscrete = discretisationEigenVectorData(EigenVectors*R); | ||
31 | [U,S,V] = svd(EigenvectorsDiscrete'*EigenVectors,0); | ||
32 | NcutValue=2*(n-trace(S)); | ||
33 | |||
34 | if abs(NcutValue-lastObjectiveValue) < eps | nbIterationsDiscretisation > nbIterationsDiscretisationMax | ||
35 | exitLoop=1; | ||
36 | else | ||
37 | lastObjectiveValue = NcutValue; | ||
38 | R=V*U'; | ||
39 | end | ||
40 | end | ||
41 | |||
42 | %%%% | ||
43 | |||
44 | SegLabel = zeros(nr,nc); | ||
45 | for j=1:size(EigenvectorsDiscrete,2), | ||
46 | SegLabel = SegLabel + j*reshape(EigenvectorsDiscrete(:,j),nr,nc); | ||
47 | end | ||
48 | EigenVectors = reshape(EigenVectors,nr,nc,size(EigenVectors,2)); | ||
49 | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/discretisationEigenVectorData.m b/SD-VBS/common/toolbox/MultiNcut/discretisationEigenVectorData.m new file mode 100755 index 0000000..4626e3d --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/discretisationEigenVectorData.m | |||
@@ -0,0 +1,12 @@ | |||
1 | function Y = discretisationEigenVectorData(EigenVector) | ||
2 | % Y = discretisationEigenVectorData(EigenVector) | ||
3 | % | ||
4 | % discretizes previously rotated eigenvectors in discretisation | ||
5 | % Timothee Cour, Stella Yu, Jianbo Shi, 2004 | ||
6 | |||
7 | [n,k]=size(EigenVector); | ||
8 | |||
9 | |||
10 | [Maximum,J]=max(EigenVector'); | ||
11 | |||
12 | Y=sparse(1:n,J',1,n,k); | ||
diff --git a/SD-VBS/common/toolbox/MultiNcut/doog1.m b/SD-VBS/common/toolbox/MultiNcut/doog1.m new file mode 100755 index 0000000..dd8e87b --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/doog1.m | |||
@@ -0,0 +1,32 @@ | |||
1 | function H=doog1(sig,r,th,N); | ||
2 | % H=doog1(sig,r,th,N); | ||
3 | |||
4 | |||
5 | % by Serge Belongie | ||
6 | |||
7 | no_pts=N; % no. of points in x,y grid | ||
8 | |||
9 | [x,y]=meshgrid(-(N/2)+1/2:(N/2)-1/2,-(N/2)+1/2:(N/2)-1/2); | ||
10 | |||
11 | phi=pi*th/180; | ||
12 | sigy=sig; | ||
13 | sigx=r*sig; | ||
14 | R=[cos(phi) -sin(phi); sin(phi) cos(phi)]; | ||
15 | C=R*diag([sigx,sigy])*R'; | ||
16 | |||
17 | X=[x(:) y(:)]; | ||
18 | |||
19 | Gb=gaussian(X,[0 0]',C); | ||
20 | Gb=reshape(Gb,N,N); | ||
21 | |||
22 | m=R*[0 sig]'; | ||
23 | |||
24 | a=1; | ||
25 | b=-1; | ||
26 | |||
27 | % make odd-symmetric filter | ||
28 | Ga=gaussian(X,m/2,C); | ||
29 | Ga=reshape(Ga,N,N); | ||
30 | Gb=rot90(Ga,2); | ||
31 | H=a*Ga+b*Gb; | ||
32 | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/doog2.m b/SD-VBS/common/toolbox/MultiNcut/doog2.m new file mode 100755 index 0000000..a0511cb --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/doog2.m | |||
@@ -0,0 +1,38 @@ | |||
1 | function G=doog2(sig,r,th,N); | ||
2 | % G=doog2(sig,r,th,N); | ||
3 | % Make difference of offset gaussians kernel | ||
4 | % theta is in degrees | ||
5 | % (see Malik & Perona, J. Opt. Soc. Amer., 1990) | ||
6 | % | ||
7 | % Example: | ||
8 | % >> imagesc(doog2(1,12,0,64,1)) | ||
9 | % >> colormap(gray) | ||
10 | |||
11 | % by Serge Belongie | ||
12 | |||
13 | no_pts=N; % no. of points in x,y grid | ||
14 | |||
15 | [x,y]=meshgrid(-(N/2)+1/2:(N/2)-1/2,-(N/2)+1/2:(N/2)-1/2); | ||
16 | |||
17 | phi=pi*th/180; | ||
18 | sigy=sig; | ||
19 | sigx=r*sig; | ||
20 | R=[cos(phi) -sin(phi); sin(phi) cos(phi)]; | ||
21 | C=R*diag([sigx,sigy])*R'; | ||
22 | |||
23 | X=[x(:) y(:)]; | ||
24 | |||
25 | Gb=gaussian(X,[0 0]',C); | ||
26 | Gb=reshape(Gb,N,N); | ||
27 | |||
28 | m=R*[0 sig]'; | ||
29 | Ga=gaussian(X,m,C); | ||
30 | Ga=reshape(Ga,N,N); | ||
31 | Gc=rot90(Ga,2); | ||
32 | |||
33 | a=-1; | ||
34 | b=2; | ||
35 | c=-1; | ||
36 | |||
37 | G = a*Ga + b*Gb + c*Gc; | ||
38 | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/eigSolve.m b/SD-VBS/common/toolbox/MultiNcut/eigSolve.m new file mode 100755 index 0000000..cfb64fc --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/eigSolve.m | |||
@@ -0,0 +1,5 @@ | |||
1 | function [eigenVectors,s]= eigSolve (multiWpp,ConstraintMat,data) | ||
2 | |||
3 | [v,s] = quickNcutHardBiais2(multiWpp,ConstraintMat,data.dataGraphCut.nbEigenValues,data.dataGraphCut); | ||
4 | v=v(1:data.p(1)*data.q(1),:); | ||
5 | eigenVectors=reshape(v,data.p(1),data.q(1),data.dataGraphCut.nbEigenValues); | ||
diff --git a/SD-VBS/common/toolbox/MultiNcut/fft_filt_2.m b/SD-VBS/common/toolbox/MultiNcut/fft_filt_2.m new file mode 100755 index 0000000..9c84e96 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/fft_filt_2.m | |||
@@ -0,0 +1,29 @@ | |||
1 | function FI=fft_filt_2(V,FB,sf); | ||
2 | % FI=fft_filt_2(V,FB,sf); | ||
3 | % fft-based filtering | ||
4 | % requires image to be called "V" | ||
5 | % and filters to be in FB | ||
6 | % sf is the subsampling factor | ||
7 | % | ||
8 | % FI is the result | ||
9 | |||
10 | [M1,M2,N3]=size(FB); | ||
11 | % prepare FFT of image for filtering | ||
12 | [N1,N2]=size(V); | ||
13 | I=zeros(size(V)+[M1-1 M2-1]); | ||
14 | I(1:N1,1:N2)=V; | ||
15 | N1s=length(1:sf:N1); | ||
16 | N2s=length(1:sf:N2); | ||
17 | IF=fft2(I); | ||
18 | FI=zeros(N1s,N2s,N3); | ||
19 | |||
20 | % apply filters | ||
21 | for n=1:N3; | ||
22 | f=rot90(FB(:,:,n),2); | ||
23 | fF=fft2(f,N1+M1-1,N2+M2-1); | ||
24 | IfF=IF.*fF; | ||
25 | If=real(ifft2(IfF)); | ||
26 | If=If(ceil((M1+1)/2):ceil((M1+1)/2)+N1-1,ceil((M2+1)/2):ceil((M2+1)/2)+N2-1); | ||
27 | FI(:,:,n)=If(1:sf:N1,1:sf:N2); | ||
28 | end | ||
29 | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/gaussian.m b/SD-VBS/common/toolbox/MultiNcut/gaussian.m new file mode 100755 index 0000000..509b129 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/gaussian.m | |||
@@ -0,0 +1,31 @@ | |||
1 | function p=gaussian(x,m,C); | ||
2 | % p=gaussian(x,m,C); | ||
3 | % | ||
4 | % Evaluate the multi-variate density with mean vector m and covariance | ||
5 | % matrix C for the input vector x. | ||
6 | % | ||
7 | % p=gaussian(X,m,C); | ||
8 | % | ||
9 | % Vectorized version: Here X is a matrix of column vectors, and p is | ||
10 | % a vector of probabilities for each vector. | ||
11 | |||
12 | d=length(m); | ||
13 | |||
14 | if size(x,1)~=d | ||
15 | x=x'; | ||
16 | end | ||
17 | N=size(x,2); | ||
18 | |||
19 | detC = det(C); | ||
20 | if rcond(C)<eps | ||
21 | % fprintf(1,'Covariance matrix close to singular. (gaussian.m)\n'); | ||
22 | p = zeros(N,1); | ||
23 | else | ||
24 | m=m(:); | ||
25 | M=m*ones(1,N); | ||
26 | denom=(2*pi)^(d/2)*sqrt(abs(detC)); | ||
27 | mahal=sum(((x-M)'*inv(C)).*(x-M)',2); % Chris Bregler's trick | ||
28 | numer=exp(-0.5*mahal); | ||
29 | p=numer/denom; | ||
30 | end | ||
31 | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/make_filterbank_even2.m b/SD-VBS/common/toolbox/MultiNcut/make_filterbank_even2.m new file mode 100755 index 0000000..f7f4527 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/make_filterbank_even2.m | |||
@@ -0,0 +1,45 @@ | |||
1 | function FB = make_filterbank(num_ori,filter_scales,wsz,enlong) | ||
2 | % | ||
3 | % F = make_filterbank(num_ori,num_scale,wsz) | ||
4 | % | ||
5 | |||
6 | if nargin<4, | ||
7 | enlong = 3; | ||
8 | end | ||
9 | |||
10 | enlong = 2*enlong; | ||
11 | |||
12 | % definine filterbank | ||
13 | %num_ori=6; | ||
14 | %num_scale=3; | ||
15 | |||
16 | num_scale = length(filter_scales); | ||
17 | |||
18 | M1=wsz; % size in pixels | ||
19 | M2=M1; | ||
20 | |||
21 | ori_incr=180/num_ori; | ||
22 | ori_offset=ori_incr/2; % helps with equalizing quantiz. error across filter set | ||
23 | |||
24 | FB=zeros(M1,M2,num_ori,num_scale); | ||
25 | |||
26 | % elongated filter set | ||
27 | counter = 1; | ||
28 | |||
29 | for m=1:num_scale | ||
30 | for n=1:num_ori | ||
31 | % r=12 here is equivalent to Malik's r=3; | ||
32 | f=doog2(filter_scales(m),enlong,ori_offset+(n-1)*ori_incr,M1); | ||
33 | FB(:,:,n,m)=f; | ||
34 | end | ||
35 | end | ||
36 | |||
37 | FB=reshape(FB,M1,M2,num_scale*num_ori); | ||
38 | total_num_filt=size(FB,3); | ||
39 | |||
40 | for j=1:total_num_filt, | ||
41 | F = FB(:,:,j); | ||
42 | a = sum(sum(abs(F))); | ||
43 | FB(:,:,j) = FB(:,:,j)/a; | ||
44 | end | ||
45 | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/make_filterbank_odd2.m b/SD-VBS/common/toolbox/MultiNcut/make_filterbank_odd2.m new file mode 100755 index 0000000..0059dca --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/make_filterbank_odd2.m | |||
@@ -0,0 +1,46 @@ | |||
1 | function FB = make_filterbank(num_ori,filter_scales,wsz,enlong) | ||
2 | % | ||
3 | % F = make_filterbank(num_ori,num_scale,wsz) | ||
4 | % | ||
5 | |||
6 | if nargin<4, | ||
7 | enlong = 3; | ||
8 | end | ||
9 | |||
10 | enlong = enlong*2; | ||
11 | |||
12 | % definine filterbank | ||
13 | %num_ori=6; | ||
14 | %num_scale=3; | ||
15 | |||
16 | num_scale = length(filter_scales); | ||
17 | |||
18 | M1=wsz; % size in pixels | ||
19 | M2=M1; | ||
20 | |||
21 | ori_incr=180/num_ori; | ||
22 | ori_offset=ori_incr/2; % helps with equalizing quantiz. error across filter set | ||
23 | |||
24 | FB=zeros(M1,M2,num_ori,num_scale); | ||
25 | |||
26 | |||
27 | % elongated filter set | ||
28 | counter = 1; | ||
29 | |||
30 | for m=1:num_scale | ||
31 | for n=1:num_ori | ||
32 | % r=12 here is equivalent to Malik's r=3; | ||
33 | f=doog1(filter_scales(m),enlong,ori_offset+(n-1)*ori_incr,M1); | ||
34 | FB(:,:,n,m)=f; | ||
35 | end | ||
36 | end | ||
37 | |||
38 | FB=reshape(FB,M1,M2,num_scale*num_ori); | ||
39 | total_num_filt=size(FB,3); | ||
40 | |||
41 | for j=1:total_num_filt, | ||
42 | F = FB(:,:,j); | ||
43 | a = sum(sum(abs(F))); | ||
44 | FB(:,:,j) = FB(:,:,j)/a; | ||
45 | end | ||
46 | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/mex_projection_QR.c b/SD-VBS/common/toolbox/MultiNcut/mex_projection_QR.c new file mode 100755 index 0000000..5ac4820 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/mex_projection_QR.c | |||
@@ -0,0 +1,82 @@ | |||
1 | /*================================================================ | ||
2 | * mex_projection_QR.c = used by quickNcutHardBiais.m in eigensolver. | ||
3 | * mex_projection_QR(X,P,Ubar,R) == (eye(length(P))-Ubar*(R'*R)^{-1}*Ubar') * P * (eye(length(P))-Ubar*(R'*R)^{-1}*Ubar') * X ; | ||
4 | * (R'*R)^{-1} is solved by solving a triangular system | ||
5 | |||
6 | * P, Ubar, R are sparse, but X is full | ||
7 | |||
8 | * R is upper triangular | ||
9 | |||
10 | % test sequence: | ||
11 | |||
12 | *=================================================================*/ | ||
13 | |||
14 | # include "math.h" | ||
15 | # include "mex.h" | ||
16 | # include "a_times_b_cmplx.c" | ||
17 | /*# include "a_times_b.c"*/ | ||
18 | |||
19 | void mexFunction( | ||
20 | int nargout, | ||
21 | mxArray *out[], | ||
22 | int nargin, | ||
23 | const mxArray *in[] | ||
24 | ) | ||
25 | { | ||
26 | int *ir[4], *jc[4], m[4], n[4]; | ||
27 | double *y, *y1,*y2,*y3,*y4,*y5,*y6, *pr[4]; | ||
28 | double *y2bis, *y5bis; | ||
29 | int k; | ||
30 | |||
31 | for (k=0; k<4; k++) { | ||
32 | m[k] = mxGetM(in[k]); | ||
33 | n[k] = mxGetN(in[k]); | ||
34 | pr[k] = mxGetPr(in[k]); | ||
35 | if (k>0) { | ||
36 | ir[k] = mxGetIr(in[k]); | ||
37 | jc[k] = mxGetJc(in[k]); | ||
38 | } | ||
39 | } | ||
40 | |||
41 | out[0] = mxCreateDoubleMatrix(m[1],1,mxREAL); | ||
42 | y = mxGetPr(out[0]); | ||
43 | |||
44 | |||
45 | y1 = mxCalloc(n[2], sizeof(double)); | ||
46 | y2 = mxCalloc(m[3], sizeof(double)); | ||
47 | y2bis = mxCalloc(m[3], sizeof(double)); | ||
48 | y3 = mxCalloc(m[1], sizeof(double)); | ||
49 | y4 = mxCalloc(m[1], sizeof(double)); | ||
50 | y5 = mxCalloc(n[2], sizeof(double)); | ||
51 | y5bis = mxCalloc(n[2], sizeof(double)); | ||
52 | y6 = mxCalloc(n[2], sizeof(double)); | ||
53 | |||
54 | CSR_VecMult_CAB_double(m[2],n[2],pr[2],ir[2],jc[2],pr[0],y1); | ||
55 | CSR_VecTriangSlvLD_CAB_double(m[3],pr[3],ir[3],jc[3],y1,y2bis); | ||
56 | CSC_VecTriangSlvUD_CAB_double(m[3],pr[3],ir[3],jc[3],y2bis,y2); | ||
57 | for(k=0;k<m[1];k++) { | ||
58 | y3[k]=pr[0][k]; | ||
59 | } | ||
60 | CSC_VecMult_CaABC_double(m[2],n[2],-1,pr[2],ir[2],jc[2],y2,y3); | ||
61 | |||
62 | CSR_VecMult_CAB_double(m[1],n[1],pr[1],ir[1],jc[1],y3,y4); | ||
63 | |||
64 | CSR_VecMult_CAB_double(m[2],n[2],pr[2],ir[2],jc[2],y4,y5); | ||
65 | |||
66 | CSR_VecTriangSlvLD_CAB_double(m[3],pr[3],ir[3],jc[3],y5,y5bis); | ||
67 | CSC_VecTriangSlvUD_CAB_double(m[3],pr[3],ir[3],jc[3],y5bis,y6); | ||
68 | for(k=0;k<m[1];k++) { | ||
69 | y[k]=y4[k]; | ||
70 | } | ||
71 | CSC_VecMult_CaABC_double(m[2],n[2],-1,pr[2],ir[2],jc[2],y6,y); | ||
72 | |||
73 | |||
74 | mxFree(y1); | ||
75 | mxFree(y2); | ||
76 | mxFree(y2bis); | ||
77 | mxFree(y3); | ||
78 | mxFree(y4); | ||
79 | mxFree(y5); | ||
80 | mxFree(y5bis); | ||
81 | mxFree(y6); | ||
82 | } | ||
diff --git a/SD-VBS/common/toolbox/MultiNcut/mex_projection_QR.dll b/SD-VBS/common/toolbox/MultiNcut/mex_projection_QR.dll new file mode 100755 index 0000000..d77f509 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/mex_projection_QR.dll | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/mex_projection_QR.mexa64 b/SD-VBS/common/toolbox/MultiNcut/mex_projection_QR.mexa64 new file mode 100755 index 0000000..bb7b7bd --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/mex_projection_QR.mexa64 | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/mex_projection_QR.mexglx b/SD-VBS/common/toolbox/MultiNcut/mex_projection_QR.mexglx new file mode 100755 index 0000000..dd63169 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/mex_projection_QR.mexglx | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/mex_projection_QR_symmetric.c b/SD-VBS/common/toolbox/MultiNcut/mex_projection_QR_symmetric.c new file mode 100755 index 0000000..5915959 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/mex_projection_QR_symmetric.c | |||
@@ -0,0 +1,83 @@ | |||
1 | /*================================================================ | ||
2 | * mex_projection_QR_symmetric.c = used by quickNcutHardBiais.m in eigensolver. | ||
3 | * mex_projection_QR_symmetric(X,P,Ubar,R) == (eye(length(P))-Ubar*(R'*R)^{-1}*Ubar') * P * (eye(length(P))-Ubar*(R'*R)^{-1}*Ubar') * X ; | ||
4 | * (R'*R)^{-1} is solved by solving a triangular system | ||
5 | |||
6 | * P, Ubar, R are sparse, but X is full | ||
7 | |||
8 | * R is upper triangular | ||
9 | * P is symmetric | ||
10 | |||
11 | % test sequence: | ||
12 | |||
13 | *=================================================================*/ | ||
14 | |||
15 | # include "math.h" | ||
16 | # include "mex.h" | ||
17 | # include "a_times_b_cmplx.c" | ||
18 | /*# include "a_times_b.c"*/ | ||
19 | |||
20 | void mexFunction( | ||
21 | int nargout, | ||
22 | mxArray *out[], | ||
23 | int nargin, | ||
24 | const mxArray *in[] | ||
25 | ) | ||
26 | { | ||
27 | int *ir[4], *jc[4], m[4], n[4]; | ||
28 | double *y, *y1,*y2,*y3,*y4,*y5,*y6, *pr[4]; | ||
29 | double *y2bis, *y5bis; | ||
30 | int k; | ||
31 | |||
32 | for (k=0; k<4; k++) { | ||
33 | m[k] = mxGetM(in[k]); | ||
34 | n[k] = mxGetN(in[k]); | ||
35 | pr[k] = mxGetPr(in[k]); | ||
36 | if (k>0) { | ||
37 | ir[k] = mxGetIr(in[k]); | ||
38 | jc[k] = mxGetJc(in[k]); | ||
39 | } | ||
40 | } | ||
41 | |||
42 | out[0] = mxCreateDoubleMatrix(m[1],1,mxREAL); | ||
43 | y = mxGetPr(out[0]); | ||
44 | |||
45 | |||
46 | y1 = mxCalloc(n[2], sizeof(double)); | ||
47 | y2 = mxCalloc(m[3], sizeof(double)); | ||
48 | y2bis = mxCalloc(m[3], sizeof(double)); | ||
49 | y3 = mxCalloc(m[1], sizeof(double)); | ||
50 | y4 = mxCalloc(m[1], sizeof(double)); | ||
51 | y5 = mxCalloc(n[2], sizeof(double)); | ||
52 | y5bis = mxCalloc(n[2], sizeof(double)); | ||
53 | y6 = mxCalloc(n[2], sizeof(double)); | ||
54 | |||
55 | CSR_VecMult_CAB_double(m[2],n[2],pr[2],ir[2],jc[2],pr[0],y1); | ||
56 | CSR_VecTriangSlvLD_CAB_double(m[3],pr[3],ir[3],jc[3],y1,y2bis); | ||
57 | CSC_VecTriangSlvUD_CAB_double(m[3],pr[3],ir[3],jc[3],y2bis,y2); | ||
58 | for(k=0;k<m[1];k++) { | ||
59 | y3[k]=pr[0][k]; | ||
60 | } | ||
61 | CSC_VecMult_CaABC_double(m[2],n[2],-1,pr[2],ir[2],jc[2],y2,y3); | ||
62 | |||
63 | CSRsymm_VecMult_CAB_double(m[1],n[1],pr[1],ir[1],jc[1],y3,y4); | ||
64 | |||
65 | CSR_VecMult_CAB_double(m[2],n[2],pr[2],ir[2],jc[2],y4,y5); | ||
66 | |||
67 | CSR_VecTriangSlvLD_CAB_double(m[3],pr[3],ir[3],jc[3],y5,y5bis); | ||
68 | CSC_VecTriangSlvUD_CAB_double(m[3],pr[3],ir[3],jc[3],y5bis,y6); | ||
69 | for(k=0;k<m[1];k++) { | ||
70 | y[k]=y4[k]; | ||
71 | } | ||
72 | CSC_VecMult_CaABC_double(m[2],n[2],-1,pr[2],ir[2],jc[2],y6,y); | ||
73 | |||
74 | |||
75 | mxFree(y1); | ||
76 | mxFree(y2); | ||
77 | mxFree(y2bis); | ||
78 | mxFree(y3); | ||
79 | mxFree(y4); | ||
80 | mxFree(y5); | ||
81 | mxFree(y5bis); | ||
82 | mxFree(y6); | ||
83 | } | ||
diff --git a/SD-VBS/common/toolbox/MultiNcut/mex_projection_QR_symmetric.dll b/SD-VBS/common/toolbox/MultiNcut/mex_projection_QR_symmetric.dll new file mode 100755 index 0000000..0270d17 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/mex_projection_QR_symmetric.dll | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/mex_projection_QR_symmetric.mexa64 b/SD-VBS/common/toolbox/MultiNcut/mex_projection_QR_symmetric.mexa64 new file mode 100755 index 0000000..201f6e3 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/mex_projection_QR_symmetric.mexa64 | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/mex_projection_QR_symmetric.mexglx b/SD-VBS/common/toolbox/MultiNcut/mex_projection_QR_symmetric.mexglx new file mode 100755 index 0000000..5b80e13 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/mex_projection_QR_symmetric.mexglx | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/mex_w_times_x_symmetric.mexglx b/SD-VBS/common/toolbox/MultiNcut/mex_w_times_x_symmetric.mexglx new file mode 100755 index 0000000..bfad956 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/mex_w_times_x_symmetric.mexglx | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/mex_w_times_x_symmetric.mexmac b/SD-VBS/common/toolbox/MultiNcut/mex_w_times_x_symmetric.mexmac new file mode 100755 index 0000000..54be540 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/mex_w_times_x_symmetric.mexmac | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/multiAffinityic.c b/SD-VBS/common/toolbox/MultiNcut/multiAffinityic.c new file mode 100755 index 0000000..6919db9 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/multiAffinityic.c | |||
@@ -0,0 +1,216 @@ | |||
1 | /*================================================================ | ||
2 | * function w = affinityic(emag,ephase,pi,pj,subgrid,nrSubgrid,ncSubgrid,subpi,sigma) | ||
3 | * Input: | ||
4 | * emag = edge strength at each pixel | ||
5 | * ephase = edge phase at each pixel | ||
6 | * [pi,pj] = index pair representation for MALTAB sparse matrices, pi index in original grid, size(pj)=nrW*ncW+1 | ||
7 | * subgrid= index of the subgrid in the original image (first pixel's index is one!) | ||
8 | * [nrSubgrid,ncSubgrid]= number of rows et colums of the subgrid | ||
9 | * subpi = pi but with index in subgrid | ||
10 | * sigma = sigma for IC energy | ||
11 | * Output: | ||
12 | * w = affinity with IC at [pi,pj] | ||
13 | * | ||
14 | |||
15 | % test sequence | ||
16 | f = synimg(10); | ||
17 | [i,j] = cimgnbmap(size(f),2); | ||
18 | [ex,ey,egx,egy] = quadedgep(f); | ||
19 | a = affinityic(ex,ey,egx,egy,i,j) | ||
20 | show_dist_w(f,a); | ||
21 | |||
22 | * Stella X. Yu, Nov 19, 2001. | ||
23 | *=================================================================*/ | ||
24 | |||
25 | # include "mex.h" | ||
26 | # include "math.h" | ||
27 | |||
28 | void mexFunction( | ||
29 | int nargout, | ||
30 | mxArray *out[], | ||
31 | int nargin, | ||
32 | const mxArray *in[] | ||
33 | ) | ||
34 | { | ||
35 | /* declare variables */ | ||
36 | int nr, nc, np, nW, total; | ||
37 | int i, j, k, t, ix, iy, jx, jy, ii, jj, iip1, jjp1, iip2, jjp2, step,nrSubgrid, ncSubgrid; | ||
38 | double sigma, di, dj, a, z, maxori, phase1, phase2, slope; | ||
39 | int *ir, *jc; | ||
40 | /* unsigned long *pi, *pj, *subpi; */ | ||
41 | unsigned int *pi, *pj, *subpi; | ||
42 | double *emag, *ephase, *w,*tmp,*subgrid; | ||
43 | |||
44 | |||
45 | /* check argument */ | ||
46 | if (nargin<8) { | ||
47 | mexErrMsgTxt("Eight input arguments required"); | ||
48 | } | ||
49 | if (nargout>1) { | ||
50 | mexErrMsgTxt("Too many output arguments"); | ||
51 | } | ||
52 | |||
53 | /* get edgel information */ | ||
54 | nr = mxGetM(in[0]); | ||
55 | nc = mxGetN(in[0]); | ||
56 | if ( nr*nc ==0 || nr != mxGetM(in[1]) || nc != mxGetN(in[1]) ) { | ||
57 | mexErrMsgTxt("Edge magnitude and phase shall be of the same image size"); | ||
58 | } | ||
59 | emag = mxGetPr(in[0]); | ||
60 | ephase = mxGetPr(in[1]); | ||
61 | np = nr * nc; | ||
62 | |||
63 | /*get subgrid information*/ | ||
64 | |||
65 | tmp = mxGetData(in[5]); | ||
66 | nrSubgrid = (int)tmp[0]; | ||
67 | tmp = mxGetData(in[6]); | ||
68 | ncSubgrid = (int)tmp[0]; | ||
69 | |||
70 | /* printf("nrSubgrid=%d\n",nrSubgrid); | ||
71 | printf("ncSubgrid=%d\n",ncSubgrid); */ | ||
72 | if (nrSubgrid* ncSubgrid != mxGetM(in[4])*mxGetN(in[4])) { | ||
73 | mexErrMsgTxt("Error in the size of the subgrid"); | ||
74 | } | ||
75 | subgrid = mxGetData(in[4]); | ||
76 | nW = nrSubgrid * ncSubgrid; | ||
77 | |||
78 | /* get new index pair */ | ||
79 | if (!mxIsUint32(in[2]) | !mxIsUint32(in[3])) { | ||
80 | mexErrMsgTxt("Index pair shall be of type UINT32"); | ||
81 | } | ||
82 | if (mxGetM(in[3]) * mxGetN(in[3]) != nW + 1) { | ||
83 | mexErrMsgTxt("Wrong index representation"); | ||
84 | } | ||
85 | pi = mxGetData(in[2]); | ||
86 | pj = mxGetData(in[3]); | ||
87 | subpi = mxGetData(in[7]); | ||
88 | /*{printf("pi[50] = %d\n",pi[50]);} | ||
89 | {printf("subpi[5] = %d\n",subpi[5]);} | ||
90 | {printf("subpi[6] = %d\n",subpi[6]);} | ||
91 | {printf("subpi[4] = %d\n",subpi[4]);}*/ | ||
92 | |||
93 | /* create output */ /*!!!!!!!!!!!!!!!!!!!!!!!changer taille output!!!!!!!!!!*/ | ||
94 | out[0] = mxCreateSparse(nW,nW,pj[nW],mxREAL); | ||
95 | if (out[0]==NULL) { | ||
96 | mexErrMsgTxt("Not enough memory for the output matrix"); | ||
97 | } | ||
98 | w = mxGetPr(out[0]); | ||
99 | ir = mxGetIr(out[0]); | ||
100 | jc = mxGetJc(out[0]); | ||
101 | |||
102 | /* find my sigma */ | ||
103 | if (nargin<9) { | ||
104 | sigma = 0; | ||
105 | for (k=0; k<np; k++) { | ||
106 | if (emag[k]>sigma) { sigma = emag[k]; } | ||
107 | } | ||
108 | sigma = sigma / 6; | ||
109 | printf("sigma = %6.5f",sigma); | ||
110 | } else { | ||
111 | sigma = mxGetScalar(in[8]); | ||
112 | } | ||
113 | a = 0.5 / (sigma * sigma); | ||
114 | |||
115 | /* computation */ | ||
116 | total = 0; | ||
117 | |||
118 | for (j=0; j<nW; j++){ | ||
119 | t= (int)subgrid[j]-1; /*on parcourt tous les pixels de la sous-grille dans la grille d'origine*/ | ||
120 | |||
121 | jc[j] = total; /* total represente le nombre voisins du pixel j*/ | ||
122 | jx = t / nr; /* col */ | ||
123 | jy = t % nr; /* row */ | ||
124 | |||
125 | for (k=pj[j]; k<pj[j+1]; k++) { /*k represente les indices correspondant au pixel j dans pi*/ | ||
126 | |||
127 | i = pi[k]-1; /*i est un voisin de j a considerer*/ | ||
128 | |||
129 | if (i==j) { | ||
130 | maxori = 1; | ||
131 | |||
132 | } else { | ||
133 | |||
134 | ix = i / nr; | ||
135 | iy = i % nr; | ||
136 | |||
137 | /* scan */ | ||
138 | di = (double) (iy - jy); | ||
139 | dj = (double) (ix - jx); | ||
140 | |||
141 | maxori = 0.; | ||
142 | phase1 = ephase[j]; | ||
143 | |||
144 | |||
145 | /* sample in i direction */ | ||
146 | if (abs(di) >= abs(dj)) { | ||
147 | slope = dj / di; | ||
148 | step = (iy>=jy) ? 1 : -1; | ||
149 | |||
150 | iip1 = jy; | ||
151 | jjp1 = jx; | ||
152 | |||
153 | |||
154 | for (ii=0;ii<abs(di);ii++){ | ||
155 | iip2 = iip1 + step; | ||
156 | jjp2 = (int)(0.5 + slope*(iip2-jy) + jx); | ||
157 | |||
158 | phase2 = ephase[iip2+jjp2*nr]; | ||
159 | |||
160 | if (phase1 != phase2) { | ||
161 | z = (emag[iip1+jjp1*nr] + emag[iip2+jjp2*nr]); | ||
162 | if (z > maxori){ | ||
163 | maxori = z; | ||
164 | } | ||
165 | } | ||
166 | |||
167 | iip1 = iip2; | ||
168 | jjp1 = jjp2; | ||
169 | phase1 = phase2; | ||
170 | } | ||
171 | |||
172 | /* sample in j direction */ | ||
173 | } else { | ||
174 | slope = di / dj; | ||
175 | step = (ix>=jx) ? 1: -1; | ||
176 | |||
177 | jjp1 = jx; | ||
178 | iip1 = jy; | ||
179 | |||
180 | |||
181 | for (jj=0;jj<abs(dj);jj++){ | ||
182 | jjp2 = jjp1 + step; | ||
183 | iip2 = (int)(0.5+ slope*(jjp2-jx) + jy); | ||
184 | |||
185 | phase2 = ephase[iip2+jjp2*nr]; | ||
186 | |||
187 | if (phase1 != phase2){ | ||
188 | z = (emag[iip1+jjp1*nr] + emag[iip2+jjp2*nr]); | ||
189 | if (z > maxori){ | ||
190 | maxori = z; | ||
191 | } | ||
192 | |||
193 | } | ||
194 | |||
195 | iip1 = iip2; | ||
196 | jjp1 = jjp2; | ||
197 | phase1 = phase2; | ||
198 | } | ||
199 | } | ||
200 | |||
201 | maxori = 0.5 * maxori; | ||
202 | maxori = exp(-maxori * maxori * a); | ||
203 | } | ||
204 | /*if (total<20) {printf("subpi[k] = %d\n",subpi[k]);}*/ | ||
205 | |||
206 | ir[total] = (int)subpi[k]; | ||
207 | /*if (total<20) {printf("ir[total] = %d\n",ir[total]);}*/ | ||
208 | w[total] = maxori; | ||
209 | total = total + 1; | ||
210 | |||
211 | } /* i */ | ||
212 | } /*j*/ | ||
213 | /*printf("total = %d\n",total);*/ | ||
214 | /*printf("ir[100] = %d\n",ir[100]);*/ | ||
215 | jc[nW] = total; | ||
216 | } | ||
diff --git a/SD-VBS/common/toolbox/MultiNcut/multiAffinityic.dll b/SD-VBS/common/toolbox/MultiNcut/multiAffinityic.dll new file mode 100755 index 0000000..f9b6bc9 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/multiAffinityic.dll | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/multiAffinityic.mexa64 b/SD-VBS/common/toolbox/MultiNcut/multiAffinityic.mexa64 new file mode 100755 index 0000000..9a2a3cc --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/multiAffinityic.mexa64 | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/multiAffinityic.mexglx b/SD-VBS/common/toolbox/MultiNcut/multiAffinityic.mexglx new file mode 100755 index 0000000..ec11a0e --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/multiAffinityic.mexglx | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/multiIntensityFirstLayer.c b/SD-VBS/common/toolbox/MultiNcut/multiIntensityFirstLayer.c new file mode 100755 index 0000000..0cae523 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/multiIntensityFirstLayer.c | |||
@@ -0,0 +1,126 @@ | |||
1 | /*================================================================ | ||
2 | * function w = intensityWppc(image,pi,pj,rMin,sigmaX,sigmaIntensite,valeurMinW ) | ||
3 | * Input: | ||
4 | * [pi,pj] = index pair representation for MALTAB sparse matrices | ||
5 | * Output: | ||
6 | * w = affinity with IC at [pi,pj] | ||
7 | * | ||
8 | |||
9 | pixels i and j (corresponding to the sampling in pi,pj) are fully connected when d(i,j) <= rmin; | ||
10 | |||
11 | % test sequence | ||
12 | f = synimg(10); | ||
13 | [i,j] = cimgnbmap(size(f),2); | ||
14 | [ex,ey,egx,egy] = quadedgep(f); | ||
15 | a = affinityic(ex,ey,egx,egy,i,j) | ||
16 | show_dist_w(f,a); | ||
17 | |||
18 | * Stella X. Yu, Nov 19, 2001. | ||
19 | *=================================================================*/ | ||
20 | |||
21 | # include "mex.h" | ||
22 | # include "math.h" | ||
23 | |||
24 | void mexFunction( | ||
25 | int nargout, | ||
26 | mxArray *out[], | ||
27 | int nargin, | ||
28 | const mxArray *in[] | ||
29 | ) | ||
30 | { | ||
31 | /* declare variables */ | ||
32 | int nr, nc, np, total; | ||
33 | int i, j, k, ix, iy, jx, jy; | ||
34 | int *ir, *jc; | ||
35 | int squareDistance; | ||
36 | /* unsigned long *pi, *pj; */ | ||
37 | unsigned int *pi, *pj; | ||
38 | double *w; | ||
39 | |||
40 | double temp,a1,a2,wij; | ||
41 | double rMin; | ||
42 | double sigmaX, sigmaIntensite,valeurMinW; | ||
43 | double *image; | ||
44 | |||
45 | /* check argument */ | ||
46 | if (nargin<7) { | ||
47 | mexErrMsgTxt("Four input arguments required"); | ||
48 | } | ||
49 | if (nargout>1) { | ||
50 | mexErrMsgTxt("Too many output arguments"); | ||
51 | } | ||
52 | |||
53 | /* get edgel information */ | ||
54 | nr = mxGetM(in[0]); | ||
55 | nc = mxGetN(in[0]); | ||
56 | np = nr * nc; | ||
57 | |||
58 | image = mxGetPr(in[0]); | ||
59 | |||
60 | |||
61 | |||
62 | /* get new index pair */ | ||
63 | if (!mxIsUint32(in[1]) | !mxIsUint32(in[2])) { | ||
64 | mexErrMsgTxt("Index pair shall be of type UINT32"); | ||
65 | } | ||
66 | if (mxGetM(in[2]) * mxGetN(in[2]) != np + 1) { | ||
67 | mexErrMsgTxt("Wrong index representation"); | ||
68 | } | ||
69 | pi = mxGetData(in[1]); | ||
70 | pj = mxGetData(in[2]); | ||
71 | |||
72 | /* create output */ | ||
73 | out[0] = mxCreateSparse(np,np,pj[np],mxREAL); | ||
74 | if (out[0]==NULL) { | ||
75 | mexErrMsgTxt("Not enough memory for the output matrix"); | ||
76 | } | ||
77 | w = mxGetPr(out[0]); | ||
78 | ir = mxGetIr(out[0]); | ||
79 | jc = mxGetJc(out[0]); | ||
80 | |||
81 | rMin = mxGetScalar(in[3]); | ||
82 | sigmaX = mxGetScalar(in[4]); | ||
83 | sigmaIntensite= mxGetScalar(in[5]); | ||
84 | valeurMinW = mxGetScalar(in[6]); | ||
85 | |||
86 | a1 = 1.0/ (sigmaX*sigmaX); | ||
87 | a2 = 1.0 / (sigmaIntensite*sigmaIntensite ); | ||
88 | |||
89 | /* computation */ | ||
90 | total = 0; | ||
91 | for (j=0; j<np; j++) { | ||
92 | |||
93 | jc[j] = total; | ||
94 | jx = j / nr; /* col */ | ||
95 | jy = j % nr; /* row */ | ||
96 | |||
97 | for (k=pj[j]; k<pj[j+1]; k++) { | ||
98 | |||
99 | i = pi[k]; | ||
100 | |||
101 | if (i==j) { | ||
102 | wij= 1; /*voir*/ | ||
103 | |||
104 | } else { | ||
105 | ix = i / nr; | ||
106 | iy = i % nr; | ||
107 | |||
108 | squareDistance = (ix-jx)*(ix-jx)+(iy-jy)*(iy-jy); | ||
109 | |||
110 | temp = image[i]-image[j]; | ||
111 | wij = exp(- squareDistance * a1 - temp*temp * a2 ); | ||
112 | /*if(wij < valeurMinW) | ||
113 | wij = -0.1;*/ | ||
114 | } | ||
115 | ir[total] = i; | ||
116 | |||
117 | w[total] = wij; | ||
118 | total = total + 1; | ||
119 | |||
120 | } /* i */ | ||
121 | |||
122 | } /* j */ | ||
123 | |||
124 | jc[np] = total; | ||
125 | } | ||
126 | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/multiIntensityFirstLayer.dll b/SD-VBS/common/toolbox/MultiNcut/multiIntensityFirstLayer.dll new file mode 100755 index 0000000..a47e22d --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/multiIntensityFirstLayer.dll | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/multiIntensityFirstLayer.mexa64 b/SD-VBS/common/toolbox/MultiNcut/multiIntensityFirstLayer.mexa64 new file mode 100755 index 0000000..06b2f57 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/multiIntensityFirstLayer.mexa64 | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/multiIntensityFirstLayer.mexglx b/SD-VBS/common/toolbox/MultiNcut/multiIntensityFirstLayer.mexglx new file mode 100755 index 0000000..c6eed07 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/multiIntensityFirstLayer.mexglx | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/multiIntensityWppc.c b/SD-VBS/common/toolbox/MultiNcut/multiIntensityWppc.c new file mode 100755 index 0000000..e01e516 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/multiIntensityWppc.c | |||
@@ -0,0 +1,158 @@ | |||
1 | /*================================================================ | ||
2 | * function w = multiIntensityWppc(image,pi,pj,rMin,sigmaX,sigmaIntensite,valeurMinW, | ||
3 | * subgrid,nrSubgrid,ncSubgrid,subpi) | ||
4 | * Input: | ||
5 | * [pi,pj] = index pair representation for MALTAB sparse matrices | ||
6 | * Output: | ||
7 | * w = affinity with IC at [pi,pj] | ||
8 | * | ||
9 | |||
10 | imageX,wiInOriginalImage,wwj,rMin,dataWpp.sigmaX,sigmaI,minW,subgrid{1,i},p(i),q(i),wi{i} | ||
11 | |||
12 | |||
13 | pixels i and j (corresponding to the sampling in pi,pj) are fully connected when d(i,j) <= rmin; | ||
14 | |||
15 | % test sequence | ||
16 | f = synimg(10); | ||
17 | [i,j] = cimgnbmap(size(f),2); | ||
18 | [ex,ey,egx,egy] = quadedgep(f); | ||
19 | a = affinityic(ex,ey,egx,egy,i,j) | ||
20 | show_dist_w(f,a); | ||
21 | |||
22 | * Stella X. Yu, Nov 19, 2001. | ||
23 | *=================================================================*/ | ||
24 | |||
25 | # include "mex.h" | ||
26 | # include "math.h" | ||
27 | |||
28 | void mexFunction( | ||
29 | int nargout, | ||
30 | mxArray *out[], | ||
31 | int nargin, | ||
32 | const mxArray *in[] | ||
33 | ) | ||
34 | { | ||
35 | /* declare variables */ | ||
36 | int nr, nc, np, nW, total; | ||
37 | int i, j, k, t, ix, iy, jx, jy, nrSubgrid, ncSubgrid; | ||
38 | int *ir, *jc; | ||
39 | int squareDistance; | ||
40 | /* unsigned long *pi, *pj, *subpi; */ | ||
41 | unsigned int *pi, *pj, *subpi; | ||
42 | double *w, *subgrid, *tmp; | ||
43 | |||
44 | double temp,a1,a2,wij; | ||
45 | double rMin; | ||
46 | double sigmaX, sigmaIntensite,valeurMinW; | ||
47 | double *image; | ||
48 | |||
49 | /* check argument */ | ||
50 | if (nargin<11) { | ||
51 | mexErrMsgTxt("Eleven input arguments required"); | ||
52 | } | ||
53 | if (nargout>1) { | ||
54 | mexErrMsgTxt("Too many output arguments"); | ||
55 | } | ||
56 | |||
57 | /* get edgel information */ | ||
58 | nr = mxGetM(in[0]); | ||
59 | nc = mxGetN(in[0]); | ||
60 | np = nr * nc; | ||
61 | /*printf("size: %d, %d, %d\n", nc, nr, np); */ | ||
62 | image = mxGetPr(in[0]); | ||
63 | |||
64 | |||
65 | /*get subgrid information*/ | ||
66 | |||
67 | tmp = mxGetData(in[8]); | ||
68 | nrSubgrid = (int)tmp[0]; | ||
69 | |||
70 | /* printf("image end = %f ", image[np-1]); */ | ||
71 | |||
72 | tmp = mxGetData(in[9]); | ||
73 | ncSubgrid = (int)tmp[0]; | ||
74 | |||
75 | if (nrSubgrid* ncSubgrid != mxGetM(in[7])*mxGetN(in[7])) { | ||
76 | mexErrMsgTxt("Error in the size of the subgrid"); | ||
77 | } | ||
78 | subgrid = mxGetData(in[7]); | ||
79 | nW = nrSubgrid * ncSubgrid; | ||
80 | |||
81 | |||
82 | |||
83 | |||
84 | /* get new index pair */ | ||
85 | if (!mxIsUint32(in[1]) | !mxIsUint32(in[2])) { | ||
86 | mexErrMsgTxt("Index pair shall be of type UINT32"); | ||
87 | } | ||
88 | if (mxGetM(in[2]) * mxGetN(in[2]) != nW + 1) { | ||
89 | mexErrMsgTxt("Wrong index representation"); | ||
90 | } | ||
91 | pi = mxGetData(in[1]); | ||
92 | pj = mxGetData(in[2]); | ||
93 | subpi = mxGetData(in[10]); | ||
94 | |||
95 | /* create output */ | ||
96 | out[0] = mxCreateSparse(nW,nW,pj[nW],mxREAL); | ||
97 | if (out[0]==NULL) { | ||
98 | mexErrMsgTxt("Not enough memory for the output matrix"); | ||
99 | } | ||
100 | |||
101 | w = mxGetPr(out[0]); | ||
102 | ir = mxGetIr(out[0]); | ||
103 | jc = mxGetJc(out[0]); | ||
104 | |||
105 | |||
106 | rMin = mxGetScalar(in[3]); | ||
107 | sigmaX = mxGetScalar(in[4]); | ||
108 | sigmaIntensite= mxGetScalar(in[5]); | ||
109 | valeurMinW = mxGetScalar(in[6]); | ||
110 | |||
111 | a1 = 1.0/ (sigmaX*sigmaX); | ||
112 | a2 = 1.0 / (sigmaIntensite*sigmaIntensite ); | ||
113 | |||
114 | |||
115 | |||
116 | /* computation */ | ||
117 | total = 0; | ||
118 | for (j=0; j<nW; j++) { | ||
119 | |||
120 | t= (int)subgrid[j]-1; /*on parcourt tous les pixels de la sous-grille dans la grille d'origine*/ | ||
121 | if ( (t<0) || (t>np-1)) {printf("badddddd!");} | ||
122 | /* printf("t = %d\n",t); | ||
123 | printf("j = %d\n",j); */ | ||
124 | jc[j] = total; | ||
125 | jx = t / nr; /* col */ | ||
126 | jy = t % nr; /* row */ | ||
127 | /* printf("pj[j+1] = %d\n",pj[j+1]); */ | ||
128 | |||
129 | for (k=pj[j]; k<pj[j+1]; k++) { | ||
130 | /* printf("k = %d\n",k); */ | ||
131 | i = pi[k]-1; | ||
132 | ix = i / nr; | ||
133 | iy = i % nr; | ||
134 | squareDistance = (ix-jx)*(ix-jx)+(iy-jy)*(iy-jy);/*abs(ix-jx)+abs(iy-jy);*/ | ||
135 | if (squareDistance <= rMin) { wij = 1;} | ||
136 | else { | ||
137 | temp = image[i]-image[t]; | ||
138 | wij = exp(- squareDistance * a1 - temp*temp * a2 ); | ||
139 | /*if(wij < valeurMinW) | ||
140 | wij = 0;*/ | ||
141 | /*wij = exp( - temp*temp * a2 );*/ | ||
142 | } | ||
143 | |||
144 | ir[total] = (int)subpi[k]; | ||
145 | |||
146 | /* if (ir[total] >5000*5000 ) {printf("trouble! [%d,%d]\n",k,(int)subpi[k]);} */ | ||
147 | |||
148 | w[total] = wij; | ||
149 | |||
150 | total = total + 1; | ||
151 | |||
152 | } /* i */ | ||
153 | |||
154 | |||
155 | } /* j */ | ||
156 | |||
157 | jc[nW] = total; | ||
158 | } | ||
diff --git a/SD-VBS/common/toolbox/MultiNcut/multiIntensityWppc.dll b/SD-VBS/common/toolbox/MultiNcut/multiIntensityWppc.dll new file mode 100755 index 0000000..16146c1 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/multiIntensityWppc.dll | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/multiIntensityWppc.mexa64 b/SD-VBS/common/toolbox/MultiNcut/multiIntensityWppc.mexa64 new file mode 100755 index 0000000..525ca62 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/multiIntensityWppc.mexa64 | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/multiIntensityWppc.mexglx b/SD-VBS/common/toolbox/MultiNcut/multiIntensityWppc.mexglx new file mode 100755 index 0000000..a17fa03 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/multiIntensityWppc.mexglx | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/quadedgep2.m b/SD-VBS/common/toolbox/MultiNcut/quadedgep2.m new file mode 100755 index 0000000..5041377 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/quadedgep2.m | |||
@@ -0,0 +1,188 @@ | |||
1 | % function [xs,ys,gx,gy,par,threshold,mag,mage,g,FIe,FIo,mago] = quadedgep(I,par,threshold); | ||
2 | % Input: | ||
3 | % I = image | ||
4 | % par = vector for 4 parameters | ||
5 | % [number of filter orientations, number of scale, filter size, elongation] | ||
6 | % To use default values, put 0. | ||
7 | % threshold = threshold on edge strength | ||
8 | % Output: | ||
9 | % [x,y,gx,gy] = locations and gradients of an ordered list of edgels | ||
10 | % x,y could be horizontal or vertical or 45 between pixel sites | ||
11 | % but it is guaranteed that there [floor(y) + (floor(x)-1)*nr] | ||
12 | % is ordered and unique. In other words, each edgel has a unique pixel id. | ||
13 | % par = actual par used | ||
14 | % threshold = actual threshold used | ||
15 | % mag = edge magnitude | ||
16 | % mage = phase map | ||
17 | % g = gradient map at each pixel | ||
18 | % [FIe,FIo] = odd and even filter outputs | ||
19 | % mago = odd filter output of optimum orientation | ||
20 | |||
21 | % Stella X. Yu, 2001 | ||
22 | |||
23 | % This is the multi scale version of the filtering | ||
24 | % For the moment the parameters are defined by default. See line 34 | ||
25 | |||
26 | |||
27 | function [x,y,gx,gy,par,threshold,mag_s,mage,g,FIe,FIo,mago] = quadedgep2(I,par,data,threshold); | ||
28 | |||
29 | |||
30 | if nargin<4 | isempty(threshold), | ||
31 | threshold = 0.1; | ||
32 | end | ||
33 | |||
34 | [r,c] = size(I); | ||
35 | def_par = [4,30,3]; | ||
36 | |||
37 | display_on = 1; | ||
38 | |||
39 | % take care of parameters, any missing value is substituted by a default value | ||
40 | if nargin<2 | isempty(par), | ||
41 | par = def_par; | ||
42 | end | ||
43 | % par(end+1:4)=0; | ||
44 | % par = par(:); | ||
45 | % j = (par>0); | ||
46 | % have_value = [ j, 1-j ]; | ||
47 | % j = 1; n_filter = have_value(j,:) * [par(j); def_par(j)]; | ||
48 | % j = 2; n_scale = have_value(j,:) * [par(j); def_par(j)]; | ||
49 | % j = 3; winsz = have_value(j,:) * [par(j); def_par(j)]; | ||
50 | % j = 4; enlong = have_value(j,:) * [par(j); def_par(j)]; | ||
51 | |||
52 | n_ori = par(1); %if it doesn't work, par<-def_par | ||
53 | |||
54 | winsz = par(2); | ||
55 | enlong = par(3); | ||
56 | |||
57 | % always make filter size an odd number so that the results will not be skewed | ||
58 | j = winsz/2; | ||
59 | if not(j > fix(j) + 0.1), | ||
60 | winsz = winsz + 1; | ||
61 | end | ||
62 | |||
63 | % filter the image with quadrature filters | ||
64 | if (isempty(data.W.scales)) | ||
65 | error ('no scales entered'); | ||
66 | end | ||
67 | |||
68 | n_scale=length(data.W.scales); | ||
69 | filter_scales=data.W.scales; | ||
70 | % | ||
71 | % if strcmp(data.dataWpp.mode,'multiscale') | ||
72 | % n_scale=size((data.dataWpp.scales),2); | ||
73 | % filter_scales=data.dataWpp.scales; | ||
74 | % else | ||
75 | % filter_scales=data.dataWpp.scales(1); | ||
76 | % n_scale=1; | ||
77 | % end | ||
78 | % if n_scale>0&&strcmp(data.dataWpp.mode,'multiscale') | ||
79 | % if (~isempty(data.dataWpp.scales)) | ||
80 | % filter_scales=data.dataWpp.scales; | ||
81 | % else | ||
82 | % filter_scales=zeros(1,n_scale); | ||
83 | % | ||
84 | % for i=1:n_scale, | ||
85 | % filter_scales(i)=(sqrt(2))^(i-1); | ||
86 | % end | ||
87 | % data.dataWpp.scales=filter_scales; | ||
88 | % end | ||
89 | % else filter_scale=1; | ||
90 | % data.dataWpp.scales=filter_scales; | ||
91 | % end | ||
92 | % | ||
93 | % %%%%%%% juste pour que ca tourne | ||
94 | % if ~strcmp(data.dataWpp.mode,'multiscale') | ||
95 | % filter_scales=data.dataWpp.scales(1); | ||
96 | % n_scale=4; | ||
97 | % end | ||
98 | % %%%%%%%%%%%% | ||
99 | |||
100 | FBo = make_filterbank_odd2(n_ori,filter_scales,winsz,enlong); | ||
101 | FBe = make_filterbank_even2(n_ori,filter_scales,winsz,enlong); | ||
102 | n = ceil(winsz/2); | ||
103 | f = [fliplr(I(:,2:n+1)), I, fliplr(I(:,c-n:c-1))]; | ||
104 | f = [flipud(f(2:n+1,:)); f; flipud(f(r-n:r-1,:))]; | ||
105 | FIo = fft_filt_2(f,FBo,1); | ||
106 | FIo = FIo(n+[1:r],n+[1:c],:); | ||
107 | FIe = fft_filt_2(f,FBe,1); | ||
108 | FIe = FIe(n+[1:r],n+[1:c],:); | ||
109 | |||
110 | % compute the orientation energy and recover a smooth edge map | ||
111 | % pick up the maximum energy across scale and orientation | ||
112 | % even filter's output: as it is the second derivative, zero cross localize the edge | ||
113 | % odd filter's output: orientation | ||
114 | |||
115 | [nr,nc,nb] = size(FIe); | ||
116 | |||
117 | FIe = reshape(FIe, nr,nc,n_ori,length(filter_scales)); | ||
118 | FIo = reshape(FIo, nr,nc,n_ori,length(filter_scales)); | ||
119 | |||
120 | mag_s = zeros(nr,nc,n_scale); | ||
121 | mag_a = zeros(nr,nc,n_ori); | ||
122 | |||
123 | mage = zeros(nr,nc,n_scale); | ||
124 | mago = zeros(nr,nc,n_scale); | ||
125 | mage = zeros(nr,nc,n_scale); | ||
126 | mago = zeros(nr,nc,n_scale); | ||
127 | |||
128 | |||
129 | |||
130 | for i = 1:n_scale, | ||
131 | mag_s(:,:,i) = sqrt(sum(FIo(:,:,:,i).^2,3)+sum(FIe(:,:,:,i).^2,3)); | ||
132 | mag_a = sqrt(FIo(:,:,:,i).^2+FIe(:,:,:,i).^2); | ||
133 | [tmp,max_id] = max(mag_a,[],3); | ||
134 | |||
135 | base_size = nr * nc; | ||
136 | id = [1:base_size]'; | ||
137 | mage(:,:,i) = reshape(FIe(id+(max_id(:)-1)*base_size+(i-1)*base_size*n_ori),[nr,nc]); | ||
138 | mago(:,:,i) = reshape(FIo(id+(max_id(:)-1)*base_size+(i-1)*base_size*n_ori),[nr,nc]); | ||
139 | |||
140 | mage(:,:,i) = (mage(:,:,i)>0) - (mage(:,:,i)<0); | ||
141 | |||
142 | if display_on, | ||
143 | ori_incr=pi/n_ori; % to convert jshi's coords to conventional image xy | ||
144 | ori_offset=ori_incr/2; | ||
145 | theta = ori_offset+([1:n_ori]-1)*ori_incr; % orientation detectors | ||
146 | % [gx,gy] are image gradient in image xy coords, winner take all | ||
147 | |||
148 | ori = theta(max_id); | ||
149 | ori = ori .* (mago(:,:,i)>0) + (ori + pi).*(mago(:,:,i)<0); | ||
150 | gy{i} = mag_s(:,:,i) .* cos(ori); | ||
151 | gx{i} = -mag_s(:,:,i) .* sin(ori); | ||
152 | g = cat(3,gx{i},gy{i}); | ||
153 | |||
154 | % phase map: edges are where the phase changes | ||
155 | mag_th = max(max(mag_s(:,:,i))) * threshold; | ||
156 | eg = (mag_s(:,:,i)>mag_th); | ||
157 | h = eg & [(mage(2:r,:,i) ~= mage(1:r-1,:,i)); zeros(1,nc)]; | ||
158 | v = eg & [(mage(:,2:c,i) ~= mage(:,1:c-1,i)), zeros(nr,1)]; | ||
159 | [y{i},x{i}] = find(h | v); | ||
160 | k = y{i} + (x{i}-1) * nr; | ||
161 | h = h(k); | ||
162 | v = v(k); | ||
163 | y{i} = y{i} + h * 0.5; % i | ||
164 | x{i} = x{i} + v * 0.5; % j | ||
165 | t = h + v * nr; | ||
166 | gx{i} = g(k) + g(k+t); | ||
167 | k = k + (nr * nc); | ||
168 | gy{i} = g(k) + g(k+t); | ||
169 | |||
170 | % figure(1); | ||
171 | % clf; | ||
172 | % imagesc(I);colormap(gray); | ||
173 | % hold on; | ||
174 | % quiver(x,y,gx,gy); hold off; | ||
175 | % title(sprintf('scale = %d, press return',i)); | ||
176 | |||
177 | % pause; | ||
178 | 0; | ||
179 | else | ||
180 | x = []; | ||
181 | y = []; | ||
182 | gx = []; | ||
183 | gy =[]; | ||
184 | g= []; | ||
185 | end | ||
186 | end | ||
187 | |||
188 | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/quickNcutHardBiais2.m b/SD-VBS/common/toolbox/MultiNcut/quickNcutHardBiais2.m new file mode 100755 index 0000000..3ca1046 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/quickNcutHardBiais2.m | |||
@@ -0,0 +1,187 @@ | |||
1 | % function [v,s] = quickNcutHardBiais(W,U,nbEigenValues,dataGraphCut) | ||
2 | %ligne 35 : changement tim | ||
3 | %[v,s] = ncut(W,nbEigenValues,[],offset); | ||
4 | %devient : | ||
5 | %[v,s] = tim_ncut_rapide(W,nbEigenValues,[],offset); | ||
6 | %et eigs devient tim_eigs | ||
7 | |||
8 | % Input: | ||
9 | % W = affinity matrix | ||
10 | % U = hard constraint matrix, could be a cell of partial grouping | ||
11 | % nbEigenValues = number of eigenvectors | ||
12 | % offset = regularization factor, default = 0 | ||
13 | % Output: | ||
14 | % v = eigenvector | ||
15 | % s = eigenvalue of (W,d), s.t. U' * x = 0. | ||
16 | |||
17 | % call eigs using my own * operation | ||
18 | |||
19 | % Stella X. Yu, Jan 2002. | ||
20 | |||
21 | function [v,s] = quickNcutHardBiais2(W,U,nbEigenValues,dataGraphCut)%voir : rajouter sigma | ||
22 | n = size(W,1); | ||
23 | nbEigenValues = min(nbEigenValues,n); | ||
24 | |||
25 | offset = dataGraphCut.offset; | ||
26 | %offset = 2; | ||
27 | |||
28 | % degrees and regularization | ||
29 | d = sum(abs(W),2); | ||
30 | dr = 0.5 * (d - sum(W,2)); | ||
31 | d = d + offset * 2; | ||
32 | dr = dr + offset; | ||
33 | W = W + spdiags(dr,0,n,n); | ||
34 | clear dr | ||
35 | |||
36 | % normalize | ||
37 | Dinvsqrt = 1./sqrt(d+eps); | ||
38 | P = spmtimesd(W,Dinvsqrt,Dinvsqrt); | ||
39 | clear W; | ||
40 | |||
41 | % if max(max(P-P')) < 1e-10 %ou eps | ||
42 | % %S = sparse(1:n,1:n,0.5); | ||
43 | % P =max(P,P'); | ||
44 | % % P=S*(P+P'); | ||
45 | % %P=0.5*(P+P'); | ||
46 | % options.issym = 1; | ||
47 | % end | ||
48 | P = sparsifyc(P,dataGraphCut.valeurMin); | ||
49 | options.issym = 1; | ||
50 | |||
51 | Ubar = spmtimesd(U,Dinvsqrt,[]); | ||
52 | %Ubar = sparsifyc(Ubar,dataGraphCut.valeurMin); %voir | ||
53 | |||
54 | options.disp = dataGraphCut.verbose; | ||
55 | options.maxit = dataGraphCut.maxiterations; | ||
56 | options.tol = dataGraphCut.eigsErrorTolerance; | ||
57 | |||
58 | options.v0 = ones(size(P,1),1);%voir | ||
59 | |||
60 | options.p = max(35,2*nbEigenValues); %voir | ||
61 | options.p = min(options.p , n); | ||
62 | |||
63 | % nouvelle idee : factorisation de Cholesky | ||
64 | C=Ubar'*Ubar; | ||
65 | %permutation = symamd(C); | ||
66 | %R = cholinc(C(permutation,permutation)); | ||
67 | t_chol_Ubar = cputime; | ||
68 | [R,ooo] = cholinc(C,'0'); | ||
69 | t_chol_Ubar = cputime - t_chol_Ubar; | ||
70 | %if error occurs, check if Ubar = sparsifyc(Ubar,dataGraphCut.valeurMin); | ||
71 | %sparsifies too much | ||
72 | |||
73 | |||
74 | % compute H = (Ubar'*Ubar)^(-1) | ||
75 | % t_inv_H = cputime; | ||
76 | % H = inv(sparsifyc(Ubar' * Ubar,dataGraphCut.valeurMin)); %changer | ||
77 | % t_inv_H = cputime - t_inv_H; | ||
78 | % H = sparsifyc(H,dataGraphCut.valeurMin); | ||
79 | % tEigs = cputime; | ||
80 | % if options.issym & max(max(H-H')) < 1e-10 | ||
81 | % [vbar,s,convergence] = tim_eigs(@mex_projection_inv_symmetric,n,nbEigenValues,'lm',options,triu(P),Ubar,triu(H)); | ||
82 | % else | ||
83 | % [vbar,s,convergence] = tim_eigs(@mex_projection_inv,n,nbEigenValues,'lm',options,P,Ubar,H); | ||
84 | % end | ||
85 | % tEigs = cputime - tEigs; | ||
86 | % | ||
87 | |||
88 | |||
89 | |||
90 | R = sparsifyc(R,dataGraphCut.valeurMin); | ||
91 | tEigs = cputime; | ||
92 | if options.issym | ||
93 | [vbar,s,convergence] = tim_eigs(@mex_projection_QR_symmetric,n,nbEigenValues,'lm',options,tril(P),Ubar,R); | ||
94 | else | ||
95 | [vbar,s,convergence] = tim_eigs(@mex_projection_QR,n,nbEigenValues,'lm',options,P,Ubar,R); | ||
96 | end | ||
97 | tEigs = cputime - tEigs; | ||
98 | |||
99 | |||
100 | %afficheTexte(sprintf('\n\nTemps ecoule pendant eigs : %g',tEigs),dataGraphCut.verbose,2); | ||
101 | %afficheTexte(sprintf('\nTemps ecoule pendant chol(Ubar''*Ubar) : %g',t_chol_Ubar),dataGraphCut.verbose); | ||
102 | if convergence~=0 | ||
103 | afficheTexte(sprintf(' (Non-convergence)'),dataGraphCut.verbose); | ||
104 | end | ||
105 | |||
106 | |||
107 | %disp(sprintf('nnz(P) : %f\n',nnz(P))); | ||
108 | %disp(sprintf('nnz(Ubar) : %f\n',nnz(Ubar))); | ||
109 | %disp(sprintf('nnz(R) : %f\n',nnz(R))); | ||
110 | %disp(sprintf('nnz(global) : %f\n',nnz(P) + 4 * nnz(Ubar) + 4*nnz(R))); | ||
111 | |||
112 | |||
113 | |||
114 | s = real(diag(s)); | ||
115 | [x,y] = sort(-s); | ||
116 | s = -x; | ||
117 | vbar = vbar(:,y); | ||
118 | |||
119 | |||
120 | v = spdiags(Dinvsqrt,0,n,n) * vbar; | ||
121 | |||
122 | for i=1:size(v,2) | ||
123 | %v(:,i) = v(:,i) / max(abs(v(:,i))); | ||
124 | v(:,i) = (v(:,i) / norm(v(:,i)) )*norm(ones(n,1)); | ||
125 | if v(1,i)~=0 | ||
126 | v(:,i) = - v(:,i) * sign(v(1,i)); | ||
127 | end | ||
128 | end | ||
129 | |||
130 | % % nouvelle idee : factorisation de Cholesky | ||
131 | % t_chol_Ubar = cputime; | ||
132 | % R = chol(Ubar' * Ubar); | ||
133 | % t_chol_Ubar = cputime - t_chol_Ubar; | ||
134 | % R = sparsifyc(R,dataGraphCut.valeurMin); | ||
135 | % tEigs = cputime; | ||
136 | % if options.issym | ||
137 | % [vbar,s,convergence] = tim_eigs(@mex_projection_QR_symmetric,n,nbEigenValues,'lm',options,triu(P),Ubar,R); | ||
138 | % else | ||
139 | % [vbar,s,convergence] = tim_eigs(@mex_projection_QR,n,nbEigenValues,'lm',options,P,Ubar,R); | ||
140 | % end | ||
141 | % tEigs = cputime - tEigs; | ||
142 | |||
143 | |||
144 | % % compute H = (Ubar'*Ubar)^(-1) | ||
145 | % t_inv_H = cputime; | ||
146 | % H = inv(sparsifyc(Ubar' * Ubar,dataGraphCut.valeurMin)); %changer | ||
147 | % t_inv_H = cputime - t_inv_H; | ||
148 | % H = sparsifyc(H,dataGraphCut.valeurMin); | ||
149 | % tEigs = cputime; | ||
150 | % if options.issym & max(max(H-H')) < 1e-10 | ||
151 | % [vbar,s,convergence] = tim_eigs(@mex_projection_inv_symmetric,n,nbEigenValues,'lm',options,triu(P),Ubar,triu(H)); | ||
152 | % else | ||
153 | % [vbar,s,convergence] = tim_eigs(@mex_projection_inv,n,nbEigenValues,'lm',options,P,Ubar,H); | ||
154 | % end | ||
155 | % tEigs = cputime - tEigs; | ||
156 | |||
157 | |||
158 | |||
159 | % % idee de mon rapport... semble pas marcher car R = qr(Ubar,0) est plus | ||
160 | % % lent que H = inv(sparsifyc(Ubar' * Ubar,dataGraphCut.valeurMin)); | ||
161 | % t_qr_Ubar = cputime; | ||
162 | % R = qr(Ubar,0); | ||
163 | % t_qr_Ubar = cputime - t_qr_Ubar; | ||
164 | % R = sparsifyc(R,dataGraphCut.valeurMin); | ||
165 | % tEigs2 = cputime; | ||
166 | % if options.issym | ||
167 | % [vbar2,s2,convergence] = tim_eigs(@mex_projection_QR_symmetric,n,nbEigenValues,'lm',options,triu(P),Ubar,R); | ||
168 | % else | ||
169 | % [vbar2,s2,convergence] = tim_eigs(@mex_projection_QR,n,nbEigenValues,'lm',options,P,Ubar,R); | ||
170 | % end | ||
171 | % tEigs2 = cputime - tEigs2; | ||
172 | |||
173 | |||
174 | |||
175 | % idee de Jianbo... semble pas marcher car on a besoin de prendre k maximal | ||
176 | % dans [A,S,B] = svds(Ubar,k); | ||
177 | % | ||
178 | % [A,S,B] = svds(Ubar,300); | ||
179 | % A = sparsifyc(A,dataGraphCut.valeurMin); | ||
180 | % tEigs = cputime; | ||
181 | % [vbar,s,convergence] = tim_eigs(@mex_projection_svd,n,nbEigenValues,'lm',options,P,A); | ||
182 | |||
183 | % afficheTexte(sprintf('\ninv(H) : %g',t_inv_H),dataGraphCut.verbose); | ||
184 | % afficheTexte(sprintf('\n\nTemps ecoule pendant eigs : %g',tEigs2),dataGraphCut.verbose,2); | ||
185 | % afficheTexte(sprintf('\nqr(Ubar) : %g',t_qr_Ubar),dataGraphCut.verbose); | ||
186 | % disp(sprintf('nnz(H) : %f\n',nnz(H))); | ||
187 | % disp(sprintf('nnz(global) : %f\n',nnz(P) + 4 * nnz(Ubar) + 2*nnz(H))); | ||
diff --git a/SD-VBS/common/toolbox/MultiNcut/read_data.m b/SD-VBS/common/toolbox/MultiNcut/read_data.m new file mode 100755 index 0000000..c0929c0 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/read_data.m | |||
@@ -0,0 +1,13 @@ | |||
1 | |||
2 | %fnames = dir('/home/jshi/Results_DLIB/SegLabl*.mat'); | ||
3 | |||
4 | fnames = dir('/data/jshi/DLIB/Results/Results_DLIB/SegLabl*.mat'); | ||
5 | |||
6 | for j=1:length(fnames), | ||
7 | cm = sprintf('load /data/jshi/DLIB/Results/Results_DLIB/%s',fnames(j).name); | ||
8 | disp(cm);eval(cm); | ||
9 | figure(1);imagesc(I); colormap(gray); axis image; | ||
10 | figure(2); imagesc(SegLabel); axis image; | ||
11 | |||
12 | pause; | ||
13 | end | ||
diff --git a/SD-VBS/common/toolbox/MultiNcut/readimage.m b/SD-VBS/common/toolbox/MultiNcut/readimage.m new file mode 100755 index 0000000..e45fa19 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/readimage.m | |||
@@ -0,0 +1,15 @@ | |||
1 | function I = readimage(fn,maxSize); | ||
2 | |||
3 | Io = imread(fn); | ||
4 | [nr,nc,nb] = size(Io); | ||
5 | |||
6 | if nb>1, | ||
7 | I = rgb2gray(Io); | ||
8 | else | ||
9 | I= Io; | ||
10 | end | ||
11 | |||
12 | %maxSize = 400; | ||
13 | if max(nr,nc) > maxSize, | ||
14 | I = imresize(I,maxSize/max(nr,nc)); | ||
15 | end | ||
diff --git a/SD-VBS/common/toolbox/MultiNcut/run_script.m b/SD-VBS/common/toolbox/MultiNcut/run_script.m new file mode 100755 index 0000000..3d2e8c6 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/run_script.m | |||
@@ -0,0 +1,60 @@ | |||
1 | %% set path for the MNcut code | ||
2 | |||
3 | if 1, | ||
4 | % MNcutDir = '/home/jshi/Matlab/Toolbox/MultiNcut'; | ||
5 | MNcutDir = 'C:\qihuizhu\Checkout\Human\Source\MultiNcut_new\MultiNcut'; | ||
6 | path(path,MNcutDir); | ||
7 | end | ||
8 | |||
9 | %% set the image input and output dir. | ||
10 | % imagedir = '/data/jshi/DLIB/image.cd'; | ||
11 | % imagedir = 'C:\qihuizhu\Checkout\Human\Source\Data\test'; | ||
12 | imagedir = 'C:\qihuizhu\Checkout\Human\Data\Current\baby_case5'; | ||
13 | % imageformat = 'ppm'; | ||
14 | imageformat = 'tif'; | ||
15 | |||
16 | % OutputDir = '/home/jshi/Results_DLIB'; | ||
17 | % OutputDir = 'C:\qihuizhu\Checkout\Human\Source\Data\test'; | ||
18 | OutputDir = 'C:\qihuizhu\Checkout\Human\Result\Segmentation\MultiNcut_new_03.07'; | ||
19 | |||
20 | a = dir(OutputDir); | ||
21 | if (length(a) == 0), | ||
22 | cm = sprintf('mkdir %s',OutputDir); | ||
23 | disp(cm); eval(cm); | ||
24 | end | ||
25 | |||
26 | files = dir(sprintf('%s/*.%s',imagedir,imageformat)); | ||
27 | |||
28 | %% image size definition | ||
29 | imageSize = 400; | ||
30 | |||
31 | % for id =11:200, | ||
32 | for id = 1:length(files) | ||
33 | %for id = 19:19, | ||
34 | I=readimage(sprintf('%s/%s',imagedir,files(id).name),imageSize); | ||
35 | |||
36 | num_segs = [10, 20]; | ||
37 | |||
38 | tic | ||
39 | [SegLabel,eigenVectors,eigenValues]= MNcut(I,num_segs); | ||
40 | toc | ||
41 | |||
42 | for j=1:size(SegLabel,3), | ||
43 | [gx,gy] = gradient(SegLabel(:,:,j)); | ||
44 | bw = (abs(gx)>0.1) + (abs(gy) > 0.1); | ||
45 | |||
46 | figure(1);clf; J1=showmask(double(I),bw); imagesc(J1);axis image; | ||
47 | cm = sprintf('print -djpeg %s/file%.4d-%.2d.jpg',OutputDir,id,num_segs(j)); disp(cm);eval(cm); | ||
48 | |||
49 | |||
50 | figure(10);imagesc(SegLabel(:,:,j));axis image; | ||
51 | cm = sprintf('print -djpeg %s/Seg%.4d-%.2d.jpg',OutputDir,id,num_segs(j));disp(cm);eval(cm); | ||
52 | |||
53 | % pause; | ||
54 | end | ||
55 | |||
56 | fname = files(id).name; | ||
57 | %cm = sprintf('save %s/SegLabl%.4d.mat I SegLabel fname',OutputDir,id); disp(cm); eval(cm); | ||
58 | %cm = sprintf('save %s/SegEig%.4d.mat eigenVectors eigenValues',OutputDir,id);disp(cm); eval(cm); | ||
59 | |||
60 | end | ||
diff --git a/SD-VBS/common/toolbox/MultiNcut/showmask.m b/SD-VBS/common/toolbox/MultiNcut/showmask.m new file mode 100755 index 0000000..6fd1142 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/showmask.m | |||
@@ -0,0 +1,65 @@ | |||
1 | % function RGB=showmask(V,M,hue); | ||
2 | % Input: | ||
3 | % V = image | ||
4 | % M = nonnegative mask | ||
5 | % hue = a number in [0,1], red,yellow,green,cyan,...,red | ||
6 | % a char, 'r','g','b','y','c','m' | ||
7 | % or a matrix of the same size of image | ||
8 | % eg. hue = mask1 * 0.7 + mask2 * 1; | ||
9 | % | ||
10 | % Output: | ||
11 | % RGB = an RGB image with V as shades and M as saturated hues | ||
12 | % If no output is required, this image is displayed. | ||
13 | |||
14 | % Stella X. YU, 2000. Based on Jianbo Shi's version. | ||
15 | |||
16 | function RGB=showmask(V,M,hue); | ||
17 | |||
18 | if nargin<3 | isempty(hue), | ||
19 | hue = 0; | ||
20 | end | ||
21 | if ischar(hue), | ||
22 | switch hue, | ||
23 | case 'r', hue = 1.0; | ||
24 | case 'g', hue = 0.3; | ||
25 | case 'b', hue = 0.7; | ||
26 | case 'y', hue = 0.15; | ||
27 | case 'c', hue = 0.55; | ||
28 | case 'm', hue = 0.85; | ||
29 | end | ||
30 | end | ||
31 | |||
32 | |||
33 | V=V-min(V(:)); | ||
34 | V=V/max(V(:)); | ||
35 | V=.25+0.75*V; %brighten things up a bit | ||
36 | |||
37 | M = double(M); | ||
38 | M = M-min(M(:)); | ||
39 | M = M/max(M(:)); | ||
40 | |||
41 | H = hue+zeros(size(V)); | ||
42 | S = M; | ||
43 | RGB = hsv2rgb(H,S,V); | ||
44 | |||
45 | if nargout>0, | ||
46 | return; | ||
47 | end | ||
48 | |||
49 | hold off; image(RGB); axis('image'); | ||
50 | s = cell(1,2); | ||
51 | if isempty(inputname(1)), | ||
52 | s{1} = 'image'; | ||
53 | else | ||
54 | s{1} = inputname(1); | ||
55 | end | ||
56 | if isempty(inputname(2)), | ||
57 | s{2} = 'mask'; | ||
58 | else | ||
59 | s{2} = inputname(2); | ||
60 | end | ||
61 | title(sprintf('%s and colored %s',s{1},s{2})); | ||
62 | |||
63 | if nargout==0, | ||
64 | clear RGB; | ||
65 | end | ||
diff --git a/SD-VBS/common/toolbox/MultiNcut/sparsifyc.c b/SD-VBS/common/toolbox/MultiNcut/sparsifyc.c new file mode 100755 index 0000000..82fca98 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/sparsifyc.c | |||
@@ -0,0 +1,232 @@ | |||
1 | /*================================================================= | ||
2 | * syntax: SPMX = SPARSIFY(MX, THRES) | ||
3 | * | ||
4 | * SPARSIFY - sparsify the input matrix, i.e. ignore the values | ||
5 | * of the matrix which are below a threshold | ||
6 | * | ||
7 | * Input: - MX: m-by-n matrix (sparse or full) | ||
8 | * - THRES: threshold value (double) | ||
9 | * | ||
10 | * Output: - SPMX: m-by-n sparse matrix only with values | ||
11 | * whose absolut value is above the given threshold | ||
12 | * | ||
13 | * Written by Mirko Visontai (10/24/2003) | ||
14 | *=================================================================*/ | ||
15 | |||
16 | |||
17 | #include <math.h> | ||
18 | #include "mex.h" | ||
19 | |||
20 | void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) | ||
21 | { | ||
22 | /* Declare variable */ | ||
23 | int i,m,n,nzmax,newnnz,col,processed,passed; | ||
24 | int starting_row_index, current_row_index, stopping_row_index; | ||
25 | double *in_pr,*in_pi,*out_pr,*out_pi; | ||
26 | int *in_ir,*in_jc,*out_ir,*out_jc; | ||
27 | double thres; | ||
28 | |||
29 | /* Check for proper number of input and output arguments */ | ||
30 | if ((nlhs != 1) || (nrhs != 2)){ | ||
31 | mexErrMsgTxt("usage: SPMX = SPARSIFY(MX, THRES)."); | ||
32 | } | ||
33 | /* if matrix is complex threshold the norm of the numbers */ | ||
34 | if (mxIsComplex(prhs[0])){ | ||
35 | /* Check data type of input argument */ | ||
36 | if (mxIsSparse(prhs[0])){ | ||
37 | |||
38 | /* read input */ | ||
39 | in_pr = mxGetPr(prhs[0]); | ||
40 | in_pi = mxGetPi(prhs[0]); | ||
41 | in_ir = mxGetIr(prhs[0]); | ||
42 | in_jc = mxGetJc(prhs[0]); | ||
43 | nzmax = mxGetNzmax(prhs[0]); | ||
44 | m = mxGetM(prhs[0]); | ||
45 | n = mxGetN(prhs[0]); | ||
46 | thres = mxGetScalar(prhs[1]); | ||
47 | |||
48 | /* Count new nonzeros */ | ||
49 | newnnz=0; | ||
50 | for(i=0; i<nzmax; i++){ | ||
51 | if (sqrt(in_pr[i]*in_pr[i] + in_pi[i]*in_pi[i])>thres) {newnnz++;} | ||
52 | } | ||
53 | |||
54 | if (newnnz>0){ | ||
55 | /* create output */ | ||
56 | plhs[0] = mxCreateSparse(m,n,newnnz,mxCOMPLEX); | ||
57 | if (plhs[0]==NULL) | ||
58 | mexErrMsgTxt("Could not allocate enough memory!\n"); | ||
59 | out_pr = mxGetPr(plhs[0]); | ||
60 | out_pi = mxGetPr(plhs[0]); | ||
61 | out_ir = mxGetIr(plhs[0]); | ||
62 | out_jc = mxGetJc(plhs[0]); | ||
63 | passed = 0; | ||
64 | out_jc[0] = 0; | ||
65 | for (col=0; col<n; col++){ | ||
66 | starting_row_index = in_jc[col]; | ||
67 | stopping_row_index = in_jc[col+1]; | ||
68 | out_jc[col+1] = out_jc[col]; | ||
69 | if (starting_row_index == stopping_row_index) | ||
70 | continue; | ||
71 | else { | ||
72 | for (current_row_index = starting_row_index; | ||
73 | current_row_index < stopping_row_index; | ||
74 | current_row_index++) { | ||
75 | if (sqrt(in_pr[current_row_index]*in_pr[current_row_index] + | ||
76 | in_pi[current_row_index]*in_pi[current_row_index] ) > thres){ | ||
77 | |||
78 | out_pr[passed]=in_pr[current_row_index]; | ||
79 | out_pi[passed]=in_pi[current_row_index]; | ||
80 | out_ir[passed]=in_ir[current_row_index]; | ||
81 | out_jc[col+1] = out_jc[col+1]+1; | ||
82 | passed++; | ||
83 | } | ||
84 | } | ||
85 | } | ||
86 | } | ||
87 | } | ||
88 | else{ | ||
89 | plhs[0] = mxCreateSparse(m,n,0,mxCOMPLEX); | ||
90 | } | ||
91 | } | ||
92 | else{ /* for full matrices */ | ||
93 | /* read input */ | ||
94 | in_pr = mxGetPr(prhs[0]); | ||
95 | in_pi = mxGetPr(prhs[0]); | ||
96 | m = mxGetM(prhs[0]); | ||
97 | n = mxGetN(prhs[0]); | ||
98 | thres = mxGetScalar(prhs[1]); | ||
99 | |||
100 | /* Count new nonzeros */ | ||
101 | newnnz=0; | ||
102 | for(i=0; i<m*n; i++){ | ||
103 | if (sqrt(in_pr[i]*in_pr[i] + in_pi[i]*in_pi[i])>thres) {newnnz++;} | ||
104 | } | ||
105 | |||
106 | if (newnnz>0){ | ||
107 | /* create output */ | ||
108 | plhs[0] = mxCreateSparse(m,n,newnnz,mxCOMPLEX); | ||
109 | if (plhs[0]==NULL) | ||
110 | mexErrMsgTxt("Could not allocate enough memory!\n"); | ||
111 | out_pr = mxGetPr(plhs[0]); | ||
112 | out_pi = mxGetPi(plhs[0]); | ||
113 | out_ir = mxGetIr(plhs[0]); | ||
114 | out_jc = mxGetJc(plhs[0]); | ||
115 | passed = 0; | ||
116 | out_jc[0] = 0; | ||
117 | |||
118 | for (col=0; col<n; col++){ | ||
119 | out_jc[col+1] = out_jc[col]; | ||
120 | for (current_row_index=0; current_row_index<m; current_row_index++){ | ||
121 | if (sqrt(in_pr[current_row_index+m*col]*in_pr[current_row_index+m*col] + | ||
122 | in_pi[current_row_index+m*col]*in_pi[current_row_index+m*col]) > thres){ | ||
123 | |||
124 | out_pr[passed]=in_pr[current_row_index+m*col]; | ||
125 | out_ir[passed]=current_row_index; | ||
126 | out_jc[col+1] = out_jc[col+1]+1; | ||
127 | passed++; | ||
128 | } | ||
129 | } | ||
130 | } | ||
131 | } | ||
132 | else{ | ||
133 | plhs[0] = mxCreateSparse(m,n,0,mxCOMPLEX); | ||
134 | } | ||
135 | } | ||
136 | } | ||
137 | else { | ||
138 | /* Check data type of input argument */ | ||
139 | if (mxIsSparse(prhs[0])){ | ||
140 | |||
141 | /* read input */ | ||
142 | in_pr = mxGetPr(prhs[0]); | ||
143 | in_ir = mxGetIr(prhs[0]); | ||
144 | in_jc = mxGetJc(prhs[0]); | ||
145 | nzmax = mxGetNzmax(prhs[0]); | ||
146 | n = mxGetN(prhs[0]); | ||
147 | m = mxGetM(prhs[0]); | ||
148 | thres = mxGetScalar(prhs[1]); | ||
149 | |||
150 | /* Count new nonzeros */ | ||
151 | newnnz=0; | ||
152 | for(i=0; i<nzmax; i++){ | ||
153 | if ((fabs(in_pr[i]))>thres) {newnnz++;} | ||
154 | } | ||
155 | |||
156 | if (newnnz>0){ | ||
157 | /* create output */ | ||
158 | plhs[0] = mxCreateSparse(m,n,newnnz,mxREAL); | ||
159 | if (plhs[0]==NULL) | ||
160 | mexErrMsgTxt("Could not allocate enough memory!\n"); | ||
161 | out_pr = mxGetPr(plhs[0]); | ||
162 | out_ir = mxGetIr(plhs[0]); | ||
163 | out_jc = mxGetJc(plhs[0]); | ||
164 | passed = 0; | ||
165 | out_jc[0] = 0; | ||
166 | for (col=0; col<n; col++){ | ||
167 | starting_row_index = in_jc[col]; | ||
168 | stopping_row_index = in_jc[col+1]; | ||
169 | out_jc[col+1] = out_jc[col]; | ||
170 | if (starting_row_index == stopping_row_index) | ||
171 | continue; | ||
172 | else { | ||
173 | for (current_row_index = starting_row_index; | ||
174 | current_row_index < stopping_row_index; | ||
175 | current_row_index++) { | ||
176 | if (fabs(in_pr[current_row_index])>thres){ | ||
177 | out_pr[passed]=in_pr[current_row_index]; | ||
178 | out_ir[passed]=in_ir[current_row_index]; | ||
179 | out_jc[col+1] = out_jc[col+1]+1; | ||
180 | passed++; | ||
181 | } | ||
182 | } | ||
183 | } | ||
184 | } | ||
185 | } | ||
186 | else{ | ||
187 | plhs[0] = mxCreateSparse(m,n,0,mxREAL); | ||
188 | } | ||
189 | } | ||
190 | else{ /* for full matrices */ | ||
191 | /* read input */ | ||
192 | in_pr = mxGetPr(prhs[0]); | ||
193 | n = mxGetN(prhs[0]); | ||
194 | m = mxGetM(prhs[0]); | ||
195 | thres = mxGetScalar(prhs[1]); | ||
196 | |||
197 | /* Count new nonzeros */ | ||
198 | newnnz=0; | ||
199 | for(i=0; i<m*n; i++){ | ||
200 | if ((fabs(in_pr[i]))>thres) {newnnz++;} | ||
201 | } | ||
202 | |||
203 | if (newnnz>0){ | ||
204 | /* create output */ | ||
205 | plhs[0] = mxCreateSparse(m,n,newnnz,mxREAL); | ||
206 | if (plhs[0]==NULL) | ||
207 | mexErrMsgTxt("Could not allocate enough memory!\n"); | ||
208 | out_pr = mxGetPr(plhs[0]); | ||
209 | out_ir = mxGetIr(plhs[0]); | ||
210 | out_jc = mxGetJc(plhs[0]); | ||
211 | passed = 0; | ||
212 | out_jc[0] = 0; | ||
213 | |||
214 | for (col=0; col<n; col++){ | ||
215 | out_jc[col+1] = out_jc[col]; | ||
216 | for (current_row_index=0; current_row_index<m; current_row_index++){ | ||
217 | if (fabs(in_pr[current_row_index+m*col])>thres){ | ||
218 | out_pr[passed]=in_pr[current_row_index+m*col]; | ||
219 | out_ir[passed]=current_row_index; | ||
220 | out_jc[col+1] = out_jc[col+1]+1; | ||
221 | passed++; | ||
222 | } | ||
223 | } | ||
224 | } | ||
225 | } | ||
226 | else{ | ||
227 | plhs[0] = mxCreateSparse(m,n,0,mxREAL); | ||
228 | } | ||
229 | } | ||
230 | } | ||
231 | } | ||
232 | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/sparsifyc.dll b/SD-VBS/common/toolbox/MultiNcut/sparsifyc.dll new file mode 100755 index 0000000..cf832a6 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/sparsifyc.dll | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/sparsifyc.mexa64 b/SD-VBS/common/toolbox/MultiNcut/sparsifyc.mexa64 new file mode 100755 index 0000000..2f5ed26 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/sparsifyc.mexa64 | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/sparsifyc.mexglx b/SD-VBS/common/toolbox/MultiNcut/sparsifyc.mexglx new file mode 100755 index 0000000..0ba41b6 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/sparsifyc.mexglx | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/sparsifyc.mexmac b/SD-VBS/common/toolbox/MultiNcut/sparsifyc.mexmac new file mode 100755 index 0000000..caa2306 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/sparsifyc.mexmac | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/spmtimesd.c b/SD-VBS/common/toolbox/MultiNcut/spmtimesd.c new file mode 100755 index 0000000..a98dc0a --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/spmtimesd.c | |||
@@ -0,0 +1,141 @@ | |||
1 | /*================================================================ | ||
2 | * spmtimesd.c | ||
3 | * This routine computes a sparse matrix times a diagonal matrix | ||
4 | * whose diagonal entries are stored in a full vector. | ||
5 | * | ||
6 | * Examples: | ||
7 | * spmtimesd(m,d,[]) = diag(d) * m, | ||
8 | * spmtimesd(m,[],d) = m * diag(d) | ||
9 | * spmtimesd(m,d1,d2) = diag(d1) * m * diag(d2) | ||
10 | * m could be complex, but d is assumed real | ||
11 | * | ||
12 | * Stella X. Yu's first MEX function, Nov 9, 2001. | ||
13 | |||
14 | % test sequence: | ||
15 | |||
16 | m = 1000; | ||
17 | n = 2000; | ||
18 | a=sparse(rand(m,n)); | ||
19 | d1 = rand(m,1); | ||
20 | d2 = rand(n,1); | ||
21 | tic; b=spmtimesd(a,d1,d2); toc | ||
22 | tic; bb = spdiags(d1,0,m,m) * a * spdiags(d2,0,n,n); toc | ||
23 | e = (bb-b); | ||
24 | max(abs(e(:))) | ||
25 | |||
26 | *=================================================================*/ | ||
27 | |||
28 | # include "mex.h" | ||
29 | |||
30 | void mexFunction( | ||
31 | int nargout, | ||
32 | mxArray *out[], | ||
33 | int nargin, | ||
34 | const mxArray *in[] | ||
35 | ) | ||
36 | { | ||
37 | /* declare variables */ | ||
38 | int i, j, k, m, n, nzmax, cmplx, xm, yn; | ||
39 | int *pir, *pjc, *qir, *qjc; | ||
40 | double *x, *y, *pr, *pi, *qr, *qi; | ||
41 | |||
42 | /* check argument */ | ||
43 | if (nargin != 3) { | ||
44 | mexErrMsgTxt("Three input arguments required"); | ||
45 | } | ||
46 | if (nargout>1) { | ||
47 | mexErrMsgTxt("Too many output arguments."); | ||
48 | } | ||
49 | if (!(mxIsSparse(in[0]))) { | ||
50 | mexErrMsgTxt("Input argument #1 must be of type sparse"); | ||
51 | } | ||
52 | if ( mxIsSparse(in[1]) || mxIsSparse(in[2]) ) { | ||
53 | mexErrMsgTxt("Input argument #2 & #3 must be of type full"); | ||
54 | } | ||
55 | |||
56 | /* computation starts */ | ||
57 | m = mxGetM(in[0]); | ||
58 | n = mxGetN(in[0]); | ||
59 | pr = mxGetPr(in[0]); | ||
60 | pi = mxGetPi(in[0]); | ||
61 | pir = mxGetIr(in[0]); | ||
62 | pjc = mxGetJc(in[0]); | ||
63 | |||
64 | i = mxGetM(in[1]); | ||
65 | j = mxGetN(in[1]); | ||
66 | xm = ((i>j)? i: j); | ||
67 | |||
68 | i = mxGetM(in[2]); | ||
69 | j = mxGetN(in[2]); | ||
70 | yn = ((i>j)? i: j); | ||
71 | |||
72 | if ( xm>0 && xm != m) { | ||
73 | mexErrMsgTxt("Row multiplication dimension mismatch."); | ||
74 | } | ||
75 | if ( yn>0 && yn != n) { | ||
76 | mexErrMsgTxt("Column multiplication dimension mismatch."); | ||
77 | } | ||
78 | |||
79 | |||
80 | nzmax = mxGetNzmax(in[0]); | ||
81 | cmplx = (pi==NULL ? 0 : 1); | ||
82 | out[0] = mxCreateSparse(m,n,nzmax,cmplx); | ||
83 | if (out[0]==NULL) { | ||
84 | mexErrMsgTxt("Not enough space for the output matrix."); | ||
85 | } | ||
86 | |||
87 | qr = mxGetPr(out[0]); | ||
88 | qi = mxGetPi(out[0]); | ||
89 | qir = mxGetIr(out[0]); | ||
90 | qjc = mxGetJc(out[0]); | ||
91 | |||
92 | /* left multiplication */ | ||
93 | x = mxGetPr(in[1]); | ||
94 | if (yn==0) { | ||
95 | for (j=0; j<n; j++) { | ||
96 | qjc[j] = pjc[j]; | ||
97 | for (k=pjc[j]; k<pjc[j+1]; k++) { | ||
98 | i = pir[k]; | ||
99 | qir[k] = i; | ||
100 | qr[k] = x[i] * pr[k]; | ||
101 | if (cmplx) { | ||
102 | qi[k] = x[i] * pi[k]; | ||
103 | } | ||
104 | } | ||
105 | } | ||
106 | qjc[n] = k; | ||
107 | return; | ||
108 | } | ||
109 | |||
110 | /* right multiplication */ | ||
111 | y = mxGetPr(in[2]); | ||
112 | if (xm==0) { | ||
113 | for (j=0; j<n; j++) { | ||
114 | qjc[j] = pjc[j]; | ||
115 | for (k=pjc[j]; k<pjc[j+1]; k++) { | ||
116 | qir[k] = pir[k]; | ||
117 | qr[k] = pr[k] * y[j]; | ||
118 | if (cmplx) { | ||
119 | qi[k] = qi[k] * y[j]; | ||
120 | } | ||
121 | } | ||
122 | } | ||
123 | qjc[n] = k; | ||
124 | return; | ||
125 | } | ||
126 | |||
127 | /* both sides */ | ||
128 | for (j=0; j<n; j++) { | ||
129 | qjc[j] = pjc[j]; | ||
130 | for (k=pjc[j]; k<pjc[j+1]; k++) { | ||
131 | i = pir[k]; | ||
132 | qir[k]= i; | ||
133 | qr[k] = x[i] * pr[k] * y[j]; | ||
134 | if (cmplx) { | ||
135 | qi[k] = x[i] * qi[k] * y[j]; | ||
136 | } | ||
137 | } | ||
138 | qjc[n] = k; | ||
139 | } | ||
140 | |||
141 | } | ||
diff --git a/SD-VBS/common/toolbox/MultiNcut/spmtimesd.dll b/SD-VBS/common/toolbox/MultiNcut/spmtimesd.dll new file mode 100755 index 0000000..f78a650 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/spmtimesd.dll | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/spmtimesd.mexa64 b/SD-VBS/common/toolbox/MultiNcut/spmtimesd.mexa64 new file mode 100755 index 0000000..43c59e3 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/spmtimesd.mexa64 | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/spmtimesd.mexglx b/SD-VBS/common/toolbox/MultiNcut/spmtimesd.mexglx new file mode 100755 index 0000000..5bc9ec4 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/spmtimesd.mexglx | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/spmtimesd.mexmac b/SD-VBS/common/toolbox/MultiNcut/spmtimesd.mexmac new file mode 100755 index 0000000..014113f --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/spmtimesd.mexmac | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/MultiNcut/tim_eigs.m b/SD-VBS/common/toolbox/MultiNcut/tim_eigs.m new file mode 100755 index 0000000..4b80262 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/tim_eigs.m | |||
@@ -0,0 +1,1084 @@ | |||
1 | function varargout = tim_eigs(varargin) | ||
2 | |||
3 | nombre_A_times_X = 0; %tim | ||
4 | nombreIterations = 0; %tim | ||
5 | |||
6 | %seule difference avec eigs : | ||
7 | % arguments_Afun = varargin{7-Amatrix-Bnotthere:end}; | ||
8 | %(pour l'instant : n'accepte que 2 arguments dans le cas de Afun : Afun(W,X)) | ||
9 | %permet d'aller plus vite en minimisant les acces a varargin | ||
10 | %(Timothee) | ||
11 | |||
12 | %EIGS Find a few eigenvalues and eigenvectors of a matrix using ARPACK. | ||
13 | % D = EIGS(A) returns a vector of A's 6 largest magnitude eigenvalues. | ||
14 | % A must be square and should be large and sparse. | ||
15 | % | ||
16 | % [V,D] = EIGS(A) returns a diagonal matrix D of A's 6 largest magnitude | ||
17 | % eigenvalues and a matrix V whose columns are the corresponding eigenvectors. | ||
18 | % | ||
19 | % [V,D,FLAG] = EIGS(A) also returns a convergence flag. If FLAG is 0 | ||
20 | % then all the eigenvalues converged; otherwise not all converged. | ||
21 | % | ||
22 | % EIGS(A,B) solves the generalized eigenvalue problem A*V == B*V*D. B must | ||
23 | % be symmetric (or Hermitian) positive definite and the same size as A. | ||
24 | % EIGS(A,[],...) indicates the standard eigenvalue problem A*V == V*D. | ||
25 | % | ||
26 | % EIGS(A,K) and EIGS(A,B,K) return the K largest magnitude eigenvalues. | ||
27 | % | ||
28 | % EIGS(A,K,SIGMA) and EIGS(A,B,K,SIGMA) return K eigenvalues based on SIGMA: | ||
29 | % 'LM' or 'SM' - Largest or Smallest Magnitude | ||
30 | % For real symmetric problems, SIGMA may also be: | ||
31 | % 'LA' or 'SA' - Largest or Smallest Algebraic | ||
32 | % 'BE' - Both Ends, one more from high end if K is odd | ||
33 | % For nonsymmetric and complex problems, SIGMA may also be: | ||
34 | % 'LR' or 'SR' - Largest or Smallest Real part | ||
35 | % 'LI' or 'SI' - Largest or Smallest Imaginary part | ||
36 | % If SIGMA is a real or complex scalar including 0, EIGS finds the eigenvalues | ||
37 | % closest to SIGMA. For scalar SIGMA, and also when SIGMA = 'SM' which uses | ||
38 | % the same algorithm as SIGMA = 0, B need only be symmetric (or Hermitian) | ||
39 | % positive semi-definite since it is not Cholesky factored as in the other cases. | ||
40 | % | ||
41 | % EIGS(A,K,SIGMA,OPTS) and EIGS(A,B,K,SIGMA,OPTS) specify options: | ||
42 | % OPTS.issym: symmetry of A or A-SIGMA*B represented by AFUN [{0} | 1] | ||
43 | % OPTS.isreal: complexity of A or A-SIGMA*B represented by AFUN [0 | {1}] | ||
44 | % OPTS.tol: convergence: Ritz estimate residual <= tol*NORM(A) [scalar | {eps}] | ||
45 | % OPTS.maxit: maximum number of iterations [integer | {300}] | ||
46 | % OPTS.p: number of Lanczos vectors: K+1<p<=N [integer | {2K}] | ||
47 | % OPTS.v0: starting vector [N-by-1 vector | {randomly generated by ARPACK}] | ||
48 | % OPTS.disp: diagnostic information display level [0 | {1} | 2] | ||
49 | % OPTS.cholB: B is actually its Cholesky factor CHOL(B) [{0} | 1] | ||
50 | % OPTS.permB: sparse B is actually CHOL(B(permB,permB)) [permB | {1:N}] | ||
51 | % | ||
52 | % EIGS(AFUN,N) accepts the function AFUN instead of the matrix A. | ||
53 | % Y = AFUN(X) should return | ||
54 | % A*X if SIGMA is not specified, or is a string other than 'SM' | ||
55 | % A\X if SIGMA is 0 or 'SM' | ||
56 | % (A-SIGMA*I)\X if SIGMA is a nonzero scalar (standard eigenvalue problem) | ||
57 | % (A-SIGMA*B)\X if SIGMA is a nonzero scalar (generalized eigenvalue problem) | ||
58 | % N is the size of A. The matrix A, A-SIGMA*I or A-SIGMA*B represented by AFUN is | ||
59 | % assumed to be real and nonsymmetric unless specified otherwise by OPTS.isreal | ||
60 | % and OPTS.issym. In all these EIGS syntaxes, EIGS(A,...) may be replaced by | ||
61 | % EIGS(AFUN,N,...). | ||
62 | % | ||
63 | % EIGS(AFUN,N,K,SIGMA,OPTS,P1,P2,...) and EIGS(AFUN,N,B,K,SIGMA,OPTS,P1,P2,...) | ||
64 | % provide for additional arguments which are passed to AFUN(X,P1,P2,...). | ||
65 | % | ||
66 | % Examples: | ||
67 | % A = delsq(numgrid('C',15)); d1 = eigs(A,5,'SM'); | ||
68 | % Equivalently, if dnRk is the following one-line function: | ||
69 | % function y = dnRk(x,R,k) | ||
70 | % y = (delsq(numgrid(R,k))) \ x; | ||
71 | % then pass dnRk's additional arguments, 'C' and 15, to EIGS: | ||
72 | % n = size(A,1); opts.issym = 1; d2 = eigs(@dnRk,n,5,'SM',opts,'C',15); | ||
73 | % | ||
74 | % See also EIG, SVDS, ARPACKC. | ||
75 | |||
76 | % Copyright 1984-2002 The MathWorks, Inc. | ||
77 | % $Revision: 1.45 $ $Date: 2002/05/14 18:50:58 $ | ||
78 | |||
79 | cputms = zeros(5,1); | ||
80 | t0 = cputime; % start timing pre-processing | ||
81 | |||
82 | if (nargout > 3) | ||
83 | error('Too many output arguments.') | ||
84 | end | ||
85 | |||
86 | % Process inputs and do error-checking | ||
87 | if isa(varargin{1},'double') | ||
88 | A = varargin{1}; | ||
89 | Amatrix = 1; | ||
90 | else | ||
91 | A = fcnchk(varargin{1}); | ||
92 | Amatrix = 0; | ||
93 | end | ||
94 | |||
95 | isrealprob = 1; % isrealprob = isreal(A) & isreal(B) & isreal(sigma) | ||
96 | if Amatrix | ||
97 | isrealprob = isreal(A); | ||
98 | end | ||
99 | |||
100 | issymA = 0; | ||
101 | if Amatrix | ||
102 | issymA = isequal(A,A'); | ||
103 | end | ||
104 | |||
105 | if Amatrix | ||
106 | [m,n] = size(A); | ||
107 | if (m ~= n) | ||
108 | error('A must be a square matrix or a function which computes A*x.') | ||
109 | end | ||
110 | else | ||
111 | n = varargin{2}; | ||
112 | nstr = 'Size of problem, ''n'', must be a positive integer.'; | ||
113 | if ~isequal(size(n),[1,1]) | ~isreal(n) | ||
114 | error(nstr) | ||
115 | end | ||
116 | if (round(n) ~= n) | ||
117 | warning('MATLAB:eigs:NonIntegerSize',['%s\n ' ... | ||
118 | 'Rounding input size.'],nstr) | ||
119 | n = round(n); | ||
120 | end | ||
121 | if issparse(n) | ||
122 | n = full(n); | ||
123 | end | ||
124 | end | ||
125 | |||
126 | Bnotthere = 0; | ||
127 | Bstr = sprintf(['Generalized matrix B must be the same size as A and' ... | ||
128 | ' either a symmetric positive (semi-)definite matrix or' ... | ||
129 | ' its Cholesky factor.']); | ||
130 | if (nargin < (3-Amatrix-Bnotthere)) | ||
131 | B = []; | ||
132 | Bnotthere = 1; | ||
133 | else | ||
134 | Bk = varargin{3-Amatrix-Bnotthere}; | ||
135 | if isempty(Bk) % allow eigs(A,[],k,sigma,opts); | ||
136 | B = Bk; | ||
137 | else | ||
138 | if isequal(size(Bk),[1,1]) & (n ~= 1) | ||
139 | B = []; | ||
140 | k = Bk; | ||
141 | Bnotthere = 1; | ||
142 | else % eigs(9,8,...) assumes A=9, B=8, ... NOT A=9, k=8, ... | ||
143 | B = Bk; | ||
144 | if ~isa(B,'double') | ~isequal(size(B),[n,n]) | ||
145 | error(Bstr) | ||
146 | end | ||
147 | isrealprob = isrealprob & isreal(B); | ||
148 | end | ||
149 | end | ||
150 | end | ||
151 | |||
152 | if Amatrix & ((nargin - ~Bnotthere)>4) | ||
153 | error('Too many inputs.') | ||
154 | end | ||
155 | |||
156 | if (nargin < (4-Amatrix-Bnotthere)) | ||
157 | k = min(n,6); | ||
158 | else | ||
159 | k = varargin{4-Amatrix-Bnotthere}; | ||
160 | end | ||
161 | |||
162 | kstr = ['Number of eigenvalues requested, k, must be a' ... | ||
163 | ' positive integer <= n.']; | ||
164 | if ~isa(k,'double') | ~isequal(size(k),[1,1]) | ~isreal(k) | (k>n) | ||
165 | error(kstr) | ||
166 | end | ||
167 | if issparse(k) | ||
168 | k = full(k); | ||
169 | end | ||
170 | if (round(k) ~= k) | ||
171 | warning('MATLAB:eigs:NonIntegerEigQty',['%s\n ' ... | ||
172 | 'Rounding number of eigenvalues.'],kstr) | ||
173 | k = round(k); | ||
174 | end | ||
175 | |||
176 | whchstr = sprintf(['Eigenvalue range sigma must be a valid 2-element string.']); | ||
177 | if (nargin < (5-Amatrix-Bnotthere)) | ||
178 | % default: eigs('LM') => ARPACK which='LM', sigma=0 | ||
179 | eigs_sigma = 'LM'; | ||
180 | whch = 'LM'; | ||
181 | sigma = 0; | ||
182 | else | ||
183 | eigs_sigma = varargin{5-Amatrix-Bnotthere}; | ||
184 | if isstr(eigs_sigma) | ||
185 | % eigs(string) => ARPACK which=string, sigma=0 | ||
186 | if ~isequal(size(eigs_sigma),[1,2]) | ||
187 | whchstr = [whchstr sprintf(['\nFor real symmetric A, the choices are ''%s'', ''%s'', ''%s'', ''%s'' or ''%s''.'], ... | ||
188 | 'LM','SM','LA','SA','BE')]; | ||
189 | whchstr = [whchstr sprintf(['\nFor non-symmetric or complex A, the choices are ''%s'', ''%s'', ''%s'', ''%s'', ''%s'' or ''%s''.\n'], ... | ||
190 | 'LM','SM','LR','SR','LI','SI')]; | ||
191 | error(whchstr) | ||
192 | end | ||
193 | eigs_sigma = upper(eigs_sigma); | ||
194 | if isequal(eigs_sigma,'SM') | ||
195 | % eigs('SM') => ARPACK which='LM', sigma=0 | ||
196 | whch = 'LM'; | ||
197 | else | ||
198 | % eigs(string), where string~='SM' => ARPACK which=string, sigma=0 | ||
199 | whch = eigs_sigma; | ||
200 | end | ||
201 | sigma = 0; | ||
202 | else | ||
203 | % eigs(scalar) => ARPACK which='LM', sigma=scalar | ||
204 | if ~isa(eigs_sigma,'double') | ~isequal(size(eigs_sigma),[1,1]) | ||
205 | error('Eigenvalue shift sigma must be a scalar.') | ||
206 | end | ||
207 | sigma = eigs_sigma; | ||
208 | if issparse(sigma) | ||
209 | sigma = full(sigma); | ||
210 | end | ||
211 | isrealprob = isrealprob & isreal(sigma); | ||
212 | whch = 'LM'; | ||
213 | end | ||
214 | end | ||
215 | |||
216 | tol = eps; % ARPACK's minimum tolerance is eps/2 (DLAMCH's EPS) | ||
217 | maxit = []; | ||
218 | p = []; | ||
219 | info = int32(0); % use a random starting vector | ||
220 | display = 1; | ||
221 | cholB = 0; | ||
222 | |||
223 | if (nargin >= (6-Amatrix-Bnotthere)) | ||
224 | opts = varargin{6-Amatrix-Bnotthere}; | ||
225 | if ~isa(opts,'struct') | ||
226 | error('Options argument must be a structure.') | ||
227 | end | ||
228 | |||
229 | if isfield(opts,'issym') & ~Amatrix | ||
230 | issymA = opts.issym; | ||
231 | if (issymA ~= 0) & (issymA ~= 1) | ||
232 | error('opts.issym must be 0 or 1.') | ||
233 | end | ||
234 | end | ||
235 | |||
236 | if isfield(opts,'isreal') & ~Amatrix | ||
237 | if (opts.isreal ~= 0) & (opts.isreal ~= 1) | ||
238 | error('opts.isreal must be 0 or 1.') | ||
239 | end | ||
240 | isrealprob = isrealprob & opts.isreal; | ||
241 | end | ||
242 | |||
243 | if ~isempty(B) & (isfield(opts,'cholB') | isfield(opts,'permB')) | ||
244 | if isfield(opts,'cholB') | ||
245 | cholB = opts.cholB; | ||
246 | if (cholB ~= 0) & (cholB ~= 1) | ||
247 | error('opts.cholB must be 0 or 1.') | ||
248 | end | ||
249 | if isfield(opts,'permB') | ||
250 | if issparse(B) & cholB | ||
251 | permB = opts.permB; | ||
252 | if ~isequal(sort(permB),(1:n)) & ... | ||
253 | ~isequal(sort(permB),(1:n)') | ||
254 | error('opts.permB must be a permutation of 1:n.') | ||
255 | end | ||
256 | else | ||
257 | warning('MATLAB:eigs:IgnoredOptionPermB', ... | ||
258 | ['Ignoring opts.permB since B is not its sparse' ... | ||
259 | ' Cholesky factor.']) | ||
260 | end | ||
261 | else | ||
262 | permB = 1:n; | ||
263 | end | ||
264 | end | ||
265 | end | ||
266 | |||
267 | if isfield(opts,'tol') | ||
268 | if ~isequal(size(opts.tol),[1,1]) | ~isreal(opts.tol) | (opts.tol<=0) | ||
269 | error(['Convergence tolerance opts.tol must be a strictly' ... | ||
270 | ' positive real scalar.']) | ||
271 | else | ||
272 | tol = full(opts.tol); | ||
273 | end | ||
274 | end | ||
275 | |||
276 | if isfield(opts,'p') | ||
277 | p = opts.p; | ||
278 | pstr = ['Number of basis vectors opts.p must be a positive' ... | ||
279 | ' integer <= n.']; | ||
280 | if ~isequal(size(p),[1,1]) | ~isreal(p) | (p<=0) | (p>n) | ||
281 | error(pstr) | ||
282 | end | ||
283 | if issparse(p) | ||
284 | p = full(p); | ||
285 | end | ||
286 | if (round(p) ~= p) | ||
287 | warning('MATLAB:eigs:NonIntegerVecQty',['%s\n ' ... | ||
288 | 'Rounding number of basis vectors.'],pstr) | ||
289 | p = round(p); | ||
290 | end | ||
291 | end | ||
292 | |||
293 | if isfield(opts,'maxit') | ||
294 | maxit = opts.maxit; | ||
295 | str = ['Maximum number of iterations opts.maxit must be' ... | ||
296 | ' a positive integer.']; | ||
297 | if ~isequal(size(maxit),[1,1]) | ~isreal(maxit) | (maxit<=0) | ||
298 | error(str) | ||
299 | end | ||
300 | if issparse(maxit) | ||
301 | maxit = full(maxit); | ||
302 | end | ||
303 | if (round(maxit) ~= maxit) | ||
304 | warning('MATLAB:eigs:NonIntegerIterationQty',['%s\n ' ... | ||
305 | 'Rounding number of iterations.'],str) | ||
306 | maxit = round(maxit); | ||
307 | end | ||
308 | end | ||
309 | |||
310 | if isfield(opts,'v0') | ||
311 | if ~isequal(size(opts.v0),[n,1]) | ||
312 | error('Start vector opts.v0 must be n-by-1.') | ||
313 | end | ||
314 | if isrealprob | ||
315 | if ~isreal(opts.v0) | ||
316 | error(['Start vector opts.v0 must be real for real problems.']) | ||
317 | end | ||
318 | resid = full(opts.v0); | ||
319 | else | ||
320 | resid(1:2:(2*n-1),1) = full(real(opts.v0)); | ||
321 | resid(2:2:2*n,1) = full(imag(opts.v0)); | ||
322 | end | ||
323 | info = int32(1); % use resid as starting vector | ||
324 | end | ||
325 | |||
326 | if isfield(opts,'disp') | ||
327 | display = opts.disp; | ||
328 | dispstr = 'Diagnostic level opts.disp must be an integer.'; | ||
329 | if (~isequal(size(display),[1,1])) | (~isreal(display)) | (display<0) | ||
330 | error(dispstr) | ||
331 | end | ||
332 | if (round(display) ~= display) | ||
333 | warning('MATLAB:eigs:NonIntegerDiagnosticLevel', ... | ||
334 | '%s\n Rounding diagnostic level.',dispstr) | ||
335 | display = round(display); | ||
336 | end | ||
337 | end | ||
338 | |||
339 | if isfield(opts,'cheb') | ||
340 | warning('MATLAB:eigs:ObsoleteOptionCheb', ... | ||
341 | ['Ignoring polynomial acceleration opts.cheb' ... | ||
342 | ' (no longer an option).']); | ||
343 | end | ||
344 | if isfield(opts,'stagtol') | ||
345 | warning('MATLAB:eigs:ObsoleteOptionStagtol', ... | ||
346 | ['Ignoring stagnation tolerance opts.stagtol' ... | ||
347 | ' (no longer an option).']); | ||
348 | end | ||
349 | |||
350 | end | ||
351 | |||
352 | % Now we know issymA, isrealprob, cholB, and permB | ||
353 | |||
354 | if isempty(p) | ||
355 | if isrealprob & ~issymA | ||
356 | p = min(max(2*k+1,20),n); | ||
357 | else | ||
358 | p = min(max(2*k,20),n); | ||
359 | end | ||
360 | end | ||
361 | if isempty(maxit) | ||
362 | maxit = max(300,ceil(2*n/max(p,1))); | ||
363 | end | ||
364 | if (info == int32(0)) | ||
365 | if isrealprob | ||
366 | resid = zeros(n,1); | ||
367 | else | ||
368 | resid = zeros(2*n,1); | ||
369 | end | ||
370 | end | ||
371 | |||
372 | if ~isempty(B) % B must be symmetric (Hermitian) positive (semi-)definite | ||
373 | if cholB | ||
374 | if ~isequal(triu(B),B) | ||
375 | error(Bstr) | ||
376 | end | ||
377 | else | ||
378 | if ~isequal(B,B') | ||
379 | error(Bstr) | ||
380 | end | ||
381 | end | ||
382 | end | ||
383 | |||
384 | useeig = 0; | ||
385 | if isrealprob & issymA | ||
386 | knstr = sprintf(['For real symmetric problems, must have number' ... | ||
387 | ' of eigenvalues k < n.\n']); | ||
388 | else | ||
389 | knstr = sprintf(['For nonsymmetric and complex problems, must have' ... | ||
390 | ' number of eigenvalues k < n-1.\n']); | ||
391 | end | ||
392 | if isempty(B) | ||
393 | knstr = [knstr sprintf(['Using eig(full(A)) instead.'])]; | ||
394 | else | ||
395 | knstr = [knstr sprintf(['Using eig(full(A),full(B)) instead.'])]; | ||
396 | end | ||
397 | if (k == 0) | ||
398 | useeig = 1; | ||
399 | end | ||
400 | if isrealprob & issymA | ||
401 | if (k > n-1) | ||
402 | if (n >= 6) | ||
403 | warning('MATLAB:eigs:TooManyRequestedEigsForRealSym', ... | ||
404 | '%s',knstr) | ||
405 | end | ||
406 | useeig = 1; | ||
407 | end | ||
408 | else | ||
409 | if (k > n-2) | ||
410 | if (n >= 7) | ||
411 | warning('MATLAB:eigs:TooManyRequestedEigsForComplexNonsym', ... | ||
412 | '%s',knstr) | ||
413 | end | ||
414 | useeig = 1; | ||
415 | end | ||
416 | end | ||
417 | |||
418 | if isrealprob & issymA | ||
419 | if ~isreal(sigma) | ||
420 | error(['For real symmetric problems, eigenvalue shift sigma must' ... | ||
421 | ' be real.']) | ||
422 | end | ||
423 | else | ||
424 | if ~isrealprob & issymA & ~isreal(sigma) | ||
425 | warning('MATLAB:eigs:ComplexShiftForRealProblem', ... | ||
426 | ['Complex eigenvalue shift sigma on a Hermitian problem' ... | ||
427 | ' (all real eigenvalues).']) | ||
428 | end | ||
429 | end | ||
430 | |||
431 | if isrealprob & issymA | ||
432 | if strcmp(whch,'LR') | ||
433 | whch = 'LA'; | ||
434 | warning('MATLAB:eigs:SigmaChangedToLA', ... | ||
435 | ['For real symmetric problems, sigma value ''LR''' ... | ||
436 | ' (Largest Real) is now ''LA'' (Largest Algebraic).']) | ||
437 | end | ||
438 | if strcmp(whch,'SR') | ||
439 | whch = 'SA'; | ||
440 | warning('MATLAB:eigs:SigmaChangedToSA', ... | ||
441 | ['For real symmetric problems, sigma value ''SR''' ... | ||
442 | ' (Smallest Real) is now ''SA'' (Smallest Algebraic).']) | ||
443 | end | ||
444 | if ~ismember(whch,{'LM', 'SM', 'LA', 'SA', 'BE'}) | ||
445 | whchstr = [whchstr sprintf(['\nFor real symmetric A, the choices are ''%s'', ''%s'', ''%s'', ''%s'' or ''%s''.'], ... | ||
446 | 'LM','SM','LA','SA','BE')]; | ||
447 | error(whchstr) | ||
448 | end | ||
449 | else | ||
450 | if strcmp(whch,'BE') | ||
451 | warning('MATLAB:eigs:SigmaChangedToLM', ... | ||
452 | ['Sigma value ''BE'' is now only available for real' ... | ||
453 | ' symmetric problems. Computing ''LM'' eigenvalues instead.']) | ||
454 | whch = 'LM'; | ||
455 | end | ||
456 | if ~ismember(whch,{'LM', 'SM', 'LR', 'SR', 'LI', 'SI'}) | ||
457 | whchstr = [whchstr sprintf(['\nFor non-symmetric or complex A, the choices are ''%s'', ''%s'', ''%s'', ''%s'', ''%s'' or ''%s''.\n'], ... | ||
458 | 'LM','SM','LR','SR','LI','SI')]; | ||
459 | error(whchstr) | ||
460 | end | ||
461 | end | ||
462 | |||
463 | % Now have enough information to do early return on cases eigs does not handle | ||
464 | if useeig | ||
465 | if (nargout <= 1) | ||
466 | varargout{1} = eigs2(A,n,B,k,whch,sigma,cholB, ... | ||
467 | varargin{7-Amatrix-Bnotthere:end}); | ||
468 | else | ||
469 | [varargout{1},varargout{2}] = eigs2(A,n,B,k,whch,sigma,cholB, ... | ||
470 | varargin{7-Amatrix-Bnotthere:end}); | ||
471 | end | ||
472 | if (nargout == 3) | ||
473 | varargout{3} = 0; % flag indicates "convergence" | ||
474 | end | ||
475 | return | ||
476 | end | ||
477 | |||
478 | if isrealprob & ~issymA | ||
479 | sigmar = real(sigma); | ||
480 | sigmai = imag(sigma); | ||
481 | end | ||
482 | |||
483 | if isrealprob & issymA | ||
484 | if (p <= k) | ||
485 | error(['For real symmetric problems, must have number of' ... | ||
486 | ' basis vectors opts.p > k.']) | ||
487 | end | ||
488 | else | ||
489 | if (p <= k+1) | ||
490 | error(['For nonsymmetric and complex problems, must have number of' ... | ||
491 | ' basis vectors opts.p > k+1.']) | ||
492 | end | ||
493 | end | ||
494 | |||
495 | if isequal(whch,'LM') & ~isequal(eigs_sigma,'LM') | ||
496 | % A*x = lambda*M*x, M symmetric (positive) semi-definite | ||
497 | % => OP = inv(A - sigma*M)*M and B = M | ||
498 | % => shift-and-invert mode | ||
499 | mode = 3; | ||
500 | elseif isempty(B) | ||
501 | % A*x = lambda*x | ||
502 | % => OP = A and B = I | ||
503 | mode = 1; | ||
504 | else % B is not empty | ||
505 | % Do not use mode=2. | ||
506 | % Use mode = 1 with OP = R'\(A*(R\x)) and B = I | ||
507 | % where R is B's upper triangular Cholesky factor: B = R'*R. | ||
508 | % Finally, V = R\V returns the actual generalized eigenvectors of A and B. | ||
509 | mode = 1; | ||
510 | end | ||
511 | |||
512 | if cholB | ||
513 | pB = 0; | ||
514 | RB = B; | ||
515 | RBT = B'; | ||
516 | end | ||
517 | |||
518 | if (mode == 3) & Amatrix % need lu(A-sigma*B) | ||
519 | if issparse(A) & (isempty(B) | issparse(B)) | ||
520 | if isempty(B) | ||
521 | AsB = A - sigma * speye(n); | ||
522 | else | ||
523 | if cholB | ||
524 | AsB = A - sigma * RBT * RB; | ||
525 | else | ||
526 | AsB = A - sigma * B; | ||
527 | end | ||
528 | end | ||
529 | [L,U,P,Q] = lu(AsB); | ||
530 | [perm,dummy] = find(Q); | ||
531 | else | ||
532 | if isempty(B) | ||
533 | AsB = A - sigma * eye(n); | ||
534 | else | ||
535 | if cholB | ||
536 | AsB = A - sigma * RBT * RB; | ||
537 | else | ||
538 | AsB = A - sigma * B; | ||
539 | end | ||
540 | end | ||
541 | [L,U,P] = lu(AsB); | ||
542 | end | ||
543 | dU = diag(U); | ||
544 | rcondestU = full(min(abs(dU)) / max(abs(dU))); | ||
545 | if (rcondestU < eps) | ||
546 | if isempty(B) | ||
547 | ds = sprintf(['(A-sigma*I) has small reciprocal condition' ... | ||
548 | ' estimate: %f\n'],rcondestU); | ||
549 | else | ||
550 | ds = sprintf(['(A-sigma*B) has small reciprocal condition' ... | ||
551 | ' estimate: %f\n'],rcondestU); | ||
552 | end | ||
553 | ds = [ds sprintf(['indicating that sigma is near an exact' ... | ||
554 | ' eigenvalue. The\nalgorithm may not converge unless' ... | ||
555 | ' you try a new value for sigma.\n'])]; | ||
556 | warning('MATLAB:eigs:SigmaNearExactEig',ds) | ||
557 | end | ||
558 | end | ||
559 | |||
560 | if (mode == 1) & ~isempty(B) & ~cholB % need chol(B) | ||
561 | if issparse(B) | ||
562 | permB = symamd(B); | ||
563 | [RB,pB] = chol(B(permB,permB)); | ||
564 | else | ||
565 | [RB,pB] = chol(B); | ||
566 | end | ||
567 | if (pB == 0) | ||
568 | RBT = RB'; | ||
569 | else | ||
570 | error(Bstr) | ||
571 | end | ||
572 | end | ||
573 | |||
574 | % Allocate outputs and ARPACK work variables | ||
575 | if isrealprob | ||
576 | if issymA % real and symmetric | ||
577 | prefix = 'ds'; | ||
578 | v = zeros(n,p); | ||
579 | ldv = int32(size(v,1)); | ||
580 | ipntr = int32(zeros(15,1)); | ||
581 | workd = zeros(n,3); | ||
582 | lworkl = p*(p+8); | ||
583 | workl = zeros(lworkl,1); | ||
584 | lworkl = int32(lworkl); | ||
585 | d = zeros(k,1); | ||
586 | else % real but not symmetric | ||
587 | prefix = 'dn'; | ||
588 | v = zeros(n,p); | ||
589 | ldv = int32(size(v,1)); | ||
590 | ipntr = int32(zeros(15,1)); | ||
591 | workd = zeros(n,3); | ||
592 | lworkl = 3*p*(p+2); | ||
593 | workl = zeros(lworkl,1); | ||
594 | lworkl = int32(lworkl); | ||
595 | workev = zeros(3*p,1); | ||
596 | d = zeros(k+1,1); | ||
597 | di = zeros(k+1,1); | ||
598 | end | ||
599 | else % complex | ||
600 | prefix = 'zn'; | ||
601 | zv = zeros(2*n*p,1); | ||
602 | ldv = int32(n); | ||
603 | ipntr = int32(zeros(15,1)); | ||
604 | workd = complex(zeros(n,3)); | ||
605 | zworkd = zeros(2*prod(size(workd)),1); | ||
606 | lworkl = 3*p^2+5*p; | ||
607 | workl = zeros(2*lworkl,1); | ||
608 | lworkl = int32(lworkl); | ||
609 | workev = zeros(2*2*p,1); | ||
610 | zd = zeros(2*(k+1),1); | ||
611 | rwork = zeros(p,1); | ||
612 | end | ||
613 | |||
614 | ido = int32(0); % reverse communication parameter | ||
615 | if isempty(B) | (~isempty(B) & (mode == 1)) | ||
616 | bmat = 'I'; % standard eigenvalue problem | ||
617 | else | ||
618 | bmat = 'G'; % generalized eigenvalue problem | ||
619 | end | ||
620 | nev = int32(k); % number of eigenvalues requested | ||
621 | ncv = int32(p); % number of Lanczos vectors | ||
622 | iparam = int32(zeros(11,1)); | ||
623 | iparam([1 3 7]) = int32([1 maxit mode]); | ||
624 | select = int32(zeros(p,1)); | ||
625 | |||
626 | cputms(1) = cputime - t0; % end timing pre-processing | ||
627 | |||
628 | iter = 0; | ||
629 | ariter = 0; | ||
630 | |||
631 | |||
632 | %tim | ||
633 | |||
634 | |||
635 | indexArgumentsAfun = 7-Amatrix-Bnotthere:length(varargin); | ||
636 | nbArgumentsAfun = length(indexArgumentsAfun); | ||
637 | if nbArgumentsAfun >=1 | ||
638 | arguments_Afun = varargin{7-Amatrix-Bnotthere}; | ||
639 | end | ||
640 | if nbArgumentsAfun >=2 | ||
641 | arguments_Afun2 = varargin{7-Amatrix-Bnotthere+1}; | ||
642 | end | ||
643 | if nbArgumentsAfun >=3 | ||
644 | arguments_Afun3 = varargin{7-Amatrix-Bnotthere+2}; | ||
645 | end | ||
646 | %fin tim | ||
647 | |||
648 | |||
649 | |||
650 | while (ido ~= 99) | ||
651 | |||
652 | t0 = cputime; % start timing ARPACK calls **aupd | ||
653 | |||
654 | if isrealprob | ||
655 | arpackc( [prefix 'aupd'], ido, ... | ||
656 | bmat, int32(n), whch, nev, tol, resid, ncv, ... | ||
657 | v, ldv, iparam, ipntr, workd, workl, lworkl, info); | ||
658 | else | ||
659 | zworkd(1:2:end-1) = real(workd); | ||
660 | zworkd(2:2:end) = imag(workd); | ||
661 | arpackc( 'znaupd', ido, ... | ||
662 | bmat, int32(n), whch, nev, tol, resid, ncv, zv, ... | ||
663 | ldv, iparam, ipntr, zworkd, workl, lworkl, ... | ||
664 | rwork, info ); | ||
665 | workd = reshape(complex(zworkd(1:2:end-1),zworkd(2:2:end)),[n,3]); | ||
666 | end | ||
667 | |||
668 | if (info < 0) | ||
669 | es = sprintf('Error with ARPACK routine %saupd: info = %d',... | ||
670 | prefix,full(info)); | ||
671 | error(es) | ||
672 | end | ||
673 | |||
674 | cputms(2) = cputms(2) + (cputime-t0); % end timing ARPACK calls **aupd | ||
675 | t0 = cputime; % start timing MATLAB OP(X) | ||
676 | |||
677 | % Compute which columns of workd ipntr references | ||
678 | |||
679 | |||
680 | |||
681 | |||
682 | |||
683 | %[row,col1] = ind2sub([n,3],double(ipntr(1))); | ||
684 | %tim | ||
685 | row = mod(double(ipntr(1))-1,n) + 1 ; | ||
686 | col1 = floor((double(ipntr(1))-1)/n) + 1; | ||
687 | |||
688 | |||
689 | if (row ~= 1) | ||
690 | str = sprintf(['ipntr(1)=%d does not refer to the start of a' ... | ||
691 | ' column of the %d-by-3 array workd.'],full(ipntr(1)),n); | ||
692 | error(str) | ||
693 | end | ||
694 | |||
695 | |||
696 | |||
697 | %[row,col2] = ind2sub([n,3],double(ipntr(2))); | ||
698 | %tim | ||
699 | row = mod(double(ipntr(2))-1,n) + 1 ; | ||
700 | col2 = floor((double(ipntr(2))-1)/n) + 1; | ||
701 | |||
702 | |||
703 | |||
704 | if (row ~= 1) | ||
705 | str = sprintf(['ipntr(2)=%d does not refer to the start of a' ... | ||
706 | ' column of the %d-by-3 array workd.'],full(ipntr(2)),n); | ||
707 | error(str) | ||
708 | end | ||
709 | if ~isempty(B) & (mode == 3) & (ido == 1) | ||
710 | [row,col3] = ind2sub([n,3],double(ipntr(3))); | ||
711 | if (row ~= 1) | ||
712 | str = sprintf(['ipntr(3)=%d does not refer to the start of a' ... | ||
713 | ' column of the %d-by-3 array workd.'],full(ipntr(3)),n); | ||
714 | error(str) | ||
715 | end | ||
716 | end | ||
717 | |||
718 | switch (ido) | ||
719 | case {-1,1} | ||
720 | if Amatrix | ||
721 | if (mode == 1) | ||
722 | if isempty(B) | ||
723 | % OP = A*x | ||
724 | workd(:,col2) = A * workd(:,col1); | ||
725 | else | ||
726 | % OP = R'\(A*(R\x)) | ||
727 | if issparse(B) | ||
728 | workd(permB,col2) = RB \ workd(:,col1); | ||
729 | workd(:,col2) = A * workd(:,col2); | ||
730 | workd(:,col2) = RBT \ workd(permB,col2); | ||
731 | else | ||
732 | workd(:,col2) = RBT \ (A * (RB \ workd(:,col1))); | ||
733 | end | ||
734 | end | ||
735 | elseif (mode == 3) | ||
736 | if isempty(B) | ||
737 | if issparse(A) | ||
738 | workd(perm,col2) = U \ (L \ (P * workd(:,col1))); | ||
739 | else | ||
740 | workd(:,col2) = U \ (L \ (P * workd(:,col1))); | ||
741 | end | ||
742 | else % B is not empty | ||
743 | if (ido == -1) | ||
744 | if cholB | ||
745 | workd(:,col2) = RBT * (RB * workd(:,col1)); | ||
746 | else | ||
747 | workd(:,col2) = B * workd(:,col1); | ||
748 | end | ||
749 | if issparse(A) & issparse(B) | ||
750 | workd(perm,col2) = U \ (L \ (P * workd(:,col1))); | ||
751 | else | ||
752 | workd(:,col2) = U \ (L \ (P * workd(:,col1))); | ||
753 | end | ||
754 | elseif (ido == 1) | ||
755 | if issparse(A) & issparse(B) | ||
756 | workd(perm,col2) = U \ (L \ (P * workd(:,col3))); | ||
757 | else | ||
758 | workd(:,col2) = U \ (L \ (P * workd(:,col3))); | ||
759 | end | ||
760 | end | ||
761 | end | ||
762 | else % mode is not 1 or 3 | ||
763 | error(['Unknown mode returned from ' prefix 'aupd.']) | ||
764 | end | ||
765 | else % A is not a matrix | ||
766 | if (mode == 1) | ||
767 | if isempty(B) | ||
768 | % OP = A*x | ||
769 | %workd(:,col2) = feval(A,workd(:,col1),varargin{7-Amatrix-Bnotthere:end}); | ||
770 | |||
771 | |||
772 | |||
773 | |||
774 | |||
775 | nombre_A_times_X = nombre_A_times_X + 1; | ||
776 | |||
777 | |||
778 | |||
779 | pause(0); %voir | ||
780 | |||
781 | if nbArgumentsAfun == 1 | ||
782 | workd(:,col2) = feval(A,workd(:,col1),arguments_Afun); | ||
783 | %workd(:,col2) = max(workd(:,col2),0); | ||
784 | elseif nbArgumentsAfun == 2 | ||
785 | workd(:,col2) = feval(A,workd(:,col1),arguments_Afun,arguments_Afun2); | ||
786 | elseif nbArgumentsAfun == 3 | ||
787 | workd(:,col2) = feval(A,workd(:,col1),arguments_Afun,arguments_Afun2,arguments_Afun3); | ||
788 | else | ||
789 | workd(:,col2) = feval(A,workd(:,col1),varargin{indexArgumentsAfun}); | ||
790 | end | ||
791 | %workd(:,col2) = tim_w_times_x_c(workd(:,col1),arguments_Afun); %slower | ||
792 | |||
793 | else | ||
794 | % OP = R'\(A*(R\x)) | ||
795 | if issparse(B) | ||
796 | workd(permB,col2) = RB \ workd(:,col1); | ||
797 | workd(:,col2) = feval(A,workd(:,col2),arguments_Afun); | ||
798 | workd(:,col2) = RBT \ workd(permB,col2); | ||
799 | |||
800 | else | ||
801 | workd(:,col2) = RBT \ feval(A,(RB\workd(:,col1)),arguments_Afun); | ||
802 | end | ||
803 | end | ||
804 | elseif (mode == 3) | ||
805 | if isempty(B) | ||
806 | workd(:,col2) = feval(A,workd(:,col1), arguments_Afun); | ||
807 | else | ||
808 | if (ido == -1) | ||
809 | if cholB | ||
810 | workd(:,col2) = RBT * (RB * workd(:,col1)); | ||
811 | else | ||
812 | workd(:,col2) = B * workd(:,col1); | ||
813 | end | ||
814 | workd(:,col2) = feval(A,workd(:,col2), arguments_Afun); | ||
815 | elseif (ido == 1) | ||
816 | workd(:,col2) = feval(A,workd(:,col3), arguments_Afun); | ||
817 | end | ||
818 | end | ||
819 | else % mode is not 1 or 3 | ||
820 | error(['Unknown mode returned from ' prefix 'aupd.']) | ||
821 | end | ||
822 | end % if Amatrix | ||
823 | case 2 | ||
824 | if (mode == 3) | ||
825 | if cholB | ||
826 | workd(:,col2) = RBT * (RB * workd(:,col1)); | ||
827 | else | ||
828 | workd(:,col2) = B * workd(:,col1); | ||
829 | end | ||
830 | else | ||
831 | error(['Unknown mode returned from ' prefix 'aupd.']) | ||
832 | end | ||
833 | case 3 | ||
834 | % setting iparam(1) = ishift = 1 ensures this never happens | ||
835 | warning('MATLAB:eigs:WorklShiftsUnsupported', ... | ||
836 | ['EIGS does not yet support computing the shifts in workl.' ... | ||
837 | ' Setting reverse communication parameter to 99 and returning.']) | ||
838 | ido = int32(99); | ||
839 | case 99 | ||
840 | otherwise | ||
841 | error(['Unknown value of reverse communication parameter' ... | ||
842 | ' returned from ' prefix 'aupd.']) | ||
843 | end | ||
844 | |||
845 | cputms(3) = cputms(3) + (cputime-t0); % end timing MATLAB OP(X) | ||
846 | |||
847 | %tim | ||
848 | if nombreIterations ~= double(ipntr(15)) | ||
849 | nombreIterations = double(ipntr(15)); | ||
850 | end | ||
851 | |||
852 | if display >= 1 && display <=2 | ||
853 | iter = double(ipntr(15)); | ||
854 | if (iter > ariter) & (ido ~= 99) | ||
855 | ariter = iter; | ||
856 | ds = sprintf(['Iteration %d: a few Ritz values of the' ... | ||
857 | ' %d-by-%d matrix:'],iter,p,p); | ||
858 | disp(ds) | ||
859 | if isrealprob | ||
860 | if issymA | ||
861 | dispvec = [workl(double(ipntr(6))+(0:p-1))]; | ||
862 | if isequal(whch,'BE') | ||
863 | % roughly k Large eigenvalues and k Small eigenvalues | ||
864 | disp(dispvec(max(end-2*k+1,1):end)) | ||
865 | else | ||
866 | % k eigenvalues | ||
867 | disp(dispvec(max(end-k+1,1):end)) | ||
868 | end | ||
869 | else | ||
870 | dispvec = [complex(workl(double(ipntr(6))+(0:p-1)), ... | ||
871 | workl(double(ipntr(7))+(0:p-1)))]; | ||
872 | % k+1 eigenvalues (keep complex conjugate pairs together) | ||
873 | disp(dispvec(max(end-k,1):end)) | ||
874 | end | ||
875 | else | ||
876 | dispvec = [complex(workl(2*double(ipntr(6))-1+(0:2:2*(p-1))), ... | ||
877 | workl(2*double(ipntr(6))+(0:2:2*(p-1))))]; | ||
878 | disp(dispvec(max(end-k+1,1):end)) | ||
879 | end | ||
880 | end | ||
881 | end | ||
882 | |||
883 | end % while (ido ~= 99) | ||
884 | |||
885 | t0 = cputime; % start timing post-processing | ||
886 | |||
887 | flag = 0; | ||
888 | if (info < 0) | ||
889 | es = sprintf('Error with ARPACK routine %saupd: info = %d',prefix,full(info)); | ||
890 | error(es) | ||
891 | else | ||
892 | if (nargout >= 2) | ||
893 | rvec = int32(1); % compute eigenvectors | ||
894 | else | ||
895 | rvec = int32(0); % do not compute eigenvectors | ||
896 | end | ||
897 | |||
898 | if isrealprob | ||
899 | if issymA | ||
900 | arpackc( 'dseupd', rvec, 'A', select, ... | ||
901 | d, v, ldv, sigma, ... | ||
902 | bmat, int32(n), whch, nev, tol, resid, ncv, ... | ||
903 | v, ldv, iparam, ipntr, workd, workl, lworkl, info ); | ||
904 | if isequal(whch,'LM') | isequal(whch,'LA') | ||
905 | d = flipud(d); | ||
906 | if (rvec == 1) | ||
907 | v(:,1:k) = v(:,k:-1:1); | ||
908 | end | ||
909 | end | ||
910 | if ((isequal(whch,'SM') | isequal(whch,'SA')) & (rvec == 0)) | ||
911 | d = flipud(d); | ||
912 | end | ||
913 | else | ||
914 | arpackc( 'dneupd', rvec, 'A', select, ... | ||
915 | d, di, v, ldv, sigmar, sigmai, workev, ... | ||
916 | bmat, int32(n), whch, nev, tol, resid, ncv, ... | ||
917 | v, ldv, iparam, ipntr, workd, workl, lworkl, info ); | ||
918 | d = complex(d,di); | ||
919 | if rvec | ||
920 | d(k+1) = []; | ||
921 | else | ||
922 | zind = find(d == 0); | ||
923 | if isempty(zind) | ||
924 | d = d(k+1:-1:2); | ||
925 | else | ||
926 | d(max(zind)) = []; | ||
927 | d = flipud(d); | ||
928 | end | ||
929 | end | ||
930 | end | ||
931 | else | ||
932 | zsigma = [real(sigma); imag(sigma)]; | ||
933 | arpackc( 'zneupd', rvec, 'A', select, ... | ||
934 | zd, zv, ldv, zsigma, workev, ... | ||
935 | bmat, int32(n), whch, nev, tol, resid, ncv, zv, ... | ||
936 | ldv, iparam, ipntr, zworkd, workl, lworkl, ... | ||
937 | rwork, info ); | ||
938 | if issymA | ||
939 | d = zd(1:2:end-1); | ||
940 | else | ||
941 | d = complex(zd(1:2:end-1),zd(2:2:end)); | ||
942 | end | ||
943 | v = reshape(complex(zv(1:2:end-1),zv(2:2:end)),[n p]); | ||
944 | end | ||
945 | |||
946 | if (info ~= 0) | ||
947 | es = ['Error with ARPACK routine ' prefix 'eupd: ']; | ||
948 | switch double(info) | ||
949 | case 2 | ||
950 | ss = sum(select); | ||
951 | if (ss < k) | ||
952 | es = [es ... | ||
953 | ' The logical variable select was only set with ' int2str(ss) ... | ||
954 | ' 1''s instead of nconv=' int2str(double(iparam(5))) ... | ||
955 | ' (k=' int2str(k) ').' ... | ||
956 | ' Please contact the ARPACK authors at arpack@caam.rice.edu.']; | ||
957 | else | ||
958 | es = [es ... | ||
959 | 'The LAPACK reordering routine ' prefix(1) ... | ||
960 | 'trsen did not return all ' int2str(k) ' eigenvalues.'] | ||
961 | end | ||
962 | case 1 | ||
963 | es = [es ... | ||
964 | 'The Schur form could not be reordered by the LAPACK routine ' ... | ||
965 | prefix(1) 'trsen.' ... | ||
966 | ' Please contact the ARPACK authors at arpack@caam.rice.edu.']; | ||
967 | case -14 | ||
968 | es = [es prefix ... | ||
969 | 'aupd did not find any eigenvalues to sufficient accuracy.']; | ||
970 | otherwise | ||
971 | es = [es sprintf('info = %d',full(info))]; | ||
972 | end | ||
973 | error(es) | ||
974 | else | ||
975 | nconv = double(iparam(5)); | ||
976 | if (nconv == 0) | ||
977 | if (nargout < 3) | ||
978 | warning('MATLAB:eigs:NoEigsConverged', ... | ||
979 | 'None of the %d requested eigenvalues converged.',k) | ||
980 | else | ||
981 | flag = 1; | ||
982 | end | ||
983 | elseif (nconv < k) | ||
984 | if (nargout < 3) | ||
985 | warning('MATLAB:eigs:NotAllEigsConverged', ... | ||
986 | 'Only %d of the %d requested eigenvalues converged.',nconv,k) | ||
987 | else | ||
988 | flag = 1; | ||
989 | end | ||
990 | end | ||
991 | end % if (info ~= 0) | ||
992 | end % if (info < 0) | ||
993 | |||
994 | if (issymA) | (~isrealprob) | ||
995 | if (nargout <= 1) | ||
996 | if isrealprob | ||
997 | varargout{1} = d; | ||
998 | else | ||
999 | varargout{1} = d(k:-1:1,1); | ||
1000 | end | ||
1001 | else | ||
1002 | varargout{1} = v(:,1:k); | ||
1003 | varargout{2} = diag(d(1:k,1)); | ||
1004 | if (nargout >= 3) | ||
1005 | varargout{3} = flag; | ||
1006 | end | ||
1007 | end | ||
1008 | else | ||
1009 | if (nargout <= 1) | ||
1010 | varargout{1} = d; | ||
1011 | else | ||
1012 | cplxd = find(di ~= 0); | ||
1013 | % complex conjugate pairs of eigenvalues occur together | ||
1014 | cplxd = cplxd(1:2:end); | ||
1015 | v(:,[cplxd cplxd+1]) = [complex(v(:,cplxd),v(:,cplxd+1)) ... | ||
1016 | complex(v(:,cplxd),-v(:,cplxd+1))]; | ||
1017 | varargout{1} = v(:,1:k); | ||
1018 | varargout{2} = diag(d); | ||
1019 | if (nargout >= 3) | ||
1020 | varargout{3} = flag; | ||
1021 | end | ||
1022 | end | ||
1023 | end | ||
1024 | |||
1025 | if (nargout >= 2) & (mode == 1) & ~isempty(B) | ||
1026 | if issparse(B) | ||
1027 | varargout{1}(permB,:) = RB \ varargout{1}; | ||
1028 | else | ||
1029 | varargout{1} = RB \ varargout{1}; | ||
1030 | end | ||
1031 | end | ||
1032 | |||
1033 | cputms(4) = cputime-t0; % end timing post-processing | ||
1034 | |||
1035 | cputms(5) = sum(cputms(1:4)); % total time | ||
1036 | |||
1037 | if (display >= 2) %tim | ||
1038 | if (mode == 1) | ||
1039 | innerstr = sprintf(['Compute A*X:' ... | ||
1040 | ' %f\n'],cputms(3)); | ||
1041 | elseif (mode == 2) | ||
1042 | innerstr = sprintf(['Compute A*X and solve B*X=Y for X:' ... | ||
1043 | ' %f\n'],cputms(3)); | ||
1044 | elseif (mode == 3) | ||
1045 | if isempty(B) | ||
1046 | innerstr = sprintf(['Solve (A-SIGMA*I)*X=Y for X:' ... | ||
1047 | ' %f\n'],cputms(3)); | ||
1048 | else | ||
1049 | innerstr = sprintf(['Solve (A-SIGMA*B)*X=B*Y for X:' ... | ||
1050 | ' %f\n'],cputms(3)); | ||
1051 | end | ||
1052 | end | ||
1053 | if ((mode == 3) & (Amatrix)) | ||
1054 | if isempty(B) | ||
1055 | prepstr = sprintf(['Pre-processing, including lu(A-sigma*I):' ... | ||
1056 | ' %f\n'],cputms(1)); | ||
1057 | else | ||
1058 | prepstr = sprintf(['Pre-processing, including lu(A-sigma*B):' ... | ||
1059 | ' %f\n'],cputms(1)); | ||
1060 | end | ||
1061 | elseif ((mode == 2) & (~cholB)) | ||
1062 | prepstr = sprintf(['Pre-processing, including chol(B):' ... | ||
1063 | ' %f\n'],cputms(1)); | ||
1064 | else | ||
1065 | prepstr = sprintf(['Pre-processing:' ... | ||
1066 | ' %f\n'],cputms(1)); | ||
1067 | end | ||
1068 | sstr = sprintf(['***********CPU Timing Results in seconds***********']); | ||
1069 | ds = sprintf(['\n' sstr '\n' ... | ||
1070 | prepstr ... | ||
1071 | 'ARPACK''s %saupd: %f\n' ... | ||
1072 | innerstr ... | ||
1073 | 'Post-processing with ARPACK''s %seupd: %f\n' ... | ||
1074 | '***************************************************\n' ... | ||
1075 | 'Total: %f\n' ... | ||
1076 | sstr '\n'], ... | ||
1077 | prefix,cputms(2),prefix,cputms(4),cputms(5)); | ||
1078 | disp(ds) | ||
1079 | if nombre_A_times_X > 0 %tim | ||
1080 | disp(sprintf('Number of iterations : %f\n',nombreIterations)); | ||
1081 | disp(sprintf('Number of times A*X was computed : %f\n',nombre_A_times_X)); | ||
1082 | disp(sprintf('Average time for A*X : %f\n',cputms(3)/nombre_A_times_X)); | ||
1083 | end | ||
1084 | end | ||
diff --git a/SD-VBS/common/toolbox/ikkjin/getANMS.m b/SD-VBS/common/toolbox/ikkjin/getANMS.m new file mode 100755 index 0000000..a40d50c --- /dev/null +++ b/SD-VBS/common/toolbox/ikkjin/getANMS.m | |||
@@ -0,0 +1,30 @@ | |||
1 | function [interestPnts]=getANMS(x, y, v, r, dataDir) | ||
2 | MAX_LIMIT=100000; | ||
3 | C_ROBUST=1; | ||
4 | r_sq=r^2; | ||
5 | points=[x y v]; | ||
6 | [n temp]=size(v); | ||
7 | [srtdV srtdVIdx]=sort(v,'descend'); | ||
8 | srtdPnts=points(srtdVIdx,:); | ||
9 | |||
10 | interestPnts=zeros(0,3); | ||
11 | |||
12 | suppressR=ones(n,1)*MAX_LIMIT; | ||
13 | supId=find(suppressR>r_sq); | ||
14 | |||
15 | iter = 0; | ||
16 | while length(supId)>0 | ||
17 | |||
18 | interestPnts=[interestPnts; srtdPnts(supId(1),:)]; | ||
19 | srtdPnts=srtdPnts(supId(2:end),:); | ||
20 | suppressR=suppressR(supId(2:end),:); | ||
21 | |||
22 | suppressR=min(suppressR,... | ||
23 | (C_ROBUST*interestPnts(end,3)>=srtdPnts(:,3)).*... | ||
24 | ((srtdPnts(:,1)-interestPnts(end,1)).^2 + (srtdPnts(:,2)-interestPnts(end,2)).^2)... | ||
25 | +(C_ROBUST*interestPnts(end,3)<srtdPnts(:,3))*... | ||
26 | MAX_LIMIT); | ||
27 | |||
28 | iter = iter + 1; | ||
29 | supId=find(suppressR>r_sq); | ||
30 | end | ||
diff --git a/SD-VBS/common/toolbox/ikkjin/getImgGrad.m b/SD-VBS/common/toolbox/ikkjin/getImgGrad.m new file mode 100755 index 0000000..90fae28 --- /dev/null +++ b/SD-VBS/common/toolbox/ikkjin/getImgGrad.m | |||
@@ -0,0 +1,7 @@ | |||
1 | function Ig=getImgGrad(imgroi) | ||
2 | im = double(rgb2gray(imgroi)); | ||
3 | g1 = fspecial('gaussian', 9,1); % Gaussian with sigma_d | ||
4 | img1 = conv2(im,g1,'same'); % blur image with sigma_d | ||
5 | Ix = conv2(img1,[-1 0 1],'same'); % take x derivative | ||
6 | Iy = conv2(img1,[-1;0;1],'same'); % take y derivative | ||
7 | Ig=Ix.^2+Iy.^2; \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/ikkjin/harris.m b/SD-VBS/common/toolbox/ikkjin/harris.m new file mode 100755 index 0000000..92a6543 --- /dev/null +++ b/SD-VBS/common/toolbox/ikkjin/harris.m | |||
@@ -0,0 +1,43 @@ | |||
1 | |||
2 | % Sample code for detecting Harris corners, following | ||
3 | % Brown et al, CVPR 2005 | ||
4 | % by Alyosha Efros, so probably buggy... | ||
5 | % slightly modified by ikkjin | ||
6 | |||
7 | function [x,y,v] = harris(imrgb); | ||
8 | [nr nc nb]=size(imrgb); | ||
9 | if nb==3 | ||
10 | im=rgb2gray(imrgb); | ||
11 | else | ||
12 | im=imrgb; | ||
13 | end | ||
14 | |||
15 | im = im2double(im); | ||
16 | g1 = fspecial('gaussian', 9,1); % Gaussian with sigma_d | ||
17 | g2 = fspecial('gaussian', 11,1.5); % Gaussian with sigma_i | ||
18 | img1 = conv2(im,g1,'same'); % blur image with sigma_d | ||
19 | Ix = conv2(img1,[-1 0 1],'same'); % take x derivative | ||
20 | Iy = conv2(img1,[-1;0;1],'same'); % take y derivative | ||
21 | |||
22 | % Compute elements of the Harris matrix H | ||
23 | %%% we can use blur instead of the summing window | ||
24 | Ix2 = conv2(Ix.*Ix,g2,'same'); | ||
25 | Iy2 = conv2(Iy.*Iy,g2,'same'); | ||
26 | IxIy = conv2(Ix.*Iy,g2,'same'); | ||
27 | R = (Ix2.*Iy2 - IxIy.*IxIy) ... % det(H) | ||
28 | ./ (Ix2 + Iy2 + eps); % trace(H) + epsilon | ||
29 | |||
30 | % don't want corners close to image border | ||
31 | R([1:15, end-16:end], :) = 0; | ||
32 | R(:,[1:15,end-16:end]) = 0; | ||
33 | |||
34 | % non-maxima supression within 3x3 windows | ||
35 | nonmax = inline('max(x)'); | ||
36 | Rmax = colfilt(R,[3 3],'sliding',nonmax); % find neighbrhood max | ||
37 | Rnm = R.*(R == Rmax); % supress non-max | ||
38 | |||
39 | % extract all interest points | ||
40 | [y,x,v] = find(Rnm); | ||
41 | |||
42 | |||
43 | |||
diff --git a/SD-VBS/common/toolbox/lagrcv/Makefile b/SD-VBS/common/toolbox/lagrcv/Makefile new file mode 100755 index 0000000..af7e8f5 --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/Makefile | |||
@@ -0,0 +1,21 @@ | |||
1 | rm liblagrcv.a | ||
2 | gcc -c -fPIC lagrcv.cpp | ||
3 | ar rc liblagrcv.a lagrcv.o | ||
4 | ranlib liblagrcv.a | ||
5 | |||
6 | mex -O calcSubsampleAvgMex.cc -L/u/ikkjin/Matlab/Toolbox/lagrcv -llagrcv -I/u/ikkjin/Matlab/Toolbox/lagrcv/ | ||
7 | mex -O calcSobelMex.cc -L/u/ikkjin/Matlab/Toolbox/lagrcv -llagrcv -I/u/ikkjin/Matlab/Toolbox/lagrcv/ | ||
8 | mex -O calcImgBlurMex.cc -L/u/ikkjin/Matlab/Toolbox/lagrcv -llagrcv -I/u/ikkjin/Matlab/Toolbox/lagrcv/ | ||
9 | mex -O calcOptFlowLKMex.cc -L/u/ikkjin/Matlab/Toolbox/lagrcv -llagrcv -I/u/ikkjin/Matlab/Toolbox/lagrcv/ | ||
10 | mex -O calcResizedImgMex.cc -L/u/ikkjin/Matlab/Toolbox/lagrcv -llagrcv -I/u/ikkjin/Matlab/Toolbox/lagrcv/ | ||
11 | mex -O calcTextureMex.cc -L/u/ikkjin/Matlab/Toolbox/lagrcv -llagrcv -I/u/ikkjin/Matlab/Toolbox/lagrcv/ | ||
12 | mex -O calcGradientPyrMex.cc -L/u/ikkjin/Matlab/Toolbox/lagrcv -llagrcv -I/u/ikkjin/Matlab/Toolbox/lagrcv/ | ||
13 | mex -O calcSobelPyrMex.cc -L/u/ikkjin/Matlab/Toolbox/lagrcv -llagrcv -I/u/ikkjin/Matlab/Toolbox/lagrcv/ | ||
14 | mex -O calcTexturePyrMex.cc -L/u/ikkjin/Matlab/Toolbox/lagrcv -llagrcv -I/u/ikkjin/Matlab/Toolbox/lagrcv/ | ||
15 | mex -O calcOptFlowLKPyrMex.cc -L/u/ikkjin/Matlab/Toolbox/lagrcv -llagrcv -I/u/ikkjin/Matlab/Toolbox/lagrcv/ | ||
16 | mex -O calcOptFlowLKPyrMex2.cc -L/u/ikkjin/Matlab/Toolbox/lagrcv -llagrcv -I/u/ikkjin/Matlab/Toolbox/lagrcv/ | ||
17 | mex -O calcOptFlowLKPyrWInitMex2.cc -L/u/ikkjin/Matlab/Toolbox/lagrcv -llagrcv -I/u/ikkjin/Matlab/Toolbox/lagrcv/ | ||
18 | mex -O calcOptFlowLKPyrWInitMex.cc -L/u/ikkjin/Matlab/Toolbox/lagrcv -llagrcv -I/u/ikkjin/Matlab/Toolbox/lagrcv/ | ||
19 | mex -O calcOptFlowLKPyrWInitSobelMex.cc -L/u/ikkjin/Matlab/Toolbox/lagrcv -llagrcv -I/u/ikkjin/Matlab/Toolbox/lagrcv/ | ||
20 | mex -O dummyMex.cc -L/u/ikkjin/Matlab/Toolbox/lagrcv -llagrcv -I/u/ikkjin/Matlab/Toolbox/lagrcv/ | ||
21 | |||
diff --git a/SD-VBS/common/toolbox/lagrcv/README.sxw b/SD-VBS/common/toolbox/lagrcv/README.sxw new file mode 100755 index 0000000..9f20d14 --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/README.sxw | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcGradientPyrMex.cc b/SD-VBS/common/toolbox/lagrcv/calcGradientPyrMex.cc new file mode 100755 index 0000000..d94130b --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcGradientPyrMex.cc | |||
@@ -0,0 +1,45 @@ | |||
1 | |||
2 | /* compile with | ||
3 | rm liblagrcv.a | ||
4 | gcc -c lagrcv.cpp | ||
5 | ar rc liblagrcv.a lagrcv.o | ||
6 | ranlib liblagrcv.a | ||
7 | mex7 calcTextureMex.cc -L/home/ikkjin/LagrMatlab/opencv/matlab -llagrcv -I/home/ikkjin/LagrMatlab/opencv/matlab/ | ||
8 | */ | ||
9 | |||
10 | #include "mex.h" | ||
11 | #include "lagrcv.h" | ||
12 | #include <stdio.h> | ||
13 | #include <math.h> | ||
14 | |||
15 | // TODO: add number of corners parameter | ||
16 | void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { | ||
17 | // usage: [dxPye dyPyr] = | ||
18 | // calcGradientPyrMex(imagePyr) | ||
19 | |||
20 | const int *cellDims = mxGetDimensions(prhs[0]); | ||
21 | double *image; | ||
22 | const mxArray* imgArray; | ||
23 | mxArray *dxArray, *dyArray; | ||
24 | double *dx, *dy; | ||
25 | const int *imdims; | ||
26 | |||
27 | plhs[0] = mxCreateCellArray(1, cellDims); | ||
28 | plhs[1] = mxCreateCellArray(1, cellDims); | ||
29 | |||
30 | for(int i=0; i<cellDims[0];i++){ | ||
31 | imgArray= mxGetCell(prhs[0],i); | ||
32 | image=mxGetPr(imgArray); | ||
33 | imdims = mxGetDimensions(imgArray); | ||
34 | |||
35 | dxArray = mxCreateNumericMatrix(imdims[0], imdims[1], mxDOUBLE_CLASS, mxREAL); | ||
36 | dyArray = mxCreateNumericMatrix(imdims[0], imdims[1], mxDOUBLE_CLASS, mxREAL); | ||
37 | mxSetCell(plhs[0], i, dxArray); | ||
38 | mxSetCell(plhs[1], i, dyArray); | ||
39 | dx=mxGetPr(dxArray); | ||
40 | dy=mxGetPr(dyArray); | ||
41 | |||
42 | calcGradient(image, imdims[0], imdims[1], dx, dy); | ||
43 | //calcSobel(image, imdims[0], imdims[1], dx, dy); | ||
44 | } | ||
45 | } | ||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcGradientPyrMex.mexa64 b/SD-VBS/common/toolbox/lagrcv/calcGradientPyrMex.mexa64 new file mode 100755 index 0000000..1ee53da --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcGradientPyrMex.mexa64 | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcGradientPyrMex.mexglx b/SD-VBS/common/toolbox/lagrcv/calcGradientPyrMex.mexglx new file mode 100755 index 0000000..cd7d6f1 --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcGradientPyrMex.mexglx | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcImgBlurMex.cc b/SD-VBS/common/toolbox/lagrcv/calcImgBlurMex.cc new file mode 100755 index 0000000..5e2f1da --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcImgBlurMex.cc | |||
@@ -0,0 +1,30 @@ | |||
1 | |||
2 | /* compile with | ||
3 | rm liblagrcv.a | ||
4 | gcc -c lagrcv.cpp | ||
5 | ar rc liblagrcv.a lagrcv.o | ||
6 | ranlib liblagrcv.a | ||
7 | mex7 calcTextureMex.cc -L/home/ikkjin/LagrMatlab/opencv/matlab -llagrcv -I/home/ikkjin/LagrMatlab/opencv/matlab/ | ||
8 | */ | ||
9 | |||
10 | #include "mex.h" | ||
11 | #include "lagrcv.h" | ||
12 | #include <stdio.h> | ||
13 | #include <math.h> | ||
14 | |||
15 | // TODO: add number of corners parameter | ||
16 | void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { | ||
17 | // usage: [IBlur] = | ||
18 | // calcImgBlurMex(image) | ||
19 | |||
20 | double *image, *retImg; | ||
21 | const int *imdims; | ||
22 | |||
23 | image=(double*)mxGetPr(prhs[0]); | ||
24 | imdims = mxGetDimensions(prhs[0]); | ||
25 | |||
26 | plhs[0] = mxCreateNumericMatrix(imdims[0], imdims[1], mxDOUBLE_CLASS, mxREAL); | ||
27 | retImg=(double*)mxGetPr(plhs[0]); | ||
28 | |||
29 | calcImgBlur(image, imdims[0], imdims[1], retImg); | ||
30 | } | ||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcImgBlurMex.mexa64 b/SD-VBS/common/toolbox/lagrcv/calcImgBlurMex.mexa64 new file mode 100755 index 0000000..8f4bfea --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcImgBlurMex.mexa64 | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcImgBlurMex.mexglx b/SD-VBS/common/toolbox/lagrcv/calcImgBlurMex.mexglx new file mode 100755 index 0000000..ade786d --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcImgBlurMex.mexglx | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKMex.cc b/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKMex.cc new file mode 100755 index 0000000..e22af8b --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKMex.cc | |||
@@ -0,0 +1,85 @@ | |||
1 | |||
2 | /* compile with | ||
3 | rm liblagrcv.a | ||
4 | gcc -c lagrcv.cpp | ||
5 | ar rc liblagrcv.a lagrcv.o | ||
6 | ranlib liblagrcv.a | ||
7 | mex7 calcTextureMex.cc -L/home/ikkjin/LagrMatlab/opencv/matlab -llagrcv -I/home/ikkjin/LagrMatlab/opencv/matlab/ | ||
8 | */ | ||
9 | |||
10 | #include "mex.h" | ||
11 | #include "lagrcv.h" | ||
12 | #include <stdio.h> | ||
13 | #include <math.h> | ||
14 | |||
15 | #ifndef MAX_LEVEL | ||
16 | # define MAX_LEVEL 5 | ||
17 | #endif | ||
18 | // TODO: add number of corners parameter | ||
19 | void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { | ||
20 | // usage: [newFeaturePnt validFlag ] = | ||
21 | // calcOptFlowLKMex(I, Idx, Idy, J, c_xx, c_xy, c_yy, featurePnt, initialPnt, winSize, accuracy_th, max_iter) | ||
22 | // featurePnt 2xn int | ||
23 | // winSize c_level int | ||
24 | // c_xx c_xy c_yy: image size double* | ||
25 | // image must be double | ||
26 | |||
27 | |||
28 | const int* imdims; | ||
29 | const int *nFeatures; | ||
30 | double *imgI, *iDx, *iDy, *imgJ, *c_xx, *c_xy, *c_yy; | ||
31 | double *fPnt, *initPnt, *newFPnt; | ||
32 | char* valid; | ||
33 | double accuracy_th; | ||
34 | int winSize, max_iter; | ||
35 | |||
36 | if (nrhs > 10) { | ||
37 | accuracy_th=(double)mxGetScalar(prhs[10]); | ||
38 | max_iter=(int)mxGetScalar(prhs[11]); | ||
39 | } | ||
40 | |||
41 | winSize = (int)mxGetScalar(prhs[9]); | ||
42 | initPnt=(double*)mxGetPr(prhs[8]); | ||
43 | fPnt=(double*)mxGetPr(prhs[7]); | ||
44 | c_xx=(double*)mxGetPr(prhs[6]); | ||
45 | c_xy=(double*)mxGetPr(prhs[5]); | ||
46 | c_yy=(double*)mxGetPr(prhs[4]); | ||
47 | imgJ=(double*)mxGetPr(prhs[3]); | ||
48 | iDy=(double*)mxGetPr(prhs[2]); | ||
49 | iDx=(double*)mxGetPr(prhs[1]); | ||
50 | imgI=(double*)mxGetPr(prhs[0]); | ||
51 | nFeatures=mxGetDimensions(prhs[7]); | ||
52 | imdims=mxGetDimensions(prhs[0]); | ||
53 | |||
54 | plhs[0] = mxCreateNumericMatrix(nFeatures[0], nFeatures[1], mxDOUBLE_CLASS, mxREAL); | ||
55 | plhs[1] = mxCreateNumericMatrix(1, nFeatures[1], mxUINT8_CLASS, mxREAL); | ||
56 | |||
57 | newFPnt = (double*)mxGetPr(plhs[0]); | ||
58 | valid = (char*)mxGetPr(plhs[1]); | ||
59 | |||
60 | //idx convert from matlab to c | ||
61 | for(int i=0; i<nFeatures[1]; i++){ | ||
62 | fPnt[i*2]=fPnt[i*2]-1; | ||
63 | fPnt[i*2+1]=fPnt[i*2+1]-1; | ||
64 | initPnt[i*2]=initPnt[i*2]-1; | ||
65 | initPnt[i*2+1]=initPnt[i*2+1]-1; | ||
66 | valid[i]=1; | ||
67 | } | ||
68 | if(nrhs>10){ | ||
69 | calcLKTrack( imgI, iDx, iDy, imgJ, imdims, | ||
70 | c_xx, c_xy, c_yy, | ||
71 | fPnt, initPnt, nFeatures[1], winSize, | ||
72 | newFPnt, valid, accuracy_th, max_iter); | ||
73 | }else{ | ||
74 | calcLKTrack( imgI, iDx, iDy, imgJ, imdims, | ||
75 | c_xx, c_xy, c_yy, | ||
76 | fPnt, initPnt, nFeatures[1], winSize, | ||
77 | newFPnt, valid); | ||
78 | } | ||
79 | //idx convert from matlab to c | ||
80 | for(int i=0; i<nFeatures[1]*2; i++){ | ||
81 | fPnt[i]=fPnt[i]+1; | ||
82 | initPnt[i]=initPnt[i]+1; | ||
83 | newFPnt[i]=newFPnt[i]+1; | ||
84 | } | ||
85 | } | ||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKMex.mexa64 b/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKMex.mexa64 new file mode 100755 index 0000000..5ee979e --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKMex.mexa64 | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKMex.mexglx b/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKMex.mexglx new file mode 100755 index 0000000..31df310 --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKMex.mexglx | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrMex.cc b/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrMex.cc new file mode 100755 index 0000000..56ab3d0 --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrMex.cc | |||
@@ -0,0 +1,99 @@ | |||
1 | |||
2 | /* compile with | ||
3 | rm liblagrcv.a | ||
4 | gcc -c lagrcv.cpp | ||
5 | ar rc liblagrcv.a lagrcv.o | ||
6 | ranlib liblagrcv.a | ||
7 | mex7 calcTextureMex.cc -L/home/ikkjin/LagrMatlab/opencv/matlab -llagrcv -I/home/ikkjin/LagrMatlab/opencv/matlab/ | ||
8 | */ | ||
9 | |||
10 | #include "mex.h" | ||
11 | #include "lagrcv.h" | ||
12 | #include <stdio.h> | ||
13 | #include <math.h> | ||
14 | |||
15 | #ifndef MAX_LEVEL | ||
16 | # define MAX_LEVEL 5 | ||
17 | #endif | ||
18 | // TODO: add number of corners parameter | ||
19 | void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { | ||
20 | // usage: [newFeaturePnt validFlag ] = | ||
21 | // calcOptFlowPyrLKMex(Ipyr, IdxPyr, IdyPyr, Jpyr, featurePnt, winSize, accuracy_th, max_iter) | ||
22 | // Ipyr, IdxPyr, IdyPyr, Jpyr: levelx1 size cell. | ||
23 | // featurePnt 2xn int | ||
24 | // winSize c_level int | ||
25 | // c_xx c_xy c_yy: image size double* | ||
26 | // image must be double | ||
27 | |||
28 | |||
29 | const mxArray* imgArray; | ||
30 | int* imdims; | ||
31 | const int *curImgDims; | ||
32 | const int *nFeatures; | ||
33 | //double **iP, **iDxP, **iDyP, **jP; | ||
34 | double *iP[MAX_LEVEL], *iDxP[MAX_LEVEL], *iDyP[MAX_LEVEL], *jP[MAX_LEVEL]; | ||
35 | double *fPnt, *newFPnt; | ||
36 | char* valid; | ||
37 | double accuracy_th; | ||
38 | int winSize, max_iter; | ||
39 | const int *cellDims = mxGetDimensions(prhs[0]); | ||
40 | |||
41 | if (nrhs > 6) { | ||
42 | accuracy_th=(double)mxGetScalar(prhs[6]); | ||
43 | max_iter=(int)mxGetScalar(prhs[7]); | ||
44 | } | ||
45 | |||
46 | winSize = (int)mxGetScalar(prhs[5]); | ||
47 | fPnt=(double*)mxGetPr(prhs[4]); | ||
48 | nFeatures=mxGetDimensions(prhs[4]); | ||
49 | |||
50 | imdims=(int*)malloc(sizeof(int)*cellDims[0]*2); | ||
51 | //iP=(double**)malloc(sizeof(double*)*cellDims[0]); | ||
52 | //iDxP=(double**)malloc(sizeof(double*)*cellDims[0]); | ||
53 | //iDyP=(double**)malloc(sizeof(double*)*cellDims[0]); | ||
54 | //jP=(double**)malloc(sizeof(double*)*cellDims[0]); | ||
55 | |||
56 | for(int i=0; i<cellDims[0]; i++){ | ||
57 | //imgArray=mxGetCell(prhs[0],i); | ||
58 | //curImgDims = mxGetDimensions(imgArray); | ||
59 | curImgDims = mxGetDimensions(mxGetCell(prhs[0],i)); | ||
60 | imdims[i*2+0]= curImgDims[0]; | ||
61 | imdims[i*2+1]= curImgDims[1]; | ||
62 | //imdims[i][1] = curImgDims[1]; | ||
63 | |||
64 | iP[i]= (double*)mxGetPr(mxGetCell(prhs[0],i)); | ||
65 | iDxP[i]= (double*)mxGetPr(mxGetCell(prhs[1],i)); | ||
66 | iDyP[i]= (double*)mxGetPr(mxGetCell(prhs[2],i)); | ||
67 | jP[i]= (double*)mxGetPr(mxGetCell(prhs[3],i)); | ||
68 | } | ||
69 | |||
70 | plhs[0] = mxCreateNumericMatrix(nFeatures[0], nFeatures[1], mxDOUBLE_CLASS, mxREAL); | ||
71 | plhs[1] = mxCreateNumericMatrix(1, nFeatures[1], mxUINT8_CLASS, mxREAL); | ||
72 | |||
73 | newFPnt = (double*)mxGetPr(plhs[0]); | ||
74 | valid = (char*)mxGetPr(plhs[1]); | ||
75 | |||
76 | //idx convert from matlab to c | ||
77 | for(int i=0; i<nFeatures[1]; i++){ | ||
78 | fPnt[i*2]=fPnt[i*2]-1; | ||
79 | fPnt[i*2+1]=fPnt[i*2+1]-1; | ||
80 | valid[i]=1; | ||
81 | } | ||
82 | if(nrhs>6){ | ||
83 | calcPyrLKTrack( iP, iDxP, iDyP, jP, imdims, cellDims[0], fPnt, nFeatures[1], winSize, | ||
84 | newFPnt, valid, accuracy_th, max_iter); | ||
85 | }else{ | ||
86 | calcPyrLKTrack( iP, iDxP, iDyP, jP, imdims, cellDims[0], fPnt, nFeatures[1], winSize, | ||
87 | newFPnt, valid); | ||
88 | } | ||
89 | //idx convert from matlab to c | ||
90 | for(int i=0; i<nFeatures[1]*2; i++){ | ||
91 | fPnt[i]=fPnt[i]+1; | ||
92 | newFPnt[i]=newFPnt[i]+1; | ||
93 | } | ||
94 | free(imdims); | ||
95 | //free(iP); | ||
96 | //free(iDxP); | ||
97 | //free(iDyP); | ||
98 | //free(jP); | ||
99 | } | ||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrMex.mexa64 b/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrMex.mexa64 new file mode 100755 index 0000000..f17c9ad --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrMex.mexa64 | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrMex.mexglx b/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrMex.mexglx new file mode 100755 index 0000000..1b6e21d --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrMex.mexglx | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrMex2.cc b/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrMex2.cc new file mode 100755 index 0000000..81f6274 --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrMex2.cc | |||
@@ -0,0 +1,99 @@ | |||
1 | |||
2 | /* compile with | ||
3 | rm liblagrcv.a | ||
4 | gcc -c lagrcv.cpp | ||
5 | ar rc liblagrcv.a lagrcv.o | ||
6 | ranlib liblagrcv.a | ||
7 | mex7 calcTextureMex.cc -L/home/ikkjin/LagrMatlab/opencv/matlab -llagrcv -I/home/ikkjin/LagrMatlab/opencv/matlab/ | ||
8 | */ | ||
9 | |||
10 | #include "mex.h" | ||
11 | #include "lagrcv.h" | ||
12 | #include <stdio.h> | ||
13 | #include <math.h> | ||
14 | |||
15 | #ifndef MAX_LEVEL | ||
16 | # define MAX_LEVEL 5 | ||
17 | #endif | ||
18 | // TODO: add number of corners parameter | ||
19 | void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { | ||
20 | // usage: [newFeaturePnt validFlag ] = | ||
21 | // calcOptFlowPyrLKMex(Ipyr, IdxPyr, IdyPyr, Jpyr, featurePnt, winSize, accuracy_th, max_iter) | ||
22 | // Ipyr, IdxPyr, IdyPyr, Jpyr: levelx1 size cell. | ||
23 | // featurePnt 2xn int | ||
24 | // winSize c_level int | ||
25 | // c_xx c_xy c_yy: image size double* | ||
26 | // image must be double | ||
27 | |||
28 | |||
29 | const mxArray* imgArray; | ||
30 | int* imdims; | ||
31 | const int *curImgDims; | ||
32 | const int *nFeatures; | ||
33 | //double **iP, **iDxP, **iDyP, **jP; | ||
34 | double *iP[MAX_LEVEL], *iDxP[MAX_LEVEL], *iDyP[MAX_LEVEL], *jP[MAX_LEVEL]; | ||
35 | double *fPnt, *newFPnt; | ||
36 | char* valid; | ||
37 | double accuracy_th; | ||
38 | int winSize, max_iter; | ||
39 | const int *cellDims = mxGetDimensions(prhs[0]); | ||
40 | |||
41 | if (nrhs > 6) { | ||
42 | accuracy_th=(double)mxGetScalar(prhs[6]); | ||
43 | max_iter=(int)mxGetScalar(prhs[7]); | ||
44 | } | ||
45 | |||
46 | winSize = (int)mxGetScalar(prhs[5]); | ||
47 | fPnt=(double*)mxGetPr(prhs[4]); | ||
48 | nFeatures=mxGetDimensions(prhs[4]); | ||
49 | |||
50 | imdims=(int*)malloc(sizeof(int)*cellDims[0]*2); | ||
51 | //iP=(double**)malloc(sizeof(double*)*cellDims[0]); | ||
52 | //iDxP=(double**)malloc(sizeof(double*)*cellDims[0]); | ||
53 | //iDyP=(double**)malloc(sizeof(double*)*cellDims[0]); | ||
54 | //jP=(double**)malloc(sizeof(double*)*cellDims[0]); | ||
55 | |||
56 | for(int i=0; i<cellDims[0]; i++){ | ||
57 | //imgArray=mxGetCell(prhs[0],i); | ||
58 | //curImgDims = mxGetDimensions(imgArray); | ||
59 | curImgDims = mxGetDimensions(mxGetCell(prhs[0],i)); | ||
60 | imdims[i*2+0]= curImgDims[0]; | ||
61 | imdims[i*2+1]= curImgDims[1]; | ||
62 | //imdims[i][1] = curImgDims[1]; | ||
63 | |||
64 | iP[i]= (double*)mxGetPr(mxGetCell(prhs[0],i)); | ||
65 | iDxP[i]= (double*)mxGetPr(mxGetCell(prhs[1],i)); | ||
66 | iDyP[i]= (double*)mxGetPr(mxGetCell(prhs[2],i)); | ||
67 | jP[i]= (double*)mxGetPr(mxGetCell(prhs[3],i)); | ||
68 | } | ||
69 | |||
70 | plhs[0] = mxCreateNumericMatrix(nFeatures[0], nFeatures[1], mxDOUBLE_CLASS, mxREAL); | ||
71 | plhs[1] = mxCreateNumericMatrix(1, nFeatures[1], mxUINT8_CLASS, mxREAL); | ||
72 | |||
73 | newFPnt = (double*)mxGetPr(plhs[0]); | ||
74 | valid = (char*)mxGetPr(plhs[1]); | ||
75 | |||
76 | //idx convert from matlab to c | ||
77 | for(int i=0; i<nFeatures[1]; i++){ | ||
78 | fPnt[i*2]=(fPnt[i*2]-1)/2; | ||
79 | fPnt[i*2+1]=(fPnt[i*2+1]-1)/2; | ||
80 | valid[i]=1; | ||
81 | } | ||
82 | if(nrhs>6){ | ||
83 | calcPyrLKTrack( iP, iDxP, iDyP, jP, imdims, cellDims[0], fPnt, nFeatures[1], winSize, | ||
84 | newFPnt, valid, accuracy_th, max_iter); | ||
85 | }else{ | ||
86 | calcPyrLKTrack( iP, iDxP, iDyP, jP, imdims, cellDims[0], fPnt, nFeatures[1], winSize, | ||
87 | newFPnt, valid); | ||
88 | } | ||
89 | //idx convert from matlab to c | ||
90 | for(int i=0; i<nFeatures[1]*2; i++){ | ||
91 | fPnt[i]=fPnt[i]*2+1; | ||
92 | newFPnt[i]=newFPnt[i]*2+1; | ||
93 | } | ||
94 | free(imdims); | ||
95 | //free(iP); | ||
96 | //free(iDxP); | ||
97 | //free(iDyP); | ||
98 | //free(jP); | ||
99 | } | ||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrMex2.mexa64 b/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrMex2.mexa64 new file mode 100755 index 0000000..b3d2ae2 --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrMex2.mexa64 | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrMex2.mexglx b/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrMex2.mexglx new file mode 100755 index 0000000..03a13a7 --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrMex2.mexglx | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrWInitMex.cc b/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrWInitMex.cc new file mode 100755 index 0000000..b9c3289 --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrWInitMex.cc | |||
@@ -0,0 +1,91 @@ | |||
1 | |||
2 | /* compile with | ||
3 | rm liblagrcv.a | ||
4 | gcc -c lagrcv.cpp | ||
5 | ar rc liblagrcv.a lagrcv.o | ||
6 | ranlib liblagrcv.a | ||
7 | mex7 calcTextureMex.cc -L/home/ikkjin/LagrMatlab/opencv/matlab -llagrcv -I/home/ikkjin/LagrMatlab/opencv/matlab/ | ||
8 | */ | ||
9 | |||
10 | #include "mex.h" | ||
11 | #include "lagrcv.h" | ||
12 | #include <stdio.h> | ||
13 | #include <math.h> | ||
14 | |||
15 | #ifndef MAX_LEVEL | ||
16 | # define MAX_LEVEL 5 | ||
17 | #endif | ||
18 | // TODO: add number of corners parameter | ||
19 | void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { | ||
20 | // usage: [newFeaturePnt validFlag ] = | ||
21 | // calcOptFlowLKPyrWInitMex2(Ipyr, IdxPyr, IdyPyr, Jpyr, featurePnt, winSize, accuracy_th, max_iter, initFPnt) | ||
22 | // Ipyr, IdxPyr, IdyPyr, Jpyr: levelx1 size cell. | ||
23 | // featurePnt 2xn int | ||
24 | // winSize c_level int | ||
25 | // c_xx c_xy c_yy: image size double* | ||
26 | // image must be double | ||
27 | |||
28 | |||
29 | const mxArray* imgArray; | ||
30 | int* imdims; | ||
31 | const int *curImgDims; | ||
32 | const int *nFeatures; | ||
33 | double *iP[MAX_LEVEL], *iDxP[MAX_LEVEL], *iDyP[MAX_LEVEL], *jP[MAX_LEVEL]; | ||
34 | double *fPnt, *newFPnt, *initFPnt; | ||
35 | char* valid; | ||
36 | double accuracy_th; | ||
37 | int winSize, max_iter; | ||
38 | const int *cellDims = mxGetDimensions(prhs[0]); | ||
39 | |||
40 | accuracy_th=(double)mxGetScalar(prhs[6]); | ||
41 | max_iter=(int)mxGetScalar(prhs[7]); | ||
42 | initFPnt=(double*)mxGetPr(prhs[8]); | ||
43 | |||
44 | winSize = (int)mxGetScalar(prhs[5]); | ||
45 | fPnt=(double*)mxGetPr(prhs[4]); | ||
46 | nFeatures=mxGetDimensions(prhs[4]); | ||
47 | |||
48 | imdims=(int*)malloc(sizeof(int)*cellDims[0]*2); | ||
49 | |||
50 | for(int i=0; i<cellDims[0]; i++){ | ||
51 | //imgArray=mxGetCell(prhs[0],i); | ||
52 | //curImgDims = mxGetDimensions(imgArray); | ||
53 | curImgDims = mxGetDimensions(mxGetCell(prhs[0],i)); | ||
54 | imdims[i*2+0]= curImgDims[0]; | ||
55 | imdims[i*2+1]= curImgDims[1]; | ||
56 | //imdims[i][1] = curImgDims[1]; | ||
57 | |||
58 | iP[i]= (double*)mxGetPr(mxGetCell(prhs[0],i)); | ||
59 | iDxP[i]= (double*)mxGetPr(mxGetCell(prhs[1],i)); | ||
60 | iDyP[i]= (double*)mxGetPr(mxGetCell(prhs[2],i)); | ||
61 | jP[i]= (double*)mxGetPr(mxGetCell(prhs[3],i)); | ||
62 | } | ||
63 | |||
64 | plhs[0] = mxCreateNumericMatrix(nFeatures[0], nFeatures[1], mxDOUBLE_CLASS, mxREAL); | ||
65 | plhs[1] = mxCreateNumericMatrix(1, nFeatures[1], mxUINT8_CLASS, mxREAL); | ||
66 | |||
67 | newFPnt = (double*)mxGetPr(plhs[0]); | ||
68 | valid = (char*)mxGetPr(plhs[1]); | ||
69 | |||
70 | //idx convert from matlab to c | ||
71 | for(int i=0; i<nFeatures[1]; i++){ | ||
72 | fPnt[i*2]=fPnt[i*2]-1; | ||
73 | fPnt[i*2+1]=fPnt[i*2+1]-1; | ||
74 | initFPnt[i*2]=initFPnt[i*2]-1; | ||
75 | initFPnt[i*2+1]=initFPnt[i*2+1]-1; | ||
76 | valid[i]=1; | ||
77 | } | ||
78 | calcPyrLKTrackWInit( iP, iDxP, iDyP, jP, imdims, cellDims[0], fPnt, nFeatures[1], winSize, | ||
79 | newFPnt, initFPnt, valid, accuracy_th, max_iter); | ||
80 | //idx convert from matlab to c | ||
81 | for(int i=0; i<nFeatures[1]*2; i++){ | ||
82 | fPnt[i]=fPnt[i]+1; | ||
83 | initFPnt[i]=initFPnt[i]+1; | ||
84 | newFPnt[i]=newFPnt[i]+1; | ||
85 | } | ||
86 | free(imdims); | ||
87 | //free(iP); | ||
88 | //free(iDxP); | ||
89 | //free(iDyP); | ||
90 | //free(jP); | ||
91 | } | ||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrWInitMex.mexa64 b/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrWInitMex.mexa64 new file mode 100755 index 0000000..7946dc1 --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrWInitMex.mexa64 | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrWInitMex.mexglx b/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrWInitMex.mexglx new file mode 100755 index 0000000..4ebcf9e --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrWInitMex.mexglx | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrWInitMex2.cc b/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrWInitMex2.cc new file mode 100755 index 0000000..35288a6 --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrWInitMex2.cc | |||
@@ -0,0 +1,91 @@ | |||
1 | |||
2 | /* compile with | ||
3 | rm liblagrcv.a | ||
4 | gcc -c lagrcv.cpp | ||
5 | ar rc liblagrcv.a lagrcv.o | ||
6 | ranlib liblagrcv.a | ||
7 | mex7 calcTextureMex.cc -L/home/ikkjin/LagrMatlab/opencv/matlab -llagrcv -I/home/ikkjin/LagrMatlab/opencv/matlab/ | ||
8 | */ | ||
9 | |||
10 | #include "mex.h" | ||
11 | #include "lagrcv.h" | ||
12 | #include <stdio.h> | ||
13 | #include <math.h> | ||
14 | |||
15 | #ifndef MAX_LEVEL | ||
16 | # define MAX_LEVEL 5 | ||
17 | #endif | ||
18 | // TODO: add number of corners parameter | ||
19 | void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { | ||
20 | // usage: [newFeaturePnt validFlag ] = | ||
21 | // calcOptFlowLKPyrWInitMex2(Ipyr, IdxPyr, IdyPyr, Jpyr, featurePnt, winSize, accuracy_th, max_iter, initFPnt) | ||
22 | // Ipyr, IdxPyr, IdyPyr, Jpyr: levelx1 size cell. | ||
23 | // featurePnt 2xn int | ||
24 | // winSize c_level int | ||
25 | // c_xx c_xy c_yy: image size double* | ||
26 | // image must be double | ||
27 | |||
28 | |||
29 | const mxArray* imgArray; | ||
30 | int* imdims; | ||
31 | const int *curImgDims; | ||
32 | const int *nFeatures; | ||
33 | double *iP[MAX_LEVEL], *iDxP[MAX_LEVEL], *iDyP[MAX_LEVEL], *jP[MAX_LEVEL]; | ||
34 | double *fPnt, *newFPnt, *initFPnt; | ||
35 | char* valid; | ||
36 | double accuracy_th; | ||
37 | int winSize, max_iter; | ||
38 | const int *cellDims = mxGetDimensions(prhs[0]); | ||
39 | |||
40 | accuracy_th=(double)mxGetScalar(prhs[6]); | ||
41 | max_iter=(int)mxGetScalar(prhs[7]); | ||
42 | initFPnt=(double*)mxGetPr(prhs[8]); | ||
43 | |||
44 | winSize = (int)mxGetScalar(prhs[5]); | ||
45 | fPnt=(double*)mxGetPr(prhs[4]); | ||
46 | nFeatures=mxGetDimensions(prhs[4]); | ||
47 | |||
48 | imdims=(int*)malloc(sizeof(int)*cellDims[0]*2); | ||
49 | |||
50 | for(int i=0; i<cellDims[0]; i++){ | ||
51 | //imgArray=mxGetCell(prhs[0],i); | ||
52 | //curImgDims = mxGetDimensions(imgArray); | ||
53 | curImgDims = mxGetDimensions(mxGetCell(prhs[0],i)); | ||
54 | imdims[i*2+0]= curImgDims[0]; | ||
55 | imdims[i*2+1]= curImgDims[1]; | ||
56 | //imdims[i][1] = curImgDims[1]; | ||
57 | |||
58 | iP[i]= (double*)mxGetPr(mxGetCell(prhs[0],i)); | ||
59 | iDxP[i]= (double*)mxGetPr(mxGetCell(prhs[1],i)); | ||
60 | iDyP[i]= (double*)mxGetPr(mxGetCell(prhs[2],i)); | ||
61 | jP[i]= (double*)mxGetPr(mxGetCell(prhs[3],i)); | ||
62 | } | ||
63 | |||
64 | plhs[0] = mxCreateNumericMatrix(nFeatures[0], nFeatures[1], mxDOUBLE_CLASS, mxREAL); | ||
65 | plhs[1] = mxCreateNumericMatrix(1, nFeatures[1], mxUINT8_CLASS, mxREAL); | ||
66 | |||
67 | newFPnt = (double*)mxGetPr(plhs[0]); | ||
68 | valid = (char*)mxGetPr(plhs[1]); | ||
69 | |||
70 | //idx convert from matlab to c | ||
71 | for(int i=0; i<nFeatures[1]; i++){ | ||
72 | fPnt[i*2]=(fPnt[i*2]-1)/2; | ||
73 | fPnt[i*2+1]=(fPnt[i*2+1]-1)/2; | ||
74 | initFPnt[i*2]=(initFPnt[i*2]-1)/2; | ||
75 | initFPnt[i*2+1]=(initFPnt[i*2+1]-1)/2; | ||
76 | valid[i]=1; | ||
77 | } | ||
78 | calcPyrLKTrackWInit( iP, iDxP, iDyP, jP, imdims, cellDims[0], fPnt, nFeatures[1], winSize, | ||
79 | newFPnt, initFPnt, valid, accuracy_th, max_iter); | ||
80 | //idx convert from matlab to c | ||
81 | for(int i=0; i<nFeatures[1]*2; i++){ | ||
82 | fPnt[i]=fPnt[i]*2+1; | ||
83 | initFPnt[i]=initFPnt[i]*2+1; | ||
84 | newFPnt[i]=newFPnt[i]*2+1; | ||
85 | } | ||
86 | free(imdims); | ||
87 | //free(iP); | ||
88 | //free(iDxP); | ||
89 | //free(iDyP); | ||
90 | //free(jP); | ||
91 | } | ||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrWInitMex2.mexa64 b/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrWInitMex2.mexa64 new file mode 100755 index 0000000..9588d9d --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrWInitMex2.mexa64 | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrWInitMex2.mexglx b/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrWInitMex2.mexglx new file mode 100755 index 0000000..984f054 --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrWInitMex2.mexglx | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrWInitSobelMex.cc b/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrWInitSobelMex.cc new file mode 100755 index 0000000..1a2b15d --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrWInitSobelMex.cc | |||
@@ -0,0 +1,87 @@ | |||
1 | |||
2 | /* compile with | ||
3 | rm liblagrcv.a | ||
4 | gcc -c lagrcv.cpp | ||
5 | ar rc liblagrcv.a lagrcv.o | ||
6 | ranlib liblagrcv.a | ||
7 | mex7 calcTextureMex.cc -L/home/ikkjin/LagrMatlab/opencv/matlab -llagrcv -I/home/ikkjin/LagrMatlab/opencv/matlab/ | ||
8 | */ | ||
9 | |||
10 | #include "mex.h" | ||
11 | #include "lagrcv.h" | ||
12 | #include <stdio.h> | ||
13 | #include <math.h> | ||
14 | |||
15 | #ifndef MAX_LEVEL | ||
16 | # define MAX_LEVEL 5 | ||
17 | #endif | ||
18 | // TODO: add number of corners parameter | ||
19 | void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { | ||
20 | // usage: [newFeaturePnt validFlag ] = | ||
21 | // calcOptFlowLKPyrWInitMex2(Ipyr, Jpyr, featurePnt, winSize, accuracy_th, max_iter, initFPnt) | ||
22 | // Ipyr, IdxPyr, IdyPyr, Jpyr: levelx1 size cell. | ||
23 | // featurePnt 2xn int | ||
24 | // winSize c_level int | ||
25 | // c_xx c_xy c_yy: image size double* | ||
26 | // image must be double | ||
27 | |||
28 | |||
29 | const mxArray* imgArray; | ||
30 | int* imdims; | ||
31 | const int *curImgDims; | ||
32 | const int *nFeatures; | ||
33 | double *iP[MAX_LEVEL], *jP[MAX_LEVEL]; | ||
34 | double *fPnt, *newFPnt, *initFPnt; | ||
35 | char* valid; | ||
36 | double accuracy_th; | ||
37 | int winSize, max_iter; | ||
38 | const int *cellDims = mxGetDimensions(prhs[0]); | ||
39 | |||
40 | accuracy_th=(double)mxGetScalar(prhs[4]); | ||
41 | max_iter=(int)mxGetScalar(prhs[5]); | ||
42 | initFPnt=(double*)mxGetPr(prhs[6]); | ||
43 | |||
44 | winSize = (int)mxGetScalar(prhs[3]); | ||
45 | fPnt=(double*)mxGetPr(prhs[2]); | ||
46 | nFeatures=mxGetDimensions(prhs[2]); | ||
47 | |||
48 | imdims=(int*)malloc(sizeof(int)*cellDims[0]*2); | ||
49 | |||
50 | for(int i=0; i<cellDims[0]; i++){ | ||
51 | //imgArray=mxGetCell(prhs[0],i); | ||
52 | //curImgDims = mxGetDimensions(imgArray); | ||
53 | curImgDims = mxGetDimensions(mxGetCell(prhs[0],i)); | ||
54 | imdims[i*2+0]= curImgDims[0]; | ||
55 | imdims[i*2+1]= curImgDims[1]; | ||
56 | //imdims[i][1] = curImgDims[1]; | ||
57 | |||
58 | iP[i]= (double*)mxGetPr(mxGetCell(prhs[0],i)); | ||
59 | jP[i]= (double*)mxGetPr(mxGetCell(prhs[1],i)); | ||
60 | } | ||
61 | |||
62 | plhs[0] = mxCreateNumericMatrix(nFeatures[0], nFeatures[1], mxDOUBLE_CLASS, mxREAL); | ||
63 | plhs[1] = mxCreateNumericMatrix(1, nFeatures[1], mxUINT8_CLASS, mxREAL); | ||
64 | |||
65 | newFPnt = (double*)mxGetPr(plhs[0]); | ||
66 | valid = (char*)mxGetPr(plhs[1]); | ||
67 | |||
68 | //idx convert from matlab to c | ||
69 | for(int i=0; i<nFeatures[1]; i++){ | ||
70 | fPnt[i*2]=fPnt[i*2]-1; | ||
71 | fPnt[i*2+1]=fPnt[i*2+1]-1; | ||
72 | initFPnt[i*2]=initFPnt[i*2]-1; | ||
73 | initFPnt[i*2+1]=initFPnt[i*2+1]-1; | ||
74 | valid[i]=1; | ||
75 | } | ||
76 | calcPyrLKTrackWInit( iP, jP, imdims, cellDims[0], fPnt, nFeatures[1], winSize, | ||
77 | newFPnt, initFPnt, valid, accuracy_th, max_iter); | ||
78 | //idx convert from matlab to c | ||
79 | for(int i=0; i<nFeatures[1]*2; i++){ | ||
80 | fPnt[i]=fPnt[i]+1; | ||
81 | initFPnt[i]=initFPnt[i]+1; | ||
82 | newFPnt[i]=newFPnt[i]+1; | ||
83 | } | ||
84 | free(imdims); | ||
85 | //free(iP); | ||
86 | //free(jP); | ||
87 | } | ||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrWInitSobelMex.mexa64 b/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrWInitSobelMex.mexa64 new file mode 100755 index 0000000..dc5640e --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrWInitSobelMex.mexa64 | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrWInitSobelMex.mexglx b/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrWInitSobelMex.mexglx new file mode 100755 index 0000000..817ad6a --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcOptFlowLKPyrWInitSobelMex.mexglx | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcOpticalFlowLK.cc b/SD-VBS/common/toolbox/lagrcv/calcOpticalFlowLK.cc new file mode 100755 index 0000000..150bae3 --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcOpticalFlowLK.cc | |||
@@ -0,0 +1,59 @@ | |||
1 | |||
2 | /* compile with | ||
3 | mex calcOpticalFlowPyrLK.cc -I/usr/local/opencv/include -L/usr/local/opencv/lib -lcxcore -lcv | ||
4 | */ | ||
5 | |||
6 | #include "mex.h" | ||
7 | #include "opencv/cv.h" | ||
8 | #include "opencv/highgui.h" | ||
9 | #include <stdio.h> | ||
10 | #include <math.h> | ||
11 | |||
12 | #define WIN_SIZE 10 | ||
13 | #define PYR_LEVELS 3 | ||
14 | |||
15 | void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { | ||
16 | // usage: [ newpoints status pyr1 ] = | ||
17 | // calcOpticalFlowPyrLK(im1,im2,oldpoints,pyr1) | ||
18 | // images must be single-channel, 8-bit | ||
19 | // DO NOT PASS SAME IMAGE IN TWICE! | ||
20 | |||
21 | char *im1_ptr = (char*)mxGetPr(prhs[0]); | ||
22 | char *im2_ptr = (char*)mxGetPr(prhs[1]); | ||
23 | const int *imdims = mxGetDimensions(prhs[0]); | ||
24 | int flags = 0; | ||
25 | int max_iter; | ||
26 | |||
27 | if(nrhs>3){ | ||
28 | max_iter=(int)mxGetScalar(prhs[3]); | ||
29 | }else{ | ||
30 | max_iter=20; | ||
31 | } | ||
32 | |||
33 | /* images */ | ||
34 | IplImage *im1 = | ||
35 | cvCreateImageHeader(cvSize(imdims[0], imdims[1]), IPL_DEPTH_8U, 1); | ||
36 | IplImage *im2 = | ||
37 | cvCreateImageHeader(cvSize(imdims[0], imdims[1]), IPL_DEPTH_8U, 1); | ||
38 | im1->imageData = im1_ptr; | ||
39 | im2->imageData = im2_ptr; | ||
40 | |||
41 | /* coordinate arrays */ | ||
42 | CvPoint2D32f *oldpoints = (CvPoint2D32f*)mxGetPr(prhs[2]); | ||
43 | const int *pointsdim = mxGetDimensions(prhs[2]); | ||
44 | int npoints = pointsdim[1]; | ||
45 | plhs[0] = mxCreateNumericMatrix(2, npoints, mxSINGLE_CLASS, mxREAL); | ||
46 | CvPoint2D32f *newpoints = (CvPoint2D32f*)mxGetPr(plhs[0]); | ||
47 | |||
48 | /* status array */ | ||
49 | plhs[1] = mxCreateNumericMatrix(1, npoints, mxUINT8_CLASS, mxREAL); | ||
50 | char *status = (char*)mxGetPr(plhs[1]); | ||
51 | |||
52 | cvCalcOpticalFlowLK(im1, im2, | ||
53 | cvSize(WIN_SIZE, WIN_SIZE), velx, vely | ||
54 | status, | ||
55 | NULL, | ||
56 | cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,max_iter,0.03), | ||
57 | flags | ||
58 | ); | ||
59 | } | ||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcOpticalFlowPyrLK.cc b/SD-VBS/common/toolbox/lagrcv/calcOpticalFlowPyrLK.cc new file mode 100755 index 0000000..d4be5ff --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcOpticalFlowPyrLK.cc | |||
@@ -0,0 +1,77 @@ | |||
1 | |||
2 | /* compile with | ||
3 | mex calcOpticalFlowPyrLK.cc -I/usr/local/opencv/include -L/usr/local/opencv/lib -lcxcore -lcv | ||
4 | */ | ||
5 | |||
6 | #include "mex.h" | ||
7 | #include "opencv/cv.h" | ||
8 | #include "opencv/highgui.h" | ||
9 | #include <stdio.h> | ||
10 | #include <math.h> | ||
11 | |||
12 | #define WIN_SIZE 8 | ||
13 | #define PYR_LEVELS 3 | ||
14 | |||
15 | void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { | ||
16 | // usage: [ newpoints status pyr1 ] = | ||
17 | // calcOpticalFlowPyrLK(im1,im2,oldpoints,pyr1) | ||
18 | // images must be single-channel, 8-bit | ||
19 | // DO NOT PASS SAME IMAGE IN TWICE! | ||
20 | |||
21 | char *im1_ptr = (char*)mxGetPr(prhs[0]); | ||
22 | char *im2_ptr = (char*)mxGetPr(prhs[1]); | ||
23 | const int *imdims = mxGetDimensions(prhs[0]); | ||
24 | IplImage *pyr1 = 0, *pyr2 = 0; | ||
25 | int flags = 0; | ||
26 | bool clearPyr1 = false; | ||
27 | int max_iter; | ||
28 | |||
29 | max_iter=30; | ||
30 | |||
31 | /* images */ | ||
32 | IplImage *im1 = | ||
33 | cvCreateImageHeader(cvSize(imdims[0], imdims[1]), IPL_DEPTH_8U, 1); | ||
34 | IplImage *im2 = | ||
35 | cvCreateImageHeader(cvSize(imdims[0], imdims[1]), IPL_DEPTH_8U, 1); | ||
36 | im1->imageData = im1_ptr; | ||
37 | im2->imageData = im2_ptr; | ||
38 | |||
39 | /* allocate pyramids */ | ||
40 | pyr1 = cvCreateImageHeader(cvSize(imdims[0],imdims[1]), IPL_DEPTH_8U, 1); | ||
41 | pyr2 = cvCreateImageHeader(cvSize(imdims[0],imdims[1]), IPL_DEPTH_8U, 1); | ||
42 | // reuse pyramid if given | ||
43 | if (nrhs > 3) { | ||
44 | pyr1->imageData = (char*)mxGetPr(prhs[3]); | ||
45 | flags |= CV_LKFLOW_PYR_A_READY; | ||
46 | } else { | ||
47 | clearPyr1 = true; | ||
48 | cvCreateData(pyr1); | ||
49 | } | ||
50 | |||
51 | // pyr2 will be reused, so allocate in return value | ||
52 | plhs[2] = mxCreateNumericMatrix(imdims[0], imdims[1], mxUINT8_CLASS, mxREAL); | ||
53 | pyr2->imageData = (char*)mxGetPr(plhs[2]); | ||
54 | |||
55 | /* coordinate arrays */ | ||
56 | CvPoint2D32f *oldpoints = (CvPoint2D32f*)mxGetPr(prhs[2]); | ||
57 | const int *pointsdim = mxGetDimensions(prhs[2]); | ||
58 | int npoints = pointsdim[1]; | ||
59 | plhs[0] = mxCreateNumericMatrix(2, npoints, mxSINGLE_CLASS, mxREAL); | ||
60 | CvPoint2D32f *newpoints = (CvPoint2D32f*)mxGetPr(plhs[0]); | ||
61 | |||
62 | /* status array */ | ||
63 | plhs[1] = mxCreateNumericMatrix(1, npoints, mxUINT8_CLASS, mxREAL); | ||
64 | char *status = (char*)mxGetPr(plhs[1]); | ||
65 | |||
66 | cvCalcOpticalFlowPyrLK(im1, im2, | ||
67 | pyr1, pyr2, | ||
68 | oldpoints, newpoints, npoints, | ||
69 | cvSize(WIN_SIZE, WIN_SIZE), PYR_LEVELS, | ||
70 | status, | ||
71 | NULL, | ||
72 | cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,max_iter,0.03), | ||
73 | flags | ||
74 | ); | ||
75 | if (clearPyr1) | ||
76 | cvReleaseImage(&pyr1); | ||
77 | } | ||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcOpticalFlowPyrLK.mexglx b/SD-VBS/common/toolbox/lagrcv/calcOpticalFlowPyrLK.mexglx new file mode 100755 index 0000000..ad5d0e9 --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcOpticalFlowPyrLK.mexglx | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcResizedImgMex.cc b/SD-VBS/common/toolbox/lagrcv/calcResizedImgMex.cc new file mode 100755 index 0000000..9c1aed7 --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcResizedImgMex.cc | |||
@@ -0,0 +1,33 @@ | |||
1 | |||
2 | /* compile with | ||
3 | rm liblagrcv.a | ||
4 | gcc -c lagrcv.cpp | ||
5 | ar rc liblagrcv.a lagrcv.o | ||
6 | ranlib liblagrcv.a | ||
7 | mex7 calcTextureMex.cc -L/home/ikkjin/LagrMatlab/opencv/matlab -llagrcv -I/home/ikkjin/LagrMatlab/opencv/matlab/ | ||
8 | */ | ||
9 | |||
10 | #include "mex.h" | ||
11 | #include "lagrcv.h" | ||
12 | #include <stdio.h> | ||
13 | #include <math.h> | ||
14 | |||
15 | // TODO: add number of corners parameter | ||
16 | void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { | ||
17 | // usage: [dxPye dyPyr] = | ||
18 | // calcGradientPyrMex(imagePyr) | ||
19 | |||
20 | double *image, *retImg; | ||
21 | int newSizeY, newSizeX; | ||
22 | const int *imdims; | ||
23 | |||
24 | image=(double*)mxGetPr(prhs[0]); | ||
25 | imdims = mxGetDimensions(prhs[0]); | ||
26 | |||
27 | newSizeY=(imdims[0]+1)/2; | ||
28 | newSizeX=(imdims[1]+1)/2; | ||
29 | plhs[0] = mxCreateNumericMatrix(newSizeY, newSizeX, mxDOUBLE_CLASS, mxREAL); | ||
30 | retImg=(double*)mxGetPr(plhs[0]); | ||
31 | |||
32 | calcImgResize(image, imdims[0], imdims[1], retImg, newSizeY, newSizeX); | ||
33 | } | ||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcResizedImgMex.mexa64 b/SD-VBS/common/toolbox/lagrcv/calcResizedImgMex.mexa64 new file mode 100755 index 0000000..0f66793 --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcResizedImgMex.mexa64 | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcResizedImgMex.mexglx b/SD-VBS/common/toolbox/lagrcv/calcResizedImgMex.mexglx new file mode 100755 index 0000000..192ea5a --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcResizedImgMex.mexglx | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcSobelMex.cc b/SD-VBS/common/toolbox/lagrcv/calcSobelMex.cc new file mode 100755 index 0000000..8667ec4 --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcSobelMex.cc | |||
@@ -0,0 +1,32 @@ | |||
1 | |||
2 | /* compile with | ||
3 | rm liblagrcv.a | ||
4 | gcc -c lagrcv.cpp | ||
5 | ar rc liblagrcv.a lagrcv.o | ||
6 | ranlib liblagrcv.a | ||
7 | mex7 calcTextureMex.cc -L/home/ikkjin/LagrMatlab/opencv/matlab -llagrcv -I/home/ikkjin/LagrMatlab/opencv/matlab/ | ||
8 | */ | ||
9 | |||
10 | #include "mex.h" | ||
11 | #include "lagrcv.h" | ||
12 | #include <stdio.h> | ||
13 | #include <math.h> | ||
14 | |||
15 | // TODO: add number of corners parameter | ||
16 | void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { | ||
17 | // usage: [dx dy] = | ||
18 | // calcSobelMex(image) | ||
19 | |||
20 | double *image, *dx, *dy; | ||
21 | const int *imdims; | ||
22 | |||
23 | image=(double*)mxGetPr(prhs[0]); | ||
24 | imdims = mxGetDimensions(prhs[0]); | ||
25 | |||
26 | plhs[0] = mxCreateNumericMatrix(imdims[0], imdims[1], mxDOUBLE_CLASS, mxREAL); | ||
27 | plhs[1] = mxCreateNumericMatrix(imdims[0], imdims[1], mxDOUBLE_CLASS, mxREAL); | ||
28 | dx=(double*)mxGetPr(plhs[0]); | ||
29 | dy=(double*)mxGetPr(plhs[1]); | ||
30 | |||
31 | calcSobel(image, imdims[0], imdims[1], dx, dy); | ||
32 | } | ||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcSobelMex.mexa64 b/SD-VBS/common/toolbox/lagrcv/calcSobelMex.mexa64 new file mode 100755 index 0000000..272563f --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcSobelMex.mexa64 | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcSobelMex.mexglx b/SD-VBS/common/toolbox/lagrcv/calcSobelMex.mexglx new file mode 100755 index 0000000..9fc5d10 --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcSobelMex.mexglx | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcSobelPyrMex.cc b/SD-VBS/common/toolbox/lagrcv/calcSobelPyrMex.cc new file mode 100755 index 0000000..314c835 --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcSobelPyrMex.cc | |||
@@ -0,0 +1,44 @@ | |||
1 | |||
2 | /* compile with | ||
3 | rm liblagrcv.a | ||
4 | gcc -c lagrcv.cpp | ||
5 | ar rc liblagrcv.a lagrcv.o | ||
6 | ranlib liblagrcv.a | ||
7 | mex7 calcTextureMex.cc -L/home/ikkjin/LagrMatlab/opencv/matlab -llagrcv -I/home/ikkjin/LagrMatlab/opencv/matlab/ | ||
8 | */ | ||
9 | |||
10 | #include "mex.h" | ||
11 | #include "lagrcv.h" | ||
12 | #include <stdio.h> | ||
13 | #include <math.h> | ||
14 | |||
15 | // TODO: add number of corners parameter | ||
16 | void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { | ||
17 | // usage: [dxPye dyPyr] = | ||
18 | // calcGradientPyrMex(imagePyr) | ||
19 | |||
20 | const int *cellDims = mxGetDimensions(prhs[0]); | ||
21 | double *image; | ||
22 | const mxArray* imgArray; | ||
23 | mxArray *dxArray, *dyArray; | ||
24 | double *dx, *dy; | ||
25 | const int *imdims; | ||
26 | |||
27 | plhs[0] = mxCreateCellArray(2, cellDims); | ||
28 | plhs[1] = mxCreateCellArray(2, cellDims); | ||
29 | |||
30 | for(int i=0; i<cellDims[0];i++){ | ||
31 | imgArray= mxGetCell(prhs[0],i); | ||
32 | image=mxGetPr(imgArray); | ||
33 | imdims = mxGetDimensions(imgArray); | ||
34 | |||
35 | dxArray = mxCreateNumericMatrix(imdims[0], imdims[1], mxDOUBLE_CLASS, mxREAL); | ||
36 | dyArray = mxCreateNumericMatrix(imdims[0], imdims[1], mxDOUBLE_CLASS, mxREAL); | ||
37 | mxSetCell(plhs[0], i, dxArray); | ||
38 | mxSetCell(plhs[1], i, dyArray); | ||
39 | dx=mxGetPr(dxArray); | ||
40 | dy=mxGetPr(dyArray); | ||
41 | |||
42 | calcSobel(image, imdims[0], imdims[1], dx, dy); | ||
43 | } | ||
44 | } | ||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcSobelPyrMex.mexa64 b/SD-VBS/common/toolbox/lagrcv/calcSobelPyrMex.mexa64 new file mode 100755 index 0000000..a8b87a8 --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcSobelPyrMex.mexa64 | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcSobelPyrMex.mexglx b/SD-VBS/common/toolbox/lagrcv/calcSobelPyrMex.mexglx new file mode 100755 index 0000000..1f1a3cc --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcSobelPyrMex.mexglx | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcSubsampleAvgMex.cc b/SD-VBS/common/toolbox/lagrcv/calcSubsampleAvgMex.cc new file mode 100755 index 0000000..1eba6d9 --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcSubsampleAvgMex.cc | |||
@@ -0,0 +1,33 @@ | |||
1 | |||
2 | /* compile with | ||
3 | rm liblagrcv.a | ||
4 | gcc -c lagrcv.cpp | ||
5 | ar rc liblagrcv.a lagrcv.o | ||
6 | ranlib liblagrcv.a | ||
7 | mex7 calcTextureMex.cc -L/home/ikkjin/LagrMatlab/opencv/matlab -llagrcv -I/home/ikkjin/LagrMatlab/opencv/matlab/ | ||
8 | */ | ||
9 | |||
10 | #include "mex.h" | ||
11 | #include "lagrcv.h" | ||
12 | #include <stdio.h> | ||
13 | #include <math.h> | ||
14 | |||
15 | // TODO: add number of corners parameter | ||
16 | void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { | ||
17 | // usage: [dxPye dyPyr] = | ||
18 | // calcGradientPyrMex(imagePyr) | ||
19 | |||
20 | double *image, *retImg; | ||
21 | int newSizeY, newSizeX; | ||
22 | const int *imdims; | ||
23 | |||
24 | image=(double*)mxGetPr(prhs[0]); | ||
25 | imdims = mxGetDimensions(prhs[0]); | ||
26 | |||
27 | newSizeY=imdims[0]/2; | ||
28 | newSizeX=imdims[1]/2; | ||
29 | plhs[0] = mxCreateNumericMatrix(newSizeY, newSizeX, mxDOUBLE_CLASS, mxREAL); | ||
30 | retImg=(double*)mxGetPr(plhs[0]); | ||
31 | |||
32 | calcSubSampleAvg(image, imdims[0], imdims[1], retImg, newSizeY, newSizeX); | ||
33 | } | ||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcSubsampleAvgMex.mexa64 b/SD-VBS/common/toolbox/lagrcv/calcSubsampleAvgMex.mexa64 new file mode 100755 index 0000000..6cf4f0e --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcSubsampleAvgMex.mexa64 | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcSubsampleAvgMex.mexglx b/SD-VBS/common/toolbox/lagrcv/calcSubsampleAvgMex.mexglx new file mode 100755 index 0000000..f8acfde --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcSubsampleAvgMex.mexglx | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcTextureMex.cc b/SD-VBS/common/toolbox/lagrcv/calcTextureMex.cc new file mode 100755 index 0000000..f91d184 --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcTextureMex.cc | |||
@@ -0,0 +1,53 @@ | |||
1 | |||
2 | /* compile with | ||
3 | rm liblagrcv.a | ||
4 | gcc -c lagrcv.cpp | ||
5 | ar rc liblagrcv.a lagrcv.o | ||
6 | ranlib liblagrcv.a | ||
7 | mex7 calcTextureMex.cc -L/home/ikkjin/LagrMatlab/opencv/matlab -llagrcv -I/home/ikkjin/LagrMatlab/opencv/matlab/ | ||
8 | */ | ||
9 | |||
10 | #include "mex.h" | ||
11 | #include "lagrcv.h" | ||
12 | #include <stdio.h> | ||
13 | #include <math.h> | ||
14 | |||
15 | // TODO: add number of corners parameter | ||
16 | void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { | ||
17 | // usage: [ lambda tr det c_xx c_xy c_yy] = | ||
18 | // goodFeaturesToTrack(image, winSize) | ||
19 | // image must be single-channel, 8-bit | ||
20 | |||
21 | double *image; | ||
22 | int winSize = (int)mxGetScalar(prhs[1]); | ||
23 | double *lambda, *tr, *det, *c_xx, *c_xy, *c_yy; | ||
24 | const int *imdims; | ||
25 | //double dx[360000];//[MAX_IMAGE_SIZE_1D]; | ||
26 | //double dy[360000];//[MAX_IMAGE_SIZE_1D]; | ||
27 | double *dx, *dy; | ||
28 | |||
29 | image = (double*)mxGetPr(prhs[0]); | ||
30 | imdims = mxGetDimensions(prhs[0]); | ||
31 | dx=(double*)malloc(sizeof(double)*imdims[0]*imdims[1]); | ||
32 | dy=(double*)malloc(sizeof(double)*imdims[0]*imdims[1]); | ||
33 | |||
34 | plhs[0] = mxCreateNumericMatrix(imdims[0], imdims[1], mxDOUBLE_CLASS, mxREAL); | ||
35 | plhs[1] = mxCreateNumericMatrix(imdims[0], imdims[1], mxDOUBLE_CLASS, mxREAL); | ||
36 | plhs[2] = mxCreateNumericMatrix(imdims[0], imdims[1], mxDOUBLE_CLASS, mxREAL); | ||
37 | plhs[3] = mxCreateNumericMatrix(imdims[0], imdims[1], mxDOUBLE_CLASS, mxREAL); | ||
38 | plhs[4] = mxCreateNumericMatrix(imdims[0], imdims[1], mxDOUBLE_CLASS, mxREAL); | ||
39 | plhs[5] = mxCreateNumericMatrix(imdims[0], imdims[1], mxDOUBLE_CLASS, mxREAL); | ||
40 | |||
41 | lambda = (double*)mxGetPr(plhs[0]); | ||
42 | tr = (double*)mxGetPr(plhs[1]); | ||
43 | det = (double*)mxGetPr(plhs[2]); | ||
44 | c_xx = (double*)mxGetPr(plhs[3]); | ||
45 | c_xy = (double*)mxGetPr(plhs[4]); | ||
46 | c_yy = (double*)mxGetPr(plhs[5]); | ||
47 | |||
48 | calcSobel(image, imdims[0], imdims[1], dx, dy); | ||
49 | calcGoodFeature(dx, dy, imdims[0], imdims[1], winSize, | ||
50 | lambda, tr, det, c_xx, c_xy, c_yy); | ||
51 | free(dx); | ||
52 | free(dy); | ||
53 | } | ||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcTextureMex.mexa64 b/SD-VBS/common/toolbox/lagrcv/calcTextureMex.mexa64 new file mode 100755 index 0000000..3c023ea --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcTextureMex.mexa64 | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcTextureMex.mexglx b/SD-VBS/common/toolbox/lagrcv/calcTextureMex.mexglx new file mode 100755 index 0000000..f8e0c99 --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcTextureMex.mexglx | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcTexturePyrMex.cc b/SD-VBS/common/toolbox/lagrcv/calcTexturePyrMex.cc new file mode 100755 index 0000000..3c332ca --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcTexturePyrMex.cc | |||
@@ -0,0 +1,54 @@ | |||
1 | |||
2 | /* compile with | ||
3 | rm liblagrcv.a | ||
4 | gcc -c lagrcv.cpp | ||
5 | ar rc liblagrcv.a lagrcv.o | ||
6 | ranlib liblagrcv.a | ||
7 | mex7 calcTextureMex.cc -L/home/ikkjin/LagrMatlab/opencv/matlab -llagrcv -I/home/ikkjin/LagrMatlab/opencv/matlab/ | ||
8 | */ | ||
9 | |||
10 | #include "mex.h" | ||
11 | #include "lagrcv.h" | ||
12 | #include <stdio.h> | ||
13 | #include <math.h> | ||
14 | |||
15 | // TODO: add number of corners parameter | ||
16 | void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { | ||
17 | // usage: [ lambda tr det c_xx c_xy c_yy] = | ||
18 | // calcTexturePyrMex(dxPyr, dyPyr, winSize, level) | ||
19 | // image is assumed to be double | ||
20 | // the lowest level is 1 | ||
21 | |||
22 | const int *cellDims = mxGetDimensions(prhs[0]); | ||
23 | int level=0; | ||
24 | char winSize = (char )mxGetScalar(prhs[2]); | ||
25 | double *dx, *dy; | ||
26 | const mxArray* dxArray, * dyArray; | ||
27 | const int *imdims; | ||
28 | double *tr, *det, *lambda, *c_xx, *c_xy, *c_yy; | ||
29 | |||
30 | if (nrhs > 3) level = (int)mxGetScalar(prhs[3])-1; | ||
31 | |||
32 | dxArray= mxGetCell(prhs[0],level); | ||
33 | dyArray= mxGetCell(prhs[1],level); | ||
34 | dx=mxGetPr(dxArray); | ||
35 | dy=mxGetPr(dyArray); | ||
36 | imdims = mxGetDimensions(dxArray); | ||
37 | |||
38 | plhs[0] = mxCreateNumericMatrix(imdims[0], imdims[1], mxDOUBLE_CLASS, mxREAL); | ||
39 | plhs[1] = mxCreateNumericMatrix(imdims[0], imdims[1], mxDOUBLE_CLASS, mxREAL); | ||
40 | plhs[2] = mxCreateNumericMatrix(imdims[0], imdims[1], mxDOUBLE_CLASS, mxREAL); | ||
41 | plhs[3] = mxCreateNumericMatrix(imdims[0], imdims[1], mxDOUBLE_CLASS, mxREAL); | ||
42 | plhs[4] = mxCreateNumericMatrix(imdims[0], imdims[1], mxDOUBLE_CLASS, mxREAL); | ||
43 | plhs[5] = mxCreateNumericMatrix(imdims[0], imdims[1], mxDOUBLE_CLASS, mxREAL); | ||
44 | |||
45 | lambda = (double*)mxGetPr(plhs[0]); | ||
46 | tr = (double*)mxGetPr(plhs[1]); | ||
47 | det = (double*)mxGetPr(plhs[2]); | ||
48 | c_xx = (double*)mxGetPr(plhs[3]); | ||
49 | c_xy = (double*)mxGetPr(plhs[4]); | ||
50 | c_yy = (double*)mxGetPr(plhs[5]); | ||
51 | |||
52 | calcGoodFeature(dx, dy, imdims[0], imdims[1], winSize, lambda, tr, det, c_xx, c_xy, c_yy); | ||
53 | |||
54 | } | ||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcTexturePyrMex.mexa64 b/SD-VBS/common/toolbox/lagrcv/calcTexturePyrMex.mexa64 new file mode 100755 index 0000000..ebede53 --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcTexturePyrMex.mexa64 | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/lagrcv/calcTexturePyrMex.mexglx b/SD-VBS/common/toolbox/lagrcv/calcTexturePyrMex.mexglx new file mode 100755 index 0000000..697ceec --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/calcTexturePyrMex.mexglx | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/lagrcv/dummyMex.cc b/SD-VBS/common/toolbox/lagrcv/dummyMex.cc new file mode 100755 index 0000000..0799182 --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/dummyMex.cc | |||
@@ -0,0 +1,58 @@ | |||
1 | |||
2 | /* compile with | ||
3 | rm liblagrcv.a | ||
4 | gcc -c lagrcv.cpp | ||
5 | ar rc liblagrcv.a lagrcv.o | ||
6 | ranlib liblagrcv.a | ||
7 | mex7 calcTextureMex.cc -L/home/ikkjin/LagrMatlab/opencv/matlab -llagrcv -I/home/ikkjin/LagrMatlab/opencv/matlab/ | ||
8 | */ | ||
9 | |||
10 | #include "mex.h" | ||
11 | #include "lagrcv.h" | ||
12 | #include <stdio.h> | ||
13 | #include <math.h> | ||
14 | |||
15 | // TODO: add number of corners parameter | ||
16 | void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { | ||
17 | // usage: [newFeaturePnt validFlag ] = | ||
18 | // calcOptFlowPyrLKMex(Ipyr, IdxPyr, IdyPyr, Jpyr, featurePnt, winSize, c_level, c_det, c_xx, c_xy, c_yy) | ||
19 | // Ipyr, IdxPyr, IdyPyr, Jpyr: levelx1 size cell. | ||
20 | // featurePnt 2xn int | ||
21 | // winSize c_level int | ||
22 | // c_xx c_xy c_yy: image size double* | ||
23 | // image must be single-channel, 8-bit | ||
24 | |||
25 | |||
26 | double* fPntDouble; | ||
27 | const int *nFeatures; | ||
28 | char* valid; | ||
29 | int *fPnt, *newFPnt; | ||
30 | |||
31 | fPntDouble=(double*)mxGetPr(prhs[0]); | ||
32 | nFeatures=mxGetDimensions(prhs[0]); | ||
33 | fPnt=(int*)malloc(sizeof(int)*nFeatures[0]*nFeatures[1]); | ||
34 | |||
35 | printf("nFeatures %d, %d", nFeatures[0], nFeatures[1]); | ||
36 | //plhs[0] = mxCreateNumericMatrix(nFeatures[0], nFeatures[1], mxINT32_CLASS, mxREAL); | ||
37 | plhs[0] = mxCreateNumericArray(2,nFeatures,mxINT32_CLASS, mxREAL); | ||
38 | //plhs[1] = mxCreateNumericMatrix(1, nFeatures[1], mxINT32_CLASS, mxREAL); | ||
39 | plhs[1] = mxCreateNumericArray(1,nFeatures+1,mxUINT8_CLASS, mxREAL); | ||
40 | |||
41 | newFPnt = (int*)mxGetPr(plhs[0]); | ||
42 | valid = (char*)mxGetPr(plhs[1]); | ||
43 | |||
44 | //idx convert from matlab to c | ||
45 | for(int i=0; i<nFeatures[1]; i++){ | ||
46 | fPnt[i*2]=(int)fPntDouble[i*2]-1; | ||
47 | fPnt[i*2+1]=(int)fPntDouble[i*2+1]-1; | ||
48 | valid[i]=1; | ||
49 | } | ||
50 | |||
51 | //printf("v %d %d %d", valid[0], valid[1], valid[2]); | ||
52 | |||
53 | //idx convert from matlab to c | ||
54 | for(int i=0; i<nFeatures[1]*2; i++){ | ||
55 | newFPnt[i]=fPnt[i]+1; | ||
56 | } | ||
57 | free(fPnt); | ||
58 | } | ||
diff --git a/SD-VBS/common/toolbox/lagrcv/dummyMex.mexa64 b/SD-VBS/common/toolbox/lagrcv/dummyMex.mexa64 new file mode 100755 index 0000000..a394cc7 --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/dummyMex.mexa64 | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/lagrcv/dummyMex.mexglx b/SD-VBS/common/toolbox/lagrcv/dummyMex.mexglx new file mode 100755 index 0000000..11c3dd2 --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/dummyMex.mexglx | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/lagrcv/findCornerSubPix.cc b/SD-VBS/common/toolbox/lagrcv/findCornerSubPix.cc new file mode 100755 index 0000000..3e8659c --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/findCornerSubPix.cc | |||
@@ -0,0 +1,39 @@ | |||
1 | |||
2 | /* compile with | ||
3 | mex findCornerSubPix.cc -I/usr/local/opencv/include -L/usr/local/opencv/lib -lcxcore -lcv | ||
4 | */ | ||
5 | |||
6 | #include "mex.h" | ||
7 | #include "opencv/cv.h" | ||
8 | #include "opencv/highgui.h" | ||
9 | #include <stdio.h> | ||
10 | #include <math.h> | ||
11 | |||
12 | //#define MAX_CORNERS 500 | ||
13 | #define WIN_SIZE 5 | ||
14 | |||
15 | void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { | ||
16 | // usage: [ features ] = | ||
17 | // findCornerSubPix(image, features) | ||
18 | // image must be single-channel, 8-bit | ||
19 | |||
20 | char *image_pr = (char*)mxGetPr(prhs[0]); | ||
21 | const int *imdims = mxGetDimensions(prhs[0]); | ||
22 | IplImage *image = | ||
23 | cvCreateImageHeader(cvSize(imdims[0], imdims[1]), IPL_DEPTH_8U, 1); | ||
24 | image->imageData = image_pr; | ||
25 | |||
26 | const int *feature_dims = mxGetDimensions(prhs[1]); | ||
27 | int nfeatures = feature_dims[1]; | ||
28 | plhs[0] = mxCreateNumericMatrix(2, nfeatures, mxSINGLE_CLASS, mxREAL); | ||
29 | CvPoint2D32f *newfeatures = (CvPoint2D32f*)mxGetPr(plhs[0]); | ||
30 | CvPoint2D32f *oldfeatures = (CvPoint2D32f*)mxGetPr(prhs[1]); | ||
31 | // plhs[0] = mxDuplicateArray(prhs[1]); | ||
32 | // CvPoint2D32f *newfeatures = (CvPoint2D32f*)mxGetPr(plhs[0]); | ||
33 | memcpy(newfeatures, oldfeatures, sizeof(float)*2*nfeatures); | ||
34 | |||
35 | cvFindCornerSubPix(image, newfeatures, nfeatures, | ||
36 | cvSize(WIN_SIZE,WIN_SIZE), | ||
37 | cvSize(-1,-1), | ||
38 | cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,20,0.03)); | ||
39 | } | ||
diff --git a/SD-VBS/common/toolbox/lagrcv/goodFeaturesToTrack.cc b/SD-VBS/common/toolbox/lagrcv/goodFeaturesToTrack.cc new file mode 100755 index 0000000..376a096 --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/goodFeaturesToTrack.cc | |||
@@ -0,0 +1,62 @@ | |||
1 | |||
2 | /* compile with | ||
3 | mex goodFeaturesToTrack.cc -I/usr/local/opencv/include -L/usr/local/opencv/lib -lcxcore -lcv | ||
4 | */ | ||
5 | |||
6 | #include "mex.h" | ||
7 | #include "opencv/cv.h" | ||
8 | #include "opencv/highgui.h" | ||
9 | #include <stdio.h> | ||
10 | #include <math.h> | ||
11 | |||
12 | #define MAX_CORNERS 500 | ||
13 | |||
14 | IplImage *eigtemp = NULL, *temp2 = NULL; | ||
15 | |||
16 | // TODO: add number of corners parameter | ||
17 | void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { | ||
18 | // usage: [ features numvalid ] = | ||
19 | // goodFeaturesToTrack(image, quality, mindist, mask) | ||
20 | // image must be single-channel, 8-bit | ||
21 | // quality = minimum acceptable ratio of eigenvalues | ||
22 | // mindist = minimum distance between corners | ||
23 | // mask (optional) = bitmap mask "region of interest" (MUST BE uint8 TYPE!) | ||
24 | |||
25 | char *image_pr = (char*)mxGetPr(prhs[0]); | ||
26 | // int imdims[] = { (int)d_imdims[0], (int)d_imdims[1] }; | ||
27 | const int *imdims = mxGetDimensions(prhs[0]); | ||
28 | double quality = mxGetScalar(prhs[1]); | ||
29 | double mindist = mxGetScalar(prhs[2]); | ||
30 | bool use_roi = nrhs > 3; | ||
31 | |||
32 | plhs[0] = mxCreateNumericMatrix(2, MAX_CORNERS, mxSINGLE_CLASS, mxREAL); | ||
33 | plhs[1] = mxCreateNumericMatrix(1, 1, mxINT32_CLASS, mxREAL); | ||
34 | |||
35 | CvPoint2D32f *corner_coords = (CvPoint2D32f*)mxGetPr(plhs[0]); | ||
36 | int *corner_count = (int*)mxGetPr(plhs[1]); | ||
37 | *corner_count = MAX_CORNERS; | ||
38 | |||
39 | if (eigtemp == NULL) { | ||
40 | eigtemp = cvCreateImage(cvSize(imdims[0],imdims[1]), IPL_DEPTH_32F, 1); | ||
41 | temp2 = cvCreateImage(cvSize(imdims[0],imdims[1]), IPL_DEPTH_32F, 1); | ||
42 | } | ||
43 | |||
44 | IplImage *image = | ||
45 | cvCreateImageHeader(cvSize(imdims[0], imdims[1]), IPL_DEPTH_8U, 1); | ||
46 | image->imageData = image_pr; | ||
47 | |||
48 | IplImage *roimask = NULL; | ||
49 | if (use_roi) { | ||
50 | roimask = cvCreateImage(cvSize(imdims[0],imdims[1]), IPL_DEPTH_8U, 1); | ||
51 | roimask->imageData = (char*)mxGetPr(prhs[3]); | ||
52 | } | ||
53 | |||
54 | cvGoodFeaturesToTrack(image, | ||
55 | eigtemp, temp2, | ||
56 | corner_coords, | ||
57 | corner_count, | ||
58 | quality, | ||
59 | mindist, | ||
60 | roimask | ||
61 | ); | ||
62 | } | ||
diff --git a/SD-VBS/common/toolbox/lagrcv/goodFeaturesToTrack.mexglx b/SD-VBS/common/toolbox/lagrcv/goodFeaturesToTrack.mexglx new file mode 100755 index 0000000..0fe9080 --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/goodFeaturesToTrack.mexglx | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/lagrcv/lagrcv.cpp b/SD-VBS/common/toolbox/lagrcv/lagrcv.cpp new file mode 100755 index 0000000..4f24b5d --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/lagrcv.cpp | |||
@@ -0,0 +1,840 @@ | |||
1 | #include "lagrcv.h" | ||
2 | /* | ||
3 | void calcImagePyr(char *src, int sizeY, int sizeX, int level, char *pyr){ | ||
4 | pyr=(char*) malloc(sizeof(char)*(int)sizeY*sizeX*4/3); | ||
5 | int i, startPnt, nX, nY; | ||
6 | |||
7 | memcpy(pyr,src, sizeY*sizeX); | ||
8 | nY=sizeY; | ||
9 | nX=sizeX; | ||
10 | for(i=0; i<level; i++){ | ||
11 | nY = (nY + 1) >> 1; | ||
12 | nX = (nX + 1) >> 1; | ||
13 | calcSubsample(pyr, sizeY, sizeX, pyr+sizeY*sizeX) | ||
14 | } | ||
15 | free(pyr); | ||
16 | } | ||
17 | */ | ||
18 | |||
19 | void calcSubSampleAvg(double *src, int sizeY, int sizeX, double *dest, int destSizeY, int destSizeX){ | ||
20 | int i, j, idx, | ||
21 | destI, destJ, idxDest; | ||
22 | for(i=0, destI=0; destI<destSizeX; i+=2, destI++){ | ||
23 | for(j=0, destJ=0; destJ<destSizeY; j+=2, destJ++){ | ||
24 | idx=i*sizeX+j; | ||
25 | idxDest=destI*destSizeY+destJ; | ||
26 | dest[idxDest]=(src[idx]+src[idx+1]+src[idx+sizeY]+src[idx+sizeY+1])/4; | ||
27 | } | ||
28 | } | ||
29 | } | ||
30 | void calcImgBlur(double *src, int sizeY, int sizeX, double *dest){ | ||
31 | double kernel[]={0.0625, 0.25, 0.375, 0.25, 0.0625}; | ||
32 | double *temp; | ||
33 | temp=(double*) malloc(sizeof(double)*sizeY*sizeX); | ||
34 | int i, j, idx, idxCol; | ||
35 | for(i=2; i<sizeX-2;i++){ | ||
36 | idxCol=i*sizeY; | ||
37 | for(j=0;j<sizeY; j++){ | ||
38 | idx=idxCol+j; | ||
39 | temp[idx]=src[idx-2*sizeY]/16+src[idx-sizeY]/4 | ||
40 | +src[idx]*3/8+src[idx+sizeY]/4+src[idx+2*sizeY]/16; | ||
41 | } | ||
42 | } | ||
43 | for(i=0; i<sizeX;i++){ | ||
44 | idxCol=i*sizeY; | ||
45 | for(j=2;j<sizeY-2; j++){ | ||
46 | idx=idxCol+j; | ||
47 | dest[idx]=temp[idx-2]/16+temp[idx-1]/4 | ||
48 | +temp[idx]*3/8+temp[idx+1]/4+temp[idx+2]/16; | ||
49 | } | ||
50 | } | ||
51 | free(temp); | ||
52 | } | ||
53 | void calcImgResize(double *src, int sizeY, int sizeX, double *dest, int dstSizeY, int dstSizeX){ | ||
54 | double ker[]={ 0.0039, 0.0156, 0.0234, 0.0156, 0.0039, | ||
55 | 0.0156, 0.0625, 0.0938, 0.0625, 0.0156, | ||
56 | 0.0234, 0.0938, 0.1406, 0.0938, 0.0234, | ||
57 | 0.0156, 0.0625, 0.0938, 0.0625, 0.0156, | ||
58 | 0.0039, 0.0156, 0.0234, 0.0156, 0.0039}; | ||
59 | int srcI, srcJ, dstI, dstJ, srcIdx, dstIdx, idxCol_1, idxCol1, idxCol_2, idxCol2; | ||
60 | for(srcI=2, dstI=1; srcI<sizeX-2; srcI+=2, dstI++){ | ||
61 | for(srcJ=2, dstJ=1; srcJ<sizeY-2; srcJ+=2, dstJ++){ | ||
62 | srcIdx=srcI*sizeY+srcJ; | ||
63 | dstIdx=dstI*dstSizeY+dstJ; | ||
64 | idxCol_1=srcIdx-sizeY; | ||
65 | idxCol_2=srcIdx-2*sizeY; | ||
66 | idxCol1=srcIdx+sizeY; | ||
67 | idxCol2=srcIdx+2*sizeY; | ||
68 | dest[dstIdx]= | ||
69 | src[idxCol_2-2]*ker[0]+src[idxCol_1-2]*ker[1] | ||
70 | +src[srcIdx-2]*ker[2]+src[idxCol1-2]*ker[3]+src[idxCol2-2]*ker[4] | ||
71 | +src[idxCol_2-1]*ker[5]+src[idxCol_1-1]*ker[6] | ||
72 | +src[srcIdx-1]*ker[7]+src[idxCol1-1]*ker[8]+src[idxCol2-1]*ker[9] | ||
73 | +src[idxCol_2]*ker[10]+src[idxCol_1]*ker[11] | ||
74 | +src[srcIdx]*ker[12]+src[idxCol1]*ker[13]+src[idxCol2]*ker[14] | ||
75 | +src[idxCol_2+1]*ker[5]+src[idxCol_1+1]*ker[16] | ||
76 | +src[srcIdx+1]*ker[17]+src[idxCol1+1]*ker[18]+src[idxCol2+1]*ker[19]; | ||
77 | +src[idxCol_2+2]*ker[20]+src[idxCol_1+2]*ker[21] | ||
78 | +src[srcIdx+2]*ker[22]+src[idxCol1+2]*ker[23]+src[idxCol2+2]*ker[24]; | ||
79 | } | ||
80 | } | ||
81 | } | ||
82 | |||
83 | void calcGradient(double *src, int sizeY, int sizeX, double *dX, double *dY){ | ||
84 | int i, j, idx; | ||
85 | for(i=1; i<sizeX; i++){ | ||
86 | for(j=1; j<sizeY; j++){ | ||
87 | idx=i*sizeY+j; | ||
88 | dX[idx]=src[idx]-src[idx-sizeY]; | ||
89 | dY[idx]=src[idx]-src[idx-1]; | ||
90 | } | ||
91 | } | ||
92 | } | ||
93 | void calcGradient(char *src, int sizeY, int sizeX, char *dX, char *dY){ | ||
94 | int i, j, idx; | ||
95 | for(i=1; i<sizeX; i++){ | ||
96 | for(j=1; j<sizeY; j++){ | ||
97 | idx=i*sizeY+j; | ||
98 | dX[idx]=src[idx]-src[idx-sizeY]; | ||
99 | dY[idx]=src[idx]-src[idx-1]; | ||
100 | } | ||
101 | } | ||
102 | } | ||
103 | void calcSobel(double *src, int sizeY, int sizeX, double *dX, double *dY){ | ||
104 | //char kernelV[9]={-1, -2, -1, 0, 0, 0, 1, 2, 1}; | ||
105 | //char kernelH[9]={-1, 0, 1, -2, 0, 2, -1, 0, 1}; | ||
106 | //const int kerSize=3; | ||
107 | int i, j, idx, idxPrevCol, idxNextCol; | ||
108 | for(i=1; i<sizeX-1; i++){ | ||
109 | for(j=1; j<sizeY-1; j++){ | ||
110 | idx=i*sizeY+j; | ||
111 | idxPrevCol=idx-sizeY; | ||
112 | idxNextCol=idx+sizeY; | ||
113 | dX[idx]=src[idxPrevCol-1]*-0.0938f+src[idxPrevCol]*-0.3125f+src[idxPrevCol+1]*-0.0938f | ||
114 | +src[idxNextCol-1]*0.0938f+src[idxNextCol]*0.3125f+src[idxNextCol+1]*0.0938f; | ||
115 | dY[idx]=src[idxPrevCol-1]*-0.0938f+src[idx-1]*-0.3125f+src[idxNextCol-1]*-0.0938f | ||
116 | +src[idxPrevCol+1]*0.0938f+src[idx+1]*0.3125f+src[idxNextCol+1]*0.0938f; | ||
117 | /* | ||
118 | dX[idx]=(src[idxPrevCol-1]*-1+src[idxPrevCol]*-2+src[idxPrevCol+1]*-1 | ||
119 | +src[idxNextCol-1]*1+src[idxNextCol]*2+src[idxNextCol+1]*1)*0.0625; | ||
120 | dY[idx]=(src[idxPrevCol-1]*-1+src[idx-1]*-2+src[idxNextCol-1]*-1 | ||
121 | +src[idxPrevCol+1]*1+src[idx+1]*2+src[idxNextCol+1]*1)*0.0625; | ||
122 | */ | ||
123 | } | ||
124 | } | ||
125 | } | ||
126 | |||
127 | void calcGoodFeature(double *dX, double *dY, int sizeY, int sizeX, int winSize, double* lambda, double* tr, double* det, | ||
128 | double* c_xx, double* c_xy, double* c_yy){ | ||
129 | double *xx, *xy, *yy; | ||
130 | int i,j,idx; | ||
131 | xx=(double*)malloc(sizeof(double)*sizeY*sizeX); | ||
132 | xy=(double*)malloc(sizeof(double)*sizeY*sizeX); | ||
133 | yy=(double*)malloc(sizeof(double)*sizeY*sizeX); | ||
134 | for(idx=0; idx<sizeX*sizeY; idx++){ | ||
135 | xx[idx]=dX[idx]*dX[idx]; | ||
136 | xy[idx]=dX[idx]*dY[idx]; | ||
137 | yy[idx]=dY[idx]*dY[idx]; | ||
138 | } | ||
139 | calcAreaSum(xx, sizeY, sizeX, winSize, c_xx); | ||
140 | calcAreaSum(xy, sizeY, sizeX, winSize, c_xy); | ||
141 | calcAreaSum(yy, sizeY, sizeX, winSize, c_yy); | ||
142 | for(idx=0; idx<sizeX*sizeY; idx++){ | ||
143 | tr[idx]=c_xx[idx]+c_yy[idx]; | ||
144 | det[idx]=c_xx[idx]*c_yy[idx]-c_xy[idx]*c_xy[idx]; | ||
145 | lambda[idx]=det[idx]/(tr[idx] + 0.00001); | ||
146 | } | ||
147 | free(xx); | ||
148 | free(xy); | ||
149 | free(yy); | ||
150 | } | ||
151 | void calcGoodFeature(char *dX, char *dY, int sizeY, int sizeX, int winSize, float* lambda, float* tr, float* det){ | ||
152 | int *xx, *xy, *yy; | ||
153 | int *c_xx, *c_xy, *c_yy; | ||
154 | int i,j,idx; | ||
155 | xx=(int*)malloc(sizeof(int)*sizeY*sizeX); | ||
156 | xy=(int*)malloc(sizeof(int)*sizeY*sizeX); | ||
157 | yy=(int*)malloc(sizeof(int)*sizeY*sizeX); | ||
158 | c_xx=(int*)malloc(sizeof(int)*sizeY*sizeX); | ||
159 | c_xy=(int*)malloc(sizeof(int)*sizeY*sizeX); | ||
160 | c_yy=(int*)malloc(sizeof(int)*sizeY*sizeX); | ||
161 | for(i=0; i<sizeX; i++){ | ||
162 | for(j=0; j<sizeY; j++){ | ||
163 | idx=i*sizeY+j; | ||
164 | xx[idx]=dX[idx]*dX[idx]; | ||
165 | xy[idx]=dX[idx]*dY[idx]; | ||
166 | yy[idx]=dY[idx]*dY[idx]; | ||
167 | } | ||
168 | } | ||
169 | calcAreaSum(xx, sizeY, sizeX, winSize, c_xx); | ||
170 | calcAreaSum(xy, sizeY, sizeX, winSize, c_xy); | ||
171 | calcAreaSum(yy, sizeY, sizeX, winSize, c_yy); | ||
172 | for(i=0; i<sizeX; i++){ | ||
173 | for(j=0; j<sizeY; j++){ | ||
174 | idx=i*sizeY+j; | ||
175 | tr[idx]=c_xx[idx]+c_yy[idx]; | ||
176 | det[idx]=c_xx[idx]*c_yy[idx]-c_xy[idx]*c_xy[idx]; | ||
177 | lambda[i*sizeY+j]=det[idx]/(tr[idx] + 0.00001); | ||
178 | } | ||
179 | } | ||
180 | } | ||
181 | void calcMinEigenValue(char *dX, char *dY, int sizeY, int sizeX, float* lambda){ | ||
182 | int xx, xy, yy; | ||
183 | int tr; | ||
184 | int i,j; | ||
185 | for(i=0; i<sizeX; i++){ | ||
186 | for(j=0; j<sizeY; j++){ | ||
187 | xx=dX[i*sizeY+j]*dX[i*sizeY+j]; | ||
188 | xy=dX[i*sizeY+j]*dY[i*sizeY+j]; | ||
189 | yy=dY[i*sizeY+j]*dY[i*sizeY+j]; | ||
190 | tr=xx+yy; | ||
191 | lambda[i*sizeY+j]=(float)(tr-pow((xx-yy)*(xx-yy)+4*xy*xy,0.5))/2; | ||
192 | } | ||
193 | } | ||
194 | } | ||
195 | |||
196 | void calcAreaSum(double *src, int sizeY, int sizeX, int winSize, double *ret){ | ||
197 | /**/ | ||
198 | const int MAX_COLS = 1024; | ||
199 | double *a_array[MAX_COLS], *b_array[MAX_COLS]; | ||
200 | double a1[MAX_COLS], a1sum; | ||
201 | |||
202 | int nave = winSize; | ||
203 | int nave_half = (int)floor((nave+1)/2)-1; | ||
204 | |||
205 | double *a_ptr = src; | ||
206 | |||
207 | int nx = sizeY; | ||
208 | int ny = sizeX; | ||
209 | |||
210 | double *b_ptr = ret; | ||
211 | |||
212 | // Construct array pointers | ||
213 | for (int iy = 0; iy < ny; iy++) { | ||
214 | a_array[iy] = a_ptr + iy*nx; | ||
215 | b_array[iy] = b_ptr + iy*nx; | ||
216 | } | ||
217 | |||
218 | // Initialize a1 array | ||
219 | for (int i = 0; i < nx+nave; i++) | ||
220 | a1[i] = 0.0; | ||
221 | // Sum over cols: | ||
222 | for (int iy = 0; iy < ny; iy++) { | ||
223 | // Copy col into temp array: | ||
224 | for (int ix = 0; ix < nx; ix++) | ||
225 | a1[ix+nave_half] = a_array[iy][ix]; | ||
226 | |||
227 | a1sum = 0.0; | ||
228 | for (int i = 0; i < nave; i++) | ||
229 | a1sum += a1[i]; | ||
230 | |||
231 | for (int ix = 0; ix < nx; ix++) { | ||
232 | b_array[iy][ix] = a1sum; | ||
233 | a1sum += a1[ix+nave]-a1[ix]; | ||
234 | } | ||
235 | } | ||
236 | // Re-initialize a1 array | ||
237 | for (int i = 0; i < ny+nave; i++) | ||
238 | a1[i] = 0.0; | ||
239 | // Sum over rows: | ||
240 | for (int ix = 0; ix < nx; ix++) { | ||
241 | // Copy row into temp array: | ||
242 | for (int iy = 0; iy < ny; iy++) | ||
243 | a1[iy+nave_half] = b_array[iy][ix]; | ||
244 | |||
245 | a1sum = 0.0; | ||
246 | for (int i = 0; i < nave; i++) | ||
247 | a1sum += a1[i]; | ||
248 | |||
249 | for (int iy = 0; iy < ny; iy++) { | ||
250 | b_array[iy][ix] = a1sum; | ||
251 | a1sum += a1[iy+nave]-a1[iy]; | ||
252 | } | ||
253 | } | ||
254 | /**/ | ||
255 | // 8n^2+2n | ||
256 | /* | ||
257 | // 10n^2 | ||
258 | int idx, idxCol, idx_1, idx_win, idx_Y, idx_win_Y; | ||
259 | double* sum=(double*)malloc(sizeof(double)*sizeX*sizeY); | ||
260 | //sum up along Y | ||
261 | for(idx=idxCol=0; idx<(sizeX*sizeY); idxCol=idx){ | ||
262 | sum[idx]=src[idx]; | ||
263 | idx++; | ||
264 | for(idx_1=idx-1;idx<(idxCol+winSize);idx++, | ||
265 | idx_1++){ | ||
266 | sum[idx]=sum[idx_1]+src[idx]; | ||
267 | } | ||
268 | for(idx_win=idx-winSize;idx<(idxCol+sizeY);idx++, | ||
269 | idx_1++, | ||
270 | idx_win++){ | ||
271 | sum[idx]=sum[idx_1]+src[idx]-src[idx_win]; | ||
272 | } | ||
273 | } | ||
274 | //sum up along X | ||
275 | for(idx=0;idx<sizeY;idx++){ | ||
276 | ret[idx]=sum[idx]; | ||
277 | } | ||
278 | for(idx_Y=idx-sizeY;idx<(winSize*sizeY);idx++, | ||
279 | idx_Y++){ | ||
280 | ret[idx]+=sum[idx]+ret[idx_Y]; | ||
281 | } | ||
282 | for(idx_win_Y=idx-winSize*sizeY;idx<(sizeX*sizeY); idx++, | ||
283 | idx_win_Y++, | ||
284 | idx_Y++){ | ||
285 | ret[idx]+=sum[idx]+ret[idx_Y]-sum[idx_win_Y]; | ||
286 | } | ||
287 | free(sum); | ||
288 | /**/ | ||
289 | /* | ||
290 | // 8n^2+2n | ||
291 | int i,j; | ||
292 | int idx,idxCol; | ||
293 | int idxDelta[4]; | ||
294 | double* sum=(double*)malloc(sizeof(double)*sizeX*sizeY); | ||
295 | int halfSize=(int)winSize/2; | ||
296 | ret[0]=src[0]; | ||
297 | for(i=1; i<sizeY; i++){ | ||
298 | sum[i]=src[i]+sum[i-1]; | ||
299 | } | ||
300 | for(i=1; i<sizeX; i++){ | ||
301 | idx=i*sizeY; | ||
302 | sum[idx]=src[idx]+sum[idx-sizeY]; | ||
303 | } | ||
304 | for(i=1; i<sizeX; i++){ | ||
305 | for(j=1; j<sizeY; j++){ | ||
306 | idx=i*sizeY+j; | ||
307 | sum[idx]=src[idx] | ||
308 | + sum[idx-1] | ||
309 | + sum[idx-sizeY] | ||
310 | - sum[idx-sizeY-1]; | ||
311 | } | ||
312 | } | ||
313 | idxDelta[0]=halfSize*sizeY+halfSize; | ||
314 | idxDelta[1]=-halfSize*sizeY+halfSize; | ||
315 | idxDelta[2]=halfSize*sizeY-halfSize; | ||
316 | idxDelta[3]=-halfSize*sizeY-halfSize; | ||
317 | for(i=halfSize; i<sizeX-halfSize; i++){ | ||
318 | for(j=halfSize; j<sizeY-halfSize; j++){ | ||
319 | idx=i*sizeY+j; | ||
320 | ret[i*sizeY+j]=sum[idx+idxDelta[0]]-sum[idx+idxDelta[1]]-sum[idx+idxDelta[2]]+sum[idx+idxDelta[3]]; | ||
321 | } | ||
322 | } | ||
323 | free(sum); | ||
324 | /**/ | ||
325 | } | ||
326 | void calcAreaSum(int *src, int sizeY, int sizeX, int sizeSum, int *ret){ | ||
327 | // 8n^2+2n | ||
328 | int i,j; | ||
329 | int idx,idxCol; | ||
330 | int idxDelta[4]; | ||
331 | int *sum; | ||
332 | sum=(int*)malloc(sizeof(int)*sizeY*sizeX); | ||
333 | int halfSize=(int)sizeSum/2; | ||
334 | ret[0]=src[0]; | ||
335 | for(i=1; i<sizeY; i++){ | ||
336 | sum[i]=src[i]+sum[i-1]; | ||
337 | } | ||
338 | for(i=0; i<sizeX; i++){ | ||
339 | idx=i*sizeY; | ||
340 | sum[idx]=src[idx]+sum[idx-sizeY]; | ||
341 | } | ||
342 | for(i=1; i<sizeX; i++){ | ||
343 | for(j=1; j<sizeY; j++){ | ||
344 | idx=i*sizeY+j; | ||
345 | sum[idx]=src[idx] | ||
346 | + sum[idx-1] | ||
347 | + sum[idx-sizeY] | ||
348 | - sum[idx-sizeY-1]; | ||
349 | } | ||
350 | } | ||
351 | /* | ||
352 | for(i=0; i<sizeX; i++){ | ||
353 | for(j=0; j<sizeY; j++){ | ||
354 | idx=i*sizeY+j; | ||
355 | sum[idx]=src[idx] | ||
356 | + ((j>0)?sum[idx-1]:0) | ||
357 | + ((i>0)?sum[idx-sizeY]:0) | ||
358 | - ((i>0&&j>0)?sum[idx-sizeY-1]:0); | ||
359 | } | ||
360 | } | ||
361 | */ | ||
362 | idxDelta[0]=halfSize*sizeY+halfSize; | ||
363 | idxDelta[1]=-halfSize*sizeY+halfSize; | ||
364 | idxDelta[2]=halfSize*sizeY-halfSize; | ||
365 | idxDelta[3]=-halfSize*sizeY-halfSize; | ||
366 | for(i=halfSize; i<sizeX-halfSize; i++){ | ||
367 | for(j=halfSize; j<sizeY-halfSize; j++){ | ||
368 | idx=i*sizeY+j; | ||
369 | ret[i*sizeY+j]=sum[idx+idxDelta[0]]-sum[idx+idxDelta[1]]-sum[idx+idxDelta[2]]+sum[idx+idxDelta[3]]; | ||
370 | } | ||
371 | } | ||
372 | |||
373 | free(sum); | ||
374 | } | ||
375 | |||
376 | |||
377 | void getInterpolatePatch(double* srcImg, int* srcDims, double centerX, double centerY, int winSize, double* dstImg){ | ||
378 | double a, b, a11, a12, a21, a22, b1, b2; | ||
379 | int srcIdxX, srcIdx; | ||
380 | int dstIdxX, dstIdx; | ||
381 | a=centerX-(double)((int)centerX); | ||
382 | b=centerY-(double)((int)centerY); | ||
383 | a11=(1.f-a)*(1.f-b); | ||
384 | a12=a*(1.f-b); | ||
385 | a21=(1.f-a)*b; | ||
386 | a22=a*b; | ||
387 | b1=1.f-b; | ||
388 | b2=b; | ||
389 | |||
390 | for(int i=-winSize; i<winSize; i++){ | ||
391 | srcIdxX=(int)centerX+i; | ||
392 | dstIdxX=i+winSize; | ||
393 | for(int j=-winSize; j<winSize; j++){ | ||
394 | srcIdx=(int)srcIdxX*srcDims[0]+(int)centerY+j; | ||
395 | dstIdx=dstIdxX*2*winSize+j+winSize; | ||
396 | dstImg[dstIdx]=srcImg[srcIdx]*a11 | ||
397 | +srcImg[srcIdx+1]*a12 | ||
398 | +srcImg[srcIdx+srcDims[0]]*a21 | ||
399 | +srcImg[srcIdx+srcDims[0]+1]*a22; | ||
400 | } | ||
401 | } | ||
402 | } | ||
403 | void calcPyrLKTrack(double** iP, double** iDxP, double** iDyP, double** jP, const int* imgDims, int pLevel, | ||
404 | double* fPnt, int nFeatures, int winSize, | ||
405 | double* newFPnt, char* valid){ | ||
406 | calcPyrLKTrack( iP, iDxP, iDyP, jP, imgDims, pLevel, | ||
407 | fPnt, nFeatures, winSize, | ||
408 | newFPnt, valid, LK_ACCURACY_TH, LK_MAX_ITER); | ||
409 | } | ||
410 | void calcPyrLKTrackWInit(double** iP, double** jP, const int* imgDims, int pLevel, | ||
411 | double* fPnt, int nFeatures, int winSize, | ||
412 | double* newFPnt, double* initFPnt, | ||
413 | char* valid, double accuracy_th, int max_iter){ | ||
414 | |||
415 | double x, y, eX, eY, dX, dY, mX, mY, prevMX, prevMY, c_xx, c_xy, c_yy, c_det, dIt; | ||
416 | double* iPatch, *jPatch, *iDxPatch, *iDyPatch; | ||
417 | int level, winSizeSq, winSizeSqWBorder; | ||
418 | int i, k, idx; | ||
419 | int imgSize[2]; | ||
420 | |||
421 | static const double rate[]={1, 0.5, 0.25, 0.125, 0.0625, 0.03125}; | ||
422 | winSizeSq=4*winSize*winSize; | ||
423 | winSizeSqWBorder=4*(winSize+1)*(winSize+1); | ||
424 | |||
425 | iPatch=(double*) malloc(sizeof(double)*winSizeSqWBorder); | ||
426 | jPatch=(double*) malloc(sizeof(double)*winSizeSq); | ||
427 | iDxPatch=(double*) malloc(sizeof(double)*winSizeSqWBorder); | ||
428 | iDyPatch=(double*) malloc(sizeof(double)*winSizeSqWBorder); | ||
429 | |||
430 | for(i=0; i<nFeatures; i++){ | ||
431 | dX=(initFPnt[i*2+0]-fPnt[i*2+0])*rate[pLevel]; | ||
432 | dY=(initFPnt[i*2+1]-fPnt[i*2+1])*rate[pLevel]; | ||
433 | x=fPnt[i*2+0]*rate[pLevel];//half size of real level | ||
434 | y=fPnt[i*2+1]*rate[pLevel]; | ||
435 | for(level=pLevel-1; level>=0; level--){ | ||
436 | x+=x; y+=y; dX+=dX; dY+=dY; | ||
437 | imgSize[0]=imgDims[level*2+0]; //y,x | ||
438 | imgSize[1]=imgDims[level*2+1]; //y,x | ||
439 | |||
440 | c_xx=c_xy=c_yy=0; | ||
441 | //when feature goes out to the boundary. | ||
442 | if((x-winSize-1)<0 || (y-winSize-1)<0 | ||
443 | || (y+winSize+1+1)>=imgSize[0] || (x+winSize+1+1)>=imgSize[1]){ | ||
444 | //winSize+1due to interpolation | ||
445 | //error or skip the level?? | ||
446 | valid[i]=0; | ||
447 | break; | ||
448 | } | ||
449 | |||
450 | getInterpolatePatch(iP[level], imgSize, x, y, winSize+1, iPatch); //to calculate iDx, iDy | ||
451 | calcSobel(iPatch, (winSize+1)*2, (winSize+1)*2, iDxPatch, iDyPatch); | ||
452 | for(k=0; k <(winSize*2); k++ ){ | ||
453 | memcpy( iPatch + k*winSize*2, iPatch + (k+1)*(winSize+1)*2 + 1, winSize*2 ); | ||
454 | memcpy( iDxPatch + k*winSize*2, iDxPatch + (k+1)*(winSize+1)*2 + 1, winSize*2 ); | ||
455 | memcpy( iDyPatch + k*winSize*2, iDyPatch + (k+1)*(winSize+1)*2 + 1, winSize*2 ); | ||
456 | } | ||
457 | |||
458 | for(idx=0; idx<winSizeSq;idx++){ | ||
459 | c_xx+=iDxPatch[idx]*iDxPatch[idx]; | ||
460 | c_xy+=iDxPatch[idx]*iDyPatch[idx]; | ||
461 | c_yy+=iDyPatch[idx]*iDyPatch[idx]; | ||
462 | } | ||
463 | c_det=c_xx*c_yy-c_xy*c_xy; | ||
464 | if(c_det/(c_xx+c_yy+0.00000001)<GOOD_FEATURE_LAMBDA_TH){ | ||
465 | //just skip? | ||
466 | valid[i]=0; | ||
467 | break; | ||
468 | } | ||
469 | c_det=1/c_det; | ||
470 | for(k=0; k<max_iter; k++){ | ||
471 | if((x+dX-winSize)<0 || (y+dY-winSize)<0 | ||
472 | || (y+dY+winSize+1)>=imgSize[0] || (x+dX+winSize+1)>=imgSize[1]){ | ||
473 | //winSize+1due to interpolation | ||
474 | //error or skip the level?? | ||
475 | valid[i]=0; | ||
476 | break; | ||
477 | } | ||
478 | getInterpolatePatch(jP[level], imgSize, x+dX, y+dY, winSize, jPatch); | ||
479 | eX=eY=0; | ||
480 | for(idx=0;idx<winSizeSq;idx++){ | ||
481 | dIt=iPatch[idx]-jPatch[idx]; | ||
482 | eX+=dIt*iDxPatch[idx]; | ||
483 | eY+=dIt*iDyPatch[idx]; | ||
484 | } | ||
485 | mX=c_det*(eX*c_yy-eY*c_xy); | ||
486 | mY=c_det*(-eX*c_xy+eY*c_xx); | ||
487 | dX+=mX; | ||
488 | dY+=mY; | ||
489 | if((mX*mX+mY*mY)<accuracy_th) break; | ||
490 | if( k>0 && (mX + prevMX) < 0.01 && (mX+prevMX) > -0.01 | ||
491 | && (mY + prevMY) < 0.01 && (mY+prevMY) > -0.01) | ||
492 | { | ||
493 | dX -= mX*0.5f; | ||
494 | dY -= mY*0.5f; | ||
495 | break; | ||
496 | } | ||
497 | prevMX=mX; | ||
498 | prevMY=mY; | ||
499 | } | ||
500 | if(k==max_iter){ | ||
501 | valid[i]=0; | ||
502 | } | ||
503 | } | ||
504 | newFPnt[i*2+0]=fPnt[i*2+0]+dX; | ||
505 | newFPnt[i*2+1]=fPnt[i*2+1]+dY; | ||
506 | /* | ||
507 | if(valid[i] | ||
508 | || (x+dX-winSize)<0 || (y+dY-winSize)<0 | ||
509 | || (y+dY+winSize+1)>=imgSize[0] || (x+dX+winSize+1)>=imgSize[1]){ | ||
510 | newFPnt[i*2+0]=fPnt[i*2+0]+dX; | ||
511 | newFPnt[i*2+1]=fPnt[i*2+1]+dY; | ||
512 | getInterpolatePatch(jP[0], imgSize, newFPnt[i*2+0], newFPnt[i*2+0], winSize, jPatch); | ||
513 | dIt=0; | ||
514 | for(idx=0;idx<winSizeSq;idx++){ | ||
515 | dIt+=(iPatch[idx]-jPatch[idx])*(iPatch[idx]-jPatch[idx]); | ||
516 | } | ||
517 | if(dIt>winSizeSq*50000){ | ||
518 | valid[i]=0; | ||
519 | } | ||
520 | }else{ | ||
521 | newFPnt[i*2+0]=0; | ||
522 | newFPnt[i*2+1]=0; | ||
523 | } | ||
524 | */ | ||
525 | } | ||
526 | free(iPatch); | ||
527 | free(jPatch); | ||
528 | free(iDxPatch); | ||
529 | free(iDyPatch); | ||
530 | } | ||
531 | void calcPyrLKTrackWInit(double** iP, double** iDxP, double** iDyP, double** jP, const int* imgDims, int pLevel, | ||
532 | double* fPnt, int nFeatures, int winSize, | ||
533 | double* newFPnt, double* initFPnt, | ||
534 | char* valid, double accuracy_th, int max_iter){ | ||
535 | |||
536 | double x, y, eX, eY, dX, dY, mX, mY, prevMX, prevMY, c_xx, c_xy, c_yy, c_det, dIt; | ||
537 | double* iPatch, *jPatch, *iDxPatch, *iDyPatch; | ||
538 | int level, winSizeSq; | ||
539 | int i, k, idx; | ||
540 | int imgSize[2]; | ||
541 | |||
542 | static const double rate[]={1, 0.5, 0.25, 0.125, 0.0625, 0.03125}; | ||
543 | winSizeSq=4*winSize*winSize; | ||
544 | |||
545 | iPatch=(double*) malloc(sizeof(double)*winSizeSq); | ||
546 | jPatch=(double*) malloc(sizeof(double)*winSizeSq); | ||
547 | iDxPatch=(double*) malloc(sizeof(double)*winSizeSq); | ||
548 | iDyPatch=(double*) malloc(sizeof(double)*winSizeSq); | ||
549 | |||
550 | for(i=0; i<nFeatures; i++){ | ||
551 | dX=(initFPnt[i*2+0]-fPnt[i*2+0])*rate[pLevel]; | ||
552 | dY=(initFPnt[i*2+1]-fPnt[i*2+1])*rate[pLevel]; | ||
553 | x=fPnt[i*2+0]*rate[pLevel];//half size of real level | ||
554 | y=fPnt[i*2+1]*rate[pLevel]; | ||
555 | for(level=pLevel-1; level>=0; level--){ | ||
556 | x+=x; y+=y; dX+=dX; dY+=dY; | ||
557 | imgSize[0]=imgDims[level*2+0]; //y,x | ||
558 | imgSize[1]=imgDims[level*2+1]; //y,x | ||
559 | |||
560 | c_xx=c_xy=c_yy=0; | ||
561 | //when feature goes out to the boundary. | ||
562 | if((x-winSize)<0 || (y-winSize)<0 | ||
563 | || (y+winSize+1)>=imgSize[0] || (x+winSize+1)>=imgSize[1]){ | ||
564 | //winSize+1due to interpolation | ||
565 | //error or skip the level?? | ||
566 | valid[i]=0; | ||
567 | break; | ||
568 | } | ||
569 | |||
570 | getInterpolatePatch(iP[level], imgSize, x, y, winSize, iPatch); | ||
571 | getInterpolatePatch(iDxP[level], imgSize, x, y, winSize, iDxPatch); | ||
572 | getInterpolatePatch(iDyP[level], imgSize, x, y, winSize, iDyPatch); | ||
573 | |||
574 | for(idx=0; idx<winSizeSq;idx++){ | ||
575 | c_xx+=iDxPatch[idx]*iDxPatch[idx]; | ||
576 | c_xy+=iDxPatch[idx]*iDyPatch[idx]; | ||
577 | c_yy+=iDyPatch[idx]*iDyPatch[idx]; | ||
578 | } | ||
579 | c_det=c_xx*c_yy-c_xy*c_xy; | ||
580 | if(c_det/(c_xx+c_yy+0.00000001)<GOOD_FEATURE_LAMBDA_TH){ | ||
581 | //just skip? | ||
582 | valid[i]=0; | ||
583 | break; | ||
584 | } | ||
585 | c_det=1/c_det; | ||
586 | for(k=0; k<max_iter; k++){ | ||
587 | if((x+dX-winSize)<0 || (y+dY-winSize)<0 | ||
588 | || (y+dY+winSize+1)>=imgSize[0] || (x+dX+winSize+1)>=imgSize[1]){ | ||
589 | //winSize+1due to interpolation | ||
590 | //error or skip the level?? | ||
591 | valid[i]=0; | ||
592 | break; | ||
593 | } | ||
594 | getInterpolatePatch(jP[level], imgSize, x+dX, y+dY, winSize, jPatch); | ||
595 | eX=eY=0; | ||
596 | for(idx=0;idx<winSizeSq;idx++){ | ||
597 | dIt=iPatch[idx]-jPatch[idx]; | ||
598 | eX+=dIt*iDxPatch[idx]; | ||
599 | eY+=dIt*iDyPatch[idx]; | ||
600 | } | ||
601 | mX=c_det*(eX*c_yy-eY*c_xy); | ||
602 | mY=c_det*(-eX*c_xy+eY*c_xx); | ||
603 | dX+=mX; | ||
604 | dY+=mY; | ||
605 | if((mX*mX+mY*mY)<accuracy_th) break; | ||
606 | if( k>0 && (mX + prevMX) < 0.01 && (mX+prevMX) > -0.01 | ||
607 | && (mY + prevMY) < 0.01 && (mY+prevMY) > -0.01) | ||
608 | { | ||
609 | dX -= mX*0.5f; | ||
610 | dY -= mY*0.5f; | ||
611 | break; | ||
612 | } | ||
613 | prevMX=mX; | ||
614 | prevMY=mY; | ||
615 | } | ||
616 | if(k==max_iter){ | ||
617 | valid[i]=0; | ||
618 | } | ||
619 | } | ||
620 | newFPnt[i*2+0]=fPnt[i*2+0]+dX; | ||
621 | newFPnt[i*2+1]=fPnt[i*2+1]+dY; | ||
622 | /* | ||
623 | if(valid[i] | ||
624 | || (x+dX-winSize)<0 || (y+dY-winSize)<0 | ||
625 | || (y+dY+winSize+1)>=imgSize[0] || (x+dX+winSize+1)>=imgSize[1]){ | ||
626 | newFPnt[i*2+0]=fPnt[i*2+0]+dX; | ||
627 | newFPnt[i*2+1]=fPnt[i*2+1]+dY; | ||
628 | getInterpolatePatch(jP[0], imgSize, newFPnt[i*2+0], newFPnt[i*2+0], winSize, jPatch); | ||
629 | dIt=0; | ||
630 | for(idx=0;idx<winSizeSq;idx++){ | ||
631 | dIt+=(iPatch[idx]-jPatch[idx])*(iPatch[idx]-jPatch[idx]); | ||
632 | } | ||
633 | if(dIt>winSizeSq*50000){ | ||
634 | valid[i]=0; | ||
635 | } | ||
636 | }else{ | ||
637 | newFPnt[i*2+0]=0; | ||
638 | newFPnt[i*2+1]=0; | ||
639 | } | ||
640 | */ | ||
641 | } | ||
642 | free(iPatch); | ||
643 | free(jPatch); | ||
644 | free(iDxPatch); | ||
645 | free(iDyPatch); | ||
646 | } | ||
647 | void calcPyrLKTrack(double** iP, double** iDxP, double** iDyP, double** jP, const int* imgDims, int pLevel, | ||
648 | double* fPnt, int nFeatures, int winSize, | ||
649 | double* newFPnt, char* valid, double accuracy_th, int max_iter){ | ||
650 | |||
651 | double x, y, eX, eY, dX, dY, mX, mY, c_xx, c_xy, c_yy, c_det, dIt; | ||
652 | double* iPatch, *jPatch, *iDxPatch, *iDyPatch; | ||
653 | int level, winSizeSq; | ||
654 | int i, k, idx; | ||
655 | int imgSize[2]; | ||
656 | |||
657 | static const double rate[]={1, 0.5, 0.25, 0.125, 0.0625, 0.03125}; | ||
658 | winSizeSq=4*winSize*winSize; | ||
659 | |||
660 | iPatch=(double*) malloc(sizeof(double)*winSizeSq); | ||
661 | jPatch=(double*) malloc(sizeof(double)*winSizeSq); | ||
662 | iDxPatch=(double*) malloc(sizeof(double)*winSizeSq); | ||
663 | iDyPatch=(double*) malloc(sizeof(double)*winSizeSq); | ||
664 | |||
665 | for(i=0; i<nFeatures; i++){ | ||
666 | dX=0; | ||
667 | dY=0; | ||
668 | x=fPnt[i*2+0]*rate[pLevel];//half size of real level | ||
669 | y=fPnt[i*2+1]*rate[pLevel]; | ||
670 | for(level=pLevel-1; level>=0; level--){ | ||
671 | x+=x; y+=y; dX+=dX; dY+=dY; | ||
672 | imgSize[0]=imgDims[level*2+0]; //y,x | ||
673 | imgSize[1]=imgDims[level*2+1]; //y,x | ||
674 | |||
675 | c_xx=c_xy=c_yy=0; | ||
676 | //when feature goes out to the boundary. | ||
677 | if((x-winSize)<0 || (y-winSize)<0 | ||
678 | || (y+winSize+1)>=imgSize[0] || (x+winSize+1)>=imgSize[1]){ | ||
679 | //winSize+1due to interpolation | ||
680 | //error or skip the level?? | ||
681 | valid[i]=0; | ||
682 | break; | ||
683 | } | ||
684 | |||
685 | getInterpolatePatch(iP[level], imgSize, x, y, winSize, iPatch); | ||
686 | getInterpolatePatch(iDxP[level], imgSize, x, y, winSize, iDxPatch); | ||
687 | getInterpolatePatch(iDyP[level], imgSize, x, y, winSize, iDyPatch); | ||
688 | |||
689 | for(idx=0; idx<winSizeSq;idx++){ | ||
690 | c_xx+=iDxPatch[idx]*iDxPatch[idx]; | ||
691 | c_xy+=iDxPatch[idx]*iDyPatch[idx]; | ||
692 | c_yy+=iDyPatch[idx]*iDyPatch[idx]; | ||
693 | } | ||
694 | c_det=c_xx*c_yy-c_xy*c_xy; | ||
695 | if(c_det/(c_xx+c_yy+0.00000001)<GOOD_FEATURE_LAMBDA_TH){ | ||
696 | valid[i]=0; | ||
697 | break; | ||
698 | } | ||
699 | c_det=1/c_det; | ||
700 | for(k=0; k<max_iter; k++){ | ||
701 | if((x+dX-winSize)<0 || (y+dY-winSize)<0 | ||
702 | || (y+dY+winSize+1)>=imgSize[0] || (x+dX+winSize+1)>=imgSize[1]){ | ||
703 | //winSize+1due to interpolation | ||
704 | //error or skip the level?? | ||
705 | valid[i]=0; | ||
706 | break; | ||
707 | } | ||
708 | getInterpolatePatch(jP[level], imgSize, x+dX, y+dY, winSize, jPatch); | ||
709 | eX=eY=0; | ||
710 | for(idx=0;idx<winSizeSq;idx++){ | ||
711 | dIt=iPatch[idx]-jPatch[idx]; | ||
712 | eX+=dIt*iDxPatch[idx]; | ||
713 | eY+=dIt*iDyPatch[idx]; | ||
714 | } | ||
715 | mX=c_det*(eX*c_yy-eY*c_xy); | ||
716 | mY=c_det*(-eX*c_xy+eY*c_xx); | ||
717 | dX+=mX; | ||
718 | dY+=mY; | ||
719 | if((mX*mX+mY*mY)<accuracy_th) break; | ||
720 | } | ||
721 | } | ||
722 | newFPnt[i*2+0]=fPnt[i*2+0]+dX; | ||
723 | newFPnt[i*2+1]=fPnt[i*2+1]+dY; | ||
724 | /* | ||
725 | if(valid[i] | ||
726 | || (x+dX-winSize)<0 || (y+dY-winSize)<0 | ||
727 | || (y+dY+winSize+1)>=imgSize[0] || (x+dX+winSize+1)>=imgSize[1]){ | ||
728 | newFPnt[i*2+0]=fPnt[i*2+0]+dX; | ||
729 | newFPnt[i*2+1]=fPnt[i*2+1]+dY; | ||
730 | getInterpolatePatch(jP[0], imgSize, newFPnt[i*2+0], newFPnt[i*2+0], winSize, jPatch); | ||
731 | dIt=0; | ||
732 | for(idx=0;idx<winSizeSq;idx++){ | ||
733 | dIt+=(iPatch[idx]-jPatch[idx])*(iPatch[idx]-jPatch[idx]); | ||
734 | } | ||
735 | if(dIt>winSizeSq*50000){ | ||
736 | valid[i]=0; | ||
737 | } | ||
738 | }else{ | ||
739 | newFPnt[i*2+0]=0; | ||
740 | newFPnt[i*2+1]=0; | ||
741 | } | ||
742 | */ | ||
743 | } | ||
744 | free(iPatch); | ||
745 | free(jPatch); | ||
746 | free(iDxPatch); | ||
747 | free(iDyPatch); | ||
748 | } | ||
749 | void getPatch(double* srcImg, const int* srcDims, double centerX, double centerY, int winSize, double** dstImg){ | ||
750 | int srcIdxX, srcIdxY, dstIdxX; | ||
751 | srcIdxY=(int)centerY-winSize; | ||
752 | for(int i=-winSize; i<winSize; i++){ | ||
753 | srcIdxX=(int)centerX+i; | ||
754 | dstIdxX=i+winSize; | ||
755 | dstImg[dstIdxX]=srcImg+srcIdxX*winSize*2+srcIdxY; | ||
756 | } | ||
757 | } | ||
758 | void calcLKTrack(double* imgI, double* iDx, double* iDy, double* imgJ, const int* imdims, | ||
759 | double* c_xx, double* c_xy, double* c_yy, | ||
760 | double* fPnt, double* initPnt, int nFeatures, int winSize, | ||
761 | double* newFPnt, char* valid){ | ||
762 | calcLKTrack( imgI, iDx, iDy, imgJ, imdims, | ||
763 | c_xx, c_xy, c_yy, | ||
764 | fPnt, initPnt, nFeatures, winSize, | ||
765 | newFPnt, valid, LK_ACCURACY_TH, LK_MAX_ITER); | ||
766 | } | ||
767 | void calcLKTrack(double* imgI, double* iDx, double* iDy, double* imgJ, const int* imdims, | ||
768 | double* c_xx, double* c_xy, double* c_yy, | ||
769 | double* fPnt, double* initPnt, int nFeatures, int winSize, | ||
770 | double* newFPnt, char* valid, | ||
771 | double accuracy_th, int max_iter){ | ||
772 | double x, y, eX, eY, dX, dY, mX, mY, c_det, dIt; | ||
773 | double* iPatch[LK_MAX_WIN], *iDxPatch[LK_MAX_WIN], *iDyPatch[LK_MAX_WIN]; | ||
774 | double* jPatch; | ||
775 | int level, winSizeSq; | ||
776 | int i, k, idxCol, idxRow, idx; | ||
777 | int imgSize[2]; | ||
778 | |||
779 | jPatch=(double*) malloc(sizeof(double)*winSizeSq); | ||
780 | winSizeSq=4*winSize*winSize; | ||
781 | imgSize[0]=imdims[0]; | ||
782 | imgSize[1]=imdims[1]; | ||
783 | for(i=0; i<nFeatures; i++){ | ||
784 | x=fPnt[i*2+0];//half size of real level | ||
785 | y=fPnt[i*2+1]; | ||
786 | dX=initPnt[i*2+0]-x; | ||
787 | dY=initPnt[i*2+1]-y; | ||
788 | //printf("input dx dy %.2f %.2f:", dX, dY); | ||
789 | |||
790 | //when feature goes out to the boundary. | ||
791 | if((x-winSize)<0 || (y-winSize)<0 | ||
792 | || (y+winSize)>=imdims[0] || (x+winSize)>=imdims[1]){ | ||
793 | //error or skip the level?? | ||
794 | valid[i]=0; | ||
795 | continue; | ||
796 | } | ||
797 | |||
798 | getPatch(imgI, imdims, x, y, winSize, iPatch); | ||
799 | getPatch(iDx, imdims, x, y, winSize, iDxPatch); | ||
800 | getPatch(iDy, imdims, x, y, winSize, iDyPatch); | ||
801 | |||
802 | idx=(int)x*imdims[0]+(int)y; | ||
803 | c_det=c_xx[i]*c_yy[i]-c_xy[i]*c_xy[i]; | ||
804 | if(c_det/(c_xx[i]+c_yy[i]+0.00000001)<GOOD_FEATURE_LAMBDA_TH*100){ | ||
805 | valid[i]=0; | ||
806 | continue; | ||
807 | } | ||
808 | c_det=1/c_det; | ||
809 | for(k=0; k<max_iter; k++){ | ||
810 | if((x+dX-winSize)<0 || (y+dY-winSize)<0 | ||
811 | || (y+dY+winSize+1)>=imdims[0] || (x+dX+winSize+1)>=imdims[1]){ | ||
812 | //winSize+1due to interpolation | ||
813 | //error or skip the level?? | ||
814 | valid[i]=0; | ||
815 | break; | ||
816 | } | ||
817 | getInterpolatePatch(imgJ, imgSize, x+dX, y+dY, winSize, jPatch); | ||
818 | eX=eY=0; | ||
819 | for(idxCol=0;idxCol<2*winSize;idxCol++){ | ||
820 | for(idxRow=0;idxRow<2*winSize;idxRow++){ | ||
821 | dIt=iPatch[idxCol][idxRow]-jPatch[idxCol*winSize*2+idxRow]; | ||
822 | eX+=dIt*iDxPatch[idxCol][idxRow]; | ||
823 | eY+=dIt*iDyPatch[idxCol][idxRow]; | ||
824 | } | ||
825 | } | ||
826 | mX=c_det*(eX*c_yy[i]-eY*c_xy[i]); | ||
827 | mY=c_det*(-eX*c_xy[i]+eY*c_xx[i]); | ||
828 | dX+=mX; | ||
829 | dY+=mY; | ||
830 | if((mX*mX+mY*mY)<accuracy_th) break; | ||
831 | } | ||
832 | if(k==max_iter){ | ||
833 | valid[i]=0; | ||
834 | } | ||
835 | newFPnt[i*2+0]=x+dX; | ||
836 | newFPnt[i*2+1]=y+dY; | ||
837 | } | ||
838 | free(jPatch); | ||
839 | } | ||
840 | |||
diff --git a/SD-VBS/common/toolbox/lagrcv/lagrcv.h b/SD-VBS/common/toolbox/lagrcv/lagrcv.h new file mode 100755 index 0000000..74d31f1 --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/lagrcv.h | |||
@@ -0,0 +1,51 @@ | |||
1 | #include <math.h> | ||
2 | #include <assert.h> | ||
3 | #include <string.h> | ||
4 | #include <stdlib.h> | ||
5 | #include <stdio.h> | ||
6 | #include <limits.h> | ||
7 | #include <float.h> | ||
8 | |||
9 | #define GOOD_FEATURE_LAMBDA_TH 10 | ||
10 | #define LK_ACCURACY_TH 0.03 | ||
11 | #define LK_MAX_ITER 20 | ||
12 | #define LK_MAX_WIN 25 | ||
13 | #define MAX_LEVEL 10 | ||
14 | #define MAX_IMAGE_SIZE_1D 1000000 | ||
15 | |||
16 | void calcSubSampleAvg(double *src, int sizeY, int sizeX, double *dest, int destSizeY, int destSizeX); | ||
17 | void calcImgBlur(double *src, int sizeY, int sizeX, double *dest); | ||
18 | void calcImgResize(double *src, int sizeY, int sizeX, double *dest, int dstSizeY, int dstSizeX); | ||
19 | void calcGradient(double *src, int sizeY, int sizeX, double *dX, double *dY); | ||
20 | void calcGradient(char *src, int sizeY, int sizeX, char *dX, char *dY); | ||
21 | void calcSobel(double *src, int sizeX, int sizeY, double *dx, double *dy); | ||
22 | void calcGoodFeature(double *dX, double *dY, int sizeY, int sizeX, int winSize, double* lambda, double* tr, double* det, | ||
23 | double* c_xx, double* c_xy, double* c_yy); | ||
24 | void calcGoodFeature(char *dX, char *dY, int sizeY, int sizeX, int winSize, float* lambda, float* tr, float* det); | ||
25 | void calcMinEigenValue(char *dX, char *dY, int sizeY, int sizeX, float* lambda); | ||
26 | void calcAreaSum(int *src, int sizeY, int sizeX, int sizeSum, int *ret); | ||
27 | void calcAreaSum(double *src, int sizeY, int sizeX, int sizeSum, double *ret); | ||
28 | void calcPyrLKTrack(double** iP, double** iDxP, double** iDyP, double** jP, const int* imgDims, int pLevel, | ||
29 | double* fPnt, int nFeatures, int winSize, | ||
30 | double* newFPnt, char* valid); | ||
31 | void calcPyrLKTrack(double** iP, double** iDxP, double** iDyP, double** jP, const int* imgDims, int pLevel, | ||
32 | double* fPnt, int nFeatures, int winSize, | ||
33 | double* newFPnt, char* valid, | ||
34 | double accuracy_th, int iter); | ||
35 | void calcLKTrack(double* imgI, double* iDx, double* iDy, double* imgJ, const int* imdims, | ||
36 | double* c_xx, double* c_xy, double* c_yy, | ||
37 | double* fPnt, double* initPnt, int nFeatures, int winSize, | ||
38 | double* newFPnt, char* valid, | ||
39 | double accuracy_th, int max_iter); | ||
40 | void calcLKTrack(double* imgI, double* iDx, double* iDy, double* imgJ, const int* imdims, | ||
41 | double* c_xx, double* c_xy, double* c_yy, | ||
42 | double* fPnt, double* initPnt, int nFeatures, int winSize, | ||
43 | double* newFPnt, char* valid); | ||
44 | void calcPyrLKTrackWInit(double** iP, double** iDxP, double** iDyP, double** jP, const int* imgDims, int pLevel, | ||
45 | double* fPnt, int nFeatures, int winSize, | ||
46 | double* newFPnt, double* initFPnt, | ||
47 | char* valid, double accuracy_th, int max_iter); | ||
48 | void calcPyrLKTrackWInit(double** iP, double** jP, const int* imgDims, int pLevel, | ||
49 | double* fPnt, int nFeatures, int winSize, | ||
50 | double* newFPnt, double* initFPnt, | ||
51 | char* valid, double accuracy_th, int max_iter); | ||
diff --git a/SD-VBS/common/toolbox/lagrcv/liblagrcv.a b/SD-VBS/common/toolbox/lagrcv/liblagrcv.a new file mode 100755 index 0000000..a7a39ae --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/liblagrcv.a | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/lagrcv/lk_flow.cc b/SD-VBS/common/toolbox/lagrcv/lk_flow.cc new file mode 100755 index 0000000..c083048 --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/lk_flow.cc | |||
@@ -0,0 +1,76 @@ | |||
1 | |||
2 | /* compile with | ||
3 | lk_flow.cc -I/usr/local/opencv/include -L/usr/local/opencv/lib -lcxcore -lcv | ||
4 | */ | ||
5 | |||
6 | #include "mex.h" | ||
7 | #include "opencv/cv.h" | ||
8 | #include "opencv/highgui.h" | ||
9 | #include <stdio.h> | ||
10 | #include <math.h> | ||
11 | |||
12 | void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { | ||
13 | // usage: [ velx vely ] = lk_flow(image1,image2,winsize) | ||
14 | // images must be single-channel, 8-bit | ||
15 | |||
16 | const int *backwards_imdims = mxGetDimensions(prhs[0]); | ||
17 | int imdims[2] = { backwards_imdims[1], backwards_imdims[0] }; | ||
18 | int winsize = (int)mxGetScalar(prhs[2]); | ||
19 | plhs[0] = mxCreateNumericArray(2, imdims, mxSINGLE_CLASS, mxREAL); | ||
20 | plhs[1] = mxCreateNumericArray(2, imdims, mxSINGLE_CLASS, mxREAL); | ||
21 | |||
22 | printf("imsize %d %d\n", imdims[0], imdims[1]); | ||
23 | |||
24 | IplImage *im1 = | ||
25 | cvCreateImageHeader(cvSize(imdims[0], imdims[1]), IPL_DEPTH_8U, 1); | ||
26 | IplImage *im2 = | ||
27 | cvCreateImageHeader(cvSize(imdims[0], imdims[1]), IPL_DEPTH_8U, 1); | ||
28 | IplImage *flow_x = | ||
29 | cvCreateImageHeader(cvSize(imdims[0], imdims[1]), IPL_DEPTH_32F, 1); | ||
30 | IplImage *flow_y = | ||
31 | cvCreateImageHeader(cvSize(imdims[0], imdims[1]), IPL_DEPTH_32F, 1); | ||
32 | |||
33 | im1->imageData = (char*)mxGetPr(prhs[0]); | ||
34 | im2->imageData = (char*)mxGetPr(prhs[1]); | ||
35 | flow_x->imageData = (char*)mxGetPr(plhs[0]); | ||
36 | flow_y->imageData = (char*)mxGetPr(plhs[1]); | ||
37 | |||
38 | cvCalcOpticalFlowLK(im1, im2, cvSize(winsize,winsize), flow_x, flow_y); | ||
39 | |||
40 | for (int row = 0; row < imdims[0]; row += 10) { | ||
41 | for (int col = 0; col < imdims[1]; col += 10) { | ||
42 | cvLine(im1, cvPoint(col,row), | ||
43 | cvPoint(int(col + flow_x->imageData[imdims[1] * row + col]), | ||
44 | int(row + flow_y->imageData[imdims[1] * row + col])), | ||
45 | CV_RGB(1,0,0), | ||
46 | 1, | ||
47 | CV_AA, | ||
48 | 0); | ||
49 | |||
50 | } | ||
51 | } | ||
52 | |||
53 | cvDestroyAllWindows(); | ||
54 | cvNamedWindow("imfoo",CV_WINDOW_AUTOSIZE); | ||
55 | // IplImage *myim = cvLoadImage("lena.jpg", -1); | ||
56 | cvShowImage("imfoo",im1); | ||
57 | // cvShowImage("imfoo",myim); | ||
58 | cvWaitKey(0); | ||
59 | |||
60 | // cvCircle(flow_x, cvPoint( 40, 20), 15, CV_RGB(10,100,100), 5); | ||
61 | |||
62 | /* | ||
63 | FILE* filefx = fopen("fx.pgm", "w"); | ||
64 | FILE* filefy = fopen("fy.pgm", "w"); | ||
65 | fprintf(filefx, "P5\n%d %d\n255\n", imdims[1], imdims[0]); | ||
66 | fprintf(filefy, "P5\n%d %d\n255\n", imdims[1], imdims[0]); | ||
67 | float *ptr = (float*)flow_x->imageData; | ||
68 | for (int i = 0; i < imdims[1] * imdims[0]; i++) { | ||
69 | // if (fabs(++ptr*) > 0.1) | ||
70 | if (fabs(*ptr++) > 0.1) fprintf(filefx, "1"); | ||
71 | else fprintf(filefx, "0"); | ||
72 | } | ||
73 | fclose(filefx); | ||
74 | fclose(filefy); | ||
75 | */ | ||
76 | } | ||
diff --git a/SD-VBS/common/toolbox/lagrcv/lk_flow.mexglx b/SD-VBS/common/toolbox/lagrcv/lk_flow.mexglx new file mode 100755 index 0000000..d6c1136 --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/lk_flow.mexglx | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/lagrcv/test.cc b/SD-VBS/common/toolbox/lagrcv/test.cc new file mode 100755 index 0000000..d18144c --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/test.cc | |||
@@ -0,0 +1,34 @@ | |||
1 | |||
2 | /* compile with | ||
3 | mex goodFeaturesToTrack.cc -I/usr/local/opencv/include -L/usr/local/opencv/lib -lcxcore -lcv | ||
4 | mex test.cc -L/home/ikkjin/LagrMatlab/opencv/matlab -llagrcv -I/home/ikkjin/LagrMatlab/opencv/matlab/ | ||
5 | */ | ||
6 | |||
7 | #include "mex.h" | ||
8 | #include "lagrcv.h" | ||
9 | #include <stdio.h> | ||
10 | #include <math.h> | ||
11 | |||
12 | #define MAX_CORNERS 500 | ||
13 | #define MAX_SIZE 700 | ||
14 | |||
15 | // TODO: add number of corners parameter | ||
16 | void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { | ||
17 | // usage: [ features numvalid ] = | ||
18 | // goodFeaturesToTrack(image, quality, mindist, mask) | ||
19 | // image must be single-channel, 8-bit | ||
20 | // quality = minimum acceptable ratio of eigenvalues | ||
21 | // mindist = minimum distance between corners | ||
22 | // mask (optional) = bitmap mask "region of interest" (MUST BE uint8 TYPE!) | ||
23 | |||
24 | char *image = (char*)mxGetPr(prhs[0]); | ||
25 | char *sum; | ||
26 | // int imdims[] = { (int)d_imdims[0], (int)d_imdims[1] }; | ||
27 | const int *imdims = mxGetDimensions(prhs[0]); | ||
28 | |||
29 | plhs[0] = mxCreateNumericMatrix(imdims[0], imdims[1], mxINT8_CLASS, mxREAL); | ||
30 | |||
31 | sum = (char*)mxGetPr(plhs[0]); | ||
32 | |||
33 | calcAreaSum(image, imdims[0], imdims[1], 8, sum); | ||
34 | } | ||
diff --git a/SD-VBS/common/toolbox/lagrcv/test/getPyramid.m b/SD-VBS/common/toolbox/lagrcv/test/getPyramid.m new file mode 100755 index 0000000..ecae078 --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/test/getPyramid.m | |||
@@ -0,0 +1,10 @@ | |||
1 | function pyr=getPyramid(img, level) | ||
2 | kernel=[1/16 1/4 3/8 1/4 1/16]; | ||
3 | pyr=cell(level,1); | ||
4 | pyr{1}=double(img); | ||
5 | for i=2:level | ||
6 | % imgBlur=conv2(pyr{i-1}, kernel, 'same'); | ||
7 | % imgBlur=conv2(imgBlur, kernel, 'same'); | ||
8 | % pyr{i}=imgBlur(1:2:end, 1:2:end); | ||
9 | pyr{i}=calcResizedImgMex(pyr{i-1}); | ||
10 | end | ||
diff --git a/SD-VBS/common/toolbox/lagrcv/test/img0.ppm b/SD-VBS/common/toolbox/lagrcv/test/img0.ppm new file mode 100755 index 0000000..816e0ad --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/test/img0.ppm | |||
@@ -0,0 +1,3137 @@ | |||
1 | P6 | ||
2 | 512 384 | ||
3 | 255 | ||
4 | ó | ||
5 | |||
6 | |||
7 | |||
8 | |||
9 | |||
10 | |||
11 | |||
12 | # | ||
13 | |||
14 | |||
15 | |||
16 | #"08%9+!5.(;(07.)2.#3*#+'&)!##).!%.")#%!!"$% "#! %)$32+):/, )$"%28)+&!$"& ! %#('(%$!/!+&"1/34-1"6 5 *"! | ||
17 | !% | ||
18 | |||
19 | |||
20 | '491F,<6($ "!%'!"*-#( | ||
21 | "2*# | ||
22 | #?64&DC$1$#./+2.)$ 0-"-A*&2$",/.?>::4@,5$/7A58T*37,%(("/72>,1-20>=):.8!2 % 5%;&6 | ||
23 | |||
24 | " | ||
25 | #'O<L8MGD | ||
26 | 3%68)R=;9&"*#%" | ||
27 | |||
28 | 4H0 !" #!#$(!""$"+%.$$!'+-AB/0['Hd)ekSC$=;*A@(3>$6L'CC:KTLri@Kf5QV(KHE<#E7,*#(+-FH2FB&?:0?C7CM8@<0JE*?F.99(-',?/6;?/@J2QY%W[!7O+3?8:H=?J7GK<MTKLdNI]6<O-1H30@0+8.4<)D91TN8QTK@\\3OQDV9OW8U[7OVDM\>PdCP]IZmIWp`I]“YlÀvyyƒˆRxŠ@j€7a{8YgAA@[AKMTSHVZM[oXVbQJcL]lL]r^p‹ˆƒË±ÿÿ˜ÿÿ“ºÌ—œÿ—ÿÿüÿÿÿÿÿ±ÿÿ–ÿÿd÷ÿq®¬ÿ¨”ÿÊìÿËÿ¼ÿÿåÿÿŠýÿÍÿÿîÿÿøÿÿÎöÿÿÿôÿÿÿÿÿÿÿÿÿÿÿÿÿÿ[Z]SIPZCOSKLULJRMQTPWSp ÅãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÆÿÿÉÿÿ¬n~dYcQHWdA\mQceGHE31257=CNENI8>A;1;U3Bh9Mp,J—&G¢0<`4:J | ||
29 | |||
30 | |||
31 | |||
32 | |||
33 | |||
34 | |||
35 | |||
36 | |||
37 | $ | ||
38 | " #".7 8, ,,)+)*+'%*#"&!#" &#&"!"'& %#" ! # %).,*&-)#5).577 2?!5! ##"! *#$(!+))+-)&,#064'**$%!! ""! $$ | ||
39 | % | ||
40 | |||
41 | |||
42 | |||
43 | |||
44 | |||
45 | ( "!#++"-0*- #'"-0#+*"# " #)+*'* | ||
46 | * # !$*6*4;2-73*40:8+9" !!!+$22&)!$*(+1(2+0-(%17(9J*,A%"%"'#&/#3-1>(,(3:(,+1&3*%"& | ||
47 | |||
48 | |||
49 | * | ||
50 | |||
51 | ,* +)% ;(/E?Z*(", % & 60 | ||
52 | -A d;! | ||
53 | &1$ $ !!!$",'!"!"! &&(!%+ ,/%" %#);#.N*,BOZFnx,~c-L?0/8"QR(@Q9PdR„‚Y\rOQfAQ]+L])A_&?H!1;2;L84G28G1MJ</9D:9;5?A6A0?A&IJ'NP18<43B=3E:6C,5G*:G27>A3;?=A8KNGLRGJ`@CN==A6*3-11*/47:A7ZP<TO;>D>7C@6J9CQ7CQ:F[?YW;LX>Wk:av@hzDhgZ`or^‡oaŽa_Rp†Ag€BLr@GZ0AN?CPL8NVIbWCSU.GZRZ__mq·’°ÿÏÿÿÿÿÿÿÿÝãɇ“ÿ‡¥ÿwÕÿ¡ÿÿœÔÿu‘ÿy€ÿx—êšüÿóÿÿÿÿÿlªÿV·ÿ¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿíÿÿÿÿÿ¤çþUN_RKZXLU]JTYHTOCULHg]cɬºÿÏÿÿÎÿÿÿÿÿÿÿÿÿÿÿðéÿz®ÀXtwXdb`ZP_WQM^XaZQJA892246C?FGJH?@>449<><J6AV.3S(/I-2<7;f | ||
54 | |||
55 | |||
56 | |||
57 | |||
58 | |||
59 | |||
60 | ! !"3 )% /( | ||
61 | |||
62 | |||
63 | # "18%0*!&+'!$$ !!"* "" !!'#&++' )#*-%0'')12.'0 .*"$+'2#3328/4#3!.+ $"*0*.3+)$+**1+. " | ||
64 | |||
65 | |||
66 | |||
67 | |||
68 | " " "! (.5;/:!&(-( (-,*!4*53/71+$#$(/##)3'(361:9#>C'??#19'#,,+-1-,('!''%"!#'(&*%'!% ( !16!/6!,%.&-$'$ !6 5,I60@/3(7*."%* | ||
69 | ' # !"' | ||
70 | (**5;4 | ||
71 | E& " " *1-G0I.94/ | ||
72 | &/. ?? | ||
73 | }@ ˆ]9T)>/#=" | ||
74 | ##:5-1 "!"%!&##" #"!#')&"''*#-3%D7-`GGzm_`~F{y-ig1[c<;F?1=^G€cg„@R\A@U=7O<.=D.>1->40;A8?755D8B>0;45;387=247M@6CBC[_FWU-I@/<?.6@,3:(<80<91BA4LM6QQ<]Z?OS?GR;QW/ZM)[E*G=0MEBAQG=U:IS0QN,7@7.><7F:GGCOS;R\ASkD[nJpyEoƒQs‚_†‡wbhgZecf|Ng}<kzBxy3uo8VT<=;FEHN<DA-2I9LZJh‘n¶òáÿÿÿÿÿÿÿÿéëÛŠž´v†ÝPnÿd—îu£¯m“–“˜¤wŒÿZšÿCµÿkæÿ_|ÖHaÔe™ÿ•ÿÿ¿ÿÿöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷¾¢\OYVKY`M\_PVXMSQHPJK`[‹®ÿýÿÿÿÿÕÿÿùÿÿÁÿÿŠÎÿz¡ÏYf™MWi]cf{fYU`OeaVxoQUJ9D98KDA‡nSxaE<D7<F8CJ77B,.:-,0-24036J | ||
75 | |||
76 | |||
77 | |||
78 | |||
79 | |||
80 | |||
81 | |||
82 | |||
83 | |||
84 | ! | ||
85 | '#//,+0.#6) | ||
86 | ""$(# (5@&;.!7((%!$$#!!# " '&!!& '$%( %")#)$ )0&&$ %&1 &'../,'(4,.+ !''%%2 '!() ! | ||
87 | |||
88 | |||
89 | |||
90 | |||
91 | |||
92 | |||
93 | $#+)" 39$I7 "#"!!*("'(/* ' -)#7#$/'/(%&<3 & )-+2?.D76!98+C!$?/)41(2)(!#!" )#+#& ""&/%-.*$)*/'3'/'.)%3+ 4(0&7%8(;./3'%$"15)9I0:%!"($&#)) 1 $O& 74$<12DA | ||
94 | %=;"5*2 | ||
95 | '"&3")##'71N==N; <31!6C'616%<3$7?08Q:[hQYc79'1 8 | ||
96 | |||
97 | |||
98 | |||
99 | *%67!#@ ! " " !%()#%$ ! #!+/'JQ2[nDcƒYKhc]wVKhBO]9L_*DK>54rAKaBQ7@I;5@7"4.*7).6&>:,B@.6=42;84:-=>23@++/2);A1DAU^Ftr@DY/=H+2A*4@&9B/48-GE9GM?S^?[\BSWB8L6?M=JY9M]:OT<BJ@uZB—RA8CBDT-6D)5>64>:6CC=FEN_IG`MSj\Ucc^ˆhhžkˆ¶\‰²QlQ`vZ]{Nd‚M{—Xl‘BUk:JH<CL@KR5=99@DUZb” •ÿ¡Òÿçÿÿÿÿÿÿÿшº†s›pUqkHkŠdŒ‚v“}š˜dˆ›QwÃ`mÿYtÓNf]L`‚Wpðr§ÿŒÐÿïÿîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôæ‹ZP^WJ[[OaaTb^XYSVOT[‚gõÝÿÿÊùÿØÿ³Üÿˆ©ÿw‹Üyz…qX”r`„lšo£‹f©„j}y]WVBEIJZry´”lloSI>7;B8?M3AH/29,-15*62)32 | ||
100 | |||
101 | |||
102 | -**(3-*6(1&, ($" | ||
103 | |||
104 | |||
105 | #% )($%(%$!# &05)G*'2/)+! | ||
106 | " "" %$)'-."&$#'%(./!%# '!),(1!$&2%&*' #"'$ | ||
107 | |||
108 | |||
109 | |||
110 | |||
111 | " | ||
112 | !0&2$ /)"P D"! | ||
113 | |||
114 | " +49 9'$#'!#&!#-2! '#(&%&#%! %$"& #,/ 035'#0+%--($* $'#1"!(+$0!*!%.%5$>&D*)33$$&$"'!0&G92J <2 GIFJ 4Z:L4O.O/ %##% $&+() 3A9"lk$>o-<%697>WNhR\&UZ/<Q>5RF;b9'S%$( | ||
115 | &,!77 +9$"0'(4 &!!"%"'$""+&0% ! !&#*C1Jd=ac\hV^hbD_KDMIMN?A?1SG7DLC1AA+A0EP$GG"88&((,#3/0A45B0;>->B+FE*4@*4;('*4.*<7EON]QCI=<@20:,;A09<4?:1CBAGRAGPO?[SH`FQT<HH:LSNDYNGRCARJAZm[Ž@lX>NAE<D+;D)8C.098<D>AJKDRN@KS?H]?\YRyg€¦`}¶Uu¥YyŒLZcMJk[LfoLk\I]BUY3UW?<S7FI6JJNej…‰’Ä‹ ÿc¸ÿZÃÿZÖÜe‘{Nt\MoI=`UJwzk–a„„Lik6NV0S^I^qIbTRgW\b|Zq°uÿuÿ…íÿÃÿÿðÿÿÿÿÿÿÿÿÿÿÿ•Ôik[s][ndbkn\^jUVfQWg‰[‡ÿ”Ëÿ´ÆûÐÉüéÏÔÌ¢›ƒ€awuy™—‚˜¨–ž§š“¬‘··“Œ†fPVQLRnUl¦^ŒžI^RMG=8B?<I:@C4?:..11*/3+-. | ||
116 | |||
117 | |||
118 | |||
119 | ,2%,6"4"*&.)*.-+1*'/&$(!!" | ||
120 | |||
121 | |||
122 | |||
123 | |||
124 | ! &(''*!%'(!#$&+'1'=&!>0%-7)(/# !# $ "'$%!' $(*#+*(%2"!1# | ||
125 | |||
126 | |||
127 | |||
128 | |||
129 | |||
130 | |||
131 | |||
132 | |||
133 | !#$!+'*'" | ||
134 | '"!# !'3",. &' &%$.*/-0*:3D:605/=/((!!#& " #'.$%/9#"8!%("3" #)*"+0!<#6"9/''+#*&.<%**'$,2F:8)'$<5!&>3'1'3-5$/31#E,!C/;()! | ||
135 | &,GG3526,<.=#! ! | ||
136 | %1J%CC#! &7#-M')@7$5=<S7+j;)W75L67BO)78,Z2>" | ||
137 | |||
138 | %,1%75A0"-#!-2@.X2L;.;!8/ !"!&!'%.''0+)*#( %)%#8')D*8QCQbOYEDQ<EJ9IP6K^4FZ67G..=.(82;C*?B,-="!$*$+4.95G:5@@22>/0:-+3#43!D=(OK:?CE-?4374334;335418=4FB=HO>:L>.:G3<I<F8?F:LX=HG:CI6HH=FHmDY“mDpq4BE2<>039/;;4D=8AGD7?DJJCMM<NO:OYNU}X‰¬S‹ Ox“Ml~<QTIFaPEVK;HD@QHFS>/7?JM>faP]hwUs§\xµ?Yò2Qÿ7W¼=]cC\BD]:JWI_clNvCneFgBCGA…KPg_M«H¦rScr\j…of…‹_Þ€‘ÿÄÿÊßÿµ÷ÿÆÿÿÿÿÿ~ˆŠezgu‘d†Œev[bzN^nK_idk‡¶§¶áÊáééÿþÿÿÖ›²šl}yqk…¢—Œô躱¦£¿‰Ÿ·v¨œt‚gTTL=IfDMŒHX}STBMT:;P8:H;:F;9>513-42+61( | ||
139 | |||
140 | |||
141 | ! | ||
142 | |||
143 | |||
144 | ",)0"1#-% !$,#!+-&%3%//5,!-,.)"+(! | ||
145 | |||
146 | " | ||
147 | |||
148 | !$"!!%&#&"% *2:$ >0#2.-*).& "% | ||
149 | |||
150 | .%%'&/$!(" #&%"$"(( | ||
151 | |||
152 | |||
153 | |||
154 | |||
155 | |||
156 | |||
157 | % | ||
158 | !%, | ||
159 | !!'5-&$ | ||
160 | # ""$%!" #& ,%562"7@18=,49!+6+"/""!)!% &*")+#,("(&%,+&2 0,6)7"-1)"#1&$5!;'B !-!$("03-+E#)!-"1C2%F);9ODD945-,../&. 8#%# &" '* ))3(!6"C-/>*/C(.64=B | ||
161 | *#"" %!-(06+0-/%/13##,% &%3!9!*!'26:)4I%+++& 9,5QKU 5":2 >+ <*?2%,hNG\>E?>!Tn=k$#S&'$ ! #!(!$#$$*+6-7-6:5S:T+B&M/C3 -*!674=HAEICAN=8P@0ED3FQ;JJ)1+((%+$(<6;I,KI"A:36#370NF9/B8.5--.&(,1&6)CM7JR93D1+;3-:,=@+=C,9@91;64B<3C>-87900D53LI:GD;9GG5C67;9<?9?GB8IjMd‡dqMP]?LV2=E/GN8@L:8?3;><;H;e†?m”BTlQMbpUpnYŒ^kž\p‘JZh6wi7Yi7Fa40GE5@EFC=HSIUeMU[d?UwVeibWSA5K=HK9?G;A59E;<MENkLGm[BNF'<@-U`x«p¾±“mˆ˜o—\nzX”ˆimsp{ˆ‚«±ÆÃÛÿìÿÿ”æÿÿÿÿÙ÷ëhc5YrS{ur‘ir‰Ta}Hf‡D‡[’— –¿äÓÿ§ñÿÿÿàÿ͙șy¶«¢ÇàÏ÷ÿÕÒЧ‚•–yޤp€Šer\PTB=IP<JYRRUNQFCM<BF7=A?2B:7?6;=/BH,CM- | ||
162 | |||
163 | |||
164 | |||
165 | |||
166 | |||
167 | |||
168 | |||
169 | |||
170 | |||
171 | |||
172 | |||
173 | |||
174 | $+$,1+3(+,,.'//'5 (-&8+ 74$38%44#7!0" | ||
175 | " !! "'.$*%&) $"#.85+>,&+2(*&+'!! '# | ||
176 | |||
177 | |||
178 | |||
179 | ("))0&!-)#!'"#!)$C$A6+98' | ||
180 | |||
181 | |||
182 | |||
183 | ! | ||
184 | & | ||
185 | 2"%$* | ||
186 | ! +..(%" "*14$"#$'$1+5618@5 :2'&0++,$ ",2C6K9"01$1#)0$4/"1-,*$'(217=BQ= +0#!(')1"1"%0'. -23!9A853,0&% (.6!!7,4E!1L#8%8364;'4031, :(4,D+C1>7E/C-?BI¤1G$#(-"0<0?81-'$8#!"-2HC*72%/ "5"6!(<$8/".1( 3*$2,%%8B9K 0C!DIF'% ,$G)LON^N=C"8T>Gp4Rc 0A1,PG77 "$$").%1#,/!%14:*5H1Fj$\j'`e,G\';O#/A4-:=7:D9B5;K0<C5=G;@M888 78%.#+/.,/;4H5=G(5B%DC5RH:@;..*,)*))*),'4<@LU@JK+ON%@9-4C76?567584/@58=:5`M+–b.ƒa6OH<KA3F>5A>82;69D:>B:B@I<JrD\]MZG9EG:T9EHC@>;><4U`1]r;YtL_’P_ŠAazOPtaUdaTk]^xVg{Ho•<|z3hh/NK7B<7@D?=KN\lQcpEvrN^c`]hAOb/SW9.742H1HX5NaIMWJ6F?2E00:?(:–[në^ƒ¶h„º‚‰‰}x„†‘~€°Í±Æ×÷éæÿ“±ÿƒ ÿ¨áÿ¯½Ì]zNN_XQmfSz`ZnNcoP\wSnŠs˜¦ž’¹ËÅâùÿÿÿÿÿÿÿÿåÿÿ´êáØÙÞÿ½ïûžÂ¦ˆ—€k{o{pgfZU^=JMBCKLK\EGW>8E66=77@::C:AE<:K85E2/D3 | ||
187 | |||
188 | |||
189 | |||
190 | |||
191 | |||
192 | |||
193 | |||
194 | |||
195 | |||
196 | |||
197 | '(.+*"1$+$"#*#*%%++!(6%+9/!:/0) + | ||
198 | ! | ||
199 | ! '",+%&' $47%;,1)"+%)/ &* " )!% | ||
200 | |||
201 | |||
202 | |||
203 | |||
204 | |||
205 | |||
206 | |||
207 | +0*%2'#2! -%#".($5+=*+383,-,"* | ||
208 | |||
209 | |||
210 | 3 | ||
211 | *#(! | ||
212 | |||
213 | |||
214 | |||
215 | $ | ||
216 | " | ||
217 | E(#! | ||
218 | !! )& | ||
219 | ***)%:5*,85%$+"+ &$%,!(F*6?.66+P9#EG$4=$5J3A574A,9 0%)+%0!25%2-2883K*6-/(2).""3),D)O120*(4'%.),-3+)4(.4!8@*D4)7#."#%!%"%&4'179B9V*+A(*A$J9&Lk?D8&*$<"9"J"6!2 %-50$ %%!(&"& "#0- E;384,:&1#*E9XD"c4/&!-*21H56U2JB:MG8.?): | ||
220 | $+ | ||
221 | "$.-'.+1&.;<JKT`gP`nJTZFAF;A516-1&-7(75>941B5+8<5@=0@33=+05=C$CA'A<;:C6EK1pb7_h;RU+<:+'"'(#'+-1.:JEN7KT1F\'NS+HP4_Y.IA+?=/MU@R_e_xi…YLWB[J9RB1@B.<>1@C8EI3EJ6GIDAFQ<HB268*4;<J<MN6IA7HP=[s4k€@pˆCr>p@_`OdƒV‚X@T^Poi[s~HyZ_uFcb;BK=BJ>KQIfrRþ·SÊžO”TjtTkwB\o8DE,+61:F1<V<>^:aW1MH.C;+?EgTdºy{ hu[‚™[†¦r‘©}–¹h¤ý†×ÿºáÿ¡è‹œþƒ©ÿ†¬žft:xƒ8twGUxRUoGWgJ`k^`}zo—ÃËÈÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÉâ’™œ…’}{€pUph\dNTZCSU9MSEIYHEL<<C4/:75:71:9->;0752:5055 | ||
222 | |||
223 | |||
224 | |||
225 | |||
226 | |||
227 | |||
228 | |||
229 | |||
230 | $'$) #)',%/ ,#$ | ||
231 | |||
232 | & " ( 5A'73#30$)&)-%,!"#! | ||
233 | $&$"" | ||
234 | |||
235 | |||
236 | |||
237 | *)%#!'#!'%(" (+(.&.)40,4*2'%6.;10), '# | ||
238 | |||
239 | |||
240 | ")(' ** 0) -% ?/(65*0C(% | ||
241 | ('N,V | ||
242 | |||
243 | |||
244 | |||
245 | &%#%%##** &(%$-')%%'1,*&$/&1#34$8P)0S>0E3,6847-43(73661,+% !.'6&*7549E%15$/)&'1!#,2+$'/3<KH<49)3206@16)/(30#19/7(*- '$#/*#;$+&#$)'1(@5!8$#")2-#$$)$& #'!0)9#-E$*P4W7P',**1ff1L‚ $O,I'7&)!&-:'4=3>1R`.jX-V#'< 8 > | ||
246 | 1%.4%B$)1@7+ #&$&#*,G9]>$U>'DI70LZ@bPQ_8TS-en-8D$3.%0*'47-)3(,'-/(5-*/.-.,6-7B4U^8{\2dR2KQ8_kEgjXf]C@I,-6.7 #'"1-*:73/:=8A@-;K%:A$8G5MN:I729:/?D5H`DeNn~IOPRLIOQ9KE5VB37D6PR6@M7<H6HU;=G9?=,7:-HD?<FDHK@eS?FP@HqA^“Fn’Li™De‰Xmzk”eR\P@Va@dj>ZgH]eSdHgl<e_AZfU^Šª£Ö¯„Úef—RXPZ…G\{A]p-QU'@K33G>5PSJgCOX5WZ1XZLTfXyl\wh]x…kzŽš’˜{‹¥^‚åi—ùj´ê‚ž’kš¦š°€’j^zKgKl”@dwBXkPShQPhSixté®·ýùÿÿÿÿòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖÿê§«™€t„jO^\I]MP_BMY?KX@CS9CM;?D36B7081,43(02/3338./3- | ||
247 | |||
248 | |||
249 | |||
250 | |||
251 | |||
252 | |||
253 | |||
254 | ! %!%)+' "&1:$>/ 00&2+(0%&( !!! # &,,- | ||
255 | |||
256 | |||
257 | |||
258 | |||
259 | |||
260 | |||
261 | |||
262 | |||
263 | ( "0#!!"''."%2%$-*&,#'#+#' | ||
264 | |||
265 | |||
266 | |||
267 | |||
268 | |||
269 | )$'%*#==?U'.F<4?@&G$ | ||
270 | )$):7#L#4"9G ("+%%))&% ! '( ! # .347882?6";?6;G?UD1TS XMGV ;P:U6R,K1G-::0663-/"71!5:"97/6:+,**3%;!,4.061 +&!(9)<'5*52A0<<?EA58"+9'09&08(0$$-5:MAE?9&/!"&&& $+ ((&,!.9,6&)!,)*';\/K`XM9P?(N63,:7#,('(02CL0oC%e";mI;e%DF R- | ||
271 | RO?W2^H"+.,FAEKFO/1+,8/!<>-Ag4+k70O9GG?99VEKCWQJhlNUm,NJ)7B'7P&PU(fT#NH#>9&56#42--8>:GKPiFmy@bi=9NQ:VYOdS?>8#)( (($($-2)1:)261<<3)12#5&2(.J1;;4:./928>?;CV/Aj1GM:IMAFIC@9BE83=9BMCOO<H?7€WA€Q4=F->?/T]9{v:ww@›™?x“=FWEEWSJ^OSdO\sOW…_OtkXz8`c=NOBRWEZSV}\VruH€€B…‰X‘§†¡åc{R[FNdIKbLKnJQxERi-Nf/Ub/KUGHbR@YIKc>KoBWoZWgWToMJr`Z„ƒm®Š«¿Y³„lg}”a‚œkœ€`“Ÿ[¡‘bˆ_Hh]Lj`JjOOlG`oFktKat_ŠÉÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõÿÿÿÿÿùÿÿÿÿÿÿÿÿíÿןWnbE[SITNCTHFTEGTHFS;?O::E29@158+03./5004-&..).+ | ||
272 | |||
273 | |||
274 | |||
275 | |||
276 | |||
277 | |||
278 | |||
279 | |||
280 | !" %*#"/6#F(F/)66)')&.'$%! "#!'$ "% ( | ||
281 | |||
282 | |||
283 | |||
284 | |||
285 | |||
286 | |||
287 | #"($! ?,F9D6(@*/&'*6&>' # % | ||
288 | |||
289 | &*1'"&"):!-* | ||
290 | |||
291 | |||
292 | |||
293 | 2E+5<'# | ||
294 | |||
295 | " *(&5.$""(!!" *$<)E.<%:?"MK.=bFFa>JWA<J>>E7>G- 7%$)&3<#:H8R%GP"SSEGOE3B$38(&- "()!*,39A#DR!.>/9(-%!/&0'H8)/G/6M13K(<C0;81"8?-31*(/(&%7)+>&+A/7$#.-2'3*.<1(E!. | ||
296 | |||
297 | |||
298 | |||
299 | %$! *,,<=7?5A]*(F&)8!4%%";'Q*J!)HJY-8z GOs{\|*-81) | ||
300 | /;EP%S\&YQ,gbP["7D+5E>9EM(1J'&7!)-&;2(AANWBu‡Qby9\d7JS5E8<_MCz8y7SW2-4)*:.4@1<C>::T:F\5QDAJ:PEGhYS:E2+. ./,'#")01)36+6;0.8"0+"$ '(,++.90,/5,CC5OA3,0:%0>98FGC?7=@EA7=66E?BWY>jlJ¡•bKx@8<6E<AG?J<OFQ…P³T‚Ddg?HIBNWDXeB\qDOjCZwMbvOn|<n{>v’C†«_ÐË]¡«kx btŒp_{S‡ˆ^|Q_u;ew9bl8^e9LfFPh2Ic/I_)Ol2Uo9Kj=O`?Ie@N_C?[DHfDJlXLvŒXŽÃW¡¡a˜oRpb\g]Ga\^snYtlDkNH\IWhNWjLSeVo|Yv]dx šêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿÿÿÿÿ°éÿ…·Ûh~T[OCPDDRIEJB>FD8HB:M>5F63>1,7/,9.99,48--/,'-'%.( | ||
301 | |||
302 | |||
303 | |||
304 | |||
305 | |||
306 | |||
307 | |||
308 | # %)&&!&$"!("2$;*H)J7&19---*-"% $! "'" #!!"! | ||
309 | |||
310 | |||
311 | |||
312 | |||
313 | |||
314 | |||
315 | |||
316 | |||
317 | |||
318 | |||
319 | |||
320 | #!>/56-5<+,(*$$ !$)' 6 D@EF+B 1 | ||
321 | |||
322 | @%7M"+C.#5 $# ! !#)",,07G<.>--+-7$5)%5:%33&36 C;3)9N-3?B@<=C6GF=7D9-.,'& ;3&!E6848OE3Al64S08=*3B&<A'K@#-@$$*"'%*#>0",(((#&()*6*<)6/1/#,22.=(B 2<C#D%!)-1!*;1%+#2,'",$!! "& | ||
323 | # | ||
324 | ! | ||
325 | |||
326 | |||
327 | '')!-!) %#!1+/9*D%)3$&'( ")FE)M'<*bZPS! | ||
328 | |||
329 | |||
330 | |||
331 | !(:(IO>[hFon;ET<AS0Q\-OU4NP.cT">>"<9!@7$M@,A>D6YY6]QO^QTQ<^b2Vn>SrYxˆKk|0WY"u^&U\6:H7WN7`k>^a@R_?T_IWqJ^j//:$ & "-%'",,*,10182'/)!- $+&'$1,,:5,7<28@DCQ5C;#ND(XX;Xa8GI4A>3??4SRHPQ\BZ=p–4Pa1=:@E;>D=>4=8AKY|W‚²H\‚?c|>ThB^jCOj;Rp7OtH\`d“[mŸKr£hm™zȨ~¼t]sFpdHcmE`[DjIQiF_vR`x>Yn0Yh3Qi6Le3OX1JS2CT8Ib:EX9;QHE]E>C;EO8I[;OgQ_pŠTn›Sq€Rh_O`]BWT\tEwHF^DEcIZpDTiEXeSXomaxjuˆÍÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéðÿéûÿÙÄ킆šYiaQWJBMB<F<8C::H8AK7>L75>2*806</7>.8;129.+1'(-#.2) | ||
332 | |||
333 | |||
334 | |||
335 | |||
336 | |||
337 | |||
338 | |||
339 | |||
340 | |||
341 | |||
342 | |||
343 | |||
344 | |||
345 | |||
346 | |||
347 | |||
348 | |||
349 | "+ | ||
350 | |||
351 | |||
352 | !$ # ! " 1'='I+!P5*387'/0*!#!!!$ 1&23"0 | ||
353 | |||
354 | |||
355 | |||
356 | |||
357 | |||
358 | |||
359 | |||
360 | |||
361 | % | ||
362 | |||
363 | # | ||
364 | ' | ||
365 | |||
366 | |||
367 | 0+011779)#8! % '(1!&C+D15M7'=5'% | ||
368 | , 3$ | ||
369 | 43$K'J:'28 3(&'# #$*/$=K&DU/=RLACIKC!HJ%>P!;M(0M,44-DH 6M)>J+?T->J1DI#@C;F$:G5ED#ER8LKQ,CA%8()%&)'1"7%'"%10 ?+ !&*,$(1(!'$46#0# #"!!$# | ||
370 | |||
371 | |||
372 | & !"!( ($L1 | ||
373 | |||
374 | |||
375 | "$,DA7XaJadL3L@JS5Aa6Lb;VQ<BW>ZY4P`3HO;S`7IO4%3A,2P)4S-PR1OU/?U4J]?Q{Bg^Ae;K^5Tf4GY8`VIdeILS<5MG,DN-Ce,LH$5%,*!"#&*$ *.'+5),6,'."'%%+.,%32(:>48D4<D<JPAQN/QW8BQF<ZF7U==ED66E1>R0GY8H`2>nBB4@?7E?DGF=DA0FF3XfM]‡OMfMjlO[cIHeJA\9Gb6bs=bvN^pTNsJZ‰K_‡yLt›IwrUoFFaHE`<AYA=WG=[NEb`UrMMc;Yr:ar5Ui7ip9yr?LV:II>3C</CDeQGHB:.J7Ji<YgG^vCVaPF]UQlUixJpiSTi_KcA4H;APIDYOEXITWQejnbrmg”åºÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}¹ò—¼”z|fV^X@OD<K7:?86A59D7;L5BO4FH0=<.1<0/96,94+3,',*",&%/) | ||
376 | |||
377 | |||
378 | |||
379 | |||
380 | |||
381 | " | ||
382 | |||
383 | |||
384 | |||
385 | |||
386 | |||
387 | '! | ||
388 | !!0=&"I.#J92::5(-2("$!*'-( # )*#/%"+)!% #! | ||
389 | |||
390 | |||
391 | |||
392 | |||
393 | |||
394 | |||
395 | |||
396 | -#++)! | ||
397 | |||
398 | |||
399 | |||
400 | |||
401 | ++%.,-6)*6! | ||
402 | |||
403 | -C67*17):/ /@12:89% | ||
404 | |||
405 | |||
406 | 6#3:#>* "64% ' '"4+&>532@05Q*6U59O*3W-5N(2Q)6R47C(6<&@8,$D0$64614=R>3D/@J+6C':B)<@5*;,*'$-! 2(*.G0>(**.!)+! *+.0$,(# ) ! | ||
407 | ! ,#7 , 3 | ||
408 | H*+%)S$5@! | ||
409 | |||
410 | |||
411 | ((* .!+-IVPcrTgQ..;42?7=>>2IA8H<UV@DSH=R?4RK(E8*0!<5(C?6gICC7B039676CKI]ZWUSHcQJqlLE]H@`U9dO4?58D8@725/5/4;1/&3,'#!-*21%,,)'*&#," (00$68)3811:6.>24B4EZ?O~8€Ÿ3——2‚k1KK76>>/94/3B49I835*.30C.E@:BH<GN<VZ=^]3Uc9f…BovEwJf~CCX;?O2<O8Ur?lˆMg?TkEB]OHhLYcSUbIJh0FW1Id0Wg0NU0>U<EUKW\QP]LFWT8bK=aTMlWfŠMƒ?hj@6<4(?Q[}Tyn7),<-;NFaSJgUUcFJ\IVqT‹š]‰ŸYŸ‰^qeE`K7LN?=DD8FLWTLdaVVwea”ò¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÒìhwÔ]|ŠSgcGUHQS=GH64D/0>/7A55C;7H:@K59D43:0*2/&,-&+("%$'&%$ | ||
412 | |||
413 | |||
414 | |||
415 | |||
416 | |||
417 | # | ||
418 | |||
419 | |||
420 | |||
421 | |||
422 | |||
423 | |||
424 | |||
425 | |||
426 | |||
427 | |||
428 | |||
429 | |||
430 | |||
431 | |||
432 | |||
433 | " | ||
434 | |||
435 | *;?(R.!V4/4@3,,0# #$)#$"&#"!$""$%" "$ | ||
436 | |||
437 | |||
438 | |||
439 | |||
440 | |||
441 | |||
442 | |||
443 | |||
444 | 2# | ||
445 | |||
446 | =A. | ||
447 | -1 %, | ||
448 | $ -,%+$)"$ | ||
449 | %&"C&;&"+ :1^J!WZ.MG*R/ & | ||
450 | |||
451 | |||
452 | |||
453 | 40#"-% | ||
454 | |||
455 | $"(#518%LF$7E-89).3,00.&"&0-)0("'/!"@/%K;5D$(@</:3&=6*3-01%09).7++((3*:D'*2+,6 BR':J$--#-""#+#!#!$"&$(%" #( $$+8+B>>?1- | ||
456 | +& 2 & | ||
457 | !$% | ||
458 | |||
459 | &,,#,#,1 %&!##$-9DQGa#>S.5 97;V3RXs`xM+Q'oKŽJ_,iGK7O060B "!HHN`f]>\BE@#<;-^U-AR6/<)-G::M=1:1KA9\L4ZP#GG/SI6i;~h+TN-NI.TSIubQcpHTdG_jIBMF?AS48K9>3??1BD.@;+42+8>);:#4;!51&1-%)5%*)#"-$'.3!49'5;*8:,!9+,1/B<99JU@RpYiD}Kmˆ2n[1jQ/?=-+54.9-2:-/.738:6DC:GF=O;Li;Kw;gZOq`Hc];[FFQ4LI1hR=LZZ\fUUaIE^:GZCbdHRj;Rf7Ih4F\4Db=Ak<So*HS2E\A`mDaq>I[A;ZG6PU<RgSmrª½[ÿ±G[L6%.gAZUpCTP.DT@diNRaSN_@pvS¦žièæ€ÿÛ”ÂÄr›‹RNiCOo8Ph8TcD`lJ\rHWdRbˆÐŽâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓÿÿˆœ™]c…Q`sHVR<RMI\DHR48@16C-7F23B9-@<3@93>24=+01%,+&$-& +!%)"!%! | ||
460 | |||
461 | |||
462 | |||
463 | |||
464 | |||
465 | |||
466 | |||
467 | |||
468 | |||
469 | |||
470 | |||
471 | |||
472 | |||
473 | |||
474 | |||
475 | 2 | ||
476 | ,$ | ||
477 | |||
478 | '<I,V4"U@22J6&,7$!*"4(./%("&###! | ||
479 | |||
480 | |||
481 | |||
482 | |||
483 | |||
484 | |||
485 | |||
486 | |||
487 | $ | ||
488 | |||
489 | |||
490 | |||
491 | 3("S.8$&2#!'"5(752@#7/$21!)&/$-,1#91.;4.'4$(814JJ>\Gbh11\1 | ||
492 | 4 :)-+#$!! !%,/*,50'!0'6/66/./#*0+.@=$8N.$D2(F+(:'!4-#2& -!17&>D"AE73('2/# 3 "$"I9$4@?MG?HR 10&*&!$!,3>3'% # *-"=!#>2%8*6E%H2 +&<BLCV4E)5 *'/. | ||
493 | ""!$)/!4> 5IQI3GK .:'1@!A2c*G[:K#0H+$]@.k@1`(qw:f˜(6g,<'!#!%")4AAOUNTDE^2V_+;[;'H1#6*"-6$85)*,'28LR5Wc6Lf8__?u[RŽE5G=8H<=PE]jO_}KGcUIPF9E5AR51<07B78G@?KBEH19A,:;5:E15@&>@&FK'5?,-;#10&)-*(43-<4+,2,).&21'ES-Vf9BDL@BdCMaOib@vL;d<El);D/3:5/4/29*2766;<3=9-93,362@:0O?BgMF`IVQDIR7‰…>¯<pCoKZg?Pd@XcF[lKSjPZdE<U5?\9HZ1S`HJe>N]5FTGSkQTn>Fb+K^,F]<H\NVv®ˆ°ñ«ù„xm852G;A@SgwmJpOW9[PCb<FmNhœ|¿çǦÿüÿÿÙÿÿ¼Ôœ_DFI.JE6SA>eBAdNSyCVhKXv¥’ÈÿÿÿÿÿÿÿÿÿÿÏÿÿÁÿÿÞÿÿˆ¸ñipQbZOaTPXA>JC6KB5H56E2<G-7C-.;2*43+607:40<032*/.%+* ,-)0#./$ | ||
494 | |||
495 | |||
496 | |||
497 | |||
498 | |||
499 | |||
500 | |||
501 | |||
502 | |||
503 | |||
504 | 0 ,)) | ||
505 | |||
506 | |||
507 | +3@* N5(E>8/7G'%4 (5(*@(1'!$"$! ##&$$! !#$%% | ||
508 | |||
509 | |||
510 | |||
511 | |||
512 | |||
513 | |||
514 | |||
515 | |||
516 | |||
517 | |||
518 | |||
519 | E2#-,6+8">"-2%(6+-,-!<-(7-2725!37@?BK(7G-=!$!-3E$^1l** | ||
520 | I | ||
521 | AE7@ ,( /B(.N D5E)H(3"*6097.%! !' ! !" "&&%%,+:<''1'&%#).$96.5:=2/2*(!''%#$4,(#&10:H6dO(TY"3K5CA2S;,;L+H<2<G?QQ(XZPLBG"Ub%0R !4/ $& ('"'#&!120 ! )=-I/4% | ||
522 | "# " $# '$)%8 6/,;+05+1 13<5C<D6$@/@@+Nj0a/# .(&/'136G1G=+AA8JE3=9..+%((!#."*!)13@]A;lF-GGQSYoZ„LVuCCA87?2BD/EZ/FZ@SMT[=IW=/AA,42/69/9H<@BGM@HR1;B2096/6..4).?6?K-?K'04#37 15#@;-A7+14$(+83(9=0IE4<J:TN5NE;HNMVLNUFIPF>EG9CG0BA,=D/BE,WC0G5-&+)18*9<(48/3@<7SIRnCks[eŒŠÌvyQkyYdkArxHm}Pl{QnxFf{@oz-PZ-Wi/[n4Tw:Ie:SpCQkQEaCGX4BX1Gd<LcSHd¯>nÿ7ù>mV4BA:HUI^€RwxsŒNMPE>T.FaQHbœ^Žÿ]¥ÿlüÿ„òÿ{°lAS65?.2=53C90G>=RI?]P=ešÍÿÿÿÿçÿÿÉÿÿœÆÿl¡ÿk£äbƒ›‡w\`]MCWFFS;@H<5<=.<92:3,=2/>+/5()3,/5/.66/8317+(-%*1$..#&-&#. | ||
523 | |||
524 | |||
525 | |||
526 | |||
527 | |||
528 | |||
529 | |||
530 | |||
531 | |||
532 | |||
533 | |||
534 | |||
535 | |||
536 | + | ||
537 | ) &, | ||
538 | |||
539 | &5B' N2'DA1&7<$&( &"(0 3*"-')%%''$+,$& "!$"! | ||
540 | |||
541 | |||
542 | |||
543 | |||
544 | |||
545 | |||
546 | |||
547 | |||
548 | |||
549 | |||
550 | |||
551 | |||
552 | (&*"*)/> )R9>?'.3+-,$&A"*7(*%(&(*F.)=Q;:X;#d F " 2 + -?#T84QLJH<80D.=&(60'<"0+$$#(6*!)+-#* %$ ($ $,1'$&/%)$#*+%-*,37:<D#JV(:I"-&)42#(%.10??M_J5W54<.VK!C\&ML,BJ&VI*B>4CF@BU64L0:=L37A,)1#: #0 *7U!L" 7* # | ||
553 | |||
554 | ( | ||
555 | " | ||
556 | |||
557 | %!#)"*'$--*!-!''9.L+]U0%.!'-*IIRF7A*<%+A3)5=$.5+D/124;#&$ !+(3-%.)'-N,,J1/7=>ILWP9]A;K8C?)_O&`C0M=?6=J1?G0<A8;/54('1,+/678D?EE-CC-B56=2)0,0:*661@@=7D7>D-1:/*835D78>5;?%9B&:;-3?4MY/^x5Xd=Th.d~5h…A_‚=Zx=Lc8?K:=J67K:<W=o‘<’£'i&KB1EJ+XQ,@F+9M;DaXIxWHw›5iEpcQybSrdNhXUy`pigyRV}Ku}AU}4U`9Ji7Cf7Hi8Cl<Hn>N\=J^;JW:>K?MVGAS`5Ny-F†9R_L^DFW[>Rr8R”0S`<V4Lc-?X<BYeXd M\ô=^ÿHtã\€tCT'AM'5D"8B,5A28G9>FJBO§K{ÿiÑÿdªÿk ÿ‡‡È€y¹Zq¨`oqi|blwF]\CKS<3>34;22:787356055*;6&(1*)5.052+00).-&)&"+%&,&&.'$,# | ||
558 | |||
559 | |||
560 | |||
561 | |||
562 | |||
563 | |||
564 | |||
565 | |||
566 | |||
567 | |||
568 | |||
569 | |||
570 | |||
571 | |||
572 | |||
573 | 0-$#% | ||
574 | |||
575 | ':J( E5'883,28(!)!!*#,) &0"".%&&"+&,*)/# | ||
576 | # | ||
577 | & | ||
578 | |||
579 | |||
580 | |||
581 | |||
582 | |||
583 | |||
584 | |||
585 | !+#:+IX$>T-$:.&"%."*R;+JU8K&#>(!.J7L&LE"+7A3@'L$+6<!7N38L=:G.3H3'35&+$$11("/2/&'"!"'-*4%6) !#.%(')% +-@8LI!FG08@H.??% ")""0&R)J3!-/89$C;!;6 1-+B)&R(!3*-469A*AU)8L*'F#'!"):2JVX#R%;&,$ | ||
586 | |||
587 | |||
588 | |||
589 | |||
590 | |||
591 | |||
592 | |||
593 | |||
594 | |||
595 | |||
596 | ##"' !+$$!%$"5.?+>-I8;.!./+$&!(,$4+ ,''!$*5@-/A;%`N)p](dS:SEO799NH5w^<gi=Zs=@Y6-2/.45+506<1-2)&.'$1+'49*5=,66217+10'2++9.=H2?O55D66F8-2/32-64:-<:2<2-;-&520739K8Ht<Kk=^m:g‰9s—HHoY<`Q:VB1B?+;9&682;X,L”4ZŠ@eLFX87NHAc=4Z$8L%AK9VWI>TH3GN8LUGc^\haXpaZrrWŠ`W…OoUˆ•U—O’“;{l.z^)IM01O13G9;UEA_EMjA`eElm;b`2<S$7J'L\4ow:p~EYhD7GX6IE:C3BZ1LV>IUUSkYTZ[[TzVXwQ[P>H/->,-6+88'8B+:I4BJ0IRYhǶàí¹µ¦¬·±±‘œ–owtkj{wfqv^mM[kAS[9=E1:>,2<19=1@:-Q</r;+W;,F4,/8.-4),4&./%(+$(-'++%*/! | ||
597 | |||
598 | |||
599 | |||
600 | |||
601 | |||
602 | |||
603 | |||
604 | |||
605 | |||
606 | |||
607 | |||
608 | - "(#* | ||
609 | |||
610 | |||
611 | #1? Y.L>*;;;0-2&'$""$)*$+&!".!),) | ||
612 | |||
613 | |||
614 | |||
615 | |||
616 | |||
617 | |||
618 | |||
619 | |||
620 | |||
621 | ,'>,I/?:45DE1313#"*3Z(%IbK9VH"08=*=)*75"$3 .("4%/,#0B*I&8%-/7/?%H5(>4%&5,&$.)(+%!+.;$4'!&$ %"$&" % " ! (!A(,7'::5%9@90K<!:3)2.%)+ #$%%# $ %%$ $:+!4#++%)""/%7""08(4.85-7%/& .#O># | ||
622 | |||
623 | |||
624 | |||
625 | |||
626 | %!!$@8=0(-+,:)8 | ||
627 | !=,##""''#&+0+..=-DgJVyM<bE=s:MI.OWJPuRTd^LXU`W8CM*A6(8='690)4&"+$"')0,9D/>F->G(+3(#'%1-:95:64?14-,45-.,13(<C*MC.595/7.C1*97%<<+TK-he4_h=D_Z<gT-<<*2<*21.84?9(25*8825>D@LYEWXIY:D^6NQ;:J(2D&1K=9T90D)29)0;<0@K9[RQgAcjDKjTSt]cŠh±‰™Ãx†Ád‚´Pw >^o*4=(+732<:8<@5HY>ZaUtXSa89H%&;5*KDa|MSvIGn7]Y.XS4MX;CXDKcHWeTUl]y‚VyV`bZVRB8A.:8)=:2EA-LF0HC9NE:PN`y»ŸÃщȾ|½a±j‹|kqhyj]lbT`U[fE[`?TY/KN1=E,8@2BD3hH;sS9‹N1L<,)2/(8(24%36$-5$.2"*3&*0& | ||
628 | |||
629 | |||
630 | |||
631 | |||
632 | |||
633 | |||
634 | |||
635 | |||
636 | |||
637 | |||
638 | 4(""& | ||
639 | |||
640 | |||
641 | |||
642 | |||
643 | &$ | ||
644 | |||
645 | ! | ||
646 | :A&Z1LE.=@:*2-%%#! ""!%##$% # | ||
647 | |||
648 | |||
649 | |||
650 | |||
651 | |||
652 | |||
653 | |||
654 | |||
655 | |||
656 | 8J<$7R53J< <1"*$+#'+:.YDTR!A48$ &-3'''* 5C1<8S09K",?!7;1IB,+8)**)!!+!*&+%-,"(&+%$#$ ( !'"'! #2+?>G7*:C"@@$56235=8>.44"",'.2!'$(&)3.#$ * $",+$$ | ||
657 | |||
658 | |||
659 | |||
660 | |||
661 | |||
662 | |||
663 | |||
664 | |||
665 | )#"" ?;." %"$#%%!"'!"%$ &7".\-:c5<V.8Z9NJN[JLOdFLU4JFFaEXc4I]*>=-=A*/0"&',%$$'BE1FI84G:65(/$"1,&@O.DE(<8+<>$91'22/)482C74B+7?(_r(‹,wd1uxC\nE3I>4F:3A@(5*2.&63*5;,9L,GQ%XW*MR)BL->U6=V8<V57R-1M9G&>@46739:'3B,.B-773A@QLaJK\:@^;\zGwfiy‘W}šLv‘9_{/Rr/NA'9+&8-0@1<B3;CE8K_LXuCTH(5(%/-(7P4Me3LJ9NTXrEjr@\mB]kHdnTС]Ã~r‡‚n‰lUtaWdBRK4DC:OU<[bFOZACN?9GHRktÓÀÇÿêÔ±£®k…–ezž[uƒaurJd\CXY>OQC\RE_JAY;JY;DO68E66>=PDHcBEaL;060'.,)0-*1*)3),2*,3+-.)*' | ||
666 | |||
667 | |||
668 | |||
669 | |||
670 | |||
671 | |||
672 | |||
673 | |||
674 | 4+''( | ||
675 | |||
676 | |||
677 | |||
678 | |||
679 | % ) | ||
680 | % | ||
681 | 6J$L.$J=8?;@*12-#'%"4%$"!,&) $ | ||
682 | $ | ||
683 | $ | ||
684 | |||
685 | %8%-5<D(5;-*$"+)! <-/2'$/! | ||
686 | -'.8"!29 /6// &) -1543<?#1!!% &4(7++&1--2:7?(4%%" %$$ &%'+'*=+816SH'Oa-D[+AM0P`,1M"+&#%$"#' & | ||
687 | |||
688 | |||
689 | |||
690 | |||
691 | |||
692 | |||
693 | |||
694 | |||
695 | |||
696 | |||
697 | |||
698 | |||
699 | (!2.<++.! | ||
700 | ," #""#'-+,!(*2(I@3:=5AA438G:DLRVD:H47>9<JSDVSFWI:@2DN44D$E;:8?7'=C8;?8,4.<?,DH%?N0=J?;L1;M17I4:B*-1*.260=7PZ-TV:CPmIctL~`KjcF[O8H59=.@I#8:(^`*st){s4SW@CT=EW=Lb23F-(;)3C2,90)71%9*4?02E1.<+5:(8;%FE,[T/`X>OcJOY=JK7BKHeNhY‡¤Z•SqHFDDCA8>;'A@1JT<CW:;J9:NFB_X6L>3?,45 <978BH3A8UXMcjikoX`sSVo_T{¨~Þ¹ûÿˆ´¿‹ÿ´j‡}UHnNRa=Z`FlmUYiMU_PQS@HI`vŽÌÿÿÿÿÿÑØÚ‡‡i]ujH`oL][:KS4FI:CG6GN:EH5AC7K5>J2<G2C@;c>?eADT::..*$)+)/*+/(*1(+3(/3+*)%! | ||
701 | ! | ||
702 | |||
703 | |||
704 | |||
705 | |||
706 | |||
707 | 72(+) | ||
708 | |||
709 | |||
710 | - <U+N7$HA7>@8230)'(% 8 )!!%"( %"$*$)& % # | ||
711 | !% !%" E‰F-Z; | ||
712 | |||
713 | 9=@1<1,+(0%QB4C! -!+"+607, | ||
714 | #%*&,+.10*!+" .8!4F'!5&()&'$$,","3!%.'/8 3.'$0)C2;.,"$"&*)% )-$0&"$'97$@D82HO0;E 5=(H*A!!# !# %!1&% ! | ||
715 | |||
716 | |||
717 | |||
718 | |||
719 | |||
720 | |||
721 | |||
722 | |||
723 | |||
724 | |||
725 | |||
726 | |||
727 | |||
728 | |||
729 | |||
730 | # ) $#*%-/. '!.3<9#',42+a>P34$#) !!$ +!>0!@@M;3+*5=87D56G23D4B;DOCQH@7;A1-:8-6E+:C.95??<>::AE4\Z2PY,ZT597*LA&>C;1D?<7<.<<-?9*5>+2;-2;/1(-1%+0+*88,K.Ib?D^O>a\8SS2F<-A018+7J+?S/TpTBs[>iOcr?k`E@CI5F;(5)+,%/1().'.."60%/1003/21,&41.>19KEBYWRdL?OL7IH:O4DYQ\r\caw“sm¢`qž>`|2s…4v3w‘2o4O]6AT4?N>XcEQ_:HS.;O-L])=N0=TCCUXAdbPefK_[;SZ:X<|ÿqÁò“úûÿÿ•ÿûHU`FFXZRe]^x`pwXeoNjrH^o}~ÁÿÿÿÿÉÿÿ‚±|o‘[avPS^UNbINP86::.5;,8<4>8;>87>8;C4>G9UL=sI>[H>sK.A9%1.'..++2%+)'((4&78-- | ||
731 | |||
732 | |||
733 | |||
734 | |||
735 | |||
736 | |||
737 | |||
738 | ! 52)(/! | ||
739 | |||
740 | |||
741 | % | ||
742 | * " * 6 C'O/ C9)=6::;6*03#$ %=!-!$#& %%'&)*&0,((*#!$" | ||
743 | |||
744 | " %#X,%AT!'+,& | ||
745 | !WKY AG"9=/4/'87JPVc++Y&%>$+'6%2;!>-$C-G+ | ||
746 | ) 8(-+#"+)"'/$*0*./("6$#)-#!)'-2>=/946-8!*9 A>6@0?%&;%5483)9#2(()3%!& %"%! *!9#3'#"$./ID38 &#" $7$H,-(" " | ||
747 | |||
748 | |||
749 | |||
750 | |||
751 | |||
752 | |||
753 | |||
754 | |||
755 | |||
756 | |||
757 | |||
758 | !#'$ $"(+.3(# % 47,6Y$-U1S8@;H!6 "%! #$ :6!:D&265IR+KG&A48I77?1<C:.A@8MN>DH6*:2/:-*3-)0.+-/<;9>I7=WBM`K9TJAXDCT,QK.XG1A@4GR-6A7/5749)2:+88,>E&<<%64&31).+()850C>.89%3>%:4/0-*2*37-GM:`PI?J?I_MOoT=mB9d05G237!22%E?$G=$B8(<<&48+&0+%1)23.01:68N4;d/AY@C@J=;78A4>R*?Z7L[=glPmuQt\YsHSsS]˜Vx©Uf›M`ƒ=Zd<;PCAWCHb;Mh0Q_:T_8JN,CW=>VQ;BT0GL8KE4A:2EW5QÆN}ù]”ÿ”ÿÿµÿ„7J:D[MKebKfjUnef{ajwY^~›qžÿŒàÿtœÎYqwKd[KdOGZR=PF?O98?3*110<5:@89;61=51:40==QGFqIC=7C<A6E=-4<-6:*/2'#("!"&#*3!,8 | ||
759 | |||
760 | |||
761 | |||
762 | |||
763 | |||
764 | |||
765 | '%##0$ )B"G4%H;1>70)24%&)# ! ##7(,%7%!6(/($/+!" '%-*70+2"*' !"! | ||
766 | |||
767 | 8/&5C,(4 !. '61<QK<>PKB:;925.(0*<<MI,R 11'?K;J!7I=GBnW)!&!% | ||
768 | $ | ||
769 | (0(+$(!!#!0'*$:'#:!3$',+"0 '(( +0'(0$'055&+8*=<6H)5@%-3 '+,9&/;$4:1>"'/%/)$ )&3*"4-7$"!% % ,71%5)0 +, %,"! | ||
770 | |||
771 | |||
772 | |||
773 | |||
774 | |||
775 | |||
776 | |||
777 | |||
778 | |||
779 | |||
780 | |||
781 | |||
782 | |||
783 | #% &#$$+0%<;+&'," ! "#0,102,.$+ "13846L0=SKpt4F\3F^3Sj/N\41I@,=C/5<26&14+")* '#),-(86*?>6CO.HM(3D%0M'AFGMNL`7BF+;D9CO*CL%CF*:?-MG2MI,ET.@F,5B(3:#11*79/8?)35&13)8;'.;''-,1;K4[@8F2KU;EMP->D+540@*6B*RY3LT>Qe7Xb5hg;TP+3;&%.+)6.KM/BF:;B867<;BC1B515*001,6>5?C=DHU_SS_MS[GJUB1CJ,SU<eY5cXNrIOU?<IKBL?=W@BhCMa@SR4;E77A4'2-!.6"/27;4OA7KDZ9I“=Qó^ŠÿR}š?6'><9EMPEO`ARqEYqNl`TdyXwÒo’ÞqxpOdTFTRLVHJRC=ED3G74<,)3.,94>C9:@179069/<?<lIHzGB,#6%'8),0".)"0) .%',(+31!/1!22(" | ||
784 | |||
785 | |||
786 | |||
787 | |||
788 | |||
789 | |||
790 | |||
791 | |||
792 | &""!# #85-#:/4:1/-21)#*,>"+1%11 ,9 !4%"&+&#!3+)5)24!.7%*.&(1 -&3$ ' ""! !((%!2&,(-)" | ||
793 | ?RJ1B]=AR8,X.N)$,5/,G5CG$4/&/3%(%%5&(I-=3"$$#!*!'4)8!/ +-* -$+ ($&1"4-(A0-?01*/ :7)C=%1&1,-223/"##!, ;*"(.% 26332)50"" "( #" &3)4%#" # &1%" | ||
794 | |||
795 | |||
796 | |||
797 | |||
798 | |||
799 | |||
800 | |||
801 | |||
802 | |||
803 | |||
804 | |||
805 | |||
806 | 0.%) )!&$ #! $"&'!1)/%(#"*-$5$)E<F]LVALOIRYZCZC4B157.C=.LE&9C$349: .9%18-1330989:18>%D9'C9:/8P)@T$1;;A;3A?/Q,S]*ET:FlC@_EIYB:K3,17$--.3)@H+7F/.<'6<,6E)1>"4<)4<KB@V56B-<C(8:/4+.-%921EF<HRM?QP6KT?K]LaWFf@5D*1/%'72=<6D=2J8+95&9G&2<.0)-:%%/3+67/:>9LEHcJPmGVb;9@.0/474:3<M/@M8K=:I;9F48H85ME>UK6Q=JP.GI-G<=*#-)4):FJgI‡n;VMKDGmRbŸI[J494I87I;?E=I8@Q2@^4H^=Scad}\g„JifQa?Q_BN]AGS=GN89<3+2()0(+591A64B47?14<2F?ATCjA/%%$"'%""$ !!"'(0%2;&5:& | ||
807 | |||
808 | |||
809 | |||
810 | |||
811 | |||
812 | |||
813 | |||
814 | |||
815 | |||
816 | |||
817 | $ ) 6<$$D()C2,-20+"" ! &)%,/&(,%',%,&$!..8+7"!7$%,'2(%%% #( ,& % | ||
818 | ""#!' | ||
819 | #1" | ||
820 | (&0@543M(2>&(;36'$$&.,)#!H7:./.$5.#="922#@ (,:!6+2);&(-"%"#&!'#+$#'!!$%)/!&0("2'*3.!1*/-' !"'&$1!5H-G6C&7&-+$=>!! ! ) 65)# +/0-+&"6% | ||
821 | |||
822 | |||
823 | |||
824 | |||
825 | |||
826 | |||
827 | |||
828 | |||
829 | |||
830 | |||
831 | |||
832 | |||
833 | |||
834 | |||
835 | |||
836 | |||
837 | !&1+4'&+,#<"+ -!# &**#%%"#.)7#! 3.$95C1H@/@E2GN6KI>N1BC-?I7CN=EK-?B*:<*:808;(;5%43+=64>?.=P0<N,=7-5+5'&.5317B494?2DM(E8(9M%5F#6G.:4*3*#(*&(+-5-+4,43*3//9C2A@'-;(4N7Gc4VW6MI::?6>9)G8)@8+DJ<ec?`U@UQ=vjFX_QEO>292D9 *-)*.=(6;(03)14$10-4&20,'.,!))!1/,:65@C=IX>D[EXIZ_,]_)e_,>E44=@6C91@5:=.*:%0:47FA=Q;9M<Yh:Vi4\l+—{-hM\BJˆZ‰q±>{qKc]X;D;B;>H<JK;?A<;.=;36=-7H*:YCcgqz`GSXBTFE[DFO?HN?BR4CI,/4) -&-32+92.8206/3=6EFJ{WHk@() $ ! #/2"9<(:A-/@, | ||
838 | |||
839 | |||
840 | |||
841 | |||
842 | |||
843 | |||
844 | ,* | ||
845 | ) 26 A%E.!72)+1-,"!"++.!"!&$&!""&!$ ) !)-$&1.$/( | ||
846 | #,'!&#(+ | ||
847 | 0% "&8#*1./-*0'$ "%($.2'*03,>"&-%#*!' 9-# $'742C,9:'7O$'C+&'.%!##&%/!1+,-(/--*"#%" !"$5G&2=L'.<'G?"";/-"!$)"," ## 4",&"$'*".,<?9E19(4-?#* | ||
848 | !$ ! | ||
849 | |||
850 | |||
851 | |||
852 | |||
853 | |||
854 | |||
855 | |||
856 | |||
857 | |||
858 | |||
859 | *(&> %#+/""&$#%!@4 "*( &!-06 4B3;2?%ST/VM32;.963>A<1;:?E76HA4BD8>A@J/<E27A1?@2CA*>F+GS4YQ1AB:EG:AM0;S(FF!@S/<S5,9)"-4.--"(%"'.$*1/7,;7 42 33$14(84(HK)IJ*1=:2?43;/:591>OHcCTi@Xk5\a7^m9np<voJzƒRe‹Is…UVƒPVDct5ET4A[*<M&*9,,2+*5)/8#-4)-6-7<#-0'+1$(3**3/+9<,9A9LA9RL`yH†‹MtˆK^c35A61=56>12>-2;'GN/n]<UN5>@F:VUI\`F[wVzh]qLDUoJc¯k›ˆjdN\D1898:CE;RHA=D72-3-6:,56,.4D4CVQkGPWB@SBAQAAR>7HB=K=@K+=>'.-'(---1036+2519:7H?IA?C5/%$ %4:'-:'-<'-5+ | ||
860 | |||
861 | |||
862 | ( "# 1>"?+P2P7'<:,1-.#% !"#'2');("%#*5 4&)' -.#+-,'" &!.-(<1") )/6'"1(086*+09+)8#*%( 3/";& +""?'6210 >%C*4/2&*,$L&/J* <8" )/$, ,*"+#0%$% | ||
863 | :O,<[;G1H4)"2+,( " ! | ||
864 | G"!:..)" !0 .%L2&@X04D8H7)98),#*,),+/9&9&%,* | ||
865 | |||
866 | |||
867 | |||
868 | "". | ||
869 | "'! | ||
870 | |||
871 | |||
872 | A](@ | ||
873 | |||
874 | $!'%N6H@A3%5*,$)&&.+.+# !((-?,3<#(/,)<G.S<+9-'36!66(/50299@1?@8<H8HH=6G;.91<889@>.;>1D=EMAIL4.991?=0:BBL<:CF"16",(.0!,)!'(*%.(%-+3.92BJ%cW)IJ*;B1AL6AX03;/%17"0+,D0,@4K]IXfCSi@k~?pƒNXˆ^_ˆWq—\y•gd„_RxUGmOHvI7R10E26I-0A+.5$(/"(4!&4$03.7:,-.**(/ )0$*1,,;/0B5DSGWmqr—sš«f{‰;:?.%24&6.7=*9::;KLFgPVl?;K==?LfaK~nhŠ•s¦—RwjLdcd~”HWf8B6).9,6D@>DB=D=7.131871:8+/8.<AFBXD_b;RW<HW<IN<AB7@E<4A6@M):<'(3*27)/6/+4,22+C4:;*.' $%6+@C)JG >F$ | ||
875 | |||
876 | |||
877 | |||
878 | |||
879 | |||
880 | |||
881 | |||
882 | |||
883 | 3 0"" | ||
884 | |||
885 | |||
886 | !$1 6%5)D,"A7.867,-/&##&+"* ,&&)!,)'(9 ," )#,*'&,,"5-/(4&6,#! | ||
887 | |||
888 | |||
889 | |||
890 | "(#)#/ '5$6: 60.<-)'4*$%( JGE"44!A53JA;<V8N26: 63:2G!/>%-:#.3(,;.8+2#)<+*%5"<92%#$&& " ">bL5g+21C!*6%+7," ! | ||
891 | D#"*@0%+'!%"4/,I/,4&F,<H,>NC?!G<#8=)5-'483/34)0$"! +"# $ | ||
892 | |||
893 | |||
894 | 7)FU<<4.# 7 | ||
895 | n4€8N,T,KC>\U!#&2 | ||
896 | +$71[e+Cj!&E $2;O<R=F2@+1( +%(&&(&#'&!(+,-.#)$:#,<&0)-*%0))-+'//4)630:68;?2>B.17:>/BD75:513,75=5>I6C<6B/70.35306<?>305#1."GC"AR5;483>%2H&@F8XXKXzIQe4GQ8JQ=DH6@;(12*+,.9A8=O7.EOFdGLxFZ~QXŽJvŠH[w[W}kQsdCcED]/Ib5E_82L*8D >B#8A$,?(1;!35./"66(.4*(-#(3":6%2,%*+&$)2*3:4GH>_vTr–i„gpR[O*@4'C@18@2c_1B@F=N[JQGldEnaP~‚_šhZ„Oˆja’M«Y{‡c†s<D?2.1.&3?%5B.8D1:9::6B;6==16;*<E:9GOKeHRa=B\>MZ8S[:b`7UP9BG3BF,45+5;48?(97*?21F2.?+"""$!#!!)0'CJ*=L.8K% | ||
897 | |||
898 | |||
899 | |||
900 | |||
901 | |||
902 | |||
903 | |||
904 | |||
905 | # | ||
906 | |||
907 | |||
908 | 7 2)-' ! | ||
909 | |||
910 | |||
911 | |||
912 | |||
913 | |||
914 | |||
915 | #17$='F-$<1(532/,*$% "!'&$&%))&0$#('.!33/<%2&!% !% #'4&!#(1"/.&#$! | ||
916 | |||
917 | |||
918 | |||
919 | |||
920 | |||
921 | |||
922 | |||
923 | |||
924 | "&*$$6, 3E1"8!9;#>M+<0%$'JAN*4N1:P&NP"AX&=O/&V3 9+.""1)2EH/2P1+9(2.-#<02!.)"+*'#& " !%! >U=7gM';#@="#1%!&* | ||
925 | |||
926 | L/F:6$$)#0*3(4<&<0)I0)?31<-96+B5+&8(*?&)2$1.+!#%* #"'.*!) | ||
927 | |||
928 | %"?.7 (?(]PEX?@SR>/(93RAFh4<ZGNc0)V/&E<7eB+F!-18" ! ! # | ||
929 | 0#T,C,#4(350">)0+'101. ?9-1(4* " %'"#&#&,*#55??/=#==& .'((/81@F=;:4GC/3;848?7=81?,(;./?70A7;H6GD-(4,&,8:A98H$$+#!,)$D.8],`^/CE/8:5=D7Q[=>mDG{<S}4Oq=Pr=Vk,gh(†i>R"Fp'3J0-B<'II:GA;^aE~IRtIOvYDaN2G<1E6/>/'9+(5,*6/3E+DD'33+06-17'E;'2:)4<%//"2.'>92<6#4@"9@(>@1.=C<JVDWtPho}ox?rn,>B68G<em>op=j]UacbOfnIii5Pl3Xb=Pb`_cM\eq„jrh~•OOY/,,'(). .2*2474495:<=:8:2552:B>LWHOZLO`?GW=FQCEQCF_GQ_6GN8DF.?C/?E.=@.8;/>//8.0=/. !!(*!($(%#$.3H,?K+?G* | ||
930 | |||
931 | |||
932 | |||
933 | |||
934 | |||
935 | |||
936 | |||
937 | |||
938 | |||
939 | |||
940 | 11+-1# | ||
941 | |||
942 | |||
943 | |||
944 | |||
945 | |||
946 | & 2<'N-M5%@<*1619''&%&$!!'!% )((/)'% :20L'4#")"&"( %'# .%$#0)$""# &%&"!!1.#! (6"4+"'" | ||
947 | ))#4+6'E-%@6A<JJ+MF06I(?<#:!-20/:=0%6A?.6?)9590=.0)".-'KM25G:,.*" 1-,$17 "!#"(!,&2&0&0."%#"! # H)XKCDDN052$>()'%! | ||
948 | I),D7:0%% '5.)$*-<+(3&+-+14&11 AC;E()" ##',!45+.# | ||
949 | % | ||
950 | * ,4:(&= DU)EbMIK8(<%K\6]z&lwY\ BZ.I\CbjC6nC&32-+705aP%?G"#*-3#"! &!- | ||
951 | '#&+.$(C$CH)>?,=<"6.#/&-).)+*6,--#*51/98.54"03#)$'!151(@9*<7.C<360137-21-0.'*/'*0,0544>*=:3B(JA$/2:I?,;>56 %#BH=TaJH^.CS0ahA{|=aW/U]8J\:Rt;@`>HdOIleB~BU>M#/E"/" (/(=;GO8:JN>BE5?@1E;2:5.<5'3,*.)'&+*-52:>.@/*7'.;3QOBoj.F@)%0"13)LL,MQ6[_/JG-7946=*-/./5C4J[:O~fz€€ys9NM,E?2AF2KnKx_Qw[`v[Ud`<GG;:G41C8EAO]DQmXŠ¡m•w^{Y7G342'/.&0*)/06,4;.;<:8;;855B4PU=KPC?SIBY=I_=Z^8NRBGQFK[BX`7IT5GV7M\4YW1KE,8,(.(-G3$@+'#,+%;5#9:"35!-1(##$+-+E.9O* | ||
952 | |||
953 | |||
954 | |||
955 | |||
956 | |||
957 | |||
958 | ! | ||
959 | |||
960 | |||
961 | 2 3&,)% | ||
962 | |||
963 | ! $+6 J*V>$>J80514%'$*!$! $ ""- !0*#' #'%%%$-!$!)#4,-;"*8%&+'"' $# %,5*3:"A%!6!4,',0'<83A4 | ||
964 | |||
965 | |||
966 | |||
967 | |||
968 | |||
969 | %8%3B&1.+(<+#AZ':D2JF/6O6;<$#42.1+->#+2.)83:I.=*4I#4E-5@$42'"5%)8$2%&,@:BF"5=:2J5J?16..6;0@)E7> 96,#)%.:&* +" F290G<&=*&) !#!"%## | ||
970 | |||
971 | D%)?87.3* % &!&"$,$3,52<!1/?/ .!%6"184A/C*B'G-E)F"./*=4>;FD.D4%3%(B8;Bg9[a+NG)A>"@B9U#C" 2CT(QX6iy,<C8;TM72# | ||
972 | |||
973 | |||
974 | &").*4;-78<4K61?3?Q'HU@D!41 :9 +7$*-#&/(07//@'&+*&"!#%'(3&73!+236/1>. ,,#-( '%'($#',2-6C0,>40:3AN.GG2;=20?(2:#+.DA*MsH]z1CW4C^O€•bl„4L_.G[-Gk3Ou06<B$5Q1M7Q1?Z"5>+-') #/9&789I4JY9<I-6J+5P0<N&8@+5=&<:"*3&->**B2%2.#/:-<X=XZ3B'&')3458C@*FB/BB6L3+;35D/US(XT/9=;:Hh;]ŒM}^<G8*0!.76L/@h9G`AZP2E@&45:E1EL-:@=+AB-?aDfxgŽbUaL4?53:**7+2<+981,3-.370690506>?>VDNT=7H?6HF=RDDV@IR>9NH7KIG^CDR9;M==NC>X@DP/D6+G91nJ/U9#83(A@,9A03>)$-)!&%&,-3%/C,?I/ | ||
975 | |||
976 | |||
977 | |||
978 | |||
979 | |||
980 | |||
981 | |||
982 | |||
983 | |||
984 | |||
985 | |||
986 | |||
987 | |||
988 | 20(+, * | ||
989 | & | ||
990 | 2."B'H21>>816;+*%!#"!$!#%&"%*".#%"!% %##*#'!*"'%%$& % *-'*.&*!)!("#%%) *&%6("#7!%/)/'"12 +:-#0. & | ||
991 | |||
992 | |||
993 | ( F(2:!2"!%0896)()* /7#2KB=9<8G4/E;!-4#$2$4%+*0$1;&?"+,0--3/9,46+:@)*6%/;%(+# $.;BALRQ!Ef#7V!<_6C1C/-S22:",<.=%8"+$""!""#,-!(')#<" '**2( %#"0"(! | ||
994 | I"$80>$+3 $*3;D- ".!!(%(OG/TC.B9)"-"%.)&3')!.;',:0 01 &/+5!$@&.63;02:-32%%$J$R8d20$2-@)% | ||
995 | &'"" &#",.21>I.--7((GABCM[3*A(&34-=+ 4!&.#')-*3/#1(-'* )'%$+, &'%5108,;8$60$))(*!& -2*986'0,&07,6A&74075$,/"6(%0-;&-G/7D7Ht5XYeGq}=jcC[;^[33:.*90-C&+:"'1.4(+J,+H*(4D7A 0@/?H5-C;(E$.D'5M*KV,CN+<M89J,-: 0;"'3&49"*+/#1?-6K(3"020394)+1(+5'.1&-./<<VdD@Y4%62,<B'3l&<\=F%2. $(*-,.2@/>C5PIJO17+.(357F6;C/651*3H,6d1KZ?RA1936@19>-7<59A3A=1682322&..2888@>;M:AG6:I9AHA=HB=F:7;:87G9C@>F9BB8<B=>EBDF9H<6@=HYX@kG1?53CG35;-()*#" $ '("2'6I, | ||
996 | |||
997 | |||
998 | |||
999 | |||
1000 | |||
1001 | |||
1002 | |||
1003 | |||
1004 | |||
1005 | |||
1006 | |||
1007 | |||
1008 | |||
1009 | |||
1010 | |||
1011 | |||
1012 | 0 | ||
1013 | 6).-% ")5 I*U6&D>7545%)#!%!!!$#+! 0)!'%*!1 %&''!&(%&*#! ($(+ '$""#) !,/ /3&.4/-0,%, | ||
1014 | " | ||
1015 | |||
1016 | |||
1017 | (36;+,/"(%"! )$!&18&AD;6(6<-7E+.<'-6/6:#,7&!$'#)%0 -&,()!"/?84J1I*FD+<G$6?51(,)7/H<63a45L@%;B#1?98%-2)&!(/"#'$ %%4!,&! 7!.. 3(!#$$&-+$+$, "''#$ | ||
1018 | $&&," (#+)""&% @ "341%!* | ||
1019 | "(,2#>'8 7('64-5 #':YZ5Bu*,0"0!3. ,%#2(74 ;-$.&'(!53,.#*C#):7-W&3$+!',+ !&")(,"32-78623&'"&.+73B;;6,13*'5."+"&(!#.&#.!'*,$(/#).""+###*!04*<22C&94$$)#&+#!++%5)))$)/+#*,&-'0'$*$$+*"0$",&#*,,--27=9PEKbQHMQHPM<FB16%,/*44%HN;;3=!-!## # $*'!""+(33/4.'.%(0#05(>@9Q:6I86K0-D#!8)"4+'3),;"$+(*2/*-"!'&.2*CG'>A/-#87 02'10:3@D;B1(1''1-)/.',9*:13>..)*%071)4:?@G>D;R\'`\2TR5MQ1Z[%>5)&+;*3F7:8/01(00,90:;:68=/88+5,*,('-%1642D:EM:EP9EN::H:?F?CJ9BF/:>88@=BQ>NQ>AH7@K:BF95*8--L@;MJF:D88.49+2'%&"-),%*-1.+-!*,'-5& " | ||
1020 | |||
1021 | |||
1022 | |||
1023 | |||
1024 | |||
1025 | |||
1026 | |||
1027 | |||
1028 | |||
1029 | |||
1030 | |||
1031 | 2 :&.-& | ||
1032 | |||
1033 | ",6K"K2\:*MH25=<$)%# % & #"$$(#)(%#%$%"")'./*.! % !$!$$& %%#!"(#!""%!!$ (#'*&'((+'"-"! "( " | ||
1034 | |||
1035 | |||
1036 | |||
1037 | &1"$$")$/-,&%06+(I*-*(7,+4/%&<!+4%+?>-,0'C* & !!2,*%:2)2J11@)(8#'2#12;<:W/3CB 8,*/'+))# '% #! " %&&)" &0*//3/%$'#$!((#F)#+;&<,--?28B8: )2&'*(!7+ -!$ $ !!'$&' V!$4.2$ | ||
1038 | &6)@%)+"%$%,()#%-$ | ||
1039 | !PW &"&!!0/?;B%J_$h]SS3U6*#53')/+#((#;&-%)1## | ||
1040 | |||
1041 | |||
1042 | #!!$ %(1!14/:623+("& #*-)7,2++2,/ -''#"%#4*"#$+($#"$!' ! !'$&22/@(/-$%$!"##0#'$"2$((#(' )()!$%,!#'%% "%'%$*$*2-+<,3F9J<-L??R:>H'3>'5A'1I(-E)4M!7>'%%#*)2*(/!=;*AC(17$'#%$8%.)9**:'"4#*&6"%4)!.& /!!,#)!")%26)MA2A?(13)/.+*3%*11-535@'A<!A;%7;#*/(,49.<,/3%59*5<.D?29E>JRM[rK[Eb†F`yFB[=7F+47,8/3-21'1+*60,644A:392+.1%**','--(8>6/=8?R=GT?FM7:D:3C>=G;=J;:?53;<2AC/FC2><7?;;@5D2+;(9A4FA9:524()2!"(##",$.8&5=$<F'9F%8?-=E0 | ||
1043 | |||
1044 | |||
1045 | |||
1046 | |||
1047 | |||
1048 | |||
1049 | |||
1050 | |||
1051 | |||
1052 | |||
1053 | |||
1054 | |||
1055 | 57&/1* #!!!!6;'K-K9)W>3LJ87=B%,'"%#%#&'%!&')",.#-- #,)$,.,5 18(4&,#'$' !%!" % '!! E"%;' $' &,# '$ % "#,, /$#"# * ,+&*! +=)!;I"BF' C %%'("&".:5>#:(&&(:':@.I#&>3.0'''!,) +:(&;9(8*95$$3!,$+0&!&'(,.0/71-8"3C7 CN!=>!051B!<3"E?'1?&G:*>96&8-10'./.,&2;1((*!(%#$)%-#$'" %&"('$$)" %#! (()/ #&/#B8>>4/")(.))*!## .& I1&204Q!8N)D>2E6!'$"!/</770,5&")" '(%/&) | ||
1056 | |||
1057 | |||
1058 | ! ($&$"!(!#,/6A.=B'11"++)1$(2*.,(74(*/ $!&(*"%& "!%'# &$+1):-/5$7@13;'%(%&&# ' !"'&) -/ *2#-26D#?SdOA2*/">B%<B&DM3>E7DK::\:Rg*Wh*3>/%5+*-'&:+-G/F4>IF#LV#CI'9B0+<7,5 (-&%!!!&"&' %"' & &&#!$&'476NR5HK.6<'72'0."*0,29/4615E,P^,M]&5?&26.5;06B.3=.6F2CO5DXDYgHAWOOkSa{SV~Qe…Dgc1>H/:A/13,42'55(073,69-41")$&-#3-&56.6<24F64B=>KACM7BH25@;8@73:5+53)31-/5*.;,.4(06013H;/fH0Y8:C24/)* ""! !$"#0*0,4>-1F.:J1=N5AP7 ! | ||
1059 | |||
1060 | |||
1061 | |||
1062 | |||
1063 | |||
1064 | |||
1065 | |||
1066 | |||
1067 | |||
1068 | |||
1069 | . 5%"/1) " 69*@+!R/,U9/OG<0C<(*0& (#!-/'0=(368 ) +*"66'0>&%<'*)1' ", .4'3#'&8&;#72041!* | ||
1070 | %!& $%,&&,3,E.60)7+?27(A.5:" 4G=-R (,#/!-'%!"%$!#') +0%$,*!"""$2'#,'+'%0- &1",'' "!" &!! $$$( +.*&0&,:");8())(.4!2B/;4-Y37L/-K&*@5&"&." "#"(*4+!#7)!!!#!**)-$+ ")$1'()*.,*!""(%$ '&!0J'J('#"!1(>".463+ | ||
1071 | |||
1072 | |||
1073 | %""-" * 5/ $("&)(3),(0*%%-(;1**+,)*#,+ 1 8 | ||
1074 | |||
1075 | |||
1076 | |||
1077 | |||
1078 | |||
1079 | $&'=&'!#('/;0>4HS$6;"/&' ',($/9-3;!,3'($"'"" $!%()#00(5B.==0(.?(3+&"!$%-**/%("$'#(,)*2*#*!"'"):%HA!D(('$-+110;#:.)5',7/3F7Dg4ao(SV"=ACHIC<9@:)FJ5<\03B*75.-4-'3$'/(0-.,-+--/$'! ! " #" $ "'&""(0,?A09500&*1+%1#(2+*815E/4D7-@;&2.%1(&2*,70(3,+.#13*=C4DBInDQc>KQKRnGGXN/LVAi;>L46G0/;.261/83.202=1/2&%)#'-&*0-472<J.=H0HJ5COBIH:8A4,40,4303*//&,0+-3)*-*),*'*/129RFH~aBˆY8[9%6+245/1,-0+58.050(8,*60%98.C2! | ||
1080 | |||
1081 | |||
1082 | |||
1083 | |||
1084 | 20%.+"*57&B+M.%c9/QL;6B;+(2! ' +//#4"/&$##(+-5#.@+.9(!1+" ),/92B78"#B!) #",2+36-328<; /"# | ||
1085 | "(%$ "/)&*#%*! ' &++9()7(<:=K#7A/-?/0/$/#2%4>+:%41$#$%!("%#'+)%5* "!&!-,/1%;!"#) " $)##1 /'""#'$'' "%#/0("8:1!%//-%"2$$'D!>6(-2%7%#( :599;5!80)$ !*.&$.)% %@%"&+$#,( $" | ||
1086 | 6,(+(#L/# | ||
1087 | |||
1088 | )",- &) #!5"$!*%$,4+90814RF7h ??D,( " | ||
1089 | ",#2F 5H.1BH(BG3>=;)8.51;495$/5,1/0,5 .+*&+"$!$$&+7;&NR/@W::B59?(72&%)$$! %"')! %$$&*$( $"#($'%<!(+&'&!*%"!% $! (%*246OQC\O>Q>(55(7<1G6B`.`m0K\03H+09.44,*)#&('#,%76$)1&&.$%*))1!-1%+'("$&2(, &#%""' %-!%%(.(00(&#%"-"(1%./&0-$*(!'%)()""1"%"*';/;09A9;R;=MF*>O(;5!,J#3K#75$86$12.1&22(32'10!.(#%%#%("*-(4.7C/>M;CO8@N=@N69B+48-54/47-.1+*4%+/)(-%$)%!'-96=bM`‘qegD`D+0*&*1+>?'EF(9>)6=+/:)(+&",-(3')3& ! | ||
1090 | |||
1091 | |||
1092 | |||
1093 | |||
1094 | |||
1095 | ).!&,$ '04*5'!:,'W3.CE;7AC(,*$!#*(&%&30.4.; "@ /$ & '7)F"!;')-&'-+$ & ,6;).9# % &! | ||
1096 | |||
1097 | |||
1098 | ) $#"$!#$ % %%(%"-6&(;./=16<.$+#%5-&"#('*,(&&9% %$.($#" %- $"#$#!##*".+%#'#2+'+5'=:!$ &)!$, $# "(!&*!'11+ '*$+"!)%$!+$"#!%!'!2&+#&"0>'.A1;=,.<+&$$3'6%(!#''# ) ,(/(*!+$# 8(!!!#! | ||
1099 | |||
1100 | |||
1101 | |||
1102 | 1 | ||
1103 | |||
1104 | |||
1105 | |||
1106 | |||
1107 | " &+;")&$''%'*,8)!2C.>$.."9(3444B+ | ||
1108 | !"&"& &.Bf#Cb793#G;&76;RT6FL4%,")/$0-!6)&.((**0*(!+&'0 )*+. :8+2B90:Q&:@ 183;24:1' (("!$ !!# &'$& "!*"* -Re^W[DA,""%(24B.9H+2@%*%2&5=;BOE]R,J0&7/(9,(,& % %&*#8(1;(#'%$%'!%%$"&%!+51 %)!'1!%&!! !#!""##!(!-%%!$(-"4/+(*%'/%)+)."(($$1/,,')'5>0GX24N6%@3,32&0,+('(..()*#''$& !*'*#((#+*,.#7,%4)#$#%#'1-:96J<BM<GN>MM?AE2<@31:288-/0)(-()+&)* %&!##*,-EJKg|gw„aG_B1,"$!",(127A19A,2<-.8($)"#$#1!.6" &"&""&#$($ | ||
1109 | |||
1110 | |||
1111 | 16$#.' ' ,,".",#4$$0*)66#%=!+$#"&"!#+(.$'+,+!2? <$ + *$!&.(8AI!( &+!5),!!3 | ||
1112 | ! ) !%)(0!-.)33%,;*3@")5+&1!151>OGAS*NSGMNQ?NDICG>B*)%(!..+#9#1'3*# ,&/=$@% (!(.&(($+"**/%%5#D/$ ,,%0&%+-3') #)"'6*(!" $(""* '4+1!!2!."! (" | ||
1113 | " | ||
1114 | |||
1115 | |||
1116 | |||
1117 | |||
1118 | |||
1119 | |||
1120 | |||
1121 | |||
1122 | |||
1123 | |||
1124 | |||
1125 | |||
1126 | |||
1127 | |||
1128 | |||
1129 | |||
1130 | |||
1131 | |||
1132 | |||
1133 | !%"+D</D %;#2!) !'#!*)' | ||
1134 | " "*B(K<97KO,Og3Jn50KR)79"%4&%/-&*(("'&*)74"+)&5+"1'23!@C1HJ9MD/-:01:.")%69- + &-.-'$:*.# &"%#$ " /%L<>/m;L|$KZ"Vg)dc-B1#& FE,DWD6S>&/$<J"EP"9;13%.$+!&+0 -&$,#*!&#! '%&!$! & $"!!!"$&#%)+%*1'0<&03&.2$9;'@:$=<DE!VU(bU@:'>I7AM2#0,$)+#+%*1*04&%(!!-$**+*)!!#!%)&.279F/66$1+#,(+,.3.=:<H@@L>GZ?SV7EF7176'1.)/'&+&%*%"'$**"-)(71<QA]YWeaTGeM)D+& "&%(-0(36(14'3=&20""'3 % '"'" *!&!! | ||
1135 | |||
1136 | |||
1137 | |||
1138 | |||
1139 | |||
1140 | 28($.('. "+8$)&($$#!"% (%")))+-0-)3")!" &#*261./1&$,3'4 $0#($ !'#//( !#"#&&'0 | ||
1141 | |||
1142 | "!# "$'")*%++!- )( ""&$.,,<*)3%>;%52.8#))';6'@3*;((>(3-(#,,+,04")+(+#*&0#/)!" ! ##$"2%=3#/ '-#"$(#'3+%" ##B58"+! | ||
1143 | |||
1144 | |||
1145 | |||
1146 | |||
1147 | |||
1148 | |||
1149 | |||
1150 | |||
1151 | |||
1152 | |||
1153 | |||
1154 | |||
1155 | |||
1156 | |||
1157 | |||
1158 | 2)#'!.%" #*4$1&9/ " ,/".49LGLMW6=J0I32;#LQ>Q$*2$$!#&(+(+'/&/2-/=#;>+PJBRUCDK8-5-,:'2("#&#'(''+%)%'%#(*&")+$-" #"%%%%!!!"!*A!(I#/3#=./O;MW%@4IJep-Pv<4N,10',!(7&+?"*:>>31#.#, !+#/#+ "/%'!! !!!&#",$(2+19/3;.AC.KL05C1NX7hc4RWIJh]`z?S^7BNC*72&-$.2#,1'*2/2?(5:",4%29$+4'0;&-1 ! ')0667;926065(76*:>1<@==I@=FB9FM@TBMP/63('))(++&)#!$# $$)#23+N96TIOZSW[MNLF197!39"BE#HI'CE$<B"FM%MQ;76354!'!#%%+)!+((%#%""! | ||
1159 | |||
1160 | |||
1161 | |||
1162 | /9(#42(0 #$! (.' # "'# " ,#&&!&-)&$8*#@,/&"3 %&'($& "!"),# | ||
1163 | |||
1164 | !$+". &$$'#($ '$#!!$!",$!%7$-, -,3%'),)*"!( ,."/420-63, /0'(%)+-(B25'@&* %! % &'#&!#+!!#0#' 5'$(.,*$% +() '"$) HIG<*.("$ | ||
1165 | ! | ||
1166 | |||
1167 | |||
1168 | |||
1169 | |||
1170 | |||
1171 | |||
1172 | |||
1173 | |||
1174 | |||
1175 | |||
1176 | |||
1177 | |||
1178 | |||
1179 | |||
1180 | |||
1181 | |||
1182 | |||
1183 | |||
1184 | |||
1185 | |||
1186 | |||
1187 | |||
1188 | !!$ #5!-!'=!8&1 $) | ||
1189 | #("%'$)'(@5>AM:1>E.++3799+9,)7'"+!)# !"%##+&*2037<2(721@C1LO"9A7H-$3.08"3976$88$!5(-2"#' "!!*&#"& & '!## "$.*@9A-LDC4S<)@*'C)(6 !)$+,.!1<*A@*1>%8@63!$*% #%%!- %#$!! #&%)"*$""$ &(-6,=46>;7BDFY@FLE=LU>]ULaRQ_h_pcbpEEA932*26(4;&19*(:1*72'8(.:+*51+9-1@+/B)1%)*006589;:66;8GN-B@/:H:=I@>G=<IHHQLKO5?B$93&47)@9#3,.+!+'*395CD?PNM^RL`I@=15,.%:A*>F*CQ+FU%>C%7D)BR*=J#AI%?P&"($$*!#!!*#" ##!!$ | ||
1190 | |||
1191 | |||
1192 | |||
1193 | 19)!3/&- | ||
1194 | "%.),@D*<+..% $"!' *)1(600@(>'%0",(# 1#, !)+!,"#'$ !" | ||
1195 | |||
1196 | |||
1197 | 0*/#0/%2"'"!$#)#!%!"%!!!($"($(/. ! # !$.(4,>#3>19)& # "()'1*$89$=!+ **4=>"9-3% .#!!#"$& %!3&.#(!!!! | ||
1198 | %##&,)2=$/%#,&#(&6 %.*1'1! ! | ||
1199 | -?7E::+)*#'! ! | ||
1200 | |||
1201 | |||
1202 | |||
1203 | |||
1204 | |||
1205 | |||
1206 | & | ||
1207 | |||
1208 | |||
1209 | |||
1210 | |||
1211 | |||
1212 | |||
1213 | |||
1214 | |||
1215 | |||
1216 | |||
1217 | |||
1218 | |||
1219 | &! &# .&#"#2;?6"wW0T^/;N*6+#3,+)-'$/%()$'##$#)-%(-2)73=7)7B:,3:'#5"7 *)-.*9,3H*GN,%' "!#$+*!! )(6.'*$& !! ,16<.27-%:)9C@:5A/))!+183!22)-#/4%1).>43H//9-'2!$()*!$#&"()'$',*/,/" %&*"):%67+1I4FA>H;*<F>OPEQO0NY@dbJlOI\5EN,]S8GF,MR,J?+08,!5-'4(,,"*+(7-.4$'2,3)0611>68@19C79L9@P8RP5QK<:F88CE@SHNS=AF14B0<A/9A,5;#;<#99+6>7;?BIDJ]IBZC7E1%++&>A/?H)@G-<D'AH*;F*<K+GK&9A#4>) $&&) | ||
1220 | |||
1221 | |||
1222 | |||
1223 | |||
1224 | |||
1225 | |||
1226 | |||
1227 | "=<7#96(.!$*!-%+!?=-<181&,-&!#" % (*)1)2#7"+1% 4&$))14 ""%! #.%*& &3+$1!$" | ||
1228 | |||
1229 | |||
1230 | |||
1231 | |||
1232 | |||
1233 | !'""%!&0!,!$"""%#+/329<4?793,+.-!" #&"$&## "$$2.%%< 8.C;MEGJ.L"3%*0#&5(!,./&"- $$!/?%8- | ||
1234 | +$%1)%)%'(&01033='-25.*5!;6"-4&0"/! | ||
1235 | .$<5-30()% | ||
1236 | |||
1237 | |||
1238 | |||
1239 | |||
1240 | |||
1241 | |||
1242 | |||
1243 | |||
1244 | |||
1245 | |||
1246 | |||
1247 | |||
1248 | |||
1249 | |||
1250 | |||
1251 | |||
1252 | |||
1253 | !# | ||
1254 | ")<:!+##)&-181!7^)8L,22*2#!*%')$.!%2 -6 $!$!%''H;&Q<1OC5066&-% *'$,#=-(,#.*+E)0>*-"#.'(" #"*( !!+=:36(&!,&%5&(2%.$4'8)0*'9-*C(>U-Ti4bw<2B(2.#-1&8M+>T!.>&2;$3>!1<5,8+2:(-2!!*$!$!!&"$$%* !!-'$0%*6 ./$(!'&(/2+/00!,<&61$,5':F1G=1F"3T5LJIXBASNIeIRaGPhE^i3IU06$-&$-" )#+)(2&,4")7'*5,-;5)96.>03@C)CF@WJG\;FS<GRCFRUHUCFK3;A37G36H49D/9F->F19C6SG8tPFjKAYA2:6'00-05/+9/0>)3@'6E)7B)8D,;K(7A#1?+ $"&#$#$#%# | ||
1255 | |||
1256 | |||
1257 | |||
1258 | |||
1259 | |||
1260 | & 7/:9!&65*/% #('$.#:!@*>-:/(00,(+,"#" ! !!$!##"$)!'')$,*1&1/!%##"''0 + ( " " #"8,C' | ||
1261 | |||
1262 | |||
1263 | |||
1264 | |||
1265 | |||
1266 | |||
1267 | "&% "!'! ,$24"0;&,@,*?%2= 3GAQ3K)2%& &## %!)* $'!1'), ''+/8!/I/'H8/?27=6E3! -*"7!!'%& '!"<& C.2$,&#"%" "$("'> -1&?*41,;"0C C-#'-!"! *%*3 ?/;/-0/.'5"# | ||
1268 | |||
1269 | |||
1270 | |||
1271 | |||
1272 | |||
1273 | |||
1274 | |||
1275 | |||
1276 | |||
1277 | |||
1278 | |||
1279 | |||
1280 | |||
1281 | |||
1282 | |||
1283 | |||
1284 | |||
1285 | |||
1286 | |||
1287 | |||
1288 | |||
1289 | |||
1290 | |||
1291 | |||
1292 | |||
1293 | & &+1/83$;3>=,3//5,0/6-G?&9A&')#)"&& $'*(&'&#$&+ -1)*5>&@< B@#;,41&%1#"("",#7?-\jaR'e>/^A RPash†(Tw"$' "!""C30,&+:309("+%*1(26).2&04"**1&-,'(/*%42,B 0PBQ??R*7:"=@+/;;-C01>.3C/.F*+>(-=&8B$/=!(% *#( ' #* (/"%""#$)%"+))" )+#*")�+(8"$/!05(-.$(71&'/$)-7/8A3QD2LF@ZXH_QKcdOiMH[/2>*3'2%227'31*+1')2$+2&*8(.70;A+FH*GH:8NMJZHJUAL_ADYN=PDGO2>H1?P-;F)@J.=I47H79DA[QL…iLrSBRB7@<-AH-?A,99);8(64(7;+49&<D'8G%/<$,;# %! !"#$$" | ||
1294 | |||
1295 | |||
1296 | |||
1297 | |||
1298 | |||
1299 | |||
1300 | !! '#!4( :-'(42&4!&(! %$(1%+/7$$:%?+"=2':/,--,$%+" '*+)3-)+0"$%0(16+1=& %(24"'$ !',$!,/$&",%2166+6.#"& | ||
1301 | |||
1302 | |||
1303 | |||
1304 | |||
1305 | |||
1306 | |||
1307 | |||
1308 | |||
1309 | &"!#!#%$.,*5#%1#+((%!%),.378,E7(4+)241;6,9#4,-/+48*3".'11;%;"+'!1"%',&0## &*4'" $<7=:=E+26-GC#J+&.?"Fe9T>17A*J6,>0'5&')3*&,'!)"&"3, ( $(!+0$*'/879*:.( | ||
1310 | |||
1311 | |||
1312 | |||
1313 | |||
1314 | |||
1315 | |||
1316 | |||
1317 | |||
1318 | |||
1319 | |||
1320 | |||
1321 | |||
1322 | |||
1323 | |||
1324 | |||
1325 | |||
1326 | |||
1327 | |||
1328 | |||
1329 | |||
1330 | |||
1331 | |||
1332 | |||
1333 | |||
1334 | |||
1335 | +$.JC0Uf*Bw.PZ ;D(9K+,<93F/00 +3$''(39 *3-4*0 2:$'20 %8$8&)1&-0!+%&% #$)"79;R,TIDpJh‹Cz‚8r…<MRY.3=9)!*!!"#&'./1*&'0'+'-(""&,$.,#6+%<(.9(6",? '/ #-.148<+;C-5=--7*)/-,/-)6/!-2+2++2,-=(+:#$(! "$%#,(0'- $,!&0!"!!!-6'!!"$##&"&%!!!)#(4))5#* % '/%/8*,6.0<:*>B3;F4FJ9RMEXI@M).D#",(*%!41(7,+1"$.'4#*4(+=69E>IU;BX1HQ>=S?7PF@PA?OB5F@@M3>K0=K/>O+2B(:L0CI0CIEe^[€oWQX<GD.+4(1B.-9)57+AA,EI)9>%*1$1< 6@!*6.5"!!% #& | ||
1336 | |||
1337 | |||
1338 | |||
1339 | |||
1340 | |||
1341 | " $%5(;1"/4-#-1(!" !%.*'#)!$*"-'),'6#$>#E)'42%2/+*+, #":D;$B,>.8913# .!(&*,4(&5%/'# (&$ # ()-"'!!*%()#("1&*&, | ||
1342 | |||
1343 | |||
1344 | |||
1345 | |||
1346 | |||
1347 | |||
1348 | |||
1349 | ! | ||
1350 | !$) $"!$& &&$))&-+&C=CI6F./)7/:((4')1!4%2".9%<'(361; +8#22.6)76/'&#$$! )#%1*%;.<7 O@KW(-V)M:>J:/6W4)A2+B'!@) 3+8B#7G(<O$>.)3%47!OD5?&+ ='=!)(,)2+4:#$; %914114' | ||
1351 | |||
1352 | |||
1353 | |||
1354 | |||
1355 | |||
1356 | |||
1357 | |||
1358 | |||
1359 | |||
1360 | |||
1361 | |||
1362 | |||
1363 | |||
1364 | |||
1365 | |||
1366 | |||
1367 | |||
1368 | |||
1369 | |||
1370 | |||
1371 | |||
1372 | |||
1373 | 0.%;DE8B]47[->C7@41?5)6/7E45@&19'!)#*$$+,.4$$8 )1 !0)%1()!(#/" ($"*-4?CJ#=A/..A#,T,<mDmYHl[Qc6”x)˜y-Œ[>S6O9+:5*+.#)%-"(!$&"- #,&%)% )((#'#&3F,DN.=V);S)+6%'(!%'"*2&&."'/&)5''2"(5!)5,*&&-/)-(/ $(!%#!$ *!!!! "!%$.)"")*'$(,)-(-0((1*06(+5/(834C80C>?O=EM(=>67,( $,!.(#+#"- ,!)7+<I=J]E_[ERQDMX9LU<EP8CP>BO88I58E2>Q.=E.4E,->'7B,HZ.B\DLeTriK^Z5FE&./&).*69-EF+EF0=C.36""(*5%4?!4?";B& ! | ||
1374 | |||
1375 | |||
1376 | #$(5#@2%0:485!%%$$'+*+#*"*%/$-1$(.'/#H#G0 93.6.*1&( % $C>%4-<3 *>#&2+ 2')&!$'%!.'0'(3 %. )#! $ $ ("":"-%$("&(.+2$./!4 *)),$&+ | ||
1377 | |||
1378 | |||
1379 | |||
1380 | #&'0 *"-&"!#(>*3!/* &F0*;26<!$<#. .7"$=#%0$+ &##,&&+(7-55$.F!2J=O%3P-9 -6%.0*/)-%" $";-C(5X:)L.(>$3>0* 06'&<>&9' &249Q?3,C)%%B-%A:#"G394, 6%4$7/, )$-),&.#-&)'"<J#/;/..+:*,'!&#*/*)+ &' | ||
1381 | ""%"# | ||
1382 | |||
1383 | |||
1384 | |||
1385 | |||
1386 | |||
1387 | |||
1388 | |||
1389 | |||
1390 | |||
1391 | |||
1392 | |||
1393 | |||
1394 | |||
1395 | |||
1396 | |||
1397 | |||
1398 | |||
1399 | )*2$04*>,((23-84629>..80%)116'$2%2&2 )3!"( ! &!(/# ,!"*+ #'*5+2'5637<64>+-:)$&%,#,;1:@OXYƒ’ƒ²‡x™wœK˜¬?hr9CH+24!73"5*_> C6#!%#"! )&0.9!=J8V^8:K-,3+&B!"1 *# # ($#2%!-"%7$$.$ -!!)"#/$$+ % ! $&!*, *("*+/4<:$7B(IN$1@%<F$58(.5.-;+8@9;SNYcA\](>D&5JA>)%+&-%(-4+6.)BEDWT?cEZhIPUABO:?P4@N8>L28I16G34B18F)5<(04(-0+6>1BI;ZXSfbAPP-36%%"#(''1+3>7;L2GR-GB!6;78-8*6D&CT+"! | ||
1400 | |||
1401 | |||
1402 | |||
1403 | |||
1404 | |||
1405 | |||
1406 | |||
1407 | |||
1408 | #-&,//$#3$:5+A213),2$'0# ,((""*1+0%*.'6!"B&B3#/5+=+14,%*), +;! :*3.$/9',;0(8,2"&$!"8$06.1+0%0 $+)" !!" $ ,"&1&!,/&26,G+875-I'9"%%$(*"--, $ | ||
1409 | |||
1410 | |||
1411 | " !"& %+%B0*))''&-#"1#,"&%! &),-..#.+, 23"*7,.3(4=&4D(2=$*,!.1 %9&8:5)C1$! (!= =4/UR)SI8a"16/189D$% % *4!)R0#<6)6 Q ;*))%! ( 4(2P"@$7;9!/!1.$5>, /HA"?B1DF"MC/8##'+&$0,84'!* $" | ||
1412 | |||
1413 | |||
1414 | |||
1415 | |||
1416 | |||
1417 | |||
1418 | |||
1419 | |||
1420 | |||
1421 | |||
1422 | |||
1423 | |||
1424 | |||
1425 | |||
1426 | |||
1427 | |||
1428 | |||
1429 | |||
1430 | |||
1431 | |||
1432 | |||
1433 | |||
1434 | "" #.5.7@"+J+->56<.,5&28-'-76!35!:9#.2-/51#(),1,9%,!&'!,4"JZ(nu.NO*19$'&-$/5%**:BO{ŒƒjŠ—vœ‰‚¤—j‘š_‰au;{e#co)1T:;pH0g'#0 !"! +(<*<=%<O*H2)2 !'#&#$$$$"('("!.)#)""*#", (-%*')" #(&%" %$)#*"",#3@7<N-&9..**4&/9/=B(-0''0.1C<.EY$BW,L@*D)&:4+9'#."*07?C?$>B(4:01AG2EY>QW6ND6H9?P2>J1-8,7>-:B/3;0/A20E->G(6;)/,1CB?{]K’hIgH0)%#"")'..*824E3FV'NN'MU&KP,LU/PU1 # | ||
1435 | |||
1436 | |||
1437 | %"*2"4) $&)#3/52 -72*6 +3*,0'(.( **&0(2+"3$"=(;.'-.-0#*.&!'"!%#29+36#45'85,+<-&<)-+$)*)&C(?5<9*/7#+:""A +#!""+*%" /)!'*'489 .: /4.9.&/ &*1+(;-(*.% | ||
1438 | |||
1439 | |||
1440 | |||
1441 | (% !" !$%$ #"#!#%**486!%= 4)"& &,#(,*02&'4#6=!)C#$'.1&+0)+3$.$ " | ||
1442 | $&<""4,-O)1D7/,#59$F $&&(##,"#%&#%#1.')#*"4!&*$0(64()7PC17A:,D)(:07=C$?*2#>&"8% %(! % | ||
1443 | |||
1444 | |||
1445 | |||
1446 | |||
1447 | |||
1448 | |||
1449 | |||
1450 | |||
1451 | |||
1452 | |||
1453 | |||
1454 | |||
1455 | |||
1456 | |||
1457 | |||
1458 | |||
1459 | |||
1460 | |||
1461 | |||
1462 | |||
1463 | |||
1464 | |||
1465 | "$&*3*8A7'1< /"2 +''2%0:$&7'.>%9?$,=&.9$'8"$!$7 ,@').:4427<$1BP6RYIl.;U&FO>L!FK!CL#ihHedj]j\_‰jk’}BxV:oW1Yo)WU(EA!-A#[): $' ##' -(")#5@),/.&'-!*&+&*%-#,#-&.&- '!% ( , !+$$ /)1') %! "*%!!# !("5$)1"" *(SR3CP/JS)93*B;9576+.<'-2*5"(6*/<&9;,3*")A.KP2CK)@N*5A/1<>3DG+=6:B9;J5AP-@=+-6)+9).;():,)75+>8&5,-,4ECKg_”qU]B,( !" %&&(,-6=44=5>I1AW2=Y:Gb5FV4!! | ||
1466 | |||
1467 | ! !+% .0" :2*>-"76.$3/'!(!'"-$3./+*3%/0'),!)(-'<&:';* ;.#5+'.%%-% *( :?'4-!71(2;(-=.33,%5!)/!2-968?&FC.+P*C%#()&# !",( !"! ""!'*.,.!:#.$&+'6"56#'>%+7!*0);'533 )@(.(4$ | ||
1468 | |||
1469 | |||
1470 | |||
1471 | |||
1472 | |||
1473 | |||
1474 | |||
1475 | |||
1476 | $ $ / &-,( 1:, &!"&)0-=$ 9('&&'!)$$+#!&#&&1)"--% ( ( ! | ||
1477 | |||
1478 | "6/ 3Q D&1%#"-%0%(3+!$'72 8$'82>(S2!+i*"?&$+&P&"}R _M25?8)3$&(.#2!2%#"*$ | ||
1479 | |||
1480 | |||
1481 | |||
1482 | |||
1483 | |||
1484 | |||
1485 | |||
1486 | |||
1487 | |||
1488 | |||
1489 | |||
1490 | |||
1491 | |||
1492 | |||
1493 | |||
1494 | |||
1495 | |||
1496 | !4)2() ,0.1(,&/'$.*'#+)'8)!(*!(&$%")*3%-##*+''#<-(=$+@'8Q.6A:7JC7O4-=8!65!95"1<'FQ=TGahDtvROdJQL469612<:37,(-!'# >,8,5/!50&(!#2'-'.(3(+#*@/0D#(8 ")'2&!-# ( ')!))!#%$&)*$$/ !'$#"''%$*)HNHHVO=nj<]]BX\6\S5?P0@J%&2$(1!(4"0? 09(#8"*8#(*4-C@5L35?-:C/;A-(/3!.06K:6B4.D;AN%'1+",% +!%. +- *,#*'(.2MASgnœlJ\@%-$&455514%20*0?-;F3=J1?L2;K8=G52H/ ! | ||
1497 | &$)0&6!.& 9*;6-*A.+,*/'8,>6I9?5 65)31*:1 (5 9* A(?-%>+&6-#6+&**!)"(##&B9+60'3;*:-,0$+% 1(%+(& *-'03-3=,!D251"" #(& "%#'" "*#++-!/(%' &2,7(+5!-7)/!'4.;#.5 /( | ||
1498 | |||
1499 | |||
1500 | |||
1501 | |||
1502 | |||
1503 | |||
1504 | #,&)+*%*0,=;$" !$&%$-&05!<-*$0,%0*.*"1' ""0 &$#"!$*&"0 | ||
1505 | '8B!*G-%1$* ('+'!#')!*" 5)-K+)(37!?# 4!%s.Cs+!-"f-ŠfV[XS097 ' ' 0'(1(!"/ | ||
1506 | |||
1507 | |||
1508 | |||
1509 | |||
1510 | |||
1511 | |||
1512 | |||
1513 | |||
1514 | |||
1515 | |||
1516 | |||
1517 | |||
1518 | |||
1519 | |||
1520 | |||
1521 | ( '.$165=-/&*-#09 0&0- $'"*(0.7-&%& &0("76&1/0447C1DG)28 )+'+ F?:G\C7QM:H?4JFPn<\_0\h*Yz/]hK==@#<_7fƒ)jw,NL+4$, .)"2.0"*%!'#'"&")-",(%#"%)+"%""&%!%")!#& !!#*($ $$')"& !$)'!!%4!5A4H1UbV€[]|KevRd{:IP@5C);;& /'.=*2:%*7$4:+25!(#& +7 07-?2?R<]],VI&3-/<G=WY*YO<KH(83&& %" !""#$ !$%.08FH_ykr—oJqN9" ,3$3<#7@!69"2?)6B03C,5D+3?+1<**1$ # """"!!$$%!." 5)5A).>25'1E*"H8!J@%F:,BC-)?,"/(%&& )'2!#@&3.$B)'='%:+#1)$-%%"(6 2+/.+&0)(&&($$(,)!&*)*--"',(")++3%!! | ||
1522 | ! %'*'$*'!%!)%($2+),#&+"# "&$ | ||
1523 | |||
1524 | |||
1525 | |||
1526 | |||
1527 | |||
1528 | |||
1529 | |||
1530 | ""4*4969$(7"!&!#&)$./31,?/@4%# 27 $#**%$%%1+(=*>&6"7-" | ||
1531 | |||
1532 | 9&&(% -##2'!"%!*#"+#;%3$"#&*`D&Ek \,#‚mnb`]9=6 | ||
1533 | #)5& | ||
1534 | |||
1535 | |||
1536 | |||
1537 | |||
1538 | |||
1539 | |||
1540 | |||
1541 | |||
1542 | |||
1543 | |||
1544 | |||
1545 | |||
1546 | |||
1547 | !! | ||
1548 | ,+., | ||
1549 | '#))$%,0")4)$//-1"10-4#5'0"*'%-:H&;AAB.A5N$5O!&;$1!')#*.*;H%Y[7[_3LR FC;B!Yf=WXG3F9/:2.F78HS8NH1HN/9N3=I(G:*I07FS/Ec?cVHn3Xi_X:6&%-(#!,&"% #) -@%=H3B.5&+% $&' &&+$)(/(+$&$( "!! !&(%!##%#% ## "$!,0O)d4^.Ug-FLCN19=+88&!*.5D-69(2<'4>"35089;A<%,-A(AU=dSLi6LY3WfGXsKSdHSg:PY&46&( "%%* #''027YBVdSi@HT;;.($ *'8<(CO(FL'?I'>C,38-15)$/$)%)- ! $$%!# | ||
1550 | |||
1551 | ! | ||
1552 | #! !(2&4340,5.0<..J2[<"eE-:K0!85-- )#&"7"9&4- 9$'A+;/%60#+,"%"!%/)9/=3&?< 3>&:!(-. (+',#'* -%$% | ||
1553 | #,&#, .!)!1&!)1 ' %# | ||
1554 | |||
1555 | |||
1556 | |||
1557 | |||
1558 | |||
1559 | |||
1560 | |||
1561 | ' -% !#%().0'&6 %6%&,).'*.)#*+$#*%* %#$)$*)-!($!)+$)"%-2'5G=# "1"* )&,&/$ & "-0$*:)#7k=*=Ak`\`>K4) | ||
1562 | &"#')4+,($ | ||
1563 | |||
1564 | |||
1565 | |||
1566 | |||
1567 | |||
1568 | |||
1569 | |||
1570 | |||
1571 | |||
1572 | %! %+!,14? '< $6%*%*4"6B)87)).*'%%''&./,"!( )>0=S.5G$%2%+3-!0%"$(-%%/ #/+9B7>ZNIwMUw?Ha2'H=,YW0b= =-)5(%//)65AG23=2$4*+5,;D3:7<J?5+.5&2R+=F3@IKhEJ`!:8 4D-.% "$2.6.A2>F$%6,/+2#)#'$ !,( /"(""$&""$%% +"7%+F$/;8<3/:7BS (,%((5-073$614E0:H%14.0G5;O(1<+./F5=V>LF4F?;SONl]arHDRE172(, .*)+'+!62*+%648]JNrQIF,:%('/1(@D)HU*<N,9J+7H)<A'14$./%18%5<% # ! $!%&* +*"&.+4.'5).:/1@1%M7$[B,@K3#=<*9!+(,$4)9($;' 9)7+&0)'*%"" #/*<96F'&D0&67%22+'!""%!&! & #%&! !$&$ | ||
1573 | |||
1574 | |||
1575 | |||
1576 | + $ 1"( %)'##5)%0'%1/ !$!$##,&&* -+)1;"%'.(,!.3)%'8"($%/*8*3*() "% | ||
1577 | |||
1578 | )'L#-0#!.$3#)!.#+ %..61I6~o:A:Q?9E'/"!" | ||
1579 | |||
1580 | |||
1581 | |||
1582 | |||
1583 | |||
1584 | |||
1585 | |||
1586 | |||
1587 | |||
1588 | |||
1589 | |||
1590 | |||
1591 | |||
1592 | #& '"!!#-&*6+(."""!"%%*4-)@',:#%.%/%+$"/.2%-(,:1+?&.</6%).2C+4&&6#$/# +62K(/X-2Z'>C!&3!'C0/<!-)#*6/5)5B3:A!07)5.+<+,75Ob7ev!OG(88+0A87FSW`=JU21F'*0" ## -)3 --###,''6%!" !"))$ "'&" $" &+**!/3&?7/00.))4%02*46:#]X.dR#14,+666K4BJ*45;7H=CE,JB/;B:BN3BJ9BIDG_[]qJIS<FS)JV'MC%-+%'-&/8$<<+K?<gRL|Y8W4 )%,&BH)GQ)>P,?J';?'49)3B*5>)3:'4C,6G'# | ||
1593 | |||
1594 | |||
1595 | " ! !#" '$&%(2!%.&(71(A4'F4)FA0=B<%9<#,)"43',)8#5$2& 6)#/''%$!$!$&&.)"8"%84"1=(,.('')")(0$2+ (!$"&" | ||
1596 | |||
1597 | |||
1598 | |||
1599 | |||
1600 | |||
1601 | # (*+/0 | ||
1602 | #(+/!#!%+$"- +)7<<5;$>) -*$9-((2 *!.""%)#6+4"#! -+" $"$% % &! | ||
1603 | |||
1604 | |||
1605 | |||
1606 | ! !! 71('.&$&%(',/%6A( | ||
1607 | *3I@Tl@RE113(+/ & | ||
1608 | & | ||
1609 | |||
1610 | |||
1611 | |||
1612 | |||
1613 | |||
1614 | |||
1615 | |||
1616 | ! | ||
1617 | |||
1618 | "#") %)$3;/948 0-,";3**2*21".1$-/$+!%+$)1+$)(,0+9A''3&)6+&0!"""'&0>,0>$-@##!$,,.*7".7'%5.9C)$8$02*&.0&9`,KM.N08O18J09[:ATK0H?"9/+;!<>-1&#%**0!!%&10"2-=2 *#/"!!!$!## &%+ "!1.%5<);95/@.#(%#&',,++;0EVC=XP;N-<<$7<25EAL]3OI8<Q?b_?LS9GG;<F1;D76D>7AV:ZMMfBYi:`\>4K0/3!&*+)//398ZJKƒa\€cB\:$1%.)54*AO&6L&1;&,<%-;%'+'"'$!/#%*'#)).% #" | ||
1619 | |||
1620 | !&!!#(" $..('# &$(.#//4/(>9#>=+==*:75)31")#&55(2&"7&7'0*#-$!2$/")#!%$ %(%)*(-+%0*#3'3&,-(+-.*21) | ||
1621 | ! ('%( | ||
1622 | |||
1623 | |||
1624 | |||
1625 | |||
1626 | #!"%!+" /%*)!.%"!!","(#!,"B"(5**6%+8(-&/0:?!*A+30! &!"" !1+ -! 6*>=!76 ( $'&"# *2% | ||
1627 | %" $')&?B3FO90*4 | ||
1628 | |||
1629 | |||
1630 | |||
1631 | |||
1632 | |||
1633 | |||
1634 | ! | ||
1635 | ($ !(3(:02>+.1 ,/'(70&0(2G&26*)7#*:#1!),&(,.3A)(<,.%*&.-&,*%+,)'$&&$4*$/%" )""-!+&,$!*#%#(5*HJ 2="#.&,5"/5)-('&3"7!+!&, 91* !##$(#'-817754/B974+0<C7E!+7 7D/j!RT=C!+( !%&& !"" #)-?//>7#11$)02,1-'97-;?>?JF:9M8<2=6+'1+ )? 3F/H:,:N6QKAPGOW;OL76A4=?864;/6D:DLDXQA\F5</+."&*&,0,:8FdQX”lix[K`I+:?!FJ"EM(AM+:@$-0&"$% %"" " !$ &""! %(& #%!&!)))($&%' +'3-832<,2<(3:(,10,+(!)&%!%'%"7!8&&)"9!6*1&",$",$'%# !"!#'%)(*"(*#+$/ /)'2/ &2,$$& | ||
1636 | % ! | ||
1637 | |||
1638 | |||
1639 | |||
1640 | |||
1641 | |||
1642 | |||
1643 | |||
1644 | |||
1645 | |||
1646 | |||
1647 | !&&# #""+) :(!'**185/1*-#, -!,))3)9.1.2J9LD/O,783;(0"2!!2!2&,# 3(("#'(..* | ||
1648 | |||
1649 | %!0+*8.+7*&$---&.=% '!54-+(6<1.1& | ||
1650 | |||
1651 | |||
1652 | |||
1653 | |||
1654 | |||
1655 | |||
1656 | |||
1657 | |||
1658 | |||
1659 | |||
1660 | #" | ||
1661 | 0L;- !%! "' | ||
1662 | |||
1663 | !0'59<%)9'50*=9%9;5(3-2;/=3)06".8(-468($4,)%% 5;(BN"18#59"54L@ MK#+ '*0++--204@4=3/$,+:M81E -.76! ()/+0"$&"&+%!!#!''#)%+)&3A ",'+'DZ-[o'w{-Ka*J_!1A$(/&)'1D&Y^=CYDEY/=J#(5'/(#(&*&*(! )!(&+.$#15"""'/,3',("@:)F9%=<2LP5MO6OS5TK.865NK-EA#?<&+(:#0'.=%8D?MHGfMu7QR4=K/;G'.2+04>8<==J;R[+cZ%A6"$,./7@[Ka|cdqRHeD1EB*AL.<G,8B'*6%"%! ""$*!!"#(%'.#+*!&" | ||
1664 | %! ! !!$'!% !' '" (*(,+1'%;)0,5-0'-)&.-#0/ 7523+&"3"0*$"&+#2&*)'-"!'!( )!%("'-.)&/&!#,') %" ! | ||
1665 | |||
1666 | |||
1667 | |||
1668 | |||
1669 | |||
1670 | |||
1671 | ""$(.",,'7',5%,)$"#**,0!46%4+*,.-0/0 2%"&# -/'4!6/957994:-2$14+':""-$ $! | ||
1672 | )* #( (#.''3(>+*?%'</%>55:<8! *0) D3 .8:6@90 $ !!(!)))(=&! '"! | ||
1673 | |||
1674 | |||
1675 | |||
1676 | |||
1677 | |||
1678 | |||
1679 | |||
1680 | |||
1681 | |||
1682 | |||
1683 | L:8nO <' K\UXxœ!s‚'j^vxFP | ||
1684 | "!! | ||
1685 | |||
1686 | |||
1687 | |||
1688 | |||
1689 | !"%*?3.6+9K/AD-?E-%6.'3-)>. 3)%0*&3%"4+*"+7&,$%'("26/=.:N03N(-M12W.%2 ' -'#)# .'%3$'4+<X,FT!SO!9>;'/$)<!+?# '")-7-3*..7 #$38)7+/$%',&DECF$JM7&;LAiG-M?)G-,4#&4'$-2>];KY;GH;=Q$'*"1(-.0 /7 %2(.!LPGDGD%-."0-)%8@"($.+/25D:'`Z*`J+>A<TX7VT=ooL[bIL\DHZ;OL;FU@b`=<I*#0 % %)+6!4J(?`EfRCQ;1<:/:,'0*%-2).6&2?4FI@f>BS&))(81GdQaŒ`]cOIcL6dR-MC)29'++$#!$"#% %( ""$&)+/$%+!%$" )# | ||
1690 | #"' %" #"#$ ()+!*.$*0)+,%-0 &1'%/'0-'/-$#0%"&('"%( ("%&$$)## ( )%'%! " | ||
1691 | $" | ||
1692 | |||
1693 | |||
1694 | |||
1695 | |||
1696 | " '%("$%,'/.,(1%%,-*5%#2(3@(0*!$&-'9 78/7!-/!#($&5**;APB -S$%8+/+-1<-#0+.1.'%2!',$ $ ) ) | ||
1697 | ,/#H,"U,&-( &.*$.-!,*&$#$/.*\)&1%"5%-,# 6 | ||
1698 | / | ||
1699 | '! &-. 0(& 1&.! & | ||
1700 | |||
1701 | |||
1702 | |||
1703 | |||
1704 | |||
1705 | |||
1706 | |||
1707 | |||
1708 | |||
1709 | |||
1710 | |||
1711 | |||
1712 | |||
1713 | * 82Y@x13EP$PJSq<iU:VF@xX!]6 | ||
1714 | |||
1715 | (",) %+035*+6<':;1B210"'/(!$%#"$) #0& "* ",*,-3,'4-$/54=+$10*518F!9K484G'!($(,%!.95?9U^4D['CR CT 19!';(/%:!'; +<#-=%"(>%8M64-.15+1+1!.<*,@5Kl(BP0@T:?P&ME&MQ;8++FI+V`@G]<\„<ht(=E,.!')#&$#3$#(#$,.*8@/3@3N`/IQ&WU'ki i^%6?#,,!8>9FXHNc\Wt;ncJ`hMjpXLbdYuJ;QQJ^J?VJbf[J_B2@*!#! "#!,/&.C%<K-:2<;.@8&,0"-)&'(%('/),=27D12(0-);9I|_b“fOcBK]G<XG668+5;#'$%&/2/3!-0 # | ||
1716 | #"(#((&$$!#+) -($%%! &#! 0&4076%18%)2!2# $()%!(,#&")40!+"+& % "! $ %)!!-% | ||
1717 | |||
1718 | |||
1719 | |||
1720 | .:3 ? ,"(2+ 3 $D$* " '%(*$* !')!)!+&'80.;!5#)#" ! * %43(2@"5D$5;-<)"# .,#)8#+%"#$$%%2(,.7=))!*7':#*'"&" 1%&"()+5% $#*3%-N,>6),05-9 (/H,$%3 (/'"6''/:",0''5" "!" 4"*(2+7:- | ||
1721 | |||
1722 | |||
1723 | |||
1724 | |||
1725 | |||
1726 | |||
1727 | |||
1728 | |||
1729 | |||
1730 | |||
1731 | |||
1732 | |||
1733 | |||
1734 | ";-C($0><DT3 | ||
1735 | |||
1736 | |||
1737 | !#00")4$,/1 &'$*%+8&5$*4"6LA659*5 &+%%#!"#%'&+-3!2-+;A+OJ>:*0@*2;.+3%-(& -#%(&5<1Ja?';3&54$14-; *9-.') '#$-"+6 "''3#4+8G!FL.= 77.2&>H3bf8Na-ci-Ya->[/]k1tˆ!CL'/M3=\<JZ=J[Iaz4dc$4?/2;70.@901 .>(*9+%.2*=7:D25HENqAd‰6`u>4;3& B1&T9'*6)M*?^5H`F[_Ph[QaWBQZpwEfaB:RGK\S:PS9C?'"" !*%/:%(1//;04B3=D./4",2#41-.&1+(1..1.+=80F=W€kl²xMeI?P:@B1.("'%'%#" #- !+ !)"* " " $ %+-" ,&$,$&# (* ""$1#/518&.7))5*-.!*/#-,/.0&7#=%9+7,:(B)/,-##"" #% $) | ||
1738 | |||
1739 | |||
1740 | 6); -0C8;4E#5<^8IM9F,9 +)%,(# | ||
1741 | # #&-),3(5"9#' -%)) "!' !(++$"-#*% )-*30!H?$=L":#" #%$/42"!##*&"'5%$())&&-#! )%/'&2&)#)"! ! | ||
1742 | 8?-P N19 1 #4 | ||
1743 | +8$6 5; Z$41#HF+G(#7&,/")%"556G':B#"#!0!1&" | ||
1744 | |||
1745 | |||
1746 | |||
1747 | |||
1748 | |||
1749 | |||
1750 | |||
1751 | |||
1752 | |||
1753 | |||
1754 | *, | ||
1755 | |||
1756 | |||
1757 | |||
1758 | |||
1759 | |||
1760 | #&(%!+$!".(8#.9@76:!6:(?@%#06'8.C>+8@')/$&+%%$$*-'16+:G2[m5Fe-CX.P](`w 0>27CF=6#)!+449V9>E!36##,.1 .4""3/3") )03 !&&83 +-):?3XX/<L$Yq,Ug#+::2S=&:7,DHNx6]q9Y|;_€AFY*QU/?L1Mj26_=IySH„8F\%57(b_,rj0tg+XQ IA%:<04!57/AL/]]7T[Lb…Db†7bw'lw$cO$GD6;E.+(#-/?I?PSO^Y]U^[`jP_m`dlaj{>ISFKZIKa:KE(5-*!-'$ #"##-$)5$*4,0>81A+5@$28%59*97+44)91+9..764E@]rf|šyV[A;Y>2<)"!".,-&%" ! | ||
1761 | "!!!!*+'! /%%'$+!%"'."3-" "&'&,&,#+1((1&(,"&2",+#7*D7N= F<77&,..)"%$!!"$"#&'! | ||
1762 | !&$%$)" $#.! ! | ||
1763 | " !'!#)"* 3,4<IK$Ab5>Q6JX+hnL1dEE9**%$3#- ! '/)B4<@$-)+ &!2%-H<J(H,5!9=34\&'S5-2'!- #$'-)6)81!!!( ))%! *"#*!*)$4- #*#! '""$ .A0A .A9&&("%;(%)"%-(#K/1OB":N-FB+9@?["?V'<<-2"<F->(*#$#$ 3 | ||
1764 | |||
1765 | |||
1766 | |||
1767 | |||
1768 | |||
1769 | % | ||
1770 | . ()=K;6Q>) | ||
1771 | |||
1772 | |||
1773 | #*-B269#>D'DP<<U0AS.J>5 )$,*-*<<'2-&2$$0' )&' 1/.+3:3GL8@:0=;AR=Kk<5Z <O&D[39d'5G,8((>47E(4(!1@$DK"$+#*!/F1;('!!*(&0;$DX(=I$7E;7^5(H36HD-G1.7,3:)$%%.+4B;K:.;F6O@F\4Dc1)=,'?3"18&6;+?B2B/897yqUr‚Kz‡I~˜7rw,<D ;<%<H,FY:Ba?MgBJfFBdKTvFd€Mit>MO>JC/,4485=NKJ_Ka^UMbXDdYHfdYxw_sW`b>@ED/HFMr:fl$OC#GCB@HH822149"5A$?G.BG+@F/=>*98297116.84*=4-:2;THe‘rz›uVmD:b?2-##&/-* | ||
1774 | |||
1775 | |||
1776 | "#*%""%$ | ||
1777 | % 1($, ,#/)6#4)4/1/%+#*##'$(*!'+#!-$((#&+!,++2%42)95/20,+)3'!#"!# # !)(!#%$##!"'&"! ! | ||
1778 | |||
1779 | "" )>%'FA)(X=68I<J?+XS#<^(>'87+J,.g09#.400 A$))*) -).$& | ||
1780 | ! 5E="0O*:,) $-(8/*#"%),) 2$"%&/&) !(%)#&$+&7-&2! 6!*#-.# " !&*%# '%%!'& A%Gi*KX1<a.*R15)"9#,9+*/@#A. ('"$; ,47#? # | ||
1781 | |||
1782 | |||
1783 | |||
1784 | |||
1785 | |||
1786 | |||
1787 | |||
1788 | |||
1789 | |||
1790 | |||
1791 | |||
1792 | |||
1793 | |||
1794 | |||
1795 | #,' | ||
1796 | $!3$!+)&3B | ||
1797 | |||
1798 | |||
1799 | +.## +$/-3<$3b*/C!@F1/9>>>>;@A2I;KUEN(%72//!*.#$, 1/"!(&#*'%$ '22;,<O,=G><J3GP'6D,'A/8:0ES+6D ?D(8?&/0(+43-(;,>J (71#)&%9"2@",,2 IN-RZ-WT+JR,"0/:=([Z.EF"%,%.3(*"&%$6.#4%*933?50<2?J 38.0)42;&5<(63<P^YR|^z•[Q|TDl:>G/W`3i{5mw:Zl>FN<@P4DN?KcQhXg{Sdl?M_4BH0>L:GWPY_UX\D@L@Tf>?KQ6Je/RkLfPRW617: 6Y@ZSbtEov8=K46H5=P+KO(=?'9>):F4BN7?M8BF+7=.,0-.-)+).4:,<:=p[d¡€x«vU‹W;a:-#!# | ||
1800 | |||
1801 | |||
1802 | ""&$'''! #$ (" ) %%-$3*+*#/(.2$0'*))#)&&#"%$+)!*&!$"#%!%#&*$,*$4+&5*'2"%D"".# ' | ||
1803 | &+4+%%#% | ||
1804 | |||
1805 | |||
1806 | |||
1807 | |||
1808 | |||
1809 | |||
1810 | "5,>(8\!3O9%7=*+)/B-8>3 7<("-0>@.2]+JKLBP0/O#;;/=A"6H 7 | ||
1811 | 0%4%*%2%*#.:"6."('!*1=!%(4A7!;#,(&0.02%'($,#0$C$(9+-7''&4&.-102 #.!/1 )45) !&! | ||
1812 | |||
1813 | |||
1814 | &'#/ !+ 3&<"# ##!9?/>=AI;!D->?#3/"-/2#,5 *'4 8#)'%)%% . . | ||
1815 | |||
1816 | |||
1817 | |||
1818 | |||
1819 | |||
1820 | |||
1821 | |||
1822 | |||
1823 | |||
1824 | |||
1825 | |||
1826 | |||
1827 | |||
1828 | |||
1829 | ! | ||
1830 | ! | ||
1831 | #" (#$)#'2;<NW>?*168/0(!/4GZ,Pn37N37B:@U<J[-OQ%V]$,6-*1:#&;98&("$'44%*8 .$0)470Se0IF-[d0J`*:A%5:"/B,5@);L*Oo'O^TRCO q`'u(?@ BL%I\VT%2<(&993=C!2C/He;_y8BZ.,; .6=b}CUy"&+4?".<)%5@%ZO"** -'"0)0983D'&4$*.,7&-?&38-6C@4O@5WL.@=9H5@F9eyGAbHnŒGx“<v5v…6n†8v‚J{†ORqOuƒMn€<OZ8H[CQ^\XkUNcFDR6Za6CL6<=2")L+AS5A:%1#*7AHL\N^og•Pmt8FKC:C;JT6SQ+KD08=:8D:AF7>D67>),1&+(&6/,/,356Nfdv¨‚‚›vb`D?3 ""+/,& | ||
1832 | |||
1833 | "#$!( # | ||
1834 | ))'()'()(,#."'*(/(%'- %$# & $%+$/%7"7( :&(3#(( %)35!5$!% | ||
1835 | !$ | ||
1836 | ""'#( "(4)<+(%*#$3+51.-$G<(B%3+".D$84-?@$BB.C3"@1)?5+",(, *$. *0.9$3*#0!0-""#&966>+0O&=8MN%Wd*AY&5M",E!2< 3@.5.;B71\ $9+0.?3-='*7,0!#-'$ *$!") )$ | ||
1837 | |||
1838 | |||
1839 | |||
1840 | |||
1841 | |||
1842 | |||
1843 | |||
1844 | ;'+G@- .W "#=(5J(:$-;0F9-0!A*5'$3H$/P>G"H%-'/!!)) (')'$# | ||
1845 | |||
1846 | |||
1847 | |||
1848 | |||
1849 | |||
1850 | |||
1851 | |||
1852 | |||
1853 | |||
1854 | |||
1855 | |||
1856 | |||
1857 | #2 # #$!&!&&+./$/90VZ6dq+a^!I^"<K [Y;bhCKZ/CQ7BM7Xb;Ij;;`90F$7A$*0(*4 .>(HM3K7= 99, 1#' /+40Yd<v†6w<cl08J,[l+Zh#1D+`Y4ZX<Xi8Zu3Sk5FoKZ‡LQq&66;l„12Z40<'#2 b_(T`#GL.gp5cmD[u.DK&;I1?XREa24= 7>)=G82$(,3<R}6V` 13'."<P3OZ-59&-4#"0''2*(5,,5,+9-*7/)5(!.0$260LD:OGKoTWRKvUX{S;eP<fTV}SasPRi`RiUTkG\bBEZ^WpZM`DXfLSpBX_3[[(FB)987HP-6@'"27BML?McJ^hWtJan3JU@T]EUZIHW4HO5PS9PI:5?.34-54+H7&54$//(<6J\T{Œwxy_`dF;)$$2-3--+("!$$( | ||
1858 | ! | ||
1859 | %& % %'#%- 0'/!) (*,0-7#3 *#"!#&'# $4'9$:# 4&7#7"(*%!( %)$"" | ||
1860 | |||
1861 | |||
1862 | |||
1863 | |||
1864 | '# 5-2*-)1 1%-,;%1#.%#+#.(6D'&P=5*%(*/!)(,3#,&'#%1+,')/' "+ /-'*,"-"% | ||
1865 | %?00X/K/$:%2?*,J#MB,;a@EH?,Q. 4+3#$#,+3"&7$()#*08'/(1/.8"960%9$)0'/3$07*,$*'%%' | ||
1866 | |||
1867 | |||
1868 | |||
1869 | |||
1870 | |||
1871 | &'-2**A) ,5',("D+#+()#$&(&))+')-+,-;),9 80,+9 | ||
1872 | .%"1(% + | ||
1873 | |||
1874 | |||
1875 | |||
1876 | |||
1877 | |||
1878 | |||
1879 | |||
1880 | |||
1881 | |||
1882 | |||
1883 | |||
1884 | |||
1885 | |||
1886 | |||
1887 | |||
1888 | |||
1889 | |||
1890 | |||
1891 | |||
1892 | #"$*2#0%"!"/0(DE;8TC<dI;`67K9?PDRlIe{:Y[7EV9Se>[h6<K-.7)(6#=D"Fh!@K)N}/\c)FF(UU#3D2837!?H.LaEToU5SSW}>Eb0QaJf}:N])TZFar@V}=Sn?=[65L82EJ:Q/!+1NvCXr%(3$ +$pqEhx8;Q9OvM\vCJ`=JU0Oa2<Q7/@6,<#(<+"3-1Q=J0;).9D5P0>R$-B#*8;Aa90?*7A!'5"&-"!*)%1&-8(,3#.4(18%67'4809@;2DB1KA/DG2SECT6=EA7SLPdQ^sOuXq{Uk‚KJ]T@[QJfHYjJ]jRNkZYzFS\:IV5IY1MR"2.3/7?39BISSK[`YsO`rImwLZiC6<@3CFJWD8E4012<32K>7MH0UB+M7+GBGuYdwYdC>EQ8)&"%$/.&=@'A<6- -.,24=9C99%" ! | ||
1893 | |||
1894 | |||
1895 | ! "!# $ -(&(((!&!''",0- *7#&3 &)-".8'8 3 %4$;&/' 5(#J%!N496%9)'-%# ##!" | ||
1896 | !% | ||
1897 | ! #$% "$('1($!+#.-)(&1,!#2(/%'2-+9-0039"'$# . #,)&-1$"6*2?373EC!.*)>-/3&#* ) -*,"% +$,/&.4A100+87%'%"#*!4(,7$'<1: 2<,C.? '5..# %&&("%).""73++#". | ||
1898 | |||
1899 | |||
1900 | |||
1901 | |||
1902 | |||
1903 | |||
1904 | |||
1905 | |||
1906 | &O',((1 "4"$&# *$ #.!"%11%$2!1:'1# | ||
1907 | # | ||
1908 | |||
1909 | |||
1910 | |||
1911 | |||
1912 | |||
1913 | |||
1914 | |||
1915 | |||
1916 | |||
1917 | |||
1918 | |||
1919 | |||
1920 | |||
1921 | |||
1922 | |||
1923 | |||
1924 | |||
1925 | |||
1926 | |||
1927 | |||
1928 | |||
1929 | |||
1930 | |||
1931 | |||
1932 | ';-K90 %!#2#)%$#*1*-*:/707#',&)-+@>$CW1>V.9H70F5 80(<<*MC-JLQo;Ml6IeAHc=DU(HG&B:#JQ,FS/R^(WY?•µB‰¦Fr“9H[$MH"LZ$NV-.3:4E8DD6CJE>S:foCf†I9a=_K`’NLa@=Y@]k)_b)my+OT(!%"6B@$>4%- '*Id\Cv=2R2-<K*BK7L<,F6=R6,>)+#&# &"#,,<%);+= !/,3A*09&1%$1-.#,'+##%#!&%*")$"1(%6+$51+>+:@'9;+$.'%2-4G1BU'CP:ZtXz_r›ahŒW[}QJ]97IENXKNjOcvMYeUK\YMbE9RKH^Hri2ea(fd2TM>NYAZeOBYV=KX=Z]J_<7G07:@4B:67.:71GC5BC>AB=FD3?B?BAP|aZsQ=>(2)+!)09A!EK%CH)>D&DA#>A+.#)$,!1B@D>?=A<7 | ||
1933 | ! !"$'(%"#*"/)$#+/")$')))5#)+'(& (&40 ."$.!-&&)'0,"'/%" "'&&) ,& | ||
1934 | |||
1935 | |||
1936 | |||
1937 | |||
1938 | |||
1939 | %" ! ) )""%!%!!#2C(4B)#3,.&( %(,+$2)0),#/4)-3&,C7'8,#$F&!**($- $3!2!,)"(+.332@&9"9,#)5!80#1D5B-;<7)58!(.5!!'$+!"%'% !#-'(' "/ | ||
1940 | +)!# (' #!"" | ||
1941 | |||
1942 | |||
1943 | |||
1944 | |||
1945 | |||
1946 | |||
1947 | |||
1948 | |||
1949 | |||
1950 | |||
1951 | |||
1952 | |||
1953 | |||
1954 | |||
1955 | |||
1956 | 2$=2D<_6 "#$!'!')%(*)#.'(0+*FH#3O.%?7-=4&>,"2!"+*!.%$+/.@Ih’Eiy<^x:]†9Uu<‹°;„¤8Mi4pŠ<¾ÈPoˆˆv lKuY8L1QZ7Ta>Qg2Q_'M^)Y8Y6g€6RuR;[G)A:4F`U~OTv;k…Ak…C`yIS|KCg.%5'+&4@ (%/@BMX>P]-[Z+QR3:A0;?+;E1?< .3*+")+6,6",%!+)%'(0"/D "8!'! !!$!'$,)-(.60BQ/0@ $"(:A5K[6Sa=;V\>[hCeY;ZQ6[JRq9?J5?QHB[[Wf]ShNIYH:UEFV;<SOUkIizLt…Iq@gc?YfCEJ86@?=@E;<6.80;F4??->>->;45773::33534887>SGXa[„U1L1#)#''0$6D,9M.AL*-9*1;';>>? 99#8:&9I)9G-9R/HW+ | ||
1957 | #" #" !#"& &! !#"'05!)""*#%"$+&-%1$)& ,'."<5)7""+"&2">$":+) %#$+%' | ||
1958 | |||
1959 | |||
1960 | ! 0!-+/#'%&#$(&,+3,?6+B(7?4FB!-%%*) &*$',!.,!.$$"*5.8%,9"*$#(!'/!4)($!%"23&&<#%)*##2##%%*1/4'-:$/&'$'$-',"$9/"%! " !%&, | ||
1961 | |||
1962 | |||
1963 | |||
1964 | |||
1965 | |||
1966 | |||
1967 | |||
1968 | !!" ! ! | ||
1969 | |||
1970 | |||
1971 | |||
1972 | |||
1973 | |||
1974 | |||
1975 | |||
1976 | |||
1977 | |||
1978 | |||
1979 | |||
1980 | |||
1981 | |||
1982 | |||
1983 | |||
1984 | |||
1985 | |||
1986 | |||
1987 | |||
1988 | |||
1989 | |||
1990 | |||
1991 | |||
1992 | |||
1993 | |||
1994 | |||
1995 | .*,<"#"! #."/0" $&"+7&- "23)*%%#26#,0-+"-$*''+10>Oq\~ER‚6x¢>YzMw’–{¬tq™A€¨o Ô˜M|Y\j_^vE?_0XuAnƒBt†@[nACV6[u3NiOmtWHX;9A.LJ`n2b;Mp8c†L[pPBgL:FCA52G:,%36&'2>PI\xPWwOZo<N_-JW-HT.EX,6J(%67E!/; .@!%1!$/$+&/ 0:#!*'! $*.&*#-3&8B,BY00D#""!>S@‚–Aq}@PS>:G>+9<&51->@8VGfu;ov41@B;ONGZKEV5;>?;T<@NA2GPQoZo†am{Y[lD]nAck2WS09?60=*-1+0=7:C7@M?VV0KF5jP+9.((%-&)7?C^whg€a6I2!!").)5=+4=$09#,5$7:(7F%:F%:B)2@%3>-6E2DW: | ||
1996 | &$!) !"!!''&!-. ,)/$ ,#%#"+#*#&)#,&"#!&%''(#02""'%I?*?.%W&"B+2"*!)!'" #% "&( | ||
1997 | |||
1998 | |||
1999 | |||
2000 | |||
2001 | '$#$-$3*(")/( / *)"),,/8 *?+8260(@-6=)614?5#06B+*2#%$% &* +&!)*)'6&;,'52;C$3H#):)"$+*' -( $ /+".((3*$(1*C1#$+&*7%2*'(" %&&&0%#.506,5 ' !""#!!'# $$+% $! # ' " % | ||
2002 | |||
2003 | |||
2004 | |||
2005 | |||
2006 | |||
2007 | |||
2008 | |||
2009 | |||
2010 | |||
2011 | |||
2012 | |||
2013 | |||
2014 | |||
2015 | |||
2016 | |||
2017 | |||
2018 | |||
2019 | |||
2020 | |||
2021 | |||
2022 | |||
2023 | |||
2024 | B= YO:# | ||
2025 | |||
2026 | |||
2027 | 70K;ESR>5" | ||
2028 | !"%!'#.0"0&&&'3:$:L"=E35=Hiv_]:8;>71MJ=L9DRRz‘RW£aW`Ÿ¡JW‚ƒ`t‚[pBl}HGhD9A1DMR`†X\{\i…>Ž3|„0JZH„•Z“5n†'Ut36pI+NL+5=GPT-C;-.-131LU-MP%" +-7$>WDGi[=TZ=_M8P9K\9?S78O5?O(7?.9.7B(/9'.9#(0#*3(0$(%#"$ #&&!0?!7>#>@.5@2+=*0@37()!-;ZH{h}«QcŠ5CR)74",2",0)@OH_|RXw>AM,BP9@F@2F48M1N[?AS--@=<XTrŠ^h‰\p~MyOƒ˜Hdr9;B/6<)LK+YQ.IF9afBTZBNMIQT;/.".$"$"103XdWfhY;H8#"#&3-!-2&0<-:D#3<!0;&/=+49,9C)9@(3;$+<'4C1EV: | ||
2029 | # ""%&#$ #%5)*2"3#*+# ##&%"#)-#+*+26+!#"$"'"&!&1!. @"M,k+%p1(UA 8:$%7-$!! | ||
2030 | |||
2031 | " | ||
2032 | |||
2033 | "!#"#&)",&!')"./*;!4#&!$%"&$)&,/1&261B'%<//-0:6'IO'*b:*=-89&%A'#-",*0**2#2#6$0.+0,'0$%9-&8)-0"0=#4) # !+)=',-!!,'$**!"(()#%,,'**:0&&<+(.$0$(!*'(22#),#'19-(!%/$ & | ||
2034 | |||
2035 | |||
2036 | " | ||
2037 | |||
2038 | |||
2039 | |||
2040 | |||
2041 | |||
2042 | |||
2043 | |||
2044 | |||
2045 | |||
2046 | |||
2047 | |||
2048 | |||
2049 | |||
2050 | |||
2051 | |||
2052 | |||
2053 | |||
2054 | |||
2055 | |||
2056 | |||
2057 | |||
2058 | 6#J"@4H ( Q7/!(*:7C H1) / | ||
2059 | |||
2060 | #),$/*)21F!0/+'&+ 3B1*@54S4Ne*Uf:TdFKn<mŽ2M`/p^)e[-mpBvŒl‰FVeYl¨{p“Pb~OYnLg}L‰”6jc2mmCa€Ya†QRkdfŠ|ZyMNM:R[kdgGjk9Ul+6E+>S&D@%4;7SH,:> 59*4F6@D'% #!!-<!:O56R5?M9AP;1<69N>8F60A5,>49P(?F.+:.1A,0%$&.)!- "*!16(-!$(939T8GV4DK.FJ/7D1I^!LUNU8EQW>Uh@[C0K/K^$IQ#?D+2JB:_ZX~>]m7Tq;gw5@M13A5/B;2I.4D)DQJj‘V†™Y’®VޤZm…\n…<ln/u<G–š=inI‹Ti|LQaM;F<,+$,( 0%$=5ImMQcG2</!%&0"*9.0#08*BK$:>%8?*8@+2;*/<*,5+(8"17+5C9RkD | ||
2061 | "$#-$# | ||
2062 | $ %/).2"! '!-#'-#+ | ||
2063 | ! #' '%) +* +%("&("2;#S!(a* q=)UI00:5##:*(%# | ||
2064 | " $!#$#("'"$ | ||
2065 | |||
2066 | |||
2067 | |||
2068 | |||
2069 | "'/%65=6):$00$01!&(%)1.#,3")2'"!<0,4%-$$5*,.8!;I&/# )+)"($#$ ',#1'$9(03$%353<-;6!(# /%6+ !#*-)* $1/$!;(<3!7, *! 4"(6".30.!# #& . *1$&!!"/ +#2 | ||
2070 | % | ||
2071 | &$)" | ||
2072 | |||
2073 | |||
2074 | |||
2075 | |||
2076 | |||
2077 | |||
2078 | |||
2079 | |||
2080 | |||
2081 | |||
2082 | |||
2083 | |||
2084 | |||
2085 | |||
2086 | |||
2087 | |||
2088 | |||
2089 | |||
2090 | |||
2091 | J8 tyG=&O6&Q.2.+:/,8-3!3" '!"%#!"!& | ||
2092 | |||
2093 | &15)8-1"*5)MT$HX2; )4)$'#0*.AUiFMaB.HKAYV`wIu\‰µZ¥ÌUtwge•^bzB?MtPiTo‰>žœC~™]Drn=}`]Œ`aFcwJ^‚<\jX_c;sb(i\:WcFgœ;;Z+,4!A>1\j20S.0@1BV1Sm&7K,Lb,JF&,6!$7)3@)4@-EX3GX5EU?CR.9K'>F.:D08D41:&1**# $!! ##" $!38$48)*&.&3>@UGIW:HP3GI/:F5JX@Yk6P_6?N<6F.)641A@U`/7I'/3%7D+JIFkIUuKZs?Qj+BK0LX-TV&>T/dvHz‹Z’¸gŸÄj—¸`”T¤U¥Ç\±Ôb ¹g’·\– Xƒ—]KdNDN>22013"<1#A4/QAKtXJiH.62*/)--8%;4"9:)AK,-6%+316@*=A)9<&++"!#!*736K<BcL | ||
2094 | |||
2095 | |||
2096 | "#&!% $&$((% ""%( % # &$!!)' $A!>+R!'W,f:-KC5!15##7") | ||
2097 | *#1'+6!:-)$% | ||
2098 | |||
2099 | |||
2100 | |||
2101 | |||
2102 | !#$* 5/42!':++3!'4%2+&4-193<&%82'!+,7'8!(7'!-E.CW!PS',V =<<E>GAN?P# ?$&%#!! " )/#0! 3-@C&T4$1*$)A%(!$( %%.&2 %#- " +,& !'$! | ||
2103 | |||
2104 | |||
2105 | |||
2106 | |||
2107 | |||
2108 | |||
2109 | |||
2110 | |||
2111 | |||
2112 | |||
2113 | |||
2114 | |||
2115 | |||
2116 | |||
2117 | |||
2118 | |||
2119 | |||
2120 | |||
2121 | |||
2122 | |||
2123 | |||
2124 | |||
2125 | |||
2126 | |||
2127 | |||
2128 | |||
2129 | |||
2130 | |||
2131 | |||
2132 | |||
2133 | |||
2134 | |||
2135 | |||
2136 | |||
2137 | |||
2138 | |||
2139 | |||
2140 | |||
2141 | |||
2142 | |||
2143 | |||
2144 | 9]@EbtBYHANE^n>0V-Q2'#*'( ! '( $-)#%+$.-.(! | ||
2145 | %#-* " !* (1-8=@(UlBBX9&?$%3*'6IH1X7"+'=G<KoBWxeŽ‹†|†„˜–Naxe[{Iit1HmKGbi†¯n5mY(=B\gX[cgP[MIY<Rf;^~3p‘KˆžS†ŽAxˆChRVŠ&Og+|€5L^FIT0E?,CW>OY;DK'+B:6"#&$*)6'%12,<7"5@%@A#9,+)05$;3*05'"!" #*%!'%#")8)5=(7A***1,<F<OI=VED[3>N55KE8ZAI^46E)5B$5;**5<0H;-;!$!"+1,=A<UDLiJ^5\q;Ul<]r7au@v—VŠŸatœi^˜gn£k¯ksŸfrw‡¾tƒ¹w„·q£Ên†£Q^d?WT2KE'23,A@0J=9XGN^KsL*74(,26B=$;:+;G0CI-7?")(&%(*&3,28)*.!%"28*BM;DYF | ||
2146 | |||
2147 | "! ! $ #$ %%# '& !$!16#\$&^._4k8)?I0*)/@3*(!!4 /;:7:;+9.+41+F#$5'$*'$1## | ||
2148 | |||
2149 | |||
2150 | |||
2151 | |||
2152 | |||
2153 | |||
2154 | "%!(#)#)#"(&0&.6,"5#/##** !//,.(&2)60%38.7; &(%'+"2323+@8;BC.ISB?&6R)/N+*L6-C9&9.# #. | ||
2155 | )"2*#40=B)/GG&'# | ||
2156 | "& | ||
2157 | %"!' | ||
2158 | |||
2159 | |||
2160 | |||
2161 | |||
2162 | |||
2163 | |||
2164 | |||
2165 | |||
2166 | |||
2167 | |||
2168 | |||
2169 | " | ||
2170 | |||
2171 | |||
2172 | " | ||
2173 | |||
2174 | |||
2175 | |||
2176 | |||
2177 | |||
2178 | |||
2179 | |||
2180 | |||
2181 | |||
2182 | |||
2183 | |||
2184 | |||
2185 | <K$K K@Mab^mA8]=A-'* 5/&!"!!$ ##$$$(0'0="0;%/) "%-9E$8&"43+CJ5U:4!$"-%3,`X&<R!?@+@E/Q_E‘‡tu¬nвbs“<?dL3GA+:5/LZ4^|-0+((1H7EPaz6Wi5U„3Ej9Gbbz™†o˜g`„L<g5_q?jVlŒSITOX~BR{.dq/Vr>Kb(7D ")%-3+<#."#"$&"%* " %#!"%$/%)"(((,!3(/:/8"(02):8'2?-A7=A72<316C6K::L,BO*3?$(0, ,/(5 '*&'040<&0@7CWERmIb…FUmB;\LQuKgapœ[Œ–TerREiVPzUOkNJn`w¥fx›f³w Çr¥ÅQœF‡—B Ÿ0fZ,XJ5J>AeW\…`TpP->/!75";A5LJ-<8)>F2>@*/3((*!"!()'.('..2#49-4B5<K2 | ||
2186 | |||
2187 | |||
2188 | #% ! -%"*!))"$?G%h&&g:$_:*a>+>?3B'4K)37 %(-=,@R&ES2A\.<K/2D*.>()92(81"0#&.',-+ !-& | ||
2189 | |||
2190 | |||
2191 | ' '+'# #*)5'4) (53/%:(%2%5%3/ )=)&/+#/+!,.+E7>()',-8*77&"%)740:959,/@(0C&+8)4+2 * $$ !**(4)F15HEC- ,!+"" | ||
2192 | |||
2193 | |||
2194 | ! | ||
2195 | |||
2196 | |||
2197 | |||
2198 | |||
2199 | |||
2200 | |||
2201 | |||
2202 | |||
2203 | |||
2204 | |||
2205 | |||
2206 | |||
2207 | |||
2208 | |||
2209 | |||
2210 | |||
2211 | |||
2212 | |||
2213 | |||
2214 | |||
2215 | |||
2216 | |||
2217 | |||
2218 | |||
2219 | |||
2220 | |||
2221 | |||
2222 | |||
2223 | |||
2224 | |||
2225 | |||
2226 | |||
2227 | *1K9ybZ›Ge…3r!Ez Jehn(†$meˆƒ`u8(##!$-'&&'-$'/, "("$$&-*B "2)2+AJ129#!*&%1<F:#\T>N_0IG*UV5lkXo „o–qd‹iyOP[39;(<I!AK."7. " +F!%).FQFR`H1EC;>;HVH;\jRt]Hi?CM3GeZQa_UfWC^BadQJ_@"?<&.=%57+",'"%0!!+"# '!$!,114'3=,7<$2< /5%.6'07-5F7DT3]i3`f6S[4C[2@M$658?!8C-COCE6A!6O%BV,PZ9JfIOiHH\5GR6D[MHgR\~YnŽOZ|:I[9N^8Vm5czHe€Yh“Ylšq‘Áw•¿hÑeŸÁe¥Ë[¤¿A£¢BŠN{g]z_FD;3+*$5>.RL2CI3CE+IG3><''%! "%)* 21#%)'7H3MU3>K5:D: | ||
2228 | % ! %-'! $ ?W%i+i8%[4.J8'L12M,)H8 791$&).<:4J99N<7ID>JB7J:?=17B)1G/:2*494<!8;>A(Q(- *#!" | ||
2229 | |||
2230 | |||
2231 | |||
2232 | $ 1)(;$%#!"!&."8",+D-=T+F6&."/#- (2$4%* 0*,*"0 54!(+#)*&0"2%"3##-& &$$ ,"-5/ | ||
2233 | |||
2234 | %%/&-K/K"<2,"4!") $%'?$A # | ||
2235 | |||
2236 | |||
2237 | |||
2238 | |||
2239 | |||
2240 | |||
2241 | |||
2242 | |||
2243 | |||
2244 | |||
2245 | |||
2246 | |||
2247 | |||
2248 | |||
2249 | |||
2250 | |||
2251 | |||
2252 | |||
2253 | |||
2254 | |||
2255 | |||
2256 | |||
2257 | |||
2258 | |||
2259 | |||
2260 | |||
2261 | #'YY†d eT!BM/PJ`fP;UDqlA7;e`}‰ma—‚¨c‹©0'] ')3*#$$&""$(%#%-/%.(&!(":C56G6B37B:=T&0P4*HI@H<>Q3uBx|TLZkPsZ\„Vb‰bJv5,E,.C46@/%=3M$ .&3/%(F>6L;6I<,H\8>N80AK&5,>B#BOA:I<3J<5L9#B=)3*<8)0! &#!%'& " #!$$.*,=?,HT0GT-CJ*-3&/3!)8'6F,>H67LME][VxNi{8VW.FY-CX)@R+1C02A/=Q*=J,AP,HW4Ob5QgCZrC^v7Rh4N]<GWL;YPKoSSj>Ke6La?Rb<ZvLfJ_€HJwe`—prŸo„´s»v~»vÆtµé`®Å[‘œe‹o>\V&G;*NK:mp>dj1HJ4>G236%A=56G=!02'./$ ',.AK>WCDZ3>V; ! $"! '+!%+ %!"" G\#k0l9'[:)H9);+)D+!D:-;99,/-8%6A I7 0<44(/76?4A?*9R)<F5?J)9N/3N4,D/'8(*=4(9,.!$&+- | ||
2262 | |||
2263 | %%'$-$*&"(+)1)).1+.3 9 ,4*:<E72P>/<$%6",*!!'"" $//$#*%*"=+""'$ % | ||
2264 | |||
2265 | B1* G1#,!(#+.(7 #$ ,)22/ | ||
2266 | |||
2267 | |||
2268 | |||
2269 | |||
2270 | |||
2271 | |||
2272 | " ! | ||
2273 | |||
2274 | |||
2275 | |||
2276 | |||
2277 | |||
2278 | |||
2279 | |||
2280 | |||
2281 | |||
2282 | |||
2283 | |||
2284 | |||
2285 | +G(N+<l8\XCZBRD@%TGEB:0L>^3cA9VrFsZ„m &‘8H’NL9XnhEDZ[‚'F„. B#$"%' $/. 4"("*(%+6:>M.IP-AK*9B%Ta*/?,03&76%ON0)?98_gReNCm;4R9;SFGSQ8M59<" )&":0-*&G=%5@XLEN'AR(0F0;K-DY97G2*802&#-'6P5Ec,2>*$)%+%"''+A%#' $#&- #,&!" # ),(+"68"#,*0=839E7<2B3=D!8A'GN3[^8Ua2HL74@O.HW7TUPk5UW2AP3DT.=H(6A+4D.6L-L\2ET;A];@WAAYEOaBF`;CZ9BQ32D82GB8E?I^J\hEZfG]eKJbCD^>ASBJbNbbn—fr’dU‚]r›y™Ä|›Æq—ºi›K?“ž:•’D|M€8WU38<+>F0ac0fi5‡€,HF(6E$>:'*0=2@>>N72D; | ||
2286 | |||
2287 | |||
2288 | !)!"&& ) '",&.&%0#-"%! | ||
2289 | |||
2290 | |||
2291 | )"0 .$%2"FM(c.$n:(P8+72,2#'A#"?5.645).)"(!5!05 +2 "(7"06 7=$BL59Q3:J6(H=';2#7.)(-'4-2$$*&.#+"#" | ||
2292 | |||
2293 | |||
2294 | |||
2295 | |||
2296 | |||
2297 | #'2#5;0<%:8**A';#,6"3>#-D 1/)6418%6D$7E-1C(%4%*)" | ||
2298 | !%!&!"$& &) | ||
2299 | ! '+ 1$ +( #'*"!$&+"! 2)'#$ | ||
2300 | |||
2301 | |||
2302 | |||
2303 | |||
2304 | |||
2305 | |||
2306 | |||
2307 | |||
2308 | |||
2309 | |||
2310 | |||
2311 | |||
2312 | $$/*$ | ||
2313 | |||
2314 | |||
2315 | |||
2316 | |||
2317 | |||
2318 | |||
2319 | |||
2320 | |||
2321 | |||
2322 | |||
2323 | |||
2324 | |||
2325 | |||
2326 | |||
2327 | A&‹‘ >m{.874%3?!6;9Q9Ij9Lg4Be=zR-“š3SpSKViSNhE7`HD%1K$5O$$<))b+-K!((! ., | ||
2328 | )" ! +-!+'",&$-0$0.,KS.:L09<2dk;Uk!(7-2)-;0# ',>XN>2G5&3&;:.6J5.8/ ,' $!/(?1Sp<Pp1Dd4CV(B_)1D*Sf2U^9Uk,/K$'5#)>-/6/?!.#!#.'!( | ||
2329 | $"$5'9E*CL%$&!+ +(1&202H3CRD>SMAVFXf0AE'/4.+:AO\Jhs3Zg7bl3IW(=M&;J&@O+;J7M`7]`3NN8AO<:H;6K6:I81D+16!".,1@3KWIToRauDTbCH]<Q[0\d3X^?^rOb{R^wEWnJk“n–»~–Áq•·uœ´X„–Yw£h‚²^œ±]˜žH‡Ž5y{0igCqˆQ‡•Sv?Ma$@M/[e&PP+DJ9Ue2UX1 | ||
2330 | %$')#$ $!#(22'%,* %!# &((+$ | ||
2331 | |||
2332 | |||
2333 | |||
2334 | |||
2335 | ""&"&1+0$)3<'6(M#_( j5-S<(02&-%@B0)46+(+-+&%4!(!#7(;E!9L%@A(:L!<C//K1);480*+%&'1-( "% "(--#!,( | ||
2336 | |||
2337 | !")'&$*$99"2A'5?!.>!0;&1@';?!=H$6H*2A&B)'%%' | ||
2338 | |||
2339 | ' +$*1#-&,3)%9* "'%!!)" !$&*-+$ !)$4'(5$'#(+!! | ||
2340 | |||
2341 | |||
2342 | ! | ||
2343 | & | ||
2344 | |||
2345 | |||
2346 | |||
2347 | |||
2348 | |||
2349 | |||
2350 | |||
2351 | |||
2352 | |||
2353 | |||
2354 | |||
2355 | |||
2356 | |||
2357 | |||
2358 | |||
2359 | |||
2360 | |||
2361 | |||
2362 | |||
2363 | |||
2364 | |||
2365 | $$ | ||
2366 | |||
2367 | |||
2368 | |||
2369 | |||
2370 | |||
2371 | |||
2372 | |||
2373 | |||
2374 | |||
2375 | /‰?’*j51/A$cV ds4X^A5>'AU82Sh+Uˆ2gP'sB(D5+>W,DQ+!")#$&!)&'4$'"%'/'*--*6 -,"(%/+3-<&/#;80RU/`n1PgLIc3@L"#0!)'3A*K'.;2$ 6+-E&CTEDDACH2;HYK[JLbC?_5&8*ED+,F=2R57VCNZ<:<<?K18 " | ||
2376 | ((*&!&*-377I5CH30"% /71<M:PW<NS:GPNXjMNd+CJ%@C2<JVGmZh…Zr‰Ojy8\b.M]1K].?J46L>?X?Ur8qy/Z\,FQ/GO.4@'*6'A=YhIObL@TKA[BHeI‚–G ¬B¢¯H•—OyŒKn‚9Yl@W~]t£uz¬wаs‰²g†¦^®c–°s“½iš·Z‚¤\œ¾O ªQ›a‘¯]€œHu‡5{y>xC‰–@‡”Ew†<bn, | ||
2377 | &#!-&"+$+%!+ $ *'%$ &&! ) | ||
2378 | |||
2379 | |||
2380 | |||
2381 | |||
2382 | |||
2383 | |||
2384 | |||
2385 | $.(.3208#-(+0"<D)"@,I,N-R0'?4)'1/+ E!G5 161%*., &!##0(241?E-5J3*F8'E21-(&#)$1%)*"#-*)!2.#&)%! | ||
2386 | |||
2387 | |||
2388 | |||
2389 | |||
2390 | "&,1%:%6+25%<D-9D/>J*>M*0N. :,(,*00'%4%.0 | ||
2391 | |||
2392 | |||
2393 | |||
2394 | -+0 | ||
2395 | 714DB!!$0(4.5%5#($ $ ))! $(")'1$!!*&+- %"&'!!!& ,!'!$ | ||
2396 | |||
2397 | |||
2398 | |||
2399 | |||
2400 | |||
2401 | |||
2402 | |||
2403 | |||
2404 | |||
2405 | |||
2406 | |||
2407 | |||
2408 | |||
2409 | |||
2410 | |||
2411 | |||
2412 | |||
2413 | |||
2414 | # | ||
2415 | |||
2416 | |||
2417 | |||
2418 | |||
2419 | |||
2420 | |||
2421 | |||
2422 | |||
2423 | |||
2424 | |||
2425 | |||
2426 | |||
2427 | |||
2428 | |||
2429 | |||
2430 | |||
2431 | !"Q#W#E$+,0:5"3),3)):(/:*A*#2*+1)%&* ).! ")'%&% -)0>%#;"2(-<>7K);!4'$/,%/<DXjFTdCM^:I]10B' $8,#<5508B(Z]:#=;#E8)66*2@@E/M6AK(HN975KI BD-5,7?DOf2Z{4Hv1+7#"'-)[J>5QC %"3,1C?B8A12E8%<6@G%DW@9)&=>(EL2=I>?RBDS??RQUnYE\AE`?Yg:N^><JS/Db'I^DlRF^D0P@B`9Od2LI-<E?9LN@eNiˆ9CO8.B18K(@H HD"HLAR`KEX?9P7HS6RkTr–lƒ¥q•Âs¦Æ_¤Pe}Fbx=ShQcŒ[h‹atŸb]z`\„`t¡j›¾t—»~”ºq·oœÅvš½mµs»l©Ãf§ÃXœ¾a˜¶cŒ´\‹¬YƒžUw—B | ||
2432 | |||
2433 | "#*#+(!, )'" !"'&""%& | ||
2434 | |||
2435 | 6/*E7(-",6"<(>& 2*H''E/"G+$70!,'+&=,."!+90 $%54"2@8'>611%*",,!(/)+ 5(')(+ $1 $. 2 * | ||
2436 | |||
2437 | |||
2438 | |||
2439 | |||
2440 | |||
2441 | #&!'),$)0 &1$,7%-E01C-7A44E/4?+"=+"'' !,&%#%% 05'.$457$& | ||
2442 | ',')'1(% )% %& 1/%#'#"#%.#)!, ("/! "& | ||
2443 | |||
2444 | |||
2445 | |||
2446 | |||
2447 | |||
2448 | |||
2449 | |||
2450 | |||
2451 | |||
2452 | |||
2453 | ! | ||
2454 | |||
2455 | ! | ||
2456 | |||
2457 | !% " | ||
2458 | |||
2459 | |||
2460 | (‚‹ gXsTqf#-'0(K3>8;3%,C(!$%.1C" /*!)1 "$ $"%#1&3:%$3%$'/+2&(5,"5"#'$3-.2C6CYGŒ¬M´ Aef1L="$)).0-#@!159LbB 6,+*<>$=G''-$$-;=AY07K0-DI4HCJ#UZ1_k@0KK!(> )&&!!)7CxŽ<>`E3V* !+ 62D/4=1:D,<;+0@@GT?H]&JR'@K:5E<-=6,7:7@62?@*9I"2<-?O6KG=M=IZ2GT/34<(BECV44:1 /<.C;G`2fk,CD5?JJ@eCIT.)3)!,.%11(977I@ZeE6=0*:<Y;IcMAgcQvsXvh–uj•_g‡Idx??\CLsR]…MiŒN^oMb}Vy“mw¢sˆ·p„©u“¸x¨Ïr—»~œº€¤ÃxªÜx·Óm Çu–¿e…¬_|ž[h†bd’W | ||
2461 | +",&#+" $% %$#) | ||
2462 | |||
2463 | |||
2464 | |||
2465 | #"$'$'#.%!%'*"0'/$5*C$I+#I3'L6%<6(7)$5"<%#, ,$$ * | ||
2466 | +?2BF,$J5 -.+'3259%*@)1&0/833=2)' | ||
2467 | |||
2468 | |||
2469 | #&%('3# %2#%.;%/9(49(/?+8(/%.73$#+,&2+/!='!!* | ||
2470 | '"/%1*613.<&(3-%$$""$ #!!/-*/# & %.!# #)"- (#'3'.%,! | ||
2471 | |||
2472 | |||
2473 | |||
2474 | |||
2475 | |||
2476 | |||
2477 | |||
2478 | |||
2479 | |||
2480 | |||
2481 | |||
2482 | |||
2483 | |||
2484 | |||
2485 | # | ||
2486 | #"$! $ | ||
2487 | |||
2488 | |||
2489 | |||
2490 | |||
2491 | |||
2492 | |||
2493 | |||
2494 | |||
2495 | |||
2496 | |||
2497 | |||
2498 | |||
2499 | k^“ªtŒŸi¤¹d¡¶j˜‹"{riY/¢Å:So)MF0@F*02+1B?~dML²<¦¦´¢#“• ./ #$ ."*(!#9(7/!-6'-0.*#&#'&86$0<4$= BA)›”F†œšIyYmXe’<…;a /&!+:,/*"(!B%)ZF2G[-3B5<,I&>21?M+.90C@+;C/+1D#:C#5 $"'%=?@FUTYZO'U1 | ||
2500 | &! "&%(%%03D9Si/OW=UaLCUG-<<&74-+%**2=.^d6}n.zh&VC!/,8"50 4>1L<,B-*>#1)<,5@'&01I=ZA9P.7M3R[;HU(7;12 5;$?@)3994F9>J0/*;*@<H[FVwQwƒVm}Y7\PQhCPd:P^:XZDKmLT|Jr”K•¦U‹«`¥c{¤kr›kyŸw„¯q‚©|”Àˆ¸à§Ù…²àyš»q€bm“Xp„SjuR[tb #/4#**&&$ !" !%$%(!((#!"$ | ||
2501 | |||
2502 | &$%#)/%2+-7277+=2$$;'!@/*H0*4538');*4+!.$"25)538;$B0/5&5G/K4&C81))/608!0?"1>*)?$)7&*=$E&.1" | ||
2503 | |||
2504 | |||
2505 | |||
2506 | |||
2507 | |||
2508 | |||
2509 | |||
2510 | ""($*, 74/C&+?-"7,+4($)-%)&(-?!)1#*4,+73>%A*%"("8( LEDI$?)0$%;*$$+'(2 (&$+#6)2%!3$/0& 9&&:#$+5#4* ! | ||
2511 | |||
2512 | |||
2513 | |||
2514 | |||
2515 | |||
2516 | |||
2517 | |||
2518 | |||
2519 | |||
2520 | |||
2521 | |||
2522 | & | ||
2523 | |||
2524 | |||
2525 | |||
2526 | |||
2527 | |||
2528 | |||
2529 | |||
2530 | |||
2531 | |||
2532 | |||
2533 | |||
2534 | P#–.*-F§5{¤Tu“bœxi[`‚¦c¤W:LHJf8[q-r€$fn@‡£vˆ¨Tˆ§¥SŸ4h¥²‹ž¾%1A,6020.+,4%-7 $3!%+!BB4>$/&!!%3#$/$EYMm¦š~³sŒ–Mz”Hko`ixj%F54(15LC 2= *..pq*@YL[!225+EVL>U--7.DO'!2(&5895ss0O\0€a)aS$*6(21œFS!)!n~'Š7HdA4NG'%( #@$:K+:Q?XH-:5!)-##!+*6MOlrf”nd‹^q‚=AT"H>$6A+=G2NO)LB8/.3-7D+8!( &+7"7*0;1L=8S5L\)MZ%W_(OX0Vf6di<su4im#[`&SX6XkE]sFSwRBiBZm=agGdsFt…D{“@r~Gm~Vn‡l—Ìkž¹c·cŽ®Zw‡\{™k~žj}˜kv›‚}´‡Ä„œÇƒ†ªh‡¡Qq†SaxUm‚LizF | ||
2535 | !$"# #!$$!$$("*)"" | ||
2536 | |||
2537 | |||
2538 | |||
2539 | !&!#*#/(/62A72N!-3*5%"7&:):''5//1&$3$"&!)< ?J/R!/?$6;*9>#8D0@0%1/7+.N9 :Q&0@-C7'-K)#4.)#$)$$,%& | ||
2540 | |||
2541 | $)$" * ,*(-,+"'!!#$%*#*!)&/*0">5)*J#:1=C6F@=9N 9K5:H+7J/C)12&%!. % | ||
2542 | #$*!# '$#&-!*& %!''!)'#((*" %#* | ||
2543 | |||
2544 | |||
2545 | |||
2546 | |||
2547 | |||
2548 | |||
2549 | |||
2550 | |||
2551 | |||
2552 | |||
2553 | |||
2554 | |||
2555 | |||
2556 | |||
2557 | #!' '!* | ||
2558 | |||
2559 | |||
2560 | |||
2561 | |||
2562 | |||
2563 | |||
2564 | |||
2565 | |||
2566 | , (ƒŸ9_Œ=jQN–ÄpW’\¨}lŒn‡:In7OYPV[s‚t`–Žun˜Š4a€4>V+3A//‰@E˜GI0M?AB%8627%-#/!/- +/0,.=$%(, >=*/$"/+Mv…lJyƒXŒv`lOtlaŽ\Lk%1D-0A6.L=+0-.@35Mkbi:$34$&/D(!:B*A+/:.3>813(31DD*?]=I]GncJd=GV<XB(V|/##,'6BhIgY5@<24+H.(Q | ||
2567 | ./" ,+/752=C8NO"I<26/, 8*[$=f)=h)>RBM9ep8Y_<_mMcyQlx@Qj+EQ&0>%-=/7,.""()4,&<3,B93LBGm@_p7SoDg~NsMx–Dp†@ky<Um?QeEGY<?C:;MJQuJMaJ>aWMu\kŒT{›_„›i…£q{Ÿkf—jx_x’Wg‰^f…ZgURqYX~nq”yŒ·v€fv˜\wŽQj‚Sh…QXs? | ||
2568 | |||
2569 | !" ""(&&,%)##&! %'& "&"$.3% ,,70/9*4,3348;F>?C%4Q+K"1A3!<+#A) 4.2&$0#*!!!AIKOR3@O13M&>D'<O..D8//):2/F!<?;?O5>M%*M2/+!",)"" | ||
2570 | |||
2571 | |||
2572 | |||
2573 | |||
2574 | |||
2575 | |||
2576 | |||
2577 | %"' %% "/&.29.76*>-<-D!$=278"0G+?J3)H'H?.-C'!1%55(;K%L!%!#+*!2*" %(* #"$$*""&"!$%#*!+' ''"&'*'&%% | ||
2578 | " | ||
2579 | |||
2580 | |||
2581 | |||
2582 | |||
2583 | |||
2584 | |||
2585 | |||
2586 | |||
2587 | |||
2588 | |||
2589 | |||
2590 | |||
2591 | |||
2592 | 2)*"'#$($ | ||
2593 | |||
2594 | |||
2595 | |||
2596 | |||
2597 | |||
2598 | |||
2599 | |||
2600 | |||
2601 | |||
2602 | "!!"}\#S:[›^~ec’ˆ;zmE_vTe2=a7YrS`žuK„‡2:c #1I>-DL!-&6G,QZ0@K;5Q1=I'.9"#*00GF ,@ $5$:7$ 1C@ |£,†–:¶©#[Oz;Oq_RfL=WNaoMC[UX_[Pe>0;++ .&+"+'+)0!0MR`qiWk.Sj(qb%<0&*445E#=9 84*VO)$0=.3J&=72R+]R)Qb2EL9/757G.8A7(4!4% "(024'./. %$((99&-43:"#$#()*01#[X6jw?{ƒE†…Efg0DJ+V^&DH51$%$56*5>.;=2<CKD\fJfV?^X9X^(ES,<<*4,-8)+7(6E'AM::&*!!- -: %9&!18)@GOj@XkO\Z[{]e„[d„W`sIPh;D]=Qg7cx5mp?FRB6J8<K;:MVSxelŽ`v’ce†`h~P5TW>eYQjSWqSc|PdxJ`nL\nWn„du›mmdz‘anŠN]zPNjHN`= | ||
2603 | |||
2604 | |||
2605 | |||
2606 | |||
2607 | &#$%$#!+"*!(' " !, /( "* $)'#-(/209C7%=K!1I*,9(077CA:*@R*:B4C,'94&@)$41&2$!*") ) # !; KO#GY=0d>+A7(3/&<-8/*'#,1,1'<A4=A/.J)-820'$## | ||
2608 | |||
2609 | |||
2610 | |||
2611 | |||
2612 | |||
2613 | |||
2614 | |||
2615 | |||
2616 | % !,.&6&)1)36,0)'A1:K2E#;?"AL,AI+J8!OLKO+IU)L-!7#+%%3-947& (),)2( " ',"/:%7.'(,2.-#8''+ #!!##(/ !"($%!-5)4(1/!.#,!! " | ||
2617 | |||
2618 | |||
2619 | !2% | ||
2620 | |||
2621 | |||
2622 | |||
2623 | |||
2624 | |||
2625 | |||
2626 | |||
2627 | |||
2628 | |||
2629 | |||
2630 | |||
2631 | %! | ||
2632 | %$'+ $,8' | ||
2633 | |||
2634 | |||
2635 | |||
2636 | '+/ | ||
2637 | ( | ||
2638 | |||
2639 | |||
2640 | |||
2641 | |||
2642 | |||
2643 | (*.707-*-0).")6!1C'?C$.;+[F1636QQb^XOW<J/^]"je>ˆ|7`fw`.VODEV13?/,1/=E',3$2"-41".(($,0 /ODIdm—‰Á£t–B:OiHNDLZ<<I>H_TU^Cd{Abx8 .,")#)<G 5> %*Pp†LDfC*I`WŒXNx(_r+4R:Xa2IQ4hDLY"]Q!<?)A?2=A,>)*".BAu'()%' && $& 0*-PF TW-Xc+EB)91*[JMI!0584,(! !$$J? 9:%3=>@\cRpt_~u]yWzQDPACR@?H3:J*07%:K1Wd4bh=ZgGM^S;K?&):". (!*"' #,$+6(!/.0F/CO$:B',(-;6C4<$.3-GDRfIVkNRnNPmPC]D8T=?U12M;@]HXrRXr?N[13I&0E,KX:OgUfˆ_g‚Y`pF;Q6'419JFWjEeuRdrGUjAOkEUoSiƒ[j|\VnVKnUMcKRjERe;O_6 | ||
2644 | # " !% $%#!"$ )#0 ":,"&()&- 20*!)0*,,/36);:%+G)1>4H5-DI)9I'BG(AG-H55E8%41+/('/&!* " ' !5NA)8]>7IH9@3&C$/!$$!9"'5A;@+7K+.I1='" | ||
2645 | |||
2646 | |||
2647 | |||
2648 | |||
2649 | |||
2650 | |||
2651 | |||
2652 | |||
2653 | !' #+'(;)<&'5"741'7B!->(+"/02-)40=+%@359.4I);J:jO:Us;Ne9#[$*$%).%&#./00'6% | ||
2654 | '*"" ?(/G(*1#*7B+DC1I#5!$"(, &(!M0(O!)*(#%7C7 /O#">%%(#++' !!" | ||
2655 | |||
2656 | # | ||
2657 | |||
2658 | |||
2659 | |||
2660 | |||
2661 | |||
2662 | |||
2663 | |||
2664 | |||
2665 | |||
2666 | |||
2667 | |||
2668 | |||
2669 | +!1:02* | ||
2670 | |||
2671 | |||
2672 | |||
2673 | |||
2674 | |||
2675 | %"$&1439#,1'8<%:9'%0&-!!'.*(-*-3//9+-=M/8IBPEbf[O{eƒ—z¡°b¢¹nn C3@9:K%@7'%22,F$ $ *"%"#"/.)6!#;,,‰mTl›gc†€ŽÌY67!8>&0DHN:M\>CSFDU`opI,3"#*$9#/>7<@&,00!2[FS-RT+->\QQC6TF2D67HM7[E;W^UeNeˆ7Af'7C(*-&/aD/,!"0!%<16 057%- | ||
2676 | .+TB71++ML7~ˆQz€FtKjt9‰4í¼PÔÁ9Õ–+Ÿ‡,kq!OSaSVQ1x@up0MP<EKMT[_myd}‹kƒŽU„…S…‰U~Emz;IL(36=8PX_|R=SLR_?IP*8<!!%"$57K1>N$<G5=7=%6D$:E*6#%058N<>V?5O<HY77H-0?-6G(.:-5G;<VEDZ;CO19H0@N1F`9]mEVqS_~I]q6@L!/?,Wf?l€N^mJYg9HP7K_@dsOi‚QgzGSe>?Z@CU:<W<G^6GV2 | ||
2677 | $ !%&# !# # ' ) (3(010+4!4'-$0-..#/5)+"3+(;"3$(.+4+-<@$@I(@H3PC78L15.0F)'<**/-'3!") *+$ ")5 6F!$O9$-@#6*&5($,($*3,7=<A-1=2"=0(, | ||
2678 | |||
2679 | |||
2680 | |||
2681 | "$$,&,#)/$" #&$'6)1$:&$/,(5%., *&3.%!.+/&,6*0C'2OI.@H8<8/266$C%,.)$*'6 "&! | ||
2682 | ! | ||
2683 | )*# ,E!H:/X19)%701"`8Pc+5[2'7&%(- '*$0#"(,/H#"8!3=&-%'(2;% 7&&* | ||
2684 | |||
2685 | |||
2686 | |||
2687 | |||
2688 | |||
2689 | |||
2690 | |||
2691 | |||
2692 | |||
2693 | |||
2694 | |||
2695 | |||
2696 | |||
2697 | |||
2698 | |||
2699 | |||
2700 | |||
2701 | !# | ||
2702 | |||
2703 | |||
2704 | |||
2705 | *6"0;'23,#. | ||
2706 | |||
2707 | |||
2708 | |||
2709 | |||
2710 | (# | ||
2711 | X[9;(&(**4$.4 %/$2:/7A0"0#")'/ )3 -;$/;)'9& )!%!$5/7AJS9AQJ\~Sqš9e)Ck24' ,3/-22%$&#A9PR7<(.-4 "1,-mŠK|§{iŽ\AobEV|-X36!6@!BU<7ICru,ipTp´Ugt![a0Q !()(2+IO=8!4;<4H40?%2A9,C3&@)575.6.69*;MQ>fOet'<X#:K-%:=D:8:N"7:6Ms0+V) | ||
2712 | $51<UY,UZ+2FZD_w=hf;\jl|^¦®p§ã˜«Ð‚ßònÿÿYƪAhUH‡O†”Vu‹lj‡[nq8=LD3WVb|y|ij”z{™kvjƒoNl[;J2,9*59J4@ICRDNc>4G60D%#! %(-'*-33E+#6*)B%':(2%'5%(;#0''9/3@)3.0D+9G%4@(39 1#0B-':24H7P`+IU1FW@N_<E_FNmL^wLaw<Th.`i9ZvUsVoS[n;Q^4NcAbwMWxDRpDSa1AR66I5<P7<L6FX5 | ||
2713 | |||
2714 | |||
2715 | # !%$$)(*%"" #"## )' 2 (31.!5;1=34).8'16#/9$%3$), 2++7 =3$9:"A"2$#--%*7>2);0."-2 =" ++#&,- ##"+!0%0-%"( 7( 4B$@.$30 3/+5' | ||
2716 | |||
2717 | |||
2718 | |||
2719 | |||
2720 | |||
2721 | |||
2722 | |||
2723 | !!$"%%&*$$-(*4!)('4'3G4YVH_E %" ( $(-/); -99=$aLPfpgiugpqr#_siZ`|Z{iPD‰=X*4V0EE>&:ULT!F`C.\>6./%F$2("!0(%*4-70<" #" | ||
2724 | |||
2725 | |||
2726 | |||
2727 | |||
2728 | |||
2729 | |||
2730 | |||
2731 | |||
2732 | |||
2733 | |||
2734 | |||
2735 | |||
2736 | |||
2737 | |||
2738 | |||
2739 | |||
2740 | |||
2741 | |||
2742 | |||
2743 | |||
2744 | #!((&!"&& $&.-&-< /7(;B$'; | ||
2745 | |||
2746 | |||
2747 | |||
2748 | |||
2749 | |||
2750 | |||
2751 | |||
2752 | |||
2753 | '$ 8?!-YA?i,02!,-%('1 +$!(DF4;B 024B":@"53$C>%14')("));5LV+@X<?Q11ICJJL<I49;#1E%)1'!!1698L1Vh66G$642./5*3-Cgy(Xh'3V,1@D2‚©''C0Oh02@2%/6%Gd?M^ZqwXtDQ]DVn-4I(*%'"%%9BJax1*;.?P)3B%$,"+4)&!!4<'#4)8B-Mg15D@%>H!*))(%!<GB5W*#'"!KEJL8I'8/'+3!"" )(_S$m_6Z^S`c:<A55<I,,;&5IAOW]koLc}Nu}\{•„®˜m›ZS`T=W|@f{q†cLlhdyOUh9:JKGWpLjh^|sQmvEbsRoRDIC3=+6A,7E34E,?P;<A:!*#!&*4\g heHE.6%& "%%-%$-%$*""+ '$- (3 .,#%1,3!/:1JT.GO&>C8:">M)5=,=H<Xh@O`6J]6AO:EO:SjIVoKZoAPg=FcDAZMLgRSxSj‰CZpAK\GUrMdoFPiDWh9JZ3MY8@J18I8BT4 | ||
2754 | !!$!$(# .')(%+!*$'!"2*!',-.05%;;!3F(0;0'<+,5*01-,5-22!16 (8(03*59#/:.$.0&$3,%6#'(0)#/--"!+#+=*?%%37='D-30"$"" | ||
2755 | "! $ | ||
2756 | |||
2757 | |||
2758 | |||
2759 | |||
2760 | |||
2761 | |||
2762 | |||
2763 | &$"%!"!'$-%-'/-/N:5U#2< 28N9RNKV0=\>.D:5*4/;(P1_M<P(>35;BEG MP%0U66I5`X?bˆ;UDYŽZL~I.cL>HEFg8JXR;U30X)7J+UL2cf3=s09EA0H@,D&(91!+#!5 :&!!!!*%"!!)"'+ ":(3 | ||
2764 | |||
2765 | |||
2766 | |||
2767 | |||
2768 | |||
2769 | |||
2770 | |||
2771 | |||
2772 | |||
2773 | |||
2774 | |||
2775 | |||
2776 | |||
2777 | |||
2778 | |||
2779 | |||
2780 | |||
2781 | |||
2782 | |||
2783 | |||
2784 | |||
2785 | |||
2786 | |||
2787 | |||
2788 | |||
2789 | |||
2790 | " #/-+',#)!#+#$ | ||
2791 | |||
2792 | *""/5++2"'+'')'2+$+&) | ||
2793 | |||
2794 | . | ||
2795 | ;995 D<@4 >A%0 $$$1 | ||
2796 | %'=:7AH0%S!##-)$&3;E3:G)?H*>B,8A"Z]1Xc'Q]CV1=&AM8NR4DS44H/=U9BK1;H(*A#(- &$84-KU>0M&36 7A#,6"%"**;6:''I !:6Cf6I$1FF($5-+) :DFKb^WoW0\J$DE?O#_`"X}%/ #4-$!39K'2<05$.(4-2CAA8/@:?L#*/>P%2O6:=CC?F*;G*4>CHVEx-JL%6G+. ()36A+"$/1*<Q7TR9ZY@cBEQ07H.7@&?N)>JHJ\G1D@;ARws\]_^NSOa]8VVDUTYnmZXVWVji~‰C‰ŠD~Iz{P{L2K7)?EKUJ_a-FE%>E1@P*;E2)A2-?%$( !*/5?SOUƒS†¨7‚“%mpWUA>@?8;(-)( )'0&6)2%((4#7I1BO9@O(+;#.@'7K&+=&5D6DYBUf7Vh7Vd/@G4;[Ej|PpŠKr‰?L[61B8;V@@XMGnTSk>HUKIgPmQhtKQc=J[7>V6AL73A:AU3 | ||
2797 | $'&1'/**2&*)'")"'!)%,6!%!$( -"0-*4#./#48&482,>1,3-5.(0/#:5$19!9"))"!>$+@5&A?!9B!&;".)6*! 2-!"# / | ||
2798 | 1629&+1( 3",<!4-*%*+�$ (, | ||
2799 | |||
2800 | $2+ | ||
2801 | |||
2802 | |||
2803 | |||
2804 | |||
2805 | |||
2806 | " "$#'&+'#2'+$9I=7HX/HN*CTBW3.TF/>FkD1w}'i•,j~6hŽ+Sx87cC5?-)5.7$":*,)$4?1:B&@C&AG:NQFQbBQb?+V?#3$.5'KE+eU.\e*]R&gi'bBcvK.[/D3&!="(((-%K(/C$!&0$HD:L*E)',7$/ !%)% !&+)))/' | ||
2807 | " | ||
2808 | |||
2809 | |||
2810 | |||
2811 | |||
2812 | |||
2813 | |||
2814 | |||
2815 | |||
2816 | |||
2817 | |||
2818 | |||
2819 | |||
2820 | |||
2821 | |||
2822 | |||
2823 | |||
2824 | |||
2825 | |||
2826 | |||
2827 | % #0 | ||
2828 | "$#$1+ $0,/5" -1!-7'16)",13$1(/.2 ).'0 | ||
2829 | ',-11/714A3CK6BI7C$ | ||
2830 | |||
2831 | H*vTŸ—r€_2J4 | ||
2832 | .*@P&^a7+H$"'&#$>?;<5L3BP/NL-?A-8P*YiHo}FSd>AU379':@/>A89L8:K17G/=S54A/&4!& '#,&%15*2#4,%(,(2!L)B52S- ($"#/$4-#9!'65C(-@0<57EA?H;tS#CH"G:0ONB36?9$T4&#)"(.&--%**)/-&:L45a41)*5./5!65*99&1=18E4S]5>A*JK-\a3asTd}_Ok7i{,>J/;>?09%#"&*"7#2>&,=64:DH1GP-GN/2:5+E50>-8DM:]_B[HAIEL[N4RLmŠhl’k…˜\skX}lKur:d`BjnW€G9B&4<5RiZa‡Kiy5hg<BU1AG$+;%.:&*1%+6H/KXFXrbvšgyž\n”KSi4Kd5Sm1^k&LW<A-3&- +86A0?4>16 * &60,</@G.FG!48,:G&-5$)A1<VANeC`vFh}6N^5VdDSkKHiRQzEYh(-:'/H37K6E]@U`>WfAXpbvŽ[j‚NPdA=I5*@61E1,;32@. (#$% !"-"/3'5(*-)'/",* 40,@&7&%+%* | ||
2833 | & | ||
2834 | '&2-32+5%)3$77&A<,6B05:)<5(5;*$>'*+!+<%JH >R.2J.!=12%4=& 0&"-$ -@0' 2 K1AQ"8M)=@*2A#:6=;A90?08&,8#1&"9!3=&5"%*#(!%"*; /1). | ||
2835 | .#,.*25:?+@!:26=,;33P1 UK^]4Ye@Ir97_F;EAS=.mc#H}D]^YOlKDYUKXNljBGs6/F%15Q6"A] N$3/;B%GL)bI+Vo/Av:5PBU=!aNYpZj<QuUNlEfdAoˆRkƒO@dO,X(>2!#,,8'45(!& @&$/#';,#0##71+M-# | ||
2836 | |||
2837 | |||
2838 | |||
2839 | |||
2840 | |||
2841 | |||
2842 | |||
2843 | |||
2844 | |||
2845 | |||
2846 | |||
2847 | |||
2848 | |||
2849 | |||
2850 | |||
2851 | |||
2852 | |||
2853 | |||
2854 | |||
2855 | |||
2856 | - F+]`eeGh | ||
2857 | |||
2858 | |||
2859 | ()# '*'3'".!( .(". #"0*$-7)3? /:'(8%%%!,)24"*7$(0 9=(0#.!39#;?-=E0*6;43" | ||
2860 | R(“Ž*h©^€˜ˆY–G€ƒ'JHM;<+ | ||
2861 | "4>,?N./LF.4/(# "-(@H5HP0DI0Ra5gpE^v35J0XRJesWY@J[5CA(E>,W\/hv4Zf02>/1C0(9'<4 %&-. | ||
2862 | 9267('%$(("R+d9 Z=),3+)-&"!%'0;''%*BN,G]*:I39O7dokj;ƒ‹@Z7WQ*^V&‹O.pR08$% !$($O5$/*:&-B2::1&4;=!+7+(;1@U'!$'#>/;H:FC]†FBnWHlN8PK%7GNTPhl'>D&;K%!-$*%,(3"") &%"7?+I^4@T9ISD=Y6>N&4B),9+&2.#5>.B:S^5'7F)49%4r$:m1Eq&HV%2X-E(>'J#:M:D,TRAOdU7O`LnclVZq39H(BM%>L&:B#GM(Q\8J^<UqPc[GnY2MO4O<9I8>R=DT;9P0EU)Q]$CJ";G,BK+:M*8C#2= 16.9%8>+P\;nu"KE*0@#(6!/()<5:UBJfMGdFdo:F[AGe?es@O^EN`(9H$IO2M]7RcAOiF[pG`sYoŒ]byAHb8<Q*1=28O0<G17B% | ||
2863 | |||
2864 | |||
2865 | |||
2866 | $$!$#"!/#+3(3) +)(5*-8!,9()7,'5*)" ( | ||
2867 | -+*311!&9 ,0'40!4;"/@+.82,9-04'16.</)44!E1YF_[)Pg7@_<=F59 W$<0!3++ 9S%94+&$AI;4X1/?CJ61MS+5U*?N*BJ,EO7EP3>V%3J045"*<)7'!3'(+"2" ")0 | ||
2868 | % ".073(/21 | ||
2869 | |||
2870 | 0) (6!*"+%<2=CKD,UV/Sa'Bg1NQ1XX%Re(Ci5=RG0RN2GH4DE?F5bS.t@r“eOn=(mD5FA5H=EG<N_OMN3TO)@a!CP8@P.ANNT#5L(1?3NFJIZKR],E\&TO3FcE3TPSFGJd=2VCAUSH\T=\M :0"$>+@ !0)23&4& . :!( 0'(8#4* | ||
2871 | |||
2872 | |||
2873 | |||
2874 | |||
2875 | |||
2876 | C$ @?#% | ||
2877 | |||
2878 | |||
2879 | |||
2880 | |||
2881 | |||
2882 | H3OC$ | ||
2883 | 6 DK;L+SOECZZS`RF | ||
2884 | -!+"$$&++0$$ "*0&.&( "/%$$%)31,.-,0$$ %#(*&4=*12#7@+A,*-(/368)@G6XL7YT(:2 | ||
2885 | !($/_15k+@dWfxF…vafryžJŠ“Awœ3gYc$@E.7I&G/$4R#*")<E7:M>?H5?JC5MWAOPB\/SI:woE€‡Gk|;{•>dr<0L>BIRWiG3?(>H&6A#CH*(6$"91#<G-PM(*142545/B;&B7.?2(N5">7EAva *J1@1'‹Jœdqu288QC;.0,GK2>WPIXShfMif9sfIÿèBÿØNª0Rm":?09,8,)1<'0*:(*!%/+*,"(13.@!GJ+\T14<;@ c[4fn:j‰Vj~46H4;K%PE(DOUvH‰|(7I"2=.;.8,1'/)* JI &3"%5%1>05>6FC'3=/)%(!/!)0,6"4:07L07A5<%5E+3?*&1.))! "%)71ETAOaK_sEuu9ALV<WV2J=8J2JX3Uf5bi3Zh7XjCm‚Jv‹EIW=/<-.5+4<6T`1de3;J(.;/CU8[s;_w1ap.J^-9C,7B#8?$9H4A&>J3MaCPk8GT#&)!%) (4,4=7(84'8=@g?OZ/*6@2WBh}8Ma3LW-=R54L2GV:?UFIaFE]PMlLOf8=O..C$!1(%;37J.-9&*% | ||
2886 | |||
2887 | |||
2888 | |||
2889 | |||
2890 | |||
2891 | |||
2892 | &"!!#1$%3"-''$!('+3(2'$2$!-&#! | ||
2893 | . | ||
2894 | *1-/ 6. .5$&.(,* +1!14,A4*4C$=3%6:'G5&MA'RM%QR*N]8RdD;_C>3>C&ƒ&"ES#048' $$8Z*3:':%,,4;:AD@AA;IA+>I02F>,79B3.7F74M:2E;6<71B,'=&,-@-!2J*;! 0 #" . 5- <E1M+ D.%* | ||
2895 | |||
2896 | |||
2897 | |||
2898 | |||
2899 | +#+,", ##"+/C9NG&QW3L\?8ZH-HDC::0U=<M*'B09;+:959,9A0;C+VH.fhHdrf-T"4A+'#8>(<=*[K1Rk6V^5Uf:]\-Yq'Ng3BI1D:4?:(MJ,SWCO[8CX@DQ4ZMC_f@Aq,DO=6F<180<=/;R3+<. -*+J4'?I21/">) "* '" #0(! | ||
2900 | |||
2901 | |||
2902 | |||
2903 | |||
2904 | D(SNCOV4;G% | ||
2905 | %! | ||
2906 | |||
2907 | $601EH ' | ||
2908 | %0631K<KOA[]G4WD+) P-M>O[:H!'&&*#+&$( )9 &$ #1-1&(/,(3*(-%(!)* 4:0);'@3(6R%JS!OT%MC-vw?|Is’VŠžD‚#‚wQi$!#$. T,8?!/+ 4**=P[SGSc–“t“qUyQa\FAS7HT,3J4">*"!$,4@0-80DS1N[2+;+)3/52,@B4EWMZ]XZiMl~gf}MGW%,43,<HIY17]2A^+:=2MGRO"8'IA8*Q6'2)*'03<3 d8+`;"X;'¿˜@µø>d˜7PrCFa */262/]o^¦ŸT¥…B€d-gk;BM')<<II6¨o;‰Qj˜KfwRX‚D]˜)WK(.-3D ,6)'=$*+"+5+/!3$"#, '#%&;C8BODmj)T`0V\QYsS<bfkwGg|0_g6Ui6UoWT…Š@uI=I%5G$:=$FS"CM >J3A JS.9H8)!'', %#&+,#1%'"&%''4$*6$,:)(2'7E(IT(;H#>N"47.7(0'% (! -/ 4B(CD-EpDlF(@++91':.2D,Rf:_qFh…Fn‰GlzJb~Xd„O_~0\f+js-{‰:{‘Dt‰6?P)FQ+;H7/G@F`JWuHaw6Sa,=K,@R,DW.[l,[`0=J<IX3+7 #!%!!/*#' .8<^,ad+29A5T?O\4?O*&8+$85Gd:Md8FW<7J=?L>=J;GU&=D%/$'.#0*'' $ | ||
2909 | |||
2910 | |||
2911 | !$(&&1!(!& $"#,'70/5 5$ ##.)'/1'5&$2'*/'@6$ME SN-JR/<R-ZH0SW2N^;UX@MbIPXF)YJC!;f)u;$;W<0C "%+<=,90*:#*",B*KI0EW6>N31C6<0=69.I:,RU+SY9G^4LM&QP3L[,TR(@e "S,-*!(!.)*/$0"0-& )() ) % ('(!!0$43/, | ||
2912 | |||
2913 | |||
2914 | "!!(&"/3@>EL"E%+80 CD34V?%GF/5=+>.8+ )4/#%2+%%# /3$D2.[R/VqFPoWM\M_R-Ma@U!AI1PQ1XdDXb<a`:h}=D~MC^B,Q?:?6HJ6?J9BLBOUD<aI::?MH6jqF[yUAa5.>2*:)30$-45 5*,)4.48!GN3Bb*?@:P)6,!27&-$&$& | ||
2915 | |||
2916 | |||
2917 | |||
2918 | |||
2919 | |||
2920 | |||
2921 | |||
2922 | |||
2923 | " F=#U]CaaJly@[w(SXFH.L$4 | ||
2924 | |||
2925 | |||
2926 | !JF5BT 9 | ||
2927 | .'27'8,9)5>(9H"?:!1-83GC Vc.TZDJYB[A<D>?1 E7#12"%372Y^;A&2)(##+),#"'!*1(0)8!),'#0(&6-)-16+-U]CFcP[nadsqUpq@ay:iE O(79205'0!,NBP`4V] %3 ",,b¬;Џ6Tcnž«‡‚”WaŒWj‹?kg7?`.'>*'0+25 ;I+?E#7I62BB4>#79$0%))-3B6QUD[jEavXakK@R);<&/#50?ES06@/\c2TaHUjK:N$+/%'!!.0%C+#oI2dA3žg;YjFOzG\C=A;E;,fy<1%WF@ïÌoÖÿtV±X^o@@N+/1*f~TK tNw^kkPØ®K“¤AAc98GHS 3H)7=%2;'IT&<H4>#-!*!$#+&13DT6LdRNgMk…T_iFIY7LZeH^Nq‡M[tHUsCIXR8F>=M)9I&/?/0>0LW7BN-%90'=2#$ %$--2#-%2&,)$*(%.!&2!$,!%,!27,@Q.@O*7M).A%&5!$-$",+3.< &0(('*@0:#/"#1$#0%*636JC_|J^vUm‡V`€J\tLgNnˆIkˆNhX_ƒW_Se‰Ho}1eu4?I!'246C@-EE4QGUu:JU1=M6HZ@LlC_z9Xb2[h.DF+)!&-C[{+WZ)'766N6JM!/7'8-&>6'@21J*1C+6J33G@HX7^h9?#)!"& % | ||
2928 | " $$%%%$$&1-+>6'" | ||
2929 | )$1*%70%'&O+PHIU$FM0UQ6VX:O_MSS<Re>W[PKgID\S8S=7<<h/h@_H19GV)*?(!3$"' 0$#I()2.( !&@#?:)8A8"3:.)7:5.D@.^I0Zo3Qq8Pk@[c;[o8Rh?Ll:Ha@5P:(?)'*D/5L'D%%1!"3,5(J2?UHH'FN L%/&0"$## 3B12?;"%'$(*'%&.-//5';>/%C5 +#'#*4*&6;..-.42&%8$%;#0&#%5)C>":K8UAGEZ?NPIF[9*UE,97540GH4_R9Tu<5Z@3F>SJICW1%Z<'(-*C5>_?5Hb60J<K8.XT5XdGY[TE_F8R>W?.OW&=S-0;*N:6F('D*"0/'9&/&3!#+ ()$ !$ | ||
2930 | |||
2931 | |||
2932 | |||
2933 | |||
2934 | |||
2935 | |||
2936 | |||
2937 | |||
2938 | |||
2939 | *(*5AI=JH>OS6GXNTDIY;,D/!+2" | ||
2940 | |||
2941 | |||
2942 | |||
2943 | |||
2944 | '!05.CR8'1 .646+$/& 7##B9HP'KS/\f;GeO8WCWQVbn:nvEYo@js:Vy55(OBEhgCYp A*F3#D=!3:$),%*-"&2%!$&&, ,&$"+>%&6;*3:CGKFIP7LO:C!8"N1%L^-CK!A5`\0PˆIPb(@F:?ŠQ_žQl‚g…|3‚v“h}gNukXVQVn6g\#>REC%LN,IP14B*2?08D2BM-4C*,9#.K@+X]@DVALOI~‘P‘3Zp(Q6 0^/(-"&$*2OAO#K9>.SR"-!#<*G9&zY>‡R?˜‚;VHMP=730O/'Šx6NhG79'7>G6Yª6Z€;KJˆ‚FÀ«9»ê-PŠI)9:ac?”ÔkH‘UxUYz.3>,7L43H&&,$/33CB!0/><*,7%%/*%"&,.8hM<OXSKZ`BaQ6H>0@A@N;?jJI`KBW6;Q14H(<M,6F#7B%$.*DY59K,&' "(!+$1 /&/"!2%-%1!'&0&4+5%-(2+5H/=S.6I$(4$0 **",#0 '& ',#- 1A/:'7&9H8E\DOgF>XA+F<.I?CgMInUPtTRpURiLYkJ_yT|”FXk74F%#1%/)+-/964M@Yj1DS6GV<H]GMgEVp>Xq8[c#AE2- | ||
2945 | "19P@Qc"9@";F-8G"6:(1+!*$);%6H)<N*1B7/F>?a3Xc!<C07%-*!"0%# | ||
2946 | |||
2947 | % ##!"!"#%-,! | ||
2948 | # | ||
2949 | )' 5-?52A+3 :,F9WU$`]5Oi6R_:OU?HZHVOBQWC?]F6ML;DI6B6F(8`)\E-„?EK_Q85C<&-)# %""4/)+0&%%3,(,51&;9#C>)XP1WeBHpJc_K\s4Lp@NeEN^E\cFTh7BW58J"FB"<T*/J.(<&"/!)**3->?>=DM5BT67JE,E&16%'7)#"2.75=A"2?>+;316*61(2136)7,%#%-&'5!12 ,*#-$')$,,2!%9%1"544=J;2W":8"-?&804&P62F[,1QDEC>GN88V<78&G9hQ)Zn9GnG;WG-2.@"*18E84DLGH[R'Ja84XC296AB(QQ<M]EO[FG\O@N>RR/Q\IK[D5P5<N*-:=-3+*,(9'/./1& | ||
2950 | |||
2951 | |||
2952 | |||
2953 | |||
2954 | |||
2955 | |||
2956 | |||
2957 | |||
2958 | ( 0E,1/7<67B=:@67D2N@93Q7&-$+-: | ||
2959 | %) (@<& !()+&.1602 3 &0+%4BANOEFTT=QDBZF>=5G^P[]ZghRIqUxuMoz[VB\+dQPevTbw3RI3 %0DL2H`8QV4XY)N_ 1M(3!,0 '( >)*6.3$"/74$3;16<>%A+'<..8?>AFWHJKE6=3%'H)=@DOHNdAIh=8Y2`V^aI…N~{w<osfly˜š]¡Z–µQ’‘F‡žQs€3DQ5EL@GW?:M0AK(@C-7=64E05/ -57F36BA8U;GQ6vrbT|]@GG56+%"$!/+=;.?,&/,7-"’^.‹¤e€‰ƒd’zª«-IS(FMWl)Sƒ_/D5¦R(œ”)22,1+2692ÿãqêÿ|hm`1-/183<:FT\9JH2CJ6O>@M&,.(;D#0B26"#,,*.#'5#&'- ..!"&.'1 =K;DQ@GQ96M57H+)6#0<2&9/3G3/A*&7&.="NT*MW(5F!66 :L0+;"/3=$ "$',&*@L.?-#"%-#- ,$3 ":$- /;.8G-=E$)2&1$*'()%%",'@$0L,9$;H17K68G:,E.BW&4F'=M9<RBD_On€Ht?ZqC\{OpUp~29G")#*5&%5@Vl7Q[3AT9Lf=YmCRp>YnD_s7JX&AK'$ | ||
2960 | |||
2961 | |||
2962 | &'5<C^0?N.AR-1>&=L#CH$/&0$4)3M+AU+?M':E41E8=\2LZ&0;++,9!#0'"# "%! | ||
2963 | !"! #"#'''0%'/)$820",7%.9':6!9F<>0QL7Sa?VbEMc@EZGRT;I]BET@6K<@<3:;.=,,5*A,9•23QgO3BP4&.2%)* $(#3,)+'+(#0,.416$29,6C*FFBPXDBa<5\?3EFBDBBZ=?T@>V7FX=M\4LX-<`4=O:BD.2G#+E!%4#>0%EE';X/8LH2M>8J?>B-,@!(;#/.+3$(7(C;=H+*G1"8= ,1/&--)27+);%"8'&0032((3(-31&2 %*(0%60':2,%6-) 0'9C)?+%4E*6?G" H.%"#*'"">7#.<>+!@O1L]55S.E=*JW24RP6CFCD5>U-#6"3 N@V_6:Q;6G=<LJ=LA9J/)9+6;:9FC4FB?;GFQ@LT=J]EH]ICZC<T-1C12:)%A)1# ! | ||
2964 | |||
2965 | |||
2966 | |||
2967 | |||
2968 | |||
2969 | |||
2970 | |||
2971 | |||
2972 | |||
2973 | |||
2974 | $ | ||
2975 | 3/+F.71.VK/VZ6?J5=D77B1,F>!2()", ()*#># -*++/.0(+2-1 %")JT"JG*OT6L\B4E3>LG,<57E@?BH'DQ(9K*!IY_`_jYXdITlF<PRdr]TlQUS9JI'#50,EC@>JPXJS\MOX8IU.1X#;$ !/%0,()/, 3@,1300:-TK$[dX]NV-T]-SZ2brDZe>W]2JJBH%`a:G\CNP5X\,4T686l^SG„Vw—CreB†«wv–ƒ‰ƒ•x~Ÿtx‘XU~<Q\?IZ>DU2BS4GZ*1C%.<!-9$'<&6A)9>'ED/_g>_kaFlG9_0-!N3GP(7*"'$4=%B7?L"B>&tq€Xvyt…ffgr9i…:)%O4.:>D&9>8E*ÆXµ–Z±“(0K% *>=PéQ˜´XuC5I%%-%+1*687NV4UL.y^8Š1_o->&,1 &.%'<> .7 0!#!&& ,#0:%!0-*03'C(#-')6&.7BT&CL+:"(7 2;"E`(5L4CW/aa(T]!@L(DF>D?Q6=("$<C"@V 1K-CL!2>!$)&&-"(6%7B.ER'8@.0#3#)%! $"-&'4%49(3E(&5(3&')!2-2F+J_5On2ReARoQ[€LwŒHTgMXxT]@G_ :>$&#"&2=6XmO‹š<q}4Wj>NiBawCf|KmŒHiu6bq0U[@>;AA=;/$!7@17J/G\+AH'BP'FZ2[g%9B9C!3=-3@84E:3R5S_1<R7IW<Oi8_q-V\*!*$#($" !!! # (&/, /$ #%'!0%$%#)0#.0*2:"0='>=-DB%FT<CU@GYAIULLU@MZECU@4MA1=7A9+D**C.!H.4z0"F`H/:[)#,!!8$""$"(" %")#"'#- -+#".#'(+B,*DM41]8,=<&512503=-=C38M15L>2G67L4?KAOI7B[26X=)G510#A;*N.#9L25+-72:56E+<A3,B25;%D=%?M'6L(;B)>D89I>-?:*5#+/!;1,D #4'#+'")+#'$-/%,8(0$0('#4#&*&+, $5)&)&.0*;;/AE$B8!)I302#%#"&- F,@GEE04K)J;-DE JL4@R3%;*97)@<3dX,Ud 5[.4J;"BG-3/0=39;00:2B@,7G"3K/*52631>I45F=/A?"<A)68$92#2/)3'/3('3"$! " | ||
2976 | |||
2977 | |||
2978 | |||
2979 | |||
2980 | |||
2981 | |||
2982 | |||
2983 | ( 0:EB).;$?9!=V7IVOI[B<R=(D.9<."8#$# * 11 ' 8 | ||
2984 | << | ||
2985 | [J5V-2 4 */&7$-&8!.&.#)0(N5_N78%%-41FQ@=SH1OG]T7Ym/SG(bN.AJ(7@.":6F_GS\UK[T%>:=,WQPY8SPM/B&E(('2*%QZGTaNRWKGTBDK+>H!%/0(,:!$.")62!;A/7@*88&MO97ZOJUNUdCYdLdjNo}QY|PZeLSm<II@GXO7kRox8ChF<K/:@,@ZJPtjW`kSšStˆr}›l„“f{lƒ¢os˜f]wGAW<:J7@I9TQ3MW0RS&DG!DV"$1;=*AI-Lb?XoT#KL(92BP,/B@3m|<<\6DAA<FX>>,?03$JT.aZ7~‚2\_PbkD~xl€º`^w;l4y„8G<!0/ 38.rz‰`Äv…†f©–#qh†BR€I©’8':2)/!67)kkh…ÌSp~SnˆK‘n8bt,”‡*nv!¬y!Ü¢&pG"GL>E>G!($$4.#!"%"!%*")1!1>67M/CQ:;.> 14)QQ+ji1amG‡Œ=€:‚”4Qk)CM/8J'RS&&"AK,Ob+5G$5G&6B("$#&(!,!7<3JY0Zh'SZ 2>&)&"""!%!,"-5%/8$-5()69LP&YX4hx>Pm=h{9H\EMiNc‰Nev=N_MSe?EO+5G!,5.4CB$SP5mUd…XS€F\{Ac{DRtCc‰Nˆ¦Sr‹CSh9Nh2@K&8N+BT&6 ',7&6>3Oj:hz2]i8dx;aw-AH&<I*;G*3;)"02.@;@U4>L99OC?]H]x;Ql..++)& %$$ !'" !#""*"(-)./#" | ||
2986 | !%%'$&03.5:#1?&55)??&CE5EM0;O=@C=EG8NR<EUA;UA3:644-P$"L0%<63a,&=FC2.U*!& % $ | ||
2987 | |||
2988 | %&'/$1)!!$90<E0&G6#/10$#'%'/!14*,=(6>0B@(BJ+IK4PU/KcGF[S<I35A&3B+*>62?($0&%+,!-;B,/BE'AN>6RG9F=8@34@3,9:18(,D'0:%-93%7#", %$#') . &))+%2 '(/-0578(8.! 01IB'AM/*G4%*!0*45&,@?<DF9JT.BW;,P((344--;J1,C1%: I+)XS",eN7K6)*7**33%2A-99'/@1.1/25%2&(-/+1"6--#$ "4%6D5?(:"#% !# | ||
2989 | |||
2990 | |||
2991 | |||
2992 | |||
2993 | |||
2994 | |||
2995 | |||
2996 | |||
2997 | |||
2998 | (&1B@2&H M:;KL3FSF,S@.61*(13+?9UX>bGFl_-Zo%]d\^^_!Xg3AQ8,7A%/&(($ F/GP$#:+($7 BH+BlPYsCjt!b| ;J?1<5TN4fi:ƒ‡Gx…CnŠUbO^u=De"*C/^F>]gLS[H^R,]['K\L4MB0=;&K/!'"')!<?CU\CKaCCKAON7:R>3;,<8/3*'3,/>:'eM2OX90@(":**97;2Q]QXoPFjQ(9U3KTMMDk_ApAps@]}8jbSFR=`g00B10*-J2A`h@bxB’š\¨wgšmh†\xˆp@sT?JM@I21A2?E2:M8>M>::%-2*)*3<@*FV6<Q@$,A&7@=ep/^u&Uf.QpWHc4?F4\I+YT-RI'd`)fd&O@9\UOU\lXuHL`Re{h€€^vˆD™vVHXQ@^-ABED/$;[13I,:]T`‰]¸U->4MbS=~€KŒkZ£04W03$:@Rjeczr<ŒŒ<š}LÚ¹T¤°xÿÿg¹¹e’©h_j2>I4[h19Y0+2"&*-%4 +/*/!*/69;0;7M&1N*_h&8K#7C!ER-Sg@WnArwO‚’Zv[r„Vo3PP(KL*Z^(PO$M[0Pa/PT!5H2Je+CT,8!,%.4A!AV 5D+>*%9=8S@Pg.1D+$( $"/%4%-=&9H%P\%cr/Pq?TrBl†Ix~FUv=ax;dsA`mNXn9HUBHf>ET(5@*KX*Ya5z‹B„Hk„PE^:,E@QkLxšLˆ¡Q§a†«ZYz=@O5BR4HT'6A4.C%%*"#/6 1>#6?10NCEjGQqFVtL\ƒ;fu4MU.0=(, #*&!79;O=T]5BV5<RBEWDFZ4.* #("+'!,!'&'1$&"$$)#*&!""!$+ '%!& #!# ("!#%*((+!)'" "!!&,+"9%0(*0!05$3:+><-2G86<78@0;K49B==C<8?301-W!T7&::7K.,B=3E.<:1'%$$ | ||
2999 | ! '"' #$%%0#(."$#"+%)+(".0&:9#BH2PQ0FR6,^JE:OCS<8S68C3:C,3?144 <$( &!$7)5A+0CD4EB4H4*?/%:/92/0E%)<*5.' "#& +$(1 !#"%,* (5)..1:74C9=''@*$' ;$H@"IM38N3<F5@B%##5"%/C%F>7-M7/:.%6$ +"* "1* &N.CX-+DM2)(&1)(#:+ CB%8D)3D(5=+<> 7>#5B,"=*&%(0<%$=)&4$%3&3&;3: >0 | ||
3000 | |||
3001 | |||
3002 | |||
3003 | |||
3004 | |||
3005 | |||
3006 | '% | ||
3007 | ,$ 0 | ||
3008 | |||
3009 | |||
3010 | |||
3011 | ,-/2=3>>>COD7J<2;$871=)MG'fY8ZkNOc3BhVI^[LcMObIhRGj[b[Ro/\€*(E!+.#$2?8"(--=,"&#"!/$5>).<:8UJZBFZ+SZ4aX}}nn‹o:UainaMkM`OE‚i.rŠ,o‰:ˆbKiLLeI8JSlIJKE>L?1[S#TLBC&-&.3AQIDHd>_W@^WEeg1BV5B9#Y:g!’›,ž—D•£P_q%?;<?[V0_gAReO@]ES>#Z`.HYH~k_…’q‹˜`q†]…QU8AZK00-=/N<1YWS€oMo…x„—†Y|`b~cJraAo7-@-,?)4>%1=2.9/*>-(5/09E(TQ"5U+>=1"B,'/(-><!DMDbxHBZ8KL:ƒ•5lu:_©Jk°F‘¦Cš A‚KqwD^oOxDEtCv‰=qdUŒ¬t‘—wr§ƒVs8DC6aa=T]>CM15&VI!WZ=‹‡;I\<G/+:($#(6>,9<$(4#5K7N^M^pRZ’d’ÕxtÈzI_mTd°D‰g=ZZ7K65I1CN:;K4BN(<H-;"*/<21-3"0 QZ/M{$J[$<W)@PPaq*DZ(EK6]q>cwGbuYt‹ev˜g‚¬Z‚«Jq?o…:cx8~‘?›;f{7Ml//E24E0'7,$+"#%*$/,:'AM28J7<H %4&3# .6Ba3%4+%'%" $**))%426PBW€MŽŒDjxQhŠa‘ VdrHYsUn•SkˆQlŠA`k>OdDQa3[g:WmEiXu’i¶\…©Cky0io<’§[žÌjŸÉj‘»k²ÊXy>ˆŠ4~ƒ0R]0QX2Qc0gh%]]KN+@R3KV*AK6;G?CPA5PB>UFaASc/:?%!"&4*?DI];Pj:Sf5O[8>M6&") /'3 1 -!/05$1"6 2)#*#)$*" !' $ $#!'&%! &"'*. .!! ##"&#!$#&##-+$*9.23077+5D21A43443</'14C!<0(,,7>!041+)(4%!+!+ !#!$)&, %(#)+!/%+%)3,'B<'=T<DSJ2QH:D3)K>28<E@9,R:1C:1=0)E0080&52'$772G'1@9&<,$3+ **#$ *)%0&!0 % *.(!)!!(#'(-#,# *003"5<51B11:8:-#=/,I)B<9&D84*"%*##6#5@&+>&)324 '(% 4$#.)'.G3CU;9N<C4$*K&'("DC'Q=&*+=-!=H% C/%(& | ||
3012 | (!!%,%"8-D<5B4 | ||
3013 | 1&- | ||
3014 | ) | ||
3015 | |||
3016 | |||
3017 | |||
3018 | 2!25 "0#.'% " 8$$/5-6<:6D;+76M?9Wb2be6poLbq[brN?Z9*011;:5@>:GNc\\Ma?Q\XpidjvK-\#'=822<5!!0 *>!2<*NJ0Ke:<i=kXS7ZS@LR`Q4b`=_gMl‹Q€~o‚tp|rs|]t}rF‰__@DxuNW IN„JRgKŽWnˆAJMVK!zz=qˆIgLEgT1K^58Cra2`zJƒ`‡®„~³‰yÀŠ€›ba¤7NM3DOLf`LpaKs=u?|yK‡†Bv˜oƒšs’°{Ou`AUi-HA4*0=.@4$ON6^[DYZlƒ`ysi9bH8^VIs;4F:?C$1?%/8 '5"&1*6$"1$+2.@G/8SE1=*9M/%/'MR"L^-Tb/K^Bc^-U_2bsUžŽG„|I‚„K’Žr‘ɯÀ{ÒÙ`™ÑUS‰X]]5’}c¢TcP|^LiUqg=DXM7mxI=ZC65-PH+o‹J:[DP^eRe8(./)9 ())+&,0 ,0MA'42+,5%/C!,d$-?&@/F?C;3)=2/8+3@/;N85A-V^/TQ+FM.)",1,.<0/56#IR4<K;Nk-OZ$Y^9xŽSš²6Œ˜@u˜G’‘Hk†Gv†]|‘Y„˜bŸY—IiP\tAx’b[†Zv›L–9p}):M$)3,,)&-#)((5,=L3L]0EZ'",* %8(59&3%!&!*!(&2@BWtZh’[y’XhyUf{[]rCfrZUrkOo_a€Ym‡Bkt@ZkH`zG^tI_uZ{Žex£m‹¶b¬R‘²i–Â{ªÕ}±Ëm³Ê¸ÕmžºV†¨bˆ©Ks=kƒAh‚]i…Pm‚;[q3Rd8BM5Oe/W\',=)+:/5H>MsH]n,FM.4(+'2%4H6=NCHaCZm:GU0>N0Q.Y/Z.a/X0W0V)M+U2[2 Z0^4Y0 N0O+N)?':$0"$!#" !#$& "#"& ""!" )"./0:,/5%-8((3'/0(,2')',!"#+81#$%+#$ "/&#/#*)+ -("+(-/,2#"/,!:*9D!BD9:J8.IB">55=&#,$2%!71,-+19)&6,.2.!9( .+*)*.*5$98,6A',=%0 #/$%2!+0+7/'7, "&)#!'')%-0)91+#70)/3%/6"2:+&3#!%%" %')+"/#'"#0-3?HA$H;(4C<#85.(1(1-5*,,./ | ||
3019 | |||
3020 | !!%!40+/EDH/A3(&4( 6)+=J8'M1*<2 8> ;C/1=!'. | ||
3021 | |||
3022 | |||
3023 | '<74I0#1'( | ||
3024 | |||
3025 | 4 DU*6@--<0461%<.N4$jlGeqVanY@`Y?D\CRU%B,!%$/-+(7%/dfRDb<FRJjf_1[R(5%#</.9F3/4-5*'*&$&).3LC":X:1A6;F08L8*?8./2VI>^hK4cH\T^ymNp„†vˆvf}hopZVi]DyLbKX&6X6?F\Q6dtfoaaogD_]<qm^lkAxY9B8'=']F3VkD“…YTsOvv7Ac5:f<>Qi‰hX\?Yp?:uaf\Ytym‹‚c™žv‹¥z†”^”_q}`fKUU7CC,YH!,.$E7/FiBHT@u{DQsSieO6*.C*"*76>)/>21<%6A#)8%078P-5HR03_/*=(8;.:GO[!ae6fw::[:BY3°²A–?NdN}–wœ¿u€´v×옪ÿ˜q——ÿÅ¡‘ª€€€X‚£Wx·tŸ‚€´c‘´B‚{Ae…IdvLES]/A136+6>:+3;6<115<>K:FX)]`+”z&¼Ž DD,ef(DJ(K<51 5031/=44>;12B..3$8;EL*>K,VO4CE6bc3WX'/8$- (,*EG%37();+8D.0L>qƒ>t£C‹±`’¸blš^b‡Uc‡Wd‚MbWe…XožOp˜Zs–SxˆN‡“J¶²U £N´Çb~_a3IW""+&*,6,1'(+-MO,Ti2I^0(;")+CBa_&8\ (<%,(1$+%+" ""%4IaP_yUZtOVxHYzGRmEJkDe|IRiRe{bq‘SoB[sCIcNes\…¡`Œ¨b„®n±t‡¹o·u‘¹~|¢‚¸su™|sžnHq^KkWJjWOyPVzSk‚bh‹bOiQGgDNe42C23HDYv+IP#BI%9M7RjP]z?]r2_h&N[$MQ+>L;BY?JcHQ`BGY8G]7¦K.¯G4±K.«P3¡T8ªK3«H6¢N3¢K0®J0ªJ1©K2ªM4ªJ9ªQ3¡M3¨K2¦K,¡H/@(};'v7g3P/=.+(($& "! " | ||
3026 | |||
3027 | |||
3028 | |||
3029 | #") )(" '#&*+5()/%%2$#,$'-!))-*(198 ! !&"(!!08.39%,7$)5"%-$-((,1'5!.0<,':(/- 5*.2!-6()$&"$ /. #:&.!+'!$&%%( '/$-)2&0;,7)&" %##-./<,;($4%+#!!(%%-&"(!H*CP%5D.066@(+;+66'1=#/2#2=!7"!##+#! 0$*5$2"@-'K2($6$!" | ||
3030 | |||
3031 | |||
3032 | & | ||
3033 | !&1)0$=) 1,((-, C8%2C91/.() | ||
3034 | |||
3035 | |||
3036 | $#/90'1+")A%BGH>A@$#-" | ||
3037 | 5*3*<-'2--+(4/@'$QlTOm^Pd\[iKem:ep>hv6N^%/*%,.0@APSY_40`I7IF1G"3U(?D'0C2$?,-%M@!onn^BH!*80/7,'4(BG).P/:)-2!M>)|‹Q{‹2bs8HbZcl_kˆsm‹baue?[NHKNN[U/T!(/)0;?COQl„OglO_A<b†[!Or'B++$SY)Cb,qdKc~€UlXUZK_w5gv/W^+n„Z„¬SbkQscE‰ˆJm]rkfxvYp‡Vk{FZmBFOCREHCJ9F1)7<99%;H/BS:HM'kwK]lALmD#4.%#%7!*+,1(#4$%4$4;%!4$42*497L724+,4&,:0%11!/? =E.D@#&6),{bz”›c‚ŸCwšez’}Ž´e’ÂѶĘn{„áŒ¬Ž»î…m¸rp„ccm[Q`wh‚„¤m„¼X]„JLJ25C-6?'E7%BC;3)<<)KK,¦‘5ʽfm°k¾£hܯ<ë¶:o,bAY…,Re(IR-%1 :<(9E-':'G4"IK%55)E5*kV5^]2Ra>HW2eP O@40*&4*)/&,5&,92DTKSXOkx\s—dzJ‚šMˆ U‡¨MO‘§SuRy—QlU±ZÁÜuãÿ}ÕùnØzˆ·_™·H•¯6†”HJU^$WoKRJ\/_{BOeC:Y8Ja_\zu-[}1&@/ %+)9#1#1>09#&$,!$'5>?Y=A]B_€Iw”Diy?guP‚˜UpŠL_z\nYt†Q†žT™£T–¥h•³u‡«ch”|{¬r€¤w€¤kJq[,NY@cZOa]P]B9@21>32E:BVGMnO`r^[vUTdAJXDH[5R`'AD65G;Sa/@Q.AT9:T?AZ@Bb=Ro8Ue7Lg8N\6:IB=QR@XCAX?EQDl=FxCIz@D}EB|EK‚EKƒFJ‰JD„DI„DI‡FH„AQˆBKŽGLKN•MQ›JJ–NM•HMœMQ“MH”GC•K@I=ŠC9{A6j>/d6%K6"B0#*,&%! | ||
3038 | |||
3039 | )&+% "$!)$"$!$'#+ $%2$7" 6"83&0 !""%.#*!&"#%! #-+-6'35/.5'.8!):791=/8$22)7!/*$"## #'# ",A*2%"""$'-"$%&$2.# ."+7%"6,+,&&%! %" & $)! ')6D:AJ54I=3>35E+2>958E># H&0&)-)2+*#") "&'*%/ +#6*1*$ | ||
3040 | |||
3041 | */)& . '%5Q7KZ(F\?*L+) | ||
3042 | |||
3043 | *#2.(IA$OU$Qa;YZC^]HM^2!7!' | ||
3044 | .1#-C*&4)$6"#.**:$<92>EN:;hH>aSBVV>fV WNJ@5:Q&+-)7/$'BUG39376"9E&&:!U@6CV&(7%4(&VnHj‚hTx\0V!'9;0&=7#6'79>N*32-X.EjR_VQzAC]K^nobzx^†`X~CJX7nYE>W2:?''5%,4-0BRZWS‚z7Sta/H</œn¢<drK5iZ_VQ†RqŽ_nfIx\ZfK=<OJhxOtb\_p„oxš˜f•’w¤ˆ]¦Kˆ‹;i^0GN.=4847/PB,EQ)5=$E24JO87?-ETGccJJl;*1'&%$"1:!)1#*&%(!43'$#IA,.C+-4 '@93!+? #/#4;-}v\›vm²y||d}ykcƒo]ivxµ³a™˜‰zjhcšî¯v±Ú`_ƒA>Q<ThJe{V[mb†”\XzFK†<R‰;a”=y+ls%;I-©„B²¹{èõ{sŠJYsaØÑ»‹ÿf 1@Z=J^>Mt59Y9*GDF*MT%,.&6D2:>+2=pF*aK;>;5AE-;F.DD);095)53:E$06"&6>4gs8~”Lm“Tk“^†¬]š¶f›¿j›·n•¸c~²Rw—Lt‰[fn~¦ ܧªê‡§Íl`~ow›m_hm©Su©8qœGz—<y3d{@JgC6@)ZZ6n}<Jc5*G?&.$,&7('4%BN!& $)6H4Th=YgF\vVe‡KT{TH{bRuOKd^Wsfw–Yˆ¨m‹³ušÅgk‘kcŽRTsdg”bv¡`QkD5A46<+)8<7MJXc8Pf2Xa0Y`2FSAJ[GJkSMfL[sUt}Kj}Ix‚=fu(]`0Gc-BS-FX-SX5H[9H[<GYBG]<D^:H`<KS6.<9/B=6S>CMGG"3D":B%8D$7K$<K&;H)<G(<L'BP-;R)EL+=Q'?V'CT/BR.@Q,CT-BX2HX,D]/E[+EY3B\3E`5C\2:[0A\/4_22K22,,."&)"! "&$* %$" | ||
3045 | !%#%*&--*1#2*%*-5 -&&!%"+()4"3$))-&*%./(//*2&-!),",3!)8$-4"6:";*&1)--+4 2"%$%&#'-7!+;(," #(!"! !"#$ %# -(" #!-,17/$81G-%AG)0G'-A!-3,/ !/*0)#<)G@IKZQ%=[*?' | ||
3046 | "" "(8- @6 A=/C- %=6 =G02IB6AA>J:( | ||
3047 | !:=,30"% | ||
3048 | #J<BU,%RGA7HMUB3OIU\K:P7?>7B- | ||
3049 | ('*+%'%",#";2!,2(*.-& -:5!&%#71E%-0A15Ai0:;AM4*H)2;+;IF@#$%A1a3O',"%+=$(&/35UW9}Š4n|VvM_5CQ@5D.,:<RX?5VDs\@MsC?IU=MC;V1+4#+9(E%,@8V[Tc€Pak8W?*±Èf¢¼‹KŽk"*7?A;[n{pzwd‡^{’r¡–Qv˜/‘›8€Ž>rmPyiqƒgn{†’ƒ™˜ˆƒšxs\J>T6-B5!,""4/11D@*LH598</7%3K1NcA8W8EM#%4'+1+>!+; (5$$(73)HJ-L213&,A'&2A(:;5C// | ||
3050 | &/6&|Z&Œœe‰Ÿh¢_ ¸fÿãdrÂYmšGeveZr\p”jS}`XwsŽºØ¸Î…ˆªGnw1‚ˆJ^}MazOVrgDRGMDBNGJ5>N=DWEWYRh4GVdOtyy€c=…p;X`ˆ>UsNo<-R/ 3(&!'&"%,)D:&89 :7%,-#FE%B0?OK1UC.B;)=6$C;#^DQGO?^K0Pn/+<445?.PjP[„Of‡DFbKm†aŸÐmÐlq¤hj—ct•VT}??gC0MAMf[§z޲t}“\_ˆIX‚R£J^lKj{L^zZ€ _ Sm~>R_)=T&@eGƒ•AVg((0#!+$+/.)((<$#, | ||
3051 | !# | ||
3052 | *400N<5LD;ZH5RE-D>);=7C73I;ASW_uZZudo†gab‡¥FZtFd‚F]wVRzIIf1D[0Na-GO*0AQM`SizJKePpˆDs}7Uf?fu?L_Ka{cj…cl‡`a€Rg‚=z‹=q„:uƒ=s}@:Q\=Kb@U_;7F96V>EX@H^3BJ66C@M^J`qI*$*,!/ - -#'$-$/$+&0"/"1$0)2(4'2)1+;&8+B*B!(A%/B!1?".A!.C*E#1;!.-#.&#)'+!&!!! #$$"!& ') 0",#) # !!$&#,%+-, ($('(/!+& " &-%65(I 3*.)66+:#-6!:7/F!$5")-!'0#).,/!3< .>"#:)#,(*#- !)#-$,3%.*"-$(4&8$ 5-), "'((*#$ | ||
3053 | #/&*6- | ||
3054 | &+%5-/<-0/70-" 7%+(#&'#$ -28;.:C:@I7#KO#%3.$*) *'&) ( | ||
3055 | +%7!( | ||
3056 | $+ %+#2 "'%>)P=GG!F29(&" | ||
3057 | |||
3058 | ?LBDS;L(DQ7MK37N&'5#& !5/#3);'$:AH=BX7YD7N_,&7 | ||
3059 | 6SLR['Fb 1'*"63 (7$&!!""-4?2*.@'PP@CV+>L9/B*-0!2A'&R0 %(M)%T0, $!&,,BV+HO8EK6F7.83$:+28=B)6P64UM>G91@-<;!49='A&%' ""')8itaDSEia5>L}8]Šd‰]E\ 7>&DFEbk^=TR8EXa~‚W€n^ps{‰m~‚p—³}›¼hEj@>Zmi…}€lntg_U[8AR'11""7-A"HA,>Q6=@.,@);G%LO41],1N40 *,##1"',"'#"(-@K%GV,bd'8Q(+=#.7 2=14A*?B$JR'6:VA6¶°_ßõz·Ôiš°fh‰y¥ÿ½úlŽŸdžWk›Rx–WInH]lPfiku’ŒÁ}UrYÅSgv<ci?^rBTk4ÿ¤6‰ƒ/po)\g3FV7a^Až›=”˜MÿÑp§·dze?]8#3*%8$+$!7F=6u}5h‚J4L%PS%QU%ph-©e0©s3w5DQ+,0%76'H40@9-$5':6>,=*-; 8A#J\'E\4N[?]H›²3†žXŒ°pl«_n†T|—Kw‡Jg.6D"(?),F<`‚`T{bKgSmƒ>NaJf‰U®E›ºUp‘Qt“m¤½^¢·Kp“7Da)!432OELl-LO:A%,&-))1$ * # +=BCK5? "2)**,+.'.!"1#+;&1<-Kc;l…H\r@FbYkŠkšVkŠUt—KlŒFr‡;Zg1Nc4Vl8JT(CKAQdXk‡LWoOg…az•Q{‹Ns”IrMc„Xdƒ^l`™Z–¥Q|MQvVw¥OsQ_|DDT8APHH]?V_)@P7KcE[o?Wi9G^DNp\b~V! | ||
3060 | )0!,'.',$. //.!,+!(&*#()('"''##&& #%! ') /&##%"!!&&)/)5/'$$# ( ,('# ")%!:*7+,2#73>?*H),:0)8!':0$1(('!,,,5!182; "@")3**70$ "&$*!/0")6$0$!* ()2&!& "-#(4',!*+'' | ||
3061 | *!&,$." !5,"7;$ZB'*C(-# &%#"$.(',>.#<5" #"".& | ||
3062 | 0 99+5,'(.."#",%/!% | ||
3063 | P,TPMIL7KO!>M8/@G!.9+ ;*$))$ | ||
3064 | ! | ||
3065 | -;#87.9?1?C!,3G09CPC;D2-8!# | ||
3066 | |||
3067 | , ;%'_Y4\c?Y]XP[=JI=EVX_f:hoOTmPBR12.&3-# "1 %$#;? 3.H8/]UFCW.3A" 5 -2",( | ||
3068 | !%<$)-'6 !-%$%$-$!1#&D5CN)H?0HS2HJ2WS&}m5‡~!Eg2BC! W1N;Q8MRECp;0;(3HSL`75>0==-@NH7T0>E!_jAM\Hƒ~Mm‚`Yd_h}†ad{t†U,;837?e_Tkyaž‘C?V*7I!":IH!M[6@U5.D+/;!=')8G-1F,(+$ "*0*058'9 !;/.z‚2<C@f[(£¦!m_ ¢c#Kf+KL4>T3US-‹—Np‡v[P™ Æ¡…·~ršN6Ji=b¹†µtFWp…Š_Nˆ[^r>n„P^}V:M[6VieWFxx‘‹ÃR~¬LvŒB]ŠQ€®ð¹ÿt~’TzyI~™'†u?zyªÓ†x®¼z¡‰Mq^*7-7; (0)PGEC.8&KA9GNd<VE+5+Ia@SK>iUP…‚i„hPmgO`u(`S$5>!D6%NB"C@&->54%B@"GL/Nd5Gb)Sf1ayLW‚h‹Èn±ãc“¼CYsH{šZP‡Ul3ZfEJ&//K]NFZ//FE\€Ur=‡ \~ªhp§a_ˆK\ƒo«m‰ªcDh<'7 '&)-B8K\2Qc2=19<?#.&*" & "")&/>L(az;Yv.Mo'AP )'1*2)2.6 ($1%3JBQrRUu=UhMZwuKgN9Y_d‹^u•QoŒNmŽ.BZ;SpCm†4mvB]tXasVc„NcˆflŒ\tOHv[kŠVn‚OvŠUq]tšf€ªc{=?ORS{b{›SnŠBbo>EJ9=P?Pm8<F35IA/FK;WCH\O;\\K\O! " / 1/ 36 .3$,+ *&+&"( '#'#&)"% ""&*%! " !"#$ ! "$(% ""'""#&(9#C'5-"+'!* *#)$# # "'$*&.&/%2+7(%://4--8 09*58#-8/?4:2;"+?"#7$ - '&" !' '%%"/!"0##''/!+)"# ! | ||
3069 | " !! )* ) | ||
3070 | |||
3071 | !$ "":&&@%.%+1$)6:#0'$(#$!"#$$$! '.+/?05@1=.>=17G&&7&&*$*)" K-PH"C | ||
3072 | ,2N@;RS=MN30M<OK<)A(=8FN 7P$FF0:P$$> /;1.5 01*1)%&027;@=E69A-:520% ;(NU?DgQX_UbkJUbC^o9Vd=cjRau\BbV+2?'A4"/ !!%!*"+*-2!/&%.<-9<BQAHK?%I+$-%#A, | ||
3073 | 2# | ||
3074 | +(3' .!'! +*$&$+,%+-IL?\U6=EEAE]Ael6aP.KE#9#-6R/JF8G`;WP?B#KP@1P+95+dc/4V)(,))4DD3Imfj…egiP˜”c›´X[xai,G@%Yb>HDAGRr@QBJQ':;8K):@1HI+2@"0=1,79$$6$ -$0,0=¢‚k.*A%;3HH)5@F16&gfJw¦…ž§Ue³tpl9RY5Xe4xr;{lQnTu˜S™¼…нvj”i^…:P[3LbqDeF^~jCMGlxMet`|“Om}*y{<OrMc|NLkXHlZQdRo‘Cr†nuƒ‚ÝœNÖÉHÁàU±°j|±gFa€JHiFO[X_7dl ][$LNI=(›YºÙGcw#‡H«ÑR“®*—$OL/`_@vsBn^KPTH{_FTjGUU3NM%GI+TL(`V*5<!GN(WV,dm5Ui7Of3HdB8^4-H82GV9Zkn˜]dŽD.RD7@CZpSc…Hnˆ,+>&F!8+'+ASHiGX…\[€PLoFE\8=ZTbmhˆQA] '.&(/+G^,Ja*CM=M hr"^g!cfTdV`CS:?!,3',297HDY'l{>e~EK\21K4(;& )'2D 4F#,= +1"$-86!=@Jn=7KH-B3&:?9_ZZwT_pQX|=]u7D^CBeIlšF[uKYqPYqMIlRX_dƒHZiCNlMWoQ[~OVyU[VQu_\z8Sc7Uhc”]rSUwHOX.?KFRgAMQ*/:-,/5!,7"7@'7F(9:" " | ||
3075 | |||
3076 | +7055)4%/)%3*2, &()'&"!#(%%&"!'" )(!"%#%)!+#&(!+ #'#"!!'%&",&+).#,%-8-A,B)70'0'$,#/0")#"*"$!!$ %("'')"-0*8 .74:!?D":P*0H/6?&/C#A)!6,"2*!% ((& & )%/,!!) , )!)$ *" 71 %<3!$$"% & (#%+!" | ||
3077 | "## "%!$* / ,(+(#2$+$ )" &!1-5>6#6!.451!3 !0!% 6-=@ 0J$EA69Y4FF*4K8?E26C"<!(''9#COA;PD/C#,=&")&%.9%,@#+;+&9'9=3'$2 !15&!5&!-='0A! HG9K4=L07G,&4' $+,84*9?&=G2/C/*8,,-%#. '>!EZ6H,1@7.MH@V[>RgLMRVQfQK_L5cQ;QWAH(&*! ( "!&))+;5'E(%"(##-&^</3N00@2@C/,J3%4&4* | ||
3078 | ,!!'&%$+,48??IDG'+!'"&",!#$$(&C.QM.L10BE7H3*5#,;#5=,!$ #GH9TW8pp>p€Gnn7ecBg^)fm*AjKN\1<P!BJGL/JW2A\PpnPwžy’šˆz•V††as BWm?¢B¼·6”˜6\i6*;092'/5--@,/6#_C!<Q'G2'%1*&\D®pÃÉ2¾ßu˜Þdr_‡Ÿ³ºF¡Û?s’'BO Z^JŒ¶Mr¢nvS{pI~…Fƒ‚=ž¦U§¥X¤’<¡šTÖôz»u`‡TMlM_}QkjGIN;T¹ßKg”w™bbXumVLe[:L6‘œCXj,yw0{r;DUF†kTͽlÄȨ³Î”£¸„¥¬mRmFf_1XyA>TBOqQChNR[JZb>bV6ŠpaƒtÁTu¥N`VeNQQZSIRL,O?@SEEOnJTT;\YEhj>Q[4GP,DK*DC34?+3<#ET=t|;_v=DW29E-9G*"'*7 +G-B/RgL5Z9#*+5/CURVoL6;#&-$.18 CQ8g|FYn5Ml57@+?R75IH6KJ8Q(3@?SN<<!@V,Cb+Sc&L_.UpCPrD|•;7O;Jd9Yi2Pc HJ;I BV#Vg)Sl+t‡J•¸T–»D‚¡5y~'R`DL)1""0&"7'&!"!!%+.E4Ne&(-! (+);@<UCIX5B_Ba{<Yo7LdETxUo‰CYlNQkEVqNq\_|Of‹AYi99P=HaAFgNmˆOc€CK^@K`AWpOip[bsGC]KNn0Q`:Oa:IU#7?%1>,;B(38,69+.3*# + | ||
3079 | ,()/"")&/'#3++1!$,"$)$)%%',**'%%( %' %$ !#")$)!#$#&"& *& %$((+0+/(2%1)/--<& B)#.+)0" 0"3!5$*%* !( "#!$+%044:;<*H&-@+7:&3E,*?8&:767*'F&&891/#'@(2 5$.#/(,%3&0!3*+5+.*1)8%/"-*,(9#51&)(+ &)&"#"'%0+75(9"' % . '##&&#($! | ||
3080 | ##*-,"+,!+#) # !0!.728!:B"99)31*+1'&04.;#0.%8449@5K $F44,65N.B@@2Q3/5;.;0;82EB,$? "% &A&+)D8(,1 '2)))2(5*0!%,58)/ ),3396IB8B+<""& B3HJ$AV==T:7F2@C58G..27;+A)&/,&/'59,-?',-/3"(7!32AQ8<J8MD-NO-AJ=1<D>=GGBA<SF<K<GX8EU4B0'(% | ||
3081 | A'DV0I#$;(!*3& "!/ ,;(;S9@M(.I$?K3=32T40-75(;%*++3913G$+4-0=2?R201%RI&/:0N=tl08ŒH$'.3"554%+$%7A44"A#YHin6if>Š„U{c€ŒU]PSRYTgxVouJaa;Qe+ii1Qf2^Z2@U;Q]OU_a‡‚j‘¤g~‹k ’h§D–]™Ðs«älŽ®SVS"IX1+:&+. <4 (,5R4-C6"3+I/"̘Y½Ä‡f“‘b|–X{X\K]p[´¸…|µn~“_s“=Œ”Hn€epbR¢²i—·[¸U¡º]s£~Z™šš¶×ˆÆÞ¡y¢]dlJ_‰:\nTvŒY[zF{f]°……ŒVUpi5_SHhh2H/3L0Misž£J¾ÕfŸd¯Ã4ÍÊnu¥‰½Ò—Æ€…”‡’ŽŽ`PDlGKa>jh.7@8DG2oo;ZkHVfVdudÍ¢ZöÚgqWPV?›F@b5=9)</&qQ.GO6T^5;K;^_9LM-6A(:6$8<'+58G&6G6GUDQ]8P`-X`!AE$CDRVRS2>!8C;,E!.5+A #/92-!#.77<ST,{>lƒHmˆA~8Œ.q{&?I+hm2Xf"ce"jv(_p3]k%>N)?O*I_9Ok6HfDEdFJi=9M+2D=C`FLrESr/;W3Xi3h~9f}:Y|Yf‚hv¢l‡µa¦ÖVªÐE¨Ã2fr"3& %-*")!"'#"//(>,BL&,3D,<P4AP1EW=WyIax@WsAYxLi}G[kAJa>SkPtšU›Mj‡St…:ag2Yl>[hDPpGB\@Oa9IY6<L;8:CJQ9Yk?Tm=ZoAVm>w€1U^(2@32E00;/#2&! # | ||
3082 | ! $ | ||
3083 | )&%&& ("(%(( #)&&(&'%#/')-,$'$((%&!+&)(($*","/%*)#"% *"'"+#)+-++-0. 3381A$"?*2)6#2#6 <%+'!$()$(3,6:->.>$)<"*5)&?,.4+%:!'6* 3,+"&)()$+&2 )+!(.**(*'(-,)6#5%,"/**413>#3>,>#'0$/$."$)'+'+ . &+$('#$$&!!$&(%1)3;0<,.1%*.."2014%9 !" & | ||
3084 | # $($%&$/&8*#3D*6<'=@':I!2L&*9+,9 06'229B(8H,'<.1?!8A98G2.D6I8%!I%#**1,,+87,3D1&=(.5)-!*3<-,@,*4$'2"3,(")+*8*0D-A%37/065+:;=6(8L&27 /#/9"=?78E8)?6.;(4@*/@4-.&'9&+%!,"%" -)/6A+4F(E;6A!A1(3C384.4B@,A8201**:>1-8:580=C7AK>0F3*#"0*0#%308@>'L133"...9/9*;S8&S*D7-858<)PK/8K")22<E3H7,1,*842 1C$0D6 2"!%(" ?9fm??&$+*6.Eƒ|K–ª!H„*JJ9,A$.40(:,)':)8<4TPL|W>ŠsOrmZvl;cC[‚8BlBTY[goJ>PBYtRzŒJnyM}y:evAmq<l€gsyl“¾v•›v>^n)]o<?c™‚q «{žEJz< .)($,#!00"Q9$6<"|O2ŸÑ™^™šMbM†~VymNHW4JX<T}rUzb{xW‰ŠQZˆ]^oYW^FÕ¡ruœ‡¤|dyGkVhpK£¯‹¡Ü ‚´™}¼s¢ºDœ¾Gi•EbXvŒGh{QvoP¬h_€@NT.<U4°–&¯™+îÚRæÿtÁ䉵ٚ¸µt…¶cm†‘Åá„•nn’TUK.V^3<ND<Y0-F/BGH8J=/@:6;G†«Žª¯l‚A{†>˜ªme‡(-)"IC)DN8?>/Jg90>'3@8<?+5E):C(JU!9@'3"(9#CU5h~<iŽK‚ž9`j'5K(Va@9W3%4+##& -$#("(20CG!- MZ,wL€§[~›Lr’Uƒ¦^˜°Q~“6Xr+CbM•²F– IMg5Z`5=P-<K"NR+\j8mr/Zl0Va+FO9Rc'>T*2F6AYBhp=Wc8Zz?v‹=_u7Ne?WpJQjUTqcP…xl©yÑg‡¥+,;%3>$<J 03$(#)%,*?S ;<'3-:J(1G':S;XzP_yAPlCA_UUsEHgEKc@m’[˜·_½QxTsœL\w=_wFg‹Hlz;^j9JY:Id6S]/@B1IRKcyCRqJbsDe{Gl€EZo4UY08G'%4$#,"+;' %#$$ | ||
3085 | $# %$ ( '( '$$ %$(&+++(,$&'"$#'+.$%$(&*#-,&+'(#!"$'''%#+!*%.-+, ,/#./#-1"J5 ?;%Q+!E4 6,$:%7'3'3&*$ , #( ".3/<8!4?$29)28 67-=$/5"*9 +/!2,,#4(%%,+/,..-3"2-6+.+3..;1/$203423-5%2&&($*.&(4&5'2#01/7<2?!8:6>&?"($%#'*$!#".&33#.9'%5)$,#)%#4 !$!(( ! ! J | ||
3086 | ;0&!)&2"",*):'67,1@,#7-/)),59#)J).?29A3+D.-4$-2'&2),02*E(-;@$.!'#.%!0#13-4J;0A(7C-.7+55#+>8!4%)"&!( 8;!6L,4C2,:--/)?3*8O1AE.DM>VQ+?U*.G#/*))5:886!#%&'!%)%$)($+/$4:+2D9<=D95E--B9=O=9A-@D7@N*,E)+-!*0>69C/8?,)E)*4,.028;/@ )90C(7''&6+$$+&#-=#0-&-<'),)<G/A/!)%%$IP0#C:)3' &';;**>36+ :$$&-/"3HL,*/.44#FRH)?* KY=†d{DWc8_a08U69"'@").9<5v"!%)-0W'3F+74)95A/3LU>C4Gn=WmCXh:ZhADMek™aƒsg›©cn”W`aV>jBKcpNmk/F,7E$ÀrœŸX«»xái”¼:TeL>),%-$N8O9)…tI‹xd”s>z|4·¬xµÖx†¼IuŽ=—›C{œSo…T|¨rqŒP‰“WŒ~J¥º’ŠYp”eJaFpk1}œQP˜=d‚GH[_Š`Š‘q™Ñ}˜Ù[b€–nƒš^‚¬e\˜}t¤S0R>3=4vŒ˜µÙ¯êÿ¨îÿªŽÈŽ‚©‹£nj…lOdY†qZ¢¾ƒ¯²¥Ã‹dšOPdNkh>ÒÌ(¸•(»Š ‡j*PJ $5""5+):F&/N>DQkyV>W`mp:MI"**%-.%++*5;225!)2"/3")/#58(ED-0=5<&3"(87,=?=MQLeIEa2=@%>L4,1#&.#*)5#,+'*&9K!('u~Mi“[\€l‡©`kdrŸoT‚PQnLw›9r†N¼o“±Zpj4Oc9ˆ“4ËÇFÌßD’¤O©¿I¼ÖD~¦?v‰1OX75H":J(<O;v‰J[v9c‚P€ŸQh†4Rb:F^67Y9Ol<LaIIdb^s~«=CP#+;3H:)< " $&#(!2E+CV 09+/:#,8-G97QKNg?8L3/A;7PBCZ?GjL^€mošxŒ¹tš³dšK_sB8VG:YQY‚Fh~Fx‘?‚–Biz7JH4FXINfFLcJ\rBZnCEbFNf=DZ29K%.7*4&;M5"!'&! | ||
3087 | & %("%!!"$(!$$!$&'(!''&&*'&#"'#!&"'"#$$#,#"/!.',*-' ,$&&((#+'#'$)'('*(")-'+030$76'[6(Z<&Q:'I6$<(%=%/,&0%$1" ,&1&#'$!"%$(,*=2"5<*;<'69$9=%2;,/:"/<!25 27/657.;!68::;74;*7!2,827/3165 82 8;/?$9;"86$<:!7?)8$067>8H 6?"4598-;$59!9=%6K)'44*):,+0'3&=02D"+7,&+. ! !2*,0-/#&%#1;((0&/*$"$)$"$%$!!$#!*,!$!!*41%)G- ?+)/9!8%"*!0%(+&&(5!#1"$ "!'!!)$/')/'4%+1D:&E+3+(#+#)$( &4-7=6:7>3?B*)>#$/'*#$4#"/;$2HN5>PG&F7)*-%"0!%+")#+,(/B/?%%7'3,%2=1!8(%&-@3.OOFY,/E$.8,H73DX8AQ!BS&:M0;A8&9,$1& #+-"0%! "'''&*3!3,!-:)>9$/D' | ||
3088 | +-#7F2!*.,-(+/7:3;,8&,<+5$$$#54!=:PA;DK(==#>V$MQ?-g5*60 )2D8^‡Ul}HoƒE"C)#,'&PR1C.22!)) "2,#.(/'GD*>T'1A844?=G@DR8=J)CGNGFIuˆ‚jfˆZˆ‹5]l.NL8H.,'‡Oq¸ÂšÔŽK€“I^`?NEzv:7N$.Os*ˆÊH‹s*²ª]ÍÓqw³„§šV¡¸“_x¡£”І¯ut›•¤¥k~†Rs–sUpvxvЇ©|u§€p‘jSƒWaŠ6–Xk…g@WZ2mq@xK™iФ‚‘³o™¯[‚™hy¢dLj^MjMYmBLZ1IO0AVaz’¢²ÆÛËîÀÛém˜Zg†gzšIоP÷÷v•º|uzv‚ƒjzH1G<BRVvzª[¸œ·å›Ëèz—¦L<S6: 0? /1FO.*,;G@*)25#/"%',&,+-/417!>E"34XD&6?)TN"gm!HH'3'3,7(>N=l…:]b1\_('9.!'!%#&##+13s†ZDX@„Š_‘´j‹¥Je{OŠ—9’¨Hf‡Tn‘Le‚j˜°_–¦?‰{Q¯uÂÀå¿Ül©Òo‡£oŠ«UŸÍPÈ6~ˆ'`h)JXA_xTr€6YyV\}UpK€–=m|2Zn4Yj8>W27M;)GOAiWb‚ .8%%+"$*&-040;*7G&8D",4&,!1!!.5':,*9"#,&.996G64SAKgSRd\CihGoie’N`u7HW@WbQp„n¶³nÎÉ`«¶e³L‡?c]FI]ALcL`~B^oBVl6Nf6Qd/;I(?G08.:S=#%!-%%)!)! | ||
3089 | |||
3090 | |||
3091 | %#(!+"&"&%$#)'&&' .!#$ ##$#$$#! "$$""% . '*%)%'! '&&##,"%*#*+%++-0-0#;2#@6$h3)W@$W<)F6%@-!7(0'#*#'# %$ (/*0/%-0!1-#42',3,/,+--%0#.,/"/4$*6)32%2:"*7$'3#,-%8.4;/; 33 19"37'/8"16(23!48%3493%-7(01.1;9(7C)*;-@1 59#72#76$@6)78%:82@/8 0275:7"4E/.@-*0&/+/*4-7/1;+3#</-61%/+.%<50@56#65# 7$0)-)()!$$ /#'))$").*.-0%!& ")!+"#4'##!-$%/)# ,%70-A:A&8,1(5<54G(-52=';04571@.=,'75(:-(:7,,9:0&L$8&9H*GD?;P<4F4+@.9*1 1% ) #'6.&AQ'7A!:4#GDB]:Q;?P?=]8-/"3;&*;?-01(85976/=10,!!#&& +.(1*!!1&+#/&,- | ||
3092 | 2:!+=/+7')1#.%B"*L$/8)+1)6!!%"/0<;)KJ/c`DlrADU/>H0PP4&D6)+ 3< :D+5@$<K(v[d™‹h—›[|6fx¥ ½=„ + s$xAX!%:!.131?,%7"*/#2$-('4P-FR)Ã/‡¸b´Éj}Áa}¤o¶Ëk–¤C§Š©²§I‚xy ÀŒ‹ 3Xg2MD%3:$,;:V$(%V@GviQ‘˜o™¤™•¢e¬¼É¤ˆ¨Z±“u‹«m|…^¥x›ŽT‹tZl}Ea`aKdTUaXlxEÜ«2‰¢B‰dž²S÷ì|»ýD’©Y|«_XŒ\l‡b p¡Çw“¾m›ÃY˜«AŒ9ÿåQš¸90`g7rˆl‘§£šÁ¶À¸áyw]<ä¨lÕÝ›¿¬¼ÿñ|¥¼UrzPCYM+4<=*qpQ1?:):D`ŒeoL7T'234@^-Tu.1F(-5#-'*.67(0&+!%C>+= 79$\Y+XW"=?2E`6-N=IVFVm4Z_'2)$-1JdYeŽa(F,#$+'+ *)VOgU+-#"'.38U„€6av_t›kjŒ]o”MgƒR‰¤OTt=E[7JTNq†cyŠSe{Tx…jÄÖx¶ñ{Ãx{®fz›LGiU•g|¯hˆÁ_ÃíH•¤;q‰O—9dx@eJoX‡ªU„ŸJh…>B\3,@') **&6<+@1'6&)!!)2".;%4>&.%%/&&"*!&- + *&0#,$102O;A`:=V>AXOLsRo=Yo=>\RRx~‰¹––²Ž¡|ˆl|”PNbDOaAVgGGgPZr=SmEQj9Ro1DX-@X+GZ1DaA%&#'",!.#&! | ||
3093 | |||
3094 | |||
3095 | ! "" *'&" %&$#$"'*#"#"%&%(#$""$"!" !&"%*#'"'!(%%%((#$)$)!)'-*(/!).#B/%^1#c9 LB'S6'A3$A(#8).&!+!) !() !$*$*+ )'#($!,#*'2)"6*0.1+)(&)!.)#/+ 1.#!0&0'#,,7/5>*:'+8$,2!-0 2-"3/$00+5 .-!,230#6-0927#-<19=.?;9@",8'04%4/.-#-0%4!$6"04-6*4&0)'5/$47!1-713;96":,'/.?+17$53 93390<0:&(2%','&' /(+3'/#)242 .//(0/4:.:531:::=E*=$214?B!EC2"$$ )#.'/": &.$+1.80C+1@--C)49+1?*>(G6T\*>c-3FE=9Q#4@!AQ2=L(EI"CP4C+@#+5 8/-;?%:!,4*,-5:9B>?+K-$1$#)-!#$ 5,A?HS'BL6/O-++07110(*2!*4>%5A()8*@2BN).?!(8+&3&"%% / 6=6>!-A&:&$$ (3,;40>+49!'3'!!%&*&'!$&%'0#4!#' .149<@&[S&Ib?HMHXVSlvNSj5GW3.S5^JLa5<%0@)07*J;$Vq<Œƒª…®y›^]›uTjqƒ‚«²•¦Â‘| i,Y""+%%%#&&%0/"c8–Žruƒkg€wXxg:CaJp‡L\M–„¨zŠ`·—Pmo_mŠŠ‰–®F”‹B® %G]gW)nw$dg?ôqŠÝ—e”©”µ£Ž°ž}¬§¹Á––Ä•‹‹t‹ `ƒªcЧcU}^i}L†ŽdŸ®P¼ÎMÀåVc¦•NzlбVrmPˆ“„ƒ±›«hZcX¦u9¬Ð`§Ð†ƒÃƒe‹‚Ž¡‰²ãÅÌcûÿ¹éÿ‰¼qt„R‘¥h‹¤nЧ™†“vFqtp¶ÿøŸèö®ÿÿÓÖ”¤H6H"-13J(+->8I-9 -;02=4-C&*1"N]-1:(:I#'&"(/ )4-{|D–«5y|48.3+HC,„…F—®d‡š:JX/(A)(""04.@ADb2'2'3 *..4jkE0I"& 0.4777*JLaišZ=Y(MQrj)•–?`†Rz‡It~T`yX`€PSoM]S~ŸF°ÞFËÜD¨´NmvLw|I•ªl~ºwPxZG^Qd‚a|ASi<u•Uy…Ui…npžx¤×d‰Áe†»ZišR‚œRz¢\x˜d–²br‹D7I "")$!,"3'/,2'!%$)$,:04A# *!$"0,3'+!/-1F15F+-E4.AJ1]@9Y?E]V€’tšˆb}tbs]]lfKfICU?4I>0JG8GH=]BTlDay@`i:ds4hy<Xl>ZlH&#&##$"%%$$%' | ||
3096 | !# !$(# ! "$$!%!!#(0***#*$()$)+'(+&1'+'*#+#- &&$*'2'62S-!a6 G:08/.("7,#<,8&=/(+!)"**!%%$&'&-(-(*)**0(0+ +)#.&",)1*+)&$"#!#%&'%-(1.$15(-,(/.0*/)5+"-1!-+ 2+5/5,!22/3 0,&3("-+%+(".(**,*,,$4&4+0,#).(+2(28+#:741!/(%5**.&. /*!7*$0+#-)1( 8.!24"4/!4*#*2 6%<-2+2./-.*+0,03-*5+0-23-"251=+=%98-5D-28120?):886F36J IC$@Y:C? 0&-2?'?@+,>'),)/ 07%.<#<5&+C+)7*;;#9D .S2(@?4@)2H6'HA47<:?0)C25<1+J5+;66@.;E'4K'2C=0A>)?#928P-<F><>>/E&'(%!+0/E>HP(4I9)8<:<->I'4@.4'3*08(6$*2)79(@A+7D8/;6 ,#"! | ||
3097 | ("&0,&)*%/$).'1%""+$K6LU[[2IT-1@.#.%+.6,"/"#' &"0)#)$*"07" $0,-+,-4<=gZM;`B8N75T[XBCCb>EF09B0LDW<^.3:'DW+S?,KiQzbh•“|j…uKif1Ufbb?•q]Š›€Ÿ¢u’f?V5:"!)8)iX'}U€›}sŠ@‰“IK}D4?'MB(ch*pGQd\@WRt@]kD|yep—j}pqÿàŒ¨ÇLˆ…Ro¢k{Ÿcg’ŽoŠWr[Oq“HX™§ nµÈ…š¦‰¬Ç‡•â}жq_Œ^?UE?PI†veŽ£`˜°¡Ï•r±M&8)ugV×Õl³´Y”˜q‡£xVˆWƒœÑ䞎͉vsbS^HVWl‘d›°‘òÿÖuˆ™‰‚^¿ÓjÐyŽp_€\nƒ¨Ít€Ž;©±zçÿÿ±à¼½Õ¶ªuSiJN['5<5N*/44#"&!+02:,8N+L^"%US%2C29 -1(EGm«¿€¤º_Œœ&LE$dT£Â€§Ãƒi”S.,7>=A-5).*1B'*./1$/?N+OXL{ˆ&HP!@Fcd82!-.(VW/>KE8OQLaMW„J\mhp‘Z\uKM{]gxM`vI~‹E|?«ºX²Ý]‹¢ºås¥Éf¨ÁU¦±HXtTBQA6H*-:2>VIhI\~.E^Fi>j€HoŠ[i‰_@bRMqRMmSm—^r•bz›g¡e†¨Khw:?+/%CS>I$GV+Sh&M[6A%-$-,76?&+?!/;/u„"JNEN$$)!/!/, !1&-<#0?'CR5McB^tIvŠ[k‰dm‹Vg{JOfADW=EL79=/8=),2/(72/@EKiPf~I`tFXsOPlBH_CAZG*-.&.($'(%$&$ (" | ||
3098 | )% | ||
3099 | &) & $'& %"!!% /$0)*4-11.3403"04-5*2!%3(,),$,''((+4#F*\/Q?:8*,4')* ,/ )!!5!17))#. "$1!2(0'%"&$"-&.+.*)++(''!-(.'),0%**+%2(+%% &,+&"."$1%*%,%&'*)*% /(6+/01,2+ *&,&5)7)60 8+;0 @-8480 00"0&2)(*(#-,31&54$6+.4-'/(0/1( .)4"4,0*!5(3+60<+5.1**%+")'+! .(0+2+7*<-7689 5; 15!/5"39'48"<7%?H%<I 2>&.502%/584;/28#4896AT)8P,/=0=C"3D&8,.(4>?)5S,8B+'?55&"+ )$(.#!9G(A50:,:7&HE$AY#/I$+F5-:2':2(2)&5#%-3/-.>5(@?'78+.%)'! | ||
3100 | ),&19-3>-3M?&/1(1#8-AB'@C-:F!8801"'%-$/='48&2;6-</.$ | ||
3101 | 6.?@HG?M ;=6@=54 /$,*1A>63D>TI+=938$&3&,&!?A-=?GK.D'4,)7&2/-!,# 4;/;K-5R-3>4,DaM'C&&&.,/*C?0:&9F:UR4=_H1GN4Mp%>k&4'@12AKp~ePk‚Siqh{1iw!0.)!D1“m-¦¥Gª¸`šµph`PœzwˆÅQam9ƒ^D¨Ù\¯nÅ=v±)Œ˜G¤ÔTˆ´k¯¹mßM§±²»ÐˆŠwo€`X{o}eKfuZPŽ£D˜7ŠÈm•—€ª|u˜€zšyu‹y€Q 2¯£8z©i„r^Žw?j_<S[ < -34C†o¤Ÿá†žÖgˆ–FR—j £•ÃÇ|ôõ~xLÿÝ>ÒâkÏ€ÿé»òÿq¯Às4fw/NtIn[<f2>ADNbzŵkÿüŸçÿÄ¥ÇOx~4E_CFC5D*3>IV*CU"+-:398,=+3'HH(7?$-F5-1%=E'2>&"-:}iƒñð‡µÃg5}…z½Ð—ªÅŒ{™ENM<?"04&"7%08FFGG:H:S-DVHfŒIRb%PP 8L05E9AO!LRLN9Y](8>-).C1EIG[N^vOFeGHrLi€J`vUµÎv¦ÊkÇûˆ´åh©Ìef‚yšÈs¦ÇØùR—+GT%5B ),),/H\Fž2\{:Hb>7R=9YC-F66O05L.4JA8UN7XVJobOwadŒdZz:9U+8L#5E).!+C8K^,7S=Dc<Zk5<T#0?8;3A#3E!/7%:B14EFoIOe8D\#,8!&&"-<"6G-V^:QjFj…]o”di‚YPmN]zB[q8S\8LU;ne*G?#B?%-)(9:2FK/C;$983;!57!4322</=-A1#@1$F1>4: 1 7!*- + (# #%!*!+ *"2$0#,&&"(! $#'(%+',(,..-,4/109!35$5=!9@!:@)7C$->%-6 -5/0'1+5&- *!)I#?:7C%-9.%.&-#& $3(.-! * & %((!5&<%G/K4.8#,/+0 )( -,0.*2 /&0.-.*,1+02,0 20-+1+-*&'*&(&$(*(0(/) )',)1%(&*$)* *+"1).20+4,1*1,#+)#2.!*%#-#$3&#-)$5'$6'3++$,'$!")&!0".,$., /'/)!-+0+9*:/!,*!2)-'3$).(($)' 6)2/*++&=).66-7,6/"52$+3#4,042160/5/5"34)92);:(?8<4B4O< ?D$<H=Q%NI)?N+<FFI$:S+2D+.7%79/E#0?,,A0/8%6C!7@+;,3?"!) '+!2<"0;07O>8;6D<'(?#!.1* @KDW:W29OBEH',? <35>@HLZ/O#7>')7(2*05).7 &= 56&/<38741><,0.+8('.!/( 03-39*/?,*0+$0#$% &RDEZ!DM0BP3CG;JJ1GX5>U9(%"/+!+/%' -0,+6).;&)7"/0B5"<E.8,:"!;8(BE"2G&&0$+!/'3Q&:J;fw/nš/BD'FIAFN5\U`H"U]1!"! /+24.3)")')" (&@\&:-L+gJ((1*4GU\YVb=-_%&Q$!˜g)¤g¦®}¤¶„¬Ãžž¸z›½‹¡|z¤M}ž`pЇ:dm=MoQPg]]\XyWcZgog–—~“”ŸŽ¨t¥f™›NÕL«–CŒâK¨¥o—Ûx”¬^¨Ý^WaL‘¨Sb–`o…bes|¡‡¨ÐuœjWk`bLbw0*"+$*RJ \j=yyZŒ‘r8ˆ[vn2»œb²¯qôý‹ÇÍWÿÿÿÍÿÁœ•µÏül°Ãzbˆ%%#-0-9%'/%FR4ªª•ÄÖõÒÛ¯ºèv#8.::&7A,-D(+4.0# 6-+2*++6C!.0 \d8i…0H`#FY-OU7~„+¥¤&¯›\Ž‹›–²ƒµSST}ޏ¢“¼ŠªÌiÁTi=^„3@S'%4%2():1Nb0Tk9E*dv1\iADS3;R27P#1;+=N*8;EZwQFpAav4uv2id*09:;T:6=7HZ:eqDn‡_c˜o:]oIt}Yfd…^lŒSx’oœ¹x’Á”Ùÿeâÿ8„†%4@38 0=E‡ Vtž5Gb*0E)0A#+7 6T)2H 3<(6%$/,!3B/<C,@OC_21%!+),<)A5C1\p;=|~ATl?DX).<(@Q'>L'BO+>G(+5'/2-6<;==71>' 1"#"!5F)Pd2[hE{F_sNKZN9N?CM>M_BUq@Wj<DMKakEIH%>F!5/&&2,*4/)-#!.;#2=!*Up*m3'n:.c90G:1851 W T +/(! 1 | ||
3102 | ,'& -"1&-.)%&'/*,+&, +*/)($**,-/.-,-,.3/6-0 /3'1#-.!7369 7<%7?*0C&2</26 88#63.7 %6!#" ,9(<3-7"$4%%-',!$%('%3 /$/)+)%-'$,'1*:)Z+"_A LH;B903<&*6&-1031-,3"1/.218"1224%-/!*-#3) 0+",(*-.-!),*('(.&-/.*(+5++./,,*-00/8/., 0*(%,*0*4%+,)(!1&1*!1,#*/!3+$/, 2)6'1&/%+%6#"3(!1&0&!3&1)"6,(5,'.0".*5*.-#4-/43(6. 3*0*0&7'"?,=/"70;/:/#;6<5=4!84!13-/91 B555#65%:4%@@?A(I<0>H%=E)4I+A?1HG16Q*8?.;@'?E!;E%4G%1<"=?#=D#?K(GQ,<N+=A'??"DD4P7E<A#EE#DU"5T6FO1+ZC42*F8A_-:L7/F=78>;A.@I5MK!C^=<T45F8;J3AG#7[4*;"21 6 *%6+;G,);)%'#2'#!(-55&0<)%>//' ( >4 1DB>C/>P7AM7AE5G=@#,/F$!'>+>?H@,I .844;=$:BEK/#J96*&EG?0@/%06. ($9'/.G>;g,8">AAG6M,efW`…L=„GeO9CxZglR>f!. !+)"3& | ||
3103 | G+(0*#"$$*+9:=H9-3E*2B %!"P"£©ÃX¬¢r®·’”¦‘b‰Œ~¤vx†mddji:LimgiPo5l–=Rˆ>J^YprAZx@hoLU‚ˆd‹–¥’¦¼’o¯tV†~„Ÿ™„¬ˆ„¡–usnw™kXhX†€ƒTŒ¯ynM:_CIRF_ƒu=kyAW`L]EXcH|ˆ?1;#$"*F83”¯K¡¸gT}nÄ2‘§Má½ÿÿœæÿÀèÿ¡çó¿Ùÿ’’ªwžß”mgLm˜€6yK"ȵ ¬Œ›1D,28mcw˜\€Ÿ¯ZSm;T04B&<82:/5 &)6$3584"PH%CS&'8:@QPS{Aw•<e:EUL>IhNZ‡šÅ|ƒ¥^›–N`sGPVZe…¤Šw–jBY@9H?5=,KS!ST6>&2>9(:,56+<8=H[57E*DS(V]$]W(y‚.uŒ6RuAh‚AyŠRw€Sp{:GR).3%6=*GQ45DB?]H5G11=&(8,/44>><Xf@XgRetUj{k“§¢ÐÿŠp™?0;!0;"-2.2HJ$@53J,JW(*?3>@Y5Wn$:G)[]6;.;!7A"'*1@/:%+2@"8K(Qa7ZwNVŠW[}GXe7L\#".%*=6JY:bl4Se*LH#BJ'HY*AK'(' ( &'/@>S|]‡¡w˯Wul:9C+<?(>C8<O;JZ71F3DO>BLDMM+@A-E<','$0&0743/8%@K)2;!<D +//"(. ,! -+ ) | ||
3104 | |||
3105 | ), %!6 | ||
3106 | 5 | ||
3107 | ))%1)1,(5/+/..,)0*/ 0( 4'7+60=/;2+50./424",0 +2'2 2(217426$B;'->#0+(;0!>2$53'*4'"&"*! -).--/+5)+(!-)$$,") &##(#/'0.10/.27+6#&0-(.-8*!89&N96r:/DK.N25>=#97%B9".5!+/"08!,9)24%45"-3!+.2+4./01215$22722/.,/213 0/0127!181472!/113151//1+4.1!/0(,-)*$@.1 %$&!)"0'1*1(/)0)!1%.$ ($ 0&/&!5*!0,#*$,%%$#(#!+'#,()%+*.')()%'&!+.#1)2,#:-%7/!6/7/!D,#=4!9- :-%4*B*>9"91'4351541.$;1"57)62(94'67:K+AI<6C)*>#57(1@.8@$:G#@G#@O16M24C)?F.BQ-?Q79Q4EM-JP,EP)GQ+:N+@9+<M$U=)<Z'8C-4>;1>&=<'=9*[T-Ih;?L<5U1,:>*:,<B->B+2I9,073"0B<C$DD1U2&=.#+-!($43$='".*( ! %0:)EH-&W;9,$9+$+!%%&-( %--4<4-:646$39,<<*,?34?>%2+$@0&T^%j" ¶*‚·Hv7RVbCSj(9KFL!1G.%4+dX2fd@J\17TP6EC50"+K"+%$#)(',66"<905 13'yT%>k@Š’=”·nš©z¦¶„š¤Š¦£oš¾UcŠ]]]_peK_yPP=-;…HY`7@TA7BIabLdqd}‹G‡še‹“4Œ’K€¼s~‡…”n™>™®tƒ¨’…Îgš±T‡ªjQZ²ºžtÏ||viŽ•L‹–(‹†78E5Y[&<F0;A0;N;sd\¢´> À'”°8m—0DYXj‡g”›Q»ßƒck?ƒjyÿãÔÏ䚟ӞwšÌîœ Óf¶Èh¦ªm_‚Mš’?\Ž$1~:>Ve„VVw2[p)>R56D3-8Z]|NJV*I\%0> )<23:=*K<K+4 16$BH<GQ$:A,1)#-*3Tb…KEe=ž¯X£Ìlk“™Cz]`‡~g‹Lª<ÚËZ¯Ãh’µZŸ¼H´ÍA”§7oŽTZƒ9@V(5B"-:"/!-4#07*@B W^,”>“£K”¬bZ{@EW9[nQ`Š\‹°Xd~=Pf-;J!<P),B'GR*&8&$7%->4?1979'FD/9H1;@4CIDVgt[ˆt>]14@!/=,@0A+9:M0=Q(6B2F!IX8@X9FW7J`>_q$Sb(DO"GM7>";F8@OZ1Zt/Ka48N;,<AD[EF[8:K('#//IT?asDDR3CF1?R(1D8;P!)36769'/2<6:/2(! $*5'E^K~Fg`?P,?H+AT-JM+BJ2:G)&68]h:HP6^h;ra4SE%*,+0)(4,5F(3F'0;/#4-BX' | ||
3108 | : B | ||
3109 | 3-%,0&5+1//-2-3-,&--/6*9267#92$;3$+6$-0$0,"4/23 22 ). .'3)23&5- 54&4'($# ()",*%1#%*#.,#.-+5-;3'7&&0%&*0.22!)1(0!/)'2.04?* 4,38(/B&,>$28!33,=!)4%D,'O8)N72h1.aI-k@2`N,?G4:5(5:"7<%:72< /7'40!)65632!7327$01!3/"62#03$99$4;"65%4: 8;#9>#9>)6B(8;#/=#7:%58"6?&4<"1;'4<$4A'6>(5;'<9/<!*2$,*&%*$1/13$52621757#09!04-1"'. 2*/4!,.&(2--,.. 1450123-"4-4/!7/))2$+'),"6/&:3"719,(>5&;5$9/(;0!<4%:1$63 --1'2/26 >:)=/$B7!95!60$92'+3+2+%[0<:"19#E<)9;+7=/6<'E?'DL+MM4=Q)A@)JK&BO21F09:+7G0DA2RG+E\+>W7HF(=F'I>?E5F'3</3BAD<*4G*=@!<C"AX(%S:13.5X*5B2<7,8D!<E%4>)&.!1046(0*($/"'!# | ||
3110 | ! | ||
3111 | G9@I$(S7$C (0) 88<9%33'2?(,%+,+`Is{-u•KS†HTqhg~na†mi’RP}=0J8C@ER"?U GYC\1WncHaI)=#%7%- %" &%)$# +-1&4>'/< ,0ESJHJ~ƒ>ˆX‰€Tˆ…xž²”‡¢¸—\¯ 5OMB=Bry@€ƒ>nŒ+rw5q€LSk;DV#D\Fdk[s’m]…_q|lƒy›¨‚¤Àe†¨lwpj„ˆ…RŠ—^snXY\s‚ƒ>¨šr¤˜n¿Ït¸Ñ‹¤Æ‡§Ìˆ†ž0dhZ$I/!3+>A.‰vS‹¥{™ÂÌ»wÿÿ]ÿÿFÞÿfðŠQ†”QqLÅl·Ð¡˜¸’y‹``hIÞ»–Éôr„ŠåëŠÊõt¨n!(3-.&)++<S91I()3%2'9E96kL%;1-@'.=OH&IJ"! &%+,06(9@IUeCs™T=p:i[TU$@E@u…b̯‰²Œ[pUUa56Wlbu• _jvŠy¬œf›’„³‚—¬Ÿ”¨m2>C=L<j‚7\w(CJAPIS"8;09,<S?p}b ¹k‚¦bUW/GO6Sa?Q\Q|§b‰®E^5FU*2G"3<+)>&#.,2=!7J"7M!;C!<B$37#>76<&:D89I5:H)9B!,-.84A5A'BS41E#@O9L,Wf>Sc7Yh8VfAfyDjz8Ua.Q^.Vd)K\.Wb2c}B`yASk)?O"8F&>T<<M%:?#:8-5*9EFWk@6E*9<*/8(DR,<:"(1,GZ5JT,8>&&,*%4/,8*AA $>6FDGW6EO*:@6GTP‘KŒ}5QN0859R7HV1T`EUd=SZ):3!(4)8H5GS3BK+9B'1;8>N9 | ||
3112 | |||
3113 | |||
3114 | |||
3115 | '.0 'DQ ;!1%!41!.4$--!518377%7316!14"5,88#29&:1(660:'-1(40!77":7(59"-3'.-3127 .2!/5!4/%3*-1*2!4.24!(@"$6#$,3,.7/:#36'35 3-!36/;"0:")8&,. 341<-=">2!B?!8:'<=%4A,0B(5>'7E+9;':7#=<$X4"H7'J83R=6NB=JF?L<7\>/ID(B?/8A+32%95%6>%?=&::$=;%D:';@)>2&:7$;7);>&;;%<;)8:%E='GF)?D+6B,7='><&@H*>H%=F(4C*69#<:'98&9=,24*7:$.<)68)7>!9@$19 7=5B#9?#4I%:=#6;%6;!/=$66"-8 5:"4?'1?,.5 .4 .806"/9&36 46'2:!75$31&72 63"/)!6(6- 2*-(%1(6'';'"=3&=0(?3%<2':2$60$=,&<3>6 ?2H0!50+)!:+3?,?2#AE=; 8;B<H=*:B"?5J@#DJ'4A(36';7(9?%CA4>H)3M1=8+EB'AD):M,EH'>R+GJ4NL1AX*UJ0L[+HY7EX)GP$KH#R?'ER/GB-;C%17.<4)=AEC+>A%>J)7L.=?8=K40<+%5 $%$''"%#" "' *2 &52;>->;+%L("5/-#'0&)-=~\Pc¡[PmFF`3sW4Bv7 .;:4+MP]i$Tv(;X'5G%;I#Na/Le85O$4/'.!2* &! #78)06.,7("+;8'cz@‰Šhq‘w†•GŒ§]¦¦µÇz“¢ŽvqKad+ed=X|scxЇ„}‰di†p†¤FT|<TV*os@Mf`qTQe;U^F=PXy{ƒœaLl^Wvb8`}^xz—Šsi™Ve…‚e‹“‰®ˆ›±‰u„އŒº‡}™kOlYCZK>Œ;W}Rm”nkpµÿÿ<ˆ—CTnJbN_]5ƒª>jKjb’ƒ6Vx7EAKPDÒÙÌÍ‹sŠg’¼²Ä֒ΰV;S #+65411*.YVIe&;I'>L!?AHM$bX49N&-+%&*.$%>:SmA‡“N]fGzj@µvÁäuµÍG…Œv¨¸r™uGuGkt=Nj3_j^„¤p|œIQlXK{[Y€Ž³’¯Í–¦2Q]5”‹Tƒ›L•.>S+-1%?920DC2HBWy†mo’H\p4<M<JT2^lEj}a~ªbj’;AQ)/; 9:%<G.6+1<O)@O+M]*KU(@H'FM$BE AK!=H*K[&LV-IR#8<?E 5K&Ne3:J+7B#HU*H\<_rObw=kvO€†CkƒRzŒFv;s†>x>Wl:\pIi…OtŠHƒ£IªÅ?µ¼>šª6cq+V[*ON IL%9B?DO1DC$FK"DJ,`^.?K&443;H;7G:0=*0(-#(+13:$>C NKC>55$IB<^S6ZU-MH8]RZVlp[n@CP'56(8K3XYNx|h¾Ÿ=c`3CL-3.=LDIY=;H.2:,,40/@7,/$' | ||
3116 | |||
3117 | #0;*'.MdL*D*$G0#@1#=/!@3<9 B5%I7#:D#==(A0$?5&C7'H9(<?%3?.96*7:&3=$69&6;*76)<5'7<"2="*6$19 76%92";: 1=(24%17#-5#2.$;2 8:/806$;6;D$A5$.>$.<(71#55#19%3;"6B&4C(H; U<)I@3DC0<E*<@->>'<=)?>)><'G5#R@ XE,P>8L9*L:6G>5]<3NN.SN>HB06=3;<(C>#PB+==&?@(M7)D;#D7,;:(C;/?;(==,GE+N=-K=+>F+A=)D<(>=07?(:<);F+;A.??+>B,;3-?<%@?*>J)A?(<F%?>)93'B:"@A&99(81#:3$0>)/<(05$34#-9"<1#;7 :8(@>%4F%8>$7>&2<!3; 4:!4<$3?"5>(4>$0B"38%3>$6C'4@$-6)87 6>#<=&8<%79#44&.+%80*=/)87'76(E- CC$D:#73'80(:/%9;+81!<,45$;5(>:":@%=8%>5%49$<8#FB<I#=B1;E$0E%@?CG*=@&?5(M@$IO$DA#AD):J&M8&DD0=G,:A6C?2E?)IJ6<F39H9ID5WP+W]=R^3DX'@P+PC#TV/HT&KN.IP8=W6DI4*=(;, 8'*2!!*8/Q+(*5 ""' $- )(" | ||
3118 | |||
3119 | &646</+@*/*"!%!(%=.4,2GlI|ˆ;s†+K}G[e7DQEI`‚(Ym3by?Fc)?U6H<G"^p.Jz2$K,!'043! "2B7P:Hi#m¾">U"=>gIƒ‡™œDƒœc|”dwckœaalkj kŠ‘žl¥šb‚¥WHaA8bWMhve‚ŽMkUzg‚…±_`nE9hRSh:R‚\;LL4NB6P.;LH(9Z<NANsG@`-/?D6Er4Oo5^QL^CZyYC]w+LjC<Q0P[tkXo7JFCsr6’’q¾k‹£KJ]B*F1&P<5!Th-B[0M]?JLQTG2ElC'% ""*21?\z3O]5CEIYj©°0TY0:&&)F>Uo Wq"o&ED"ŠŽ=Ru/8I+8G1o~?ª´Gž7|†#\e#J`C88B!5E<‘zZ²ËfØú©¬†—£ºÎ–޲lˆ£[g–ccƒ:PqM~‚>s’wMŠ_9[TKV7Gp;Kdiš¾Ÿ°ß«Ìß‹ýÿƒïÿ“®Ul„L:E"C><2"4/CF&9>=bpO“PUk18;0TdRs™[}¦Ya~mˆ¬Mdt08C@=1<N/c]NU(>M1CR5Yq8Q^2Pd-JV0DN$GX,Qg/ht2Yp8`t2hv2mm,Se;Hb9JV*GP3O\:[hGZhJ_yOcƒTi‡JYsLcvQv„]x’Y\m:Ne<VlKMgKd„Nn–gl’ns—n“¶eŒAfz5ab;\\2[Z0NU4aY/U_*KY6]j:Yb+W\'CI1GK0AC%AL/TY01 &0(1=+<H/S`,>E(:G4:?3?N.BT4QN<?HQEN8BI&08)AD>olUEQ€d€ZVi;9H,4H2=L?5G67G+-4!-0$"3.r=,o?&d9'l)q)s.w,r.u.v.t0y/„: ~<%|7'‰2•5”?&€>2…F3„D*C2†I,N5‘G4‰H3‡V8ŠI@‰D/D*I.K5xQ3TI8NB-BE&:B.9?':@%<A*C?$6?%88'.;$.4(-2!28!9>&8>'6<'9< ==&>3'N:FD"?D'<?-8F#;G(?;&2D&4=-7689B=">D%GI)CK,D9*H7,GD3<C5BC*GH*MC/CJ(FG)EC-G:(D@'SQ-YE2NC-JC-L?.IE/EI+I@<;C07C18>'@B(>D-A=2:8(::,?:)A:(P5$@E'9B%;?&>E)BC,I:/?A/F9)A<"BK,E?,FE+;>-@5,?B'@L)AC2DD,BM)CC/=G*DE3<6*>@&BC,CN,GC+>O'H=*>C%6D)7A 2:#<=#7:!:;%:A)4;.3B*47,9A'<C(:>"CH$AF$<L%0@*1=(5='4A":D$;G%.A,28"2<#/9&<:(8@+7B(6A*1=$1-%25#84*7<*,7(90,47(71'97%=4+?<*;C(9:.>H(<F+=A)2?,77#62$7@#5B#4?*2?5>G/EK(=O.CL'DQ1>K/;A)7:+A@/K>.FG*V9)cP*LT2CJ%>A%<>%:<$EC-AB'MK&LX&J]0`J>Oc9=I2QR4Tf-D]7FR7EX7JU:RQ;ZU(?T&88F/JWNIGT8P3&B"*,$#/!!+#' '),)1#(##(!1(" | ||
3120 | |||
3121 | 0-67"JD*??+(B"""W1b^NY+&D$#8(45.hfY_“ACX0]\:Wy5‘“5v<b}>Tm4<Z.7H#EQ]k37W<?I#=K+=))-+-4&.+%02*$<C"Rh+lbPKv‹x†@OœKSnCƒe›|‰¨‡a€}„Tjˆi[\EqcGƒzVs³_žy· Xœ‘Qv<[€,Sd=[rN?OAP]o{€„i•`Cd4WuEd6:S1KM-AX'*O</7&?Q%'O&" +' $.-E'=$PO.UX2J\-=K+>N+Yb(D]KRZhŒ•Cžªs«°eØÏvޝg}‚:ƒ.;J†–9R~<aw?Sr94N6Cn@-7-2;3;3@&\T+JQ$|x)ov9UgjRN$8@22Qm"Š Io‡8¢žAŽ®\T…4i\J6F*,1&HN,csSzŽ\’©T€™Se}9m-fl4JR0É×VÉÿ† Ì‘ÅíªÓÿ‰¥¸mŽ •—¯t¥´UqŒD?TFck‰m<S_N[HJt9S{FBT.ixS€ž|•³¦¹ÑÐìÀúÙÆág´ËBro6ga-ql$cV*^b-BD*ŒuQ•§Zdr6eq2fzKMZKZk[X_mgn“BGK$LO)f`A`g;sl8\d09;/;JC^g;k|:WZ4Za4gf?exKq‘FpˆFQx–GUo<Of>ao7db4lo7VYIiiJ_kGew\‚•N‡“U†CjqJlrRgtOgt1Vf5Qg=M]?TlR`zTbzVPeapu]]pZ…šKsLnuEnk<fgEkqCjs6_]@^mApl@gr6\b+OV,JP5P]CUg4IJ"94#9>0LQ>ET5CE05C3XW);H9Sm:^j2MY9GJ5bX.NS-TV>GO9<<ISXNHV73</-;+%?87@3=D-=;"/.*7'¤RA§PB¥NB°MD´P:µX>µUAºX@º\D¾`D¶^E®\I¼XJ°XE®YG²NAR@©UH¤SL¬PH®WJ¾TJ¡[N®^O¯ZM«RN¥MQ¤KQ¤KF§JD¦QD¨MJ¢WN’RS†MImH?RJ>:E7>H0@D*<I,:E09=*6G*:@+6;<?=@)EB+@G+9B*1C*;=)?A!@E.9L-BB0?E,>N)DM'<R)=I1;A'=E#<C+EG,DN.@G1AB2?D)CH46D3JH+AP1MF-FQ/>H42H-9?'E=+JK2NG0HN4CJ8CG3?L3AK/@F.AE-BC.<A#FA+;K)>@3@G*=G-:@'8A*H?%BM3;P2=B*=G(>I'I=*@Q,:81;H&BD.?J&EG2BJ0=I-GI,@Z/<L3KN-]F1hS/TW,JL8:L.BG*>H+@G*HD6?K4HG,?U+<L/BB#BP'6O(AD+?I!;G,@B%AA'HK'>F+4B.>>'<H(>D21=-'0+@5'>=#@:&FD);N*>A39B!BG"BG)=O$7@+:@+1B#8;$-=#5;#6?%;B&=M'>J#<G'AK*8K04<%5=,2D(59'76#?4#@E&CC*;T"C@-CV'DP.AQ+DX,>R%=L.FP7DN+=N0BH6GT/GT.KX)_S,Tc1Ra)YZ0ZW3UN/ZA(]H$IT)DP0DF&LP)=N1PT3Oa8\UAZ`9Pc4fc>N_:U_:TS1Da.b[>]mH]uCip2bu4Rp5F]:;ND:M7EH'Dj9>A9=5A?2GCA" =(- '$ "4$61/2 '''.+$,3-018EO:4".3-KE&8C+(;'B9,t_…}u’ANzM<REM[+Wr*Ra>N(9QENj3lƒ#IpE=V@R]F?_4Pn3AO$=RSc(Vg8i~=Tq-TV+Q`&ED<="+0($7 "3OFSTP_sb)‰®Iy`W¨6it;mJ0•–6’²`kŽp^}jPO8m_S_nEgjJLgqs†}hšSv[Qo™a@SCHI7RqE/E.;FXKhCOoKEuQFW[CX@9Q<YPYhATzGFc=3J)5%"*:$ *%)CS,ƒ„P{©8\r6MV!hh/‡Ž>Œ/s|/by[*Nnƒzu𽓵”‹Ïè}¦¾gt˜6j†[t‘DwˆHJj<\_,|‹=„œ)~”7‰¨Mg,CkKAF:T[cD]SOC3ª XøúCº×-.:3>GRw„`ÆÚw¨ÌgŸ®L“¯XQŽ(qQ Œž9‰—QŠ¡Oœ¸dn›Q`{Dp”Y’¥VŸ«W”×¢\„‚hxt^‹öÆ–×Ôs×à~©Ægi„k„”\|§Aêq½ÏaÓÏ3´ÀA}›BVc7LU;f‡[¤ˆŸ¹¥¬Ó‹«Êœ¼³šËƺöËâ[ªºU‰¢S™‹Iކ@o|?\ue]ƒ]MODipPoŠDS^8NZ>FS<UhTdtFdh;†?gpA__DW_BXe9UY'MQ7YgAj„Ddl<ck:`l>VdIGSL[qYzŸnO‰Ÿ;hxCjwAuIŽC€€AnyOz„GuWua’™dŒ˜Z— SJ…„S‡’Dsx;Zn4N\6K`HTnCZtG_qK^kENaUn’hƒ˜W‹R€xO~yUo|SmxJspIxyQ|‚IuƒAls8ai<ld>fa=V\8QY+UN#BH0JU5JR4H@(WK2dj2DR9C_LTl@GZ:ER3:I/5I?Rb/DA,ML;}w:as/DT'@C#24(8<,=C,>D$/1#/6']:M]=I]9K`6Kg@CkANa?Vk@RcARfCWjD^e?[j:[d>K_;Wm9Jb=Kb>Kb;W]4Bb:Lb9Nc>Pf<W_=Q`6K_0KV1@Y1B^/EV1AW2FW3DW5IY6C[2DJ19=9>>G2:E/8H,9I2AF*@M1>F(:@,=G(CB)AD->L/8F0/E.;<*5D!5B+<?*@@,JN+JQ2DP0?O0JD-BN1>M.?G+BG0BK/BO2GG0RN+BP.<I5=H+>N/CJ1GM.?J7?K0?J'BG&MN2MS1FU8AQ6AJ/DM)FM.=O7AJ.AN.CL/>Q)8N,EI)>O.<Q/@N+AM1CS+=U0?K90K*BC-GM&BR/;T6GJ,AT+@O(9N.CK-?P3;Q1?H3AQ33S2AE-BP0LQ6E[>CK4IA9BP.IM3BT*EK,?M+6K-<F1;<2>:*DH)?T1FF1DS*>X/LL-IT,?T1BJ.>F)B>$EF(EQ+@J,EX+>R(>A*DQ,<D)@C*A@0@H)?B(E@+EL29S0;H.<L-;L%8N-7G&<I(BL)?U+IU,HW.CU.@W0FS/DY'DQ"DM!CLBE$8L&:@%8G.:C&9?,4G+9?-?B-AK)<D(?A.@H-GI1DJ(JA,MC,DG.ML8MU;MW=JO;KF5FL=UM*IG5Z@6KZ-PM)VJ)YO0|l%Xj2B\2PXA_cBUb@ok@e}?Zo3aa?hn4_dBn]>OuCccKuvE\vILb*Wf&\ˆ/]l@gg&qp?T}=`^,7_5&7&)**",-&@29J79"9>)0C$-=+7 017M+;<"%@1-6F387?F/FR*92+$.)(IQ"ae={Š`\€`”ŒFxž-b”FHk?GX4JX%O\"qo+br8\{.Jt1*T3IF0^c!X`-bb&Wx2:T1hY8Wf(t_(sq%Wj2~o(WfOBW\Nd%G`B7P@7A.>M8Z]cj\m”Z¢¹vŒÒ`ˆ§jÂq{žJ|ŠY„¯Qž°Vt¬YOŠMFdHWddJqr4OTPXVVwBLg@HXP-<:@-#6%JC&g€4X=DH8=R./F5+Ea'8J%3/(:(K;F@M]3?J-3/7IZ!MR%uwU\wzKaISU4ueN•¶uC„v4=I*D>,L!8@[kGp·ÇŠÑé ÃÞŠ·Ýc|ŠE‰R_‘fmt<‹‡WHp~Wj‰wz‘†™Ÿ‰¬‚k‚Pt€I^9=D4n|P¡Ê¶ªÚáh¤’RNRa7Uyƒ“¨q}–Ÿ|…¦z¦¬B_ƒ[EZU_jY~žKv]˜¶Iy~<FZMc}|k™„zŸq“´Yˆ¨`¦Jª¶³‡¨~j—›ˆ²v‰¬T¦ºeµØn¦ÉšYn0Fz2@Z^]BnfCˆ†L±hœÇƒµÞ©ˆ¾©¥«ÊÞ…Öð¢ÖöÊÖü²òÿ޶Åp›·b’·X|—JglAWV6bQ4eaN[cLgw9]h5Zf;qy9gsGˆ|D}qMOŠB‰w?|B2vj5on:qrDcnAn|@‡B]u:as5UdFRf]u†f€™I†ŽO€‡N—†]˜ª\{…B{…K{‹Nw•R‰—_™®hxŒ^‚™m’¥[–Z‚‘ZˆˆHqs=X\9QY>WgDb}Ee~F[nD^{W`oy›o‰’m’”Z|}Tr€WqvS…†Y‰]ƒ†Vs~S‚Pr|Kw}KuvI`e=^bAig6e]<ij:_l;nu9|k?vu5_i-DW;4L?8>9EJ1@S/STBXY7RT5CPSk}T`p9Xc=Xe$68&)0(/9->F" ' %3%>"5@!/< 2@#4=&0:"6<;C6= 9>!>B$:=!<? 9@8E7H 7J 5M#8H'5C"0=5;7A 1=:;480;+B(A+A&,A#+@&*@%)B',A%-B(/E(+D41DN1BT/>I09O1@F+=Q*7I09C1<H&CG*<J,:N02K47F-=?&BJ">M+<F,GK,IK)IR5DR3>U7@J1?K2BI1?O.GM6FK3CN0KJ/F\.FK:AK7AU2>M0?R1FP4;M1=G0?R/GK+NR2JV1OZ<Eb:8Y5BD,@J*;I,@J/@Q.9S3/H5/@.9F*@P3?P0?N2CQ/>U,3L35E2=@(<I';R,FO1:U4HK*I]4DY0MX5EZ3KY1EY0AV0C[1FW3AS)?X1ET/BW3;Y7:H/8G0AO0AO/;P.IB26Y28D.B@*FO(AQ)EP/;[0=H1BM2BL-4L3=A3?O1HR6FU&CV.BY5FT4=U/AP3>J*=I+=I,KL%FG.DN-G?1JE4;J2:D2=S,8H/:K,7I,>J+BL-?V,;T0?N-<N4:R78H:?R6>U4GS7DW8CZ1LT3A^4ES.NS-GK)AL'=K#DD$1H%9=$?G'=I(<E+DE-HO3@N)CG@QG9K[)AP;ME9XW9Rb.OZ/N].FZ/;C)CP5NY.J\9MTFXSARMRWb;XV@bb5X`3SZ@T`S_cDfo<kmI^iAd}M]ƒPkV<p}Ubˆ\_j8ab,hi9gˆ;t}]moPT€cR_<5Z@7I&RV0H9B>M)1N/8D"3A($>'%2*%1!.1O? CT)7G&)*(/E9=+9@<>K+=C MO!DT2QC?ŒqQYo3FVJdKTh„Neu8kk+YŒ/w„3]˜Bhi<k…B1b138NZXg3Qj8bmASxC;I"TK,XP4WrDdsTQgJluDk|Mji-YiQH]DUjM>W(XI|®/œ£O™ŸO•X{¢‘j}Š—8†{4HzSYu\vrŒ‘<hyJQ:4QI<ME?YE7>,F@,ƒ—^7hFE^CCO-Fc2G^"_yE?T>IN7hq4=`;#B"DF"'5M?%as:Cd8JM9WZ9dj5Tmgb5o„DY\h‘Kto&^m=KbXQ_e:W5+3"02&E,.`UEr Qvœ‰¬Å“‘Åf®Ç_’¦E˜–OÁËxy‹P\nZF]_G^g1MdCR`RYIj^R–5d]?j^g„z|—¡VÉà`RU.pr:‹¥vn[›’]Ÿ¥nØîy¤ÌW`~4v‰LP`F¤´]ÀlezSi‡<WqOewJ‰“n¯Ô}‹¾a\tYkx}¯ÇRvŠHvŒ`]‚gi„vˆ—}¶ÓŽÁäY¾Z¢ÀV§Ílž¤Vla^“l_‡f‡ŸŠ’´p»Í…™¹›¿ã¦—°º~’±„¦ºc~m_jevŠ_“LJ{i=…n?jl<eTNqN€‰D}uB}L{…S•ŽY˜Tlue^kMolPŒ…SކN—•J“Iˆ…EŒ|Ew{MnzJe{JoDx†BhsKv‡bˆ–Yy’[†Ši•Ÿ\€ˆW‚“J‚ˆN‹‚[“Z†›pŒ [ƒ–U~\~\~“X‰›V€‡M~FpqBp„@n„O…œP^ƒOn’X•¦]tƒf~t™šm„‡`xtYwwVwzX…c‚†fŒ‰[ƒ`ž‘^”ž^„‘W}ˆO{€FsqGnqIilLozGkqc–§z¹¯TtqCWh=Og5S`/Za8fe3MI0AE9DT-BT:U_TH\HBS=CYAFZ0<B#)1$)-+6C *3$B* 60<'";,),$!#*-() ""1Dfo'I0&:*+$ $#6?4>="7=$59&A6";=#C8)A>%?G(CR/GQ0DK1EM3LK2EV.;I4EI-AM,BN+=P3=N46H/BJ*HK&JR+CW5HM5DP0=R1CW9GW:GN3EU4@Q0AG0=Q2AK2FR-HU6OS1FQ8GH7>P9@P:EM/IV1A]1?Q:9I09G-9D+>O2CV0VT4Hj;9R7H@+BS'AP.5J.AF-<N3@L.CJ)<N&DO3AV2GM/JR2IT-AP1IL0LY*E[.CP69S2=L5EO'DW5FU7A[99V3<R2IV.6^1CL1AT2AQ3BX5GO,EW5DY9FR3;R2?D1GQ,BZ.DJ0EY3JU0IU(FT0CQ0<U,7I3BI1CO,:N,8G1=C*7B5;G1>K//M->D4BL+DN:FX1BS0DP99P0<K-:T/:I1:A)O@-JK/<F#B6&FB+>P)7I,9A)D=&.I*5=1>J-7F3:K,<J-@O*<T/BQ-;O0CM0IY1?^2>G8FJ5JX1DV6AU-FT.CW1CY#DN(DN&DV+PR'LY7BU/A_.LP-O\8JV-Ea2OO4L`BSb;He;NN1YV;Yo*ak5TW8[Z0QT3GN1PY9NO6PT<WS?ZmJy_5ci7W]@^SC_VKf_>VjQQ]>hcJd{TˆqE_vL\oUZ`NeuX`rU``VXp8LV<7X&6: ASC:>$JG-NL.F^#8?*<A'G@FV?D'_`2Ss?CZL"57=-C:-EU06C/0P52D6DJGEY*H^TP_HOTG`}:›UsÀ[p SE”LAF,?]99S69J8‚:§³*È8{Ç6v Hv¤Bi—Ck{!q„'}Ž)uŠDo5[y,ep8ezBnf;ytBb‹DU]9;Q:~|)›±ZН\zup¤avmxŒ]Y¢†TKTnw%8H'sK>DqUDK-HC(=;-6[59646B3IN<]Žc257NEJ¡ÂZR¿L4V)8hG,@T61Jj†n&Q=(8&#."*@27<MAI(,A(#89KMK{Y™ c›hPkKFkrŠ…·ºe¥7’Ai…4H9If PTO_)PeG\\S[f:j•`l~W¨·r´´jÒçr~™Ž£mPLD[r2(.&+20.&ny=ÁºgÖÿ¢å÷„òÿ“ÍèÕ݃Óðm¿×dáûaŽºiš“`ÅÚ{ ¯ˆãÿ¬îÿ{©Ó_U‚X,H2hqeyŸbw›Ls‚DT[Phzf—¥³²ß°›ÉfRpHf{O”oµË\ªÉX©ÄEi‡J‰_~’rh‘”y–{…®¢“¸Ž_„ZVx;Vs8e„;c€SYud´Ð¥¾é‰¸Áz™¡m¤V…šS‚‘<Y`G‹™_ˆ¡n™¼d}™X{yVigB^qMdsF]qMmoZƒ_ŠZ†‚byTyxTƒCopJ‹^£“d¤ f¡bž]š“M‰…LvƒJquSxU¦ž]q‚Gj„^{^Ÿ®i½ºkˆŽW„‡[“—[ T’™N›V}†]|†LWqNrzTjpJ]vW€†Y‚ƒSryQ}‘Wqb¨`~œV\|OV}{Š´y…™mzŠ€®¨j—’X‹X{}LixWx€Uxgw~gˆ…g‰Žj‰ r‹›pŽ¡]€’RwƒPŠ|Qq}VlX{…p€‘y•lwuLQ\>QjH^vLg„Y…˜Jse(GM2LX-PM;G^8@J34H36H76C79D+1/9 16!#/. F9'9<%A3(8=%(5-#1? | ||
3122 | 4?46&+,+ 3Gw"€/Z>0E3:### | ||
3123 | |||
3124 | ' E IAEM$>M*?H3BI*?G,E?)EK)GI1AS0JP5PP-HO5IS/L^1OR8HP4FP0?V2?Q8DI5CM,OQ-NV,SX7;^8DL=;N+?F.EO4GT4KQ4EX7IP3DR1AT1EJ/ET-DT7NO7UO4PY6FV7EM6IR,CU4:P/:@55A&9<+@A(@H&LS/ST->^6CO<;J'9G,@O-7K,A@)FL-BR4@Q0;O0DQ7>W48X8AJ4KO7PV0Ha4B]5=U8MQ3I^2HW5DU/ES-F[6=X4AN0?Q.>I)=S77P*8F-=K-GQ.<T-8G07J+@L5?O.BI'NI+=`3JH/JT.C[8G]0J\5KX6J^0GS0BN)<K*?J1;L(CN+=F-DD(IT,M[.<V(=I&<E0BJ/DQ/=P3@P18N/8:-58(9B'AK-GJ5>I/?D'<H,=C0IH,CN+=K*<C*?C$BM%3X1AH-?O-;K19N56J/AP2?P+;T0?S9CQ/FQ/FR.CT06Q4AO4EL0KY,G]2G\5F\7@Z.MUAO[6Mc9Pd.Og=Ki;P^>Ld6Sh<T[?Ya6Tl6Wn=ZkGMoBZhAX`2Z]4Pg+Ri0UY4a`/]b,_T5Pc?PRIQnCcW7j[@[JCef<aZBi]<^yP]vL_{WazS`v:bgSaiDhZEjƒNjr3Tk/GO!RS(PW#X`0hcCUjNdh3az0[~HyeDj;e†;`vT[j+Lf0@O2LU8Y_Rft/O‚2DO#"K'1+4"6+J;/QU6L\*7K:R^@ERP2>8EP/J^3.T,-5_<$a{ORmMbxM\vFss>s“Jjy7KYJ\cQmˆRvsNg”;—”6£¸O°Eh™Xb|YkuBhh1K c_“ke„OeƒLoŠ[[v|x‹{~˜ToŒc?n@^}[Db4TL-]];;d-@N/.G):A(9E6SH`EV%?6)^‹¨2DM'! !,(9R,').;( &+#5'!.""*@_~}‹a{~:PS_m4`{S„ƒŸp••Jjyz\=I&@R6Vf5AQE7;BikC{q:ŠJ›¦lºÊ‰Óæ•‘Æwy˜‚?Z~~Š“U{Q=bW63!VS%wu/¤ºm®Ö´©à½:x9h©"Bj*:vG\|Sgƒu‰²œ_p|n¨ÁŒ¡Ã|’›rž¸©‘œÁC3G_MNz—KAJWcta…‘Jhƒv^v—g§m‰‚Xƒ:<M8RYXpƒÜú€®ÉoŠ©OfuYuEZn?cuL€‰VœŸZms5‡”>_3Zg>€’;qŠR‘©|ºÍ‹Š²yÂa†¤c‰Wz£J–¨O–ªs–¡^˜¬q’¡a¯¼`¦²K\|7EL7›œG·°K˜š_œ§cµ°c§¨]˜ _´¨YªœZ œa’™n žs¢—j¨Œ[¨Y˜ŠRˆ™U†’O‡–gŽŸl—«Vn~T|Y€–€€£ƒž¨Z¥§fŸ k¬·dšcŒ±c€¤LrMw„M}’N}~;fxGkxX‡RŒWŠžc€i‡˜^tSp”Jk‰hp–{ qrxq‚–vº¯d’ ]‰€NuyRk}Rq~Qiv`Š’gˆœo‰œl‡–l…Ÿeyˆ[vƒTvySjsS[q^i‹pžn„™^o{Mkv<\gKbjV\st{‹g]pD|{>]jAT]<GY5AQ/MR)6;*$00.;%>@&~T,bJ 25 ).60+99*89+0C,%7-$ 3 | ||
3125 | 7"94!>:2C4.80*9/ C o })"W@5</= #4 $! | ||
3126 | +I!DPHL0IN3JC:JR.GJ5EJ2?N4DK0?P0CJ3HO0NM7OW2K`9OQ7LK5DP1>O1EE7MK+SY.S`/J[4M_<CT8HW8CU5IK5LR1NS2T[2Nc8F\4?[5ET4NU/DV1ON1RQ1QU1F]=8P9=@3HI.OH1BT2<E'>I#NL%U\&Xc.Pd8Qb8Lc7JR6IU*@O1FO)/W,E>+>V*GK3MW3TV/F]6HQ1AQ7DK(IN0MN2=a9MQ4BS/@P-QT+Gd9MP0F\.O]1Pc5Bb8AO5BH(ER'FM,GR#@Y%=S+AP+=O+6L(K?*F['EV0LU3T`5B[4IW0O`2Cc5HZ:N^1B`9EV,KZ,JS4MP)CZ*FX.JN.FX1EZ3OV7I`6HY0CX/?F(GM/GP-AR.AL28L'8>$>M)BK/:U/=O17G+AB*7F%DF)CX.9O1CL-IO18W4=K.@L&7N46D/=G+;H+/D!>A+6<-7I-<K/CS/BU8BU4:Q6AT*C[2>S/HD/AM,0A.5C.DK2E\==Q5AO1@U8>P;A[??J<LW6Qe@N\?K_A\cAGnC\a;B`6JY>MS.OY;Od9Jh7T\CIcBQN4SeLCP/LX?W]3Th?al<Wv=V]BimB\dHY_8lsKhp>^^DloCZmHRW=\oQu~IoˆSn>`q*Na>cgRmyD{šPip<y†D\‡Y[kNmrXq˜WW|Thi@vHv—E}Š6kŒ7pTf•cŒI<}3UA[P^eRm=@T8Wg)[Q;{n4_c#S\+E€8?;%dh&am>\xBgy2s:O‘?GKL[bJiƒO^h:{r6ƒ‘KeQo€P{–^v…„‹ˆƒ…¨n]FkqYl•It™rbˆ‹j}^|‚Rg˜bh›nSUŠœhS[ˆOOORi+NgJp{:}<boO:j;AG0P^.@n@ECRNQ[(=7EU6KjOK:(F(: %(.<78V9L>K(1%2JI&+$-4325K=CF&:&6<* /8I1I.1SPJ3qID†•-@</aiH14)SB&qŽKqˆOc“m€£„‚©‰”º’‘§TGrT6A3+8t33Y6XW_b+‘§Y¬Óx°Öj©‘8W# **(*74$j4IIO<^Wj[OªÃ~»å‡£a…c´\OeUwˆ)Q‚ND_Dnj1˜¥hˆ©nbŽW>_T?T=ViNkj;GQ(AC5Spa¦¶²ÔÿŠ¿êXkwBpm=We-`_?œ‘s±³«È†¬·uŸ¤=Tg3XpO[rXpŒuezw]~V¡¡\‡²c{°P±P£¿½Ý“ùÿwÌÞ{ˆ¡YX|½txœF£ BŽ£w˜®|¨Ãl·Á~±¼~£¾p›»m¯»w·²q›¤e”žb¥Ÿ^™ŽW—”_‰]‰ˆY„X—¯k¢¼s ±©Ñ{½Ò`›§V•ž\ˆ“d‹©ut’®opq{™`zŒo˜]žVŠ—`œ°X€“SŠ™R‚še›¨l—®n¢j|‘em}]w„YtŽZqTnŽls–nv{`syo‚œ{©fŒ›Tx„Ny…RvEu‡\ˆœf…—a{Œo‰›j’¢gz•Z—V}Ix{Ej{Us’mv¥m~ d}Xf|RjoK`lDk}]RgS6KWn|ZfoPoy:U`=L[>O\0F=!,2 +2'<E)iK2IQ-@HB>>1/?6'<B+1A1!60# | ||
3127 | 34$</":7.B5-9;2:84D+*b |)T706-E"2 | ||
3128 | (;!@C=C.EE5CD5<N5AH8@J0BL6>I1;H1I@/IN.IP5PX7GW;PT8NJ7GG8KG3OO1yT.˜]2pw>HlAES@LM<I_8OY8MS4NM2JU8VY=R`>C\>QQ9UZ4UV5LW7PK4MP-MH3PU=FP0E@0`E,ŒR-]f=I^DAU3WH-ab0Xb:MbHKZ@GX8HX6TM2JP1IN.BR4PK(>I1HL2MS4VX8Nl<R\9G_4NW+GZ2PU/H]:UV/Jg4=[8YR*NjBNX6G^1IZ9@`6BM9MO.OZ)Lh/I\5[[4Nl3Q]3NZ16]2FG*MK&TZ1K[6>V1YO/OuBF_5TX0Sl;Ob4R_2V]:Wl0T^3N`3R]2T]?We7Kb<N^5Fd9TK4Zd<Zb4Je>Pc-Pc3Qb9Xh6Ff4Q\5_c*Rk'Ja4P_1Md+QY5H[(>O.DN(QU4Gi0S^/Qd-Uf5Wg0Rc,Kb/Hb.:G'??&DJ)AL"BR*>R'BS)GV(BU18L.:G+AI':S01N2DC/;[3?P+?N&AQ#MR2PV/D_3@N/FO(BX-LW,MZ.KY6HT6?M9HW5CYDPW8K^9O\3Kb4Wg<Nj<U\=UeANdAUW5K^?GT@UT8MS2^N<TS9HCLUL9OO4WP<W]:PO;fOA\f=`J:[L>OZ=UU:e]7nkTjmM€tSuj=qŠAt…I~}iy–SjHq„Nl€<pŠK\}[b{Jg†AqyG~N‘•Z€¡W‚‰n~‡`u£`svJu•Xc‚?u{cq”P‡‰]VAUQ7x„Qg‰M]a8‡§E}ˆ*`rXm€GƒBošNOSPWfG`3C{9Sb>Rg<UyHpfw\‹¥D‚®\ž¿_“Ê^TWŒ^xŽ@d„Vf‚^mku‚JaˆjGgk[LJE†f7RŠHGS`e[9nh*EA==XCQT6QC=C0Ae@:OG&+1œ€FšÊYY" ++'*!66BG,Vi-Hx6LX.(:3(&#%.( *.%+4+89H,0N.$>(*-&( #&[J/4<)gbA^€cXw\BT)hrV?> PU4zoQgAVb3K[Gtvb¦ÊnqšmTNƒ›66<%(A5,£˜j³Çˆ‡°’¯+6E/&@A:7C= [d5haZOZ,89#cgU”–’¸„‰©mI{rA`~TnThQe€1Rs(=Od=YgclWMl<BX(@Z/‚€V‚‘\>]?>M,V_>‡oŠ]™†DPf‘~XÒÌvÄÉ>vwQ‹„gOWl^~˜Npž]zbƒ™Iwƒ9\d?YrCbmNd{[‹™Wh~K»¸_ž¯‹›½‡Òÿ¶éÿ´ßÿ„ˆ¨KXhH„•Tl¡~¨Ë’³Âgh™¶n˜©w¬µz¢Àx¬ºn¨u£nŸ f™¯b•§iž±g˜ªe™MsˆM†•rÂÖ•¢Ó’§Ã‰¤Ç®Ôÿœ¾Ýmšhˆ›lv–ltŽlޏbŠ[„¢U“g†®o”Âf—Ÿd‘`¢cŠ«c«p¡¾xŒ¬pvŽ\x‘V|ŒJgmJd~Uq‘Sn•c‚ŸewŒ[€Œ_y‹f˜¦g«e‡œR„˜\—±b‘ªl‹¸žÀ]‡œeŽšcm…dƒ™hŽ«a™°W‡˜Gt„Xzš]kŠ_\yd{†WsvYRhN[xHmwKVi8NYQyh\t~Kmi;W_<S_8HJ%<@"=G+ES)<<6Lc8_p1QO(77&;>(5?*.?2 5, | ||
3129 | < @+F<&@C3EA2A>3=62A-/V!"o' Q5/7.@0'.*/'( 6 <0<>EA/AG/J<4=M4@C;EI.=I3;?,>C0E>/DN/JS5YQ6OX:TXEMS6MT9ZR:NU1yS=ra8Um<J_>FR?QT1Na:G^;RS;JP9MQ:NX5I^?VS;aS3\m5Ud=R[8PQ9ZM2^d3Ya@N^ELQ5PK-LQ.NLFIQKFM6HL1XW1WS=N[DE^:5R7BD/PM(CX1TO1W_2TX2NM1NP,WW0TW.G^:GT3=W1<K1=J,DN-RU0S_2He@L\?H`)N\8FT7NR/PX+G_4]S.Gb+CU8VV8Fh2RU=Pg4Pc:Fb@DP5YP O^)\^7_t>Mi@L`&Ca<^S;Uv8VnAF`=OZ2cm7SrBMc9Ma<;U7HN5K_GLY<GS7OZ6^S3Uc3R`<_bC]f6S_;P[3M`3Oa=Ld4Ua1\l>Ji;bX5\x4SpDTgCUw4Xg8Og8OZ1Oe4dhDi:T}<]dDRy:Fj@XZ6If.B^,TL-H],JO*HV-SW2Pc7J]-CZ'SW-Ob(HT.GX$?W*=S.=P&FM&DZ&DG7HY9NV.GY-GU,FZ/J_D_q;Li:FT5XZ4fk=Gw;[\;Ek1MX:O_>Zi>UlE_gEKn<Pf<I`;Ve1Ri5Nm7Wg7U‡FRj6PU'R^.Ge,IL'FQ1HX/FVMQP)WT4PO5\L3^U<_hGXaD_]Hig8czL`pMxiBj~Vj„S~žbiLmqHI]E`V:elGRtclkeu‡cf^r^l—eg‡bYŽUr“k‰œHƒKŽ™a®m¸W“¨=Ž™d·Å]±ÍMo´P~¢l—šN‘²EWScpKj6xŸRj“7g‰.ir-p‹0t›9€•Go¾Qe™YLwKDaYvmKu”]lKh~PVjAemHe”i9VX>AU]^C~y=Nv</D!7-0TYVzr*„§.g~17?1"/0$4(+(%.**(>=] 5| /)'\`N$SMJ2B;NQLpFDp!':", *" / dV=R!6@ GBEU9FUOq~<k~+_`;Aa0MA=t‡G‰Z—«DšªE¤Ûp|¿_r·>rh=e ioˆoft@{ˆ9‰‚dh‰4iy)ys=Ç윎Γy…j ¤Q~£,s’ 9›§F§¹<Vv50F6.:D64'bb-auH£pš³t`Œ]o}5E^3Ac7EKEepSE^3;M%^]4Z€JTc9j‹9W|5frTcr[A?%mq?U}CNWW@E2XS5’¨g†®›•|ŒGEUFBM3HQ?wm<‡„`„¥]§^m4Zh6OZBOhORjj W`Š_h„oŸ¨d‹§§°ã·¸çœ—·W‚L[~]Œ¬n¥½²´Ì²¾Ó~°ÆŠ«Â{šo®§l¯³vÃÏy½Çˆ¾Å€¯¶w£®t’¨tŒ¨aЍh‰ªfÆ€› „§¥‚…¿x•°’§Ê»£Ø…Æk›³aŠ˜Y†—h˜»j“¨`”«h”¦iŽªo Èv¶Ñj§µ~Ÿºlž¶l±n¤Á{°Àc…š]’[oŒTcyOxTg~So‡\{’`iŠ_šh|—g”©a„ŸhŠ¥u›»|™¿Œžqq„vŸo®fŠ¥^t^|•g‚Ÿu“³t«[|ƒSh„Mhp@JTIRbP_vRh}DXsSk€Kmx=RhhwŒfo{jy~NQ\>AHEm|8Nb4Qd;YmM}Ÿ<dj=ayUr‰Evu?:<+9C,7?'&A*"-)?F?DM)AH3=M:3?3;@1D5,N#$c&#T,%8)6@1,FC(3I).8#-1)+5'9-:C:F&EG,AE1AB,9K1?F0AI.AL/DE/SK.@Y.GM7PQ3ZT9Gf?GOBTS;OZ@SY<dU:ZT@XR:RX<TT9ZZ5X[1MbBKZ=QT;L\6[U9N[9JR>KS:WS6PcAR[DNY;QT6Q\5V_<[cEObDNYAUS6a_8UZ8ZW9Ne2FX=MT2Q^/MaAEZ=?X8IM*OX&Ja6PZ2Di4X]9^\8Ng4F\9OU3Ob6NW6MZ,DY,AS#JO&K\(KZ0La9Ud9Fk7GW:L^5^d9Ru.Kb?Q\*Re2Od;Jd5TY:V]5Mm7Yc=XgCWg8Pc3Nc;X^2Yk=cqFWq7^i;Zn9MmAQiGThFHn6emBQyEShFRj?Wl6jh/kz<I{<_`@[u9Xh@\lBfo?ey<`yB_oC\v4Qc9``3Ss9ZZ9Lp8TY@c`7G„AV[?aa7_]7]i:SkBWq=Qh=EZ2X`>NyD[V@Y_>QHIi>OcBVb;Wo6QkB\m>Wf=`o5[v:Qj>hp7[u<iz=Et5W_<Jg8TY8Dc(B`-HS8IY2H`5@Z1P]5Of5Qb1ck4]n7_nBWk2Hw7^_=T€TUi7PeMF`9TZ6Tg9XjDVyCNjGYk6_{H_zAa{<Sv=Md<Xj@Ui?W_9Pq5M\:Rc6R\/Xb7Wh*is,eu3hx8vŠBr…9V|?Uu=fDW€NXlFVmKduDv‚Jo‡Lt‰Qn˜S{‘Fb‚=f|5mn@z“K[yNmg7„C‰œSlˆcaŠ[quJe…SgŒgr~YƒVsžp§i†©o‰•l©l’³{Ž¿f™g©·rŠ¿u–§džµM~O˜™pn^”«Y‚ g€–Z€YyŸNrwO?p7}s6\‚0[n<\tb=`^f‡e7KKbdAV‹[byEYk"l‹Z˜€bt@;)*<-PIBv•gW~gBacFi?0G&$5#6!$*5"&!+ , '+9:9.;4#?:()@/L[Rj’/Z}&5.+#1J!(7LR4/_N[a9[qG8SR,8PGZ`—Mvˆ?¾L±is—sn‡“t”˜_€ˆm˜[luX„—dVh=7HHgoX·Ü„wŒ^h{Iw„Pž³p|¢¤†ÊŠ„¼e¡žz³£V…´VŸ»p·ÖŠ`|~Ok.Qb-Uc#XZ$MV:V]=f’}Pz†?_FPql—ŸAax3js?z€G…Š.\U'f†c£eˆO„š`b†CRV:‡}7Tg.ipGYn:Wa6OV,ffUsnir|ga{l<[WYU-ws4ŠAWud„{g¦™h£·t>eTER1BV+CM/DR;XvWg@lŒebŒgWn\y’sxžq¦kb~IWkN:XpXzˆƒ›˜Š˜—ƒ’“—ª”¹¿±Èx¡µŒ¹Ü±Àγ¸Ê«ª¿…ÀÅvª·k²ºuš»q–ªl©°y–¬sˆ¦i‡¥`€¯jƒ¢|hš›…®‡®|}£_}¡t¤¼ˆ«ÄuŸ®j}¦`|œm¡··Ñ¿Îw›¯y”³y½sŸ¹²Ës…ªay‹RjOZpKlvK„ƒR‚‰Xˆ—_„”UƒŽfuŽkx–e‚£kŒ©ž¬†ˆ·nuUm…]v—w“©lz¤d¨fŠf†Ÿo‡£tx›i}–[‚U€>ht5_lRu™i”¹_z†\KQ^@RWVf{]djY`gCmh2ENIi„O^sKs’WyŒh”°^‰™P“Y{ŠSmƒQ9C.:F+2E'E*"+"<BC>J.<H5:J05D-;D1A5(J"%Q" K$"8#*D/(CL'>N8>G68J%>@$KA BQ;K)?L+>G,?H/EJ1<L3?H/KJ-AM0?H/HM.FW3JN5WO.]X8Qb;OGERO8KV?LO@]G=YV:YUC\Z:b`A`eCe\<FhJHRCPJ3OS;SR;K[7EV;AP6KP/IR4GV8KU6HV5DU4G[=LY7NY;JZ7U\4Me7PY:Pa8J_7>a>DY2GY-EZ;GS<J]7LU-K_1I\4QU5Ma:VW7Yb6Rp7Td=Se3Jd0Le9Rc6Sd5H`0d]+Pq4Zj6Ol9Sh>Q_<]h=[v7Xr@Vq=Wo@ee<Vz?Yi@Lj8Mb7Tb8DjCV]7Vn7KkAI_LQd<Pn6Si:Kq@SdBcn:KyHOi?No2Da7fe7^|7NsBN`ATa<Zk;tl<tŒH[^gpDZy@\zAQoG?mBP\=_pGIvEZdEIs@xa=]|HHp@VdAfo5sz=UˆBPb7Oh:ff=^E_tGTo>J`@Xg7Gu>gZ=`z4FfFKQ0PU0Lf2G^;UbA^s?vj=[y>Wj@]oGZoD^g?dvKZ{AcmOW|BY^>|f2N—?TT<P\,S`/Me;Zf/T_/Pa6Xc8Yh:Tf@^g@[xGYk<Ui2ceA]p?^yEYu@gf1gƒGavKXFc|Abq9f{CVmDguE^…Mcs>cƒ;i„FbzFYkJan2Zs7[p?Ui7_q<VsMdyKU|EdjGb{ZjzYQ†Mf{UWwDTe:bs=V„8`tK_uIrxR] V[kMT~Qiy9j‚Nu‡X{QˆŽLs—L¢j§álxŒ^{œfŒ§j‚¦g|Ÿd•a•¬j’³€¯s¶wš©c¢½n–ªr}§}‘®qŽœxšÇt•°q–¶‹’ÀtŸÜsŸyÄiƒ™^šf—€¤¿W’³Q„–eŒ¬h’¹G†Éƒn|(|ŽDu|-W[78?7:A=D@;7`_(;Q0-\f1JPBY#=e‰6G5Wg$3O;ZI..S"<><F=J#IZ)4 #!#$5&. '#-&/);P&7/&'0#>8.XdM;ZN>3zR2Z&DB&Pg"Tm3\uIq€/nz*w5sb„£}Žžy¹É|d†C_rSCOVpfK\}Nfxe„¨n…›MXm,alCq““FH8amL„X‘¼hi’jXkIsoH¶Ây¸Ø…®ÁcÎ傪ቀ¯N‚¢Qai>afDbwNnz>pAOh<<N+9A"3C65SxVro`†bSzx—w¬<kXYxjGSz‡Ÿu\lY2EHE>+M\:Lh=KU5DQ5UjRx–aŠŽJ|8Š{6µT7^S<WLrˆGjspˆ~t”aHL,ic/ˆ8KT+=E1ZnD`n@•œKƒ˜Cz…>}šW„¥c¬Qš¢Em€0IU,gqPŒªl¤¤c‘§R‹¦‚Ûç•Åà…Çٸϓ²Æ’æÆ‘ºÂ°¿¤Ð斸еé¢ÕðxÅä•Ájˆ£h¦Yj|\{‹j…š`jˆ`oŒiazau•iŽ t˜Œ–¾~–¶SŠ¢dŒ©‹ˆ‰®p‚y¯ˆ{ ‡«}‡£}t“]~–Vw’EsCvˆR‡¤Y™YŒ `Š¥[›XƒMVsd’q—ªw”±t•¯eƒ¨SwŠOl‰l{šRx™\…±l„§o µeŒ¡_t“ak‡Uf{bi–\Š¥S‘–\}Ÿw}¨rj†UYtLFR9QSJ^nL^`JhyLƒHh|\‹›Uj{`‚fov§y’›Zw‹\tˆUj~P;C/=H07E-=&!!.B<@GC,DN,BM/AH)>H'E=(D) B""; 6)B)#LG%DL2EM2EJ*LI+QJ%EP,MM-RW,VU,IO/HK2KJ-QR/LR+EW6MN1IQ.XU3N`4dX5nZ4Y\>SZCSV:JX9UOAXW6`a0X`AR`>RaCLf?QUAHd@LYF\S3K_9UV=Ha2HU?DU8TS*Nc+NY5U[2H`.G\9AW2QT+I]3WY/\_3Ne7S^9Kf<J`7Da6OT0?])FT4GV0E[,JV)C^2BT2OV-Zc1fg7d{;^tIPn?I];Gd3J^:KZ1I^9A]1OT0Od?Vd8Dg:B\;L[/Od5]j<RkDLcCN^;Qc8LpEVcAKl>L\8Ka2C`9X\*Rj6GcA\^:Ey4Nb7Sd4JcBJe4Le9DgKI]<Vk8Ij:Xc5`uCYrJDzETg9\kC_o:N{W_iT|z2i™EbƒIW€Bou;Xˆ1^n6CoEI\5Ke>`m7[uCi{>Vs5Qv7YkCVrORpG\j4l{4T~Kbk:ZqBqr9v1NzJ[Y"f{A^„LWvBan2gq7lu7T|5^p>or>fCdyDWq?am:Sq@Xt=aƒQ]uAnmH`‚DTx?esYQxBa[?ei<d~=ZrDZ[3ir/p|:t}:VƒKQb2\c@Wz<LuAXo5ilB[„FZoN^r@WpNSe@nqKm‡NdƒB`lDh{Pp’KnNjyCj‡F{Bc‘M\x@cx>ouA_ˆ7bgBd~ERk?Wi?SmFZs9Vg=Nn9\k9Tƒ:nl>eŠ2he9x¡Eg‰Iv}Ea‹?m‰W\~7bsCp‹IVr?a{JYyRq„O|‚P‚¢^†¤‚wž]‘žZ¥´lw]s²^w‘Vq¤jt˜cg‘zl“lw•dƒ«y™¬w±zˆ©oŸµr–¼ƒ•¶w—Éi‡Çd °q¬¼w”Óž›¾pšÅÀ” ¨{—Ç— ¿t–¤`›®~˜¶hƒ `‰ c°o—°e›È[‘´Fy‘0[p$¼3uœ#‘¹E€¯Ju}/r„/Km*R|T1S-/;/8L 7D&EJ0<N0Ff@2U-4C!1002@7O"TZKf!Ia 3A#,7-,"TH+xm1Kb5537*RS0hbKu†[Lg+*5ZH*jx9G_?’gPde„‡sŠÂks¥yyžqp¯wUvtmŠJay[jƒ8 ŒRjK‚xY[›fKZibƒWUta^dS›¤K™ÎOawnBec_kWNh=[gZ{ƒ‡¢°{q”ƒ€ž‘eˆjp’\Ÿ¦h„²S~®Eb{L\‚PgxcRi=q„32M&4A<?)DY6‡ˆXv¢D‘–Ub‹YYmCiz.Rx:7EiU^]jx@‚u-{6š`ÅTv6¥?ÅÀKb”RvpKd€¯f-D@%11@$tt[–¾WbuD\gFv}7™›e¨ÌŠ»ë=‹”.fm>y†Nª¹]›¥[ެP’ j}«}’º\zŽv‹¶_v=o†\m~c“wdY–¦z³Ð‘¾Á†¦Í‹Ðêz¿ñ¨Ål‘Âz‘¬ˆª›’°rx©¢§à£—Ê€€´u›Ð‡éÛcawSis†¡cx—Zm‘Sc‰Wh„[pa_|nzšwƒ“\m™p}jv‹ky˜l†šlz—akˆ_qŒZW{WcuPg[lŽW€•Tw˜\–¼k›»oœ¸g…²b{—mŽ©Km€Qv‘a‡¤rˆ¦ƒ Åy’¾exˆHczc˜NeˆWp—lx¤t…¬e i‡§k‘Rn‰Phn~Ÿo…§c€˜p{euFF_9AV9HJE`o>O]L^~ayŠT]wt~©[m‰Y\‡ckn}žtoˆZgXpˆ]qŠL9?.@A.4C%>+$8D*9C=?,DK,DO,BI/DO.CE-?)#6 0 . J GMEO*JM2KK/RR*VM.US2WX8`S;_U;OU8RN3US3\^=T`=Mc@YT>Mc<M^>V^;R_;RXBV]<\]D]U=T];ZMAP`4^Y2Zf<Ve>V^CHZ:OR3NZ;R^<Ze3Jb9KX>R[5P`9Ka/NX.I`,IR3Oa1Ib5J^5Kc1VY0^d.Qi6Vb6Mf=J_?Ia6Cc;DT4IS+P_/J]4A[.IS.QU.A]0>U+LR*E].I_6Ye:WlBKj@G`=L\1Oe7F_8Ld0LW5Kb'fe4F7Ac9H\5M^1Ee8I[6Y`1@a<SY/Qo5Hl;M\:Nb7Rg6Fh/Hc7N`1Pe.Jd?K],Fd@P[7\h.In6Qd-Ng3Q]5Mg,Ld6Hg=B`;V\8PkLXt?Qj;jl8T€MkkHbƒ?r€AR•TXvSl|Pl†CTPctEJ}GWi2Qz<Yj>N{FVx?^xLYz=zn=aŽ?Vo>d/e=Q‰O`p2Vv?roARLYqNV€HWlBvKu’Mv‰:c“RQwQcn<f‡8_„PhUh˜Kc‡PmŒOiŒHX<z€6U”KwzCY„JZhIXm;]r;lr1ru=iˆ<ez>j|9f€GXgIb{MUsNLc:Yj1]u<LlC[g2sw:v Qp”CuJm‘>w=i›Ey’LjšSpsHX†KcvQ\}KOvFpˆTt–S|‰X‚‹Jr˜LtCqM^DXg>ay@c‹6cr9k„4s5\‡:fy=mˆ7Y|:htLu˜Z`“eXyRbsISuP_k8y€S_ŒDcsXy‡Ps˜Bn’?aˆD‚Ah”cnZr–Rƒ¤^†–o–k{—TlBw‰Ml‘YlŠL_zGu’S£iˆ¤gxµtf‡_}•p}£o~§|…iss˜ g¡Çt›ç‹ŒÀl‡ºyˆ½ˆŸ³‡¾n¨ÂgµÓt»çu³g áS‚ÉZ›®‰¤lš›k…Ôs…ƒc†ŠYv£Y|œV¤®^›Å€…·m’´ck‹MwM±¥<”š*”À3‹º:|”/’½>–(‡œ.OW-UC`w)‰‰$ˆ )k Q<UNd`-6U"Šk^fXWDTnQ\TFxn2Fj bQ4œ³EÞ„˜¥YW’1o‚åÚyÀ¿4}–t°Æ[¡½xClJkfFUeAoƒ>h‡?q˜XT}^Ž£Q]’L|’P„œ]“¯OºÐ;i‹hD`U‰uaeœlHSmj†=BK'l~Y‡‰;¥µS™ÉUÛÅY¡ÝMˆ¤Sœ½aˆ˜^œ»sa‰_VleŠ¢CÒ²fœÿx†¿mSkEUZ,S]%@™ÄL¨g’¡M‹·d]yCYƒI^„7gu<]ƒ,mq>ŽY“µv›OtœR]†^pœW‡¥g‡¬jH_CŸ¬^pte‰ZOp&3: fu=l‡ykŽRt=c‹Tvr¯Ò‹¢Ä‹·ÒŸwªwNsHO\X¬¸|½ßxÇâŽÈᇾڈ¡¾•„™t©wœ¨]¢±w³]‚˜]z‰Q‚šm¦Á€®Ã¦Ào•Åx…´fr£KhHgrQpXY€EBgPVzjZ]}šl§º£€ ulzCYqTe~ck„Tk€Tz’Sd‘T_€L\y[h‡c`ƒPax`n•`t’Yreq‡dpŽRe}I_€De{=cvFdzNz…\†³bƒ¬_ˆt‰¯r¶h²i‰¢az•Xp’[ƒ¥cƒ«n‘¢z‡¹…´nkKgz^oRe…Nq”iƒ–`l“nˆ«w“´kl€P^zRk–n„¢v˜±g‰^jƒUWp;T`;R_4KLGuHr„Eq‚W[|EIZhsŠhŠˆB_wR^ucj‚[m‰Uh•hx’mƒ W:B)E>'.?(</! 5 =- | ||
3130 | @;&6B/AA-FB-FA6@N2;A(>)..$#)<@ELK)BI2LB.QH0IK0WP4TO7XJ@]M;TM=RM?LV7ISAIT<B_;LS>Ha<B[EIS9NS>GWANT8]_=aZ?QWCLN<QS8TR6]X<bZ:aT?WY<S[;RT6O`5U\9G_=FW:HU3Q[4Lf>Ma7HZ4LU2I]1KV3H[/LX2R]+S]8Lb5^Y=Ym=Of<Ra3Ad1IR-MZ*Mc,@e6=T9ER*IQ0N[.Ic4K[-Md1N`1S_/Sc4Ek=S\<Jh1Ig2Kf9Mi._c1an2S{<@yXPZ;S^1Nh,K`5L]6S_3Og5Pe1Nc5Oa5Ya7`l6[s<G}DRW2_h4^o5Xr<Qh-Q_:Sg-Zm6ZzGTi8Oi6O[7`a8V}9Hl9KS5Xa&Or<^e;`uIh~:`„FOyKNxNTlLfvQZƒL_rIK{LUpNXq:]yK_p9Ws=Tk=Hq=Rh7Ni?_k=t{<V„QVsLX|3VzB^iOP8ZpItCj›Zd‚<Rw>WsGesA`€TYŒJNrQ]v?vw3ƒH^šG^~9I|G_fF^ƒD_}DTu?SsD_tB_‚Bb‡Zd{:r‰Eg†?h?j}HeƒQ^{A‚ˆI‰–A€¢?]•AUpEbn<_}:k€?W†DWt<pu;`‚JYzJwyUk‰UƒƒCk•S\†K^|Uc{BhzHdŠ6lŽK]‡?[~4jNqQk—ZpˆKO}HgˆOuŠFh;`<_‡D}ˆAfŽXt‹S[’KsIl¤RƒŽEkNl‰Wg}G”’;fŒEkŒ<€.ržEyST“Enk@sˆIm–crŠFh…CcƒIly?‚O‹ŽK„¥j|“W›¼YzžW„ K„•J¢Y–™CoŸOm’_q›Wskq’FjŽNu‰^¨R€§YlŠjz¥`…¼b•¤œªl†Õqxeƒžw—¬¢¬ÙŽ’ÄšºÖŸªÊ”Åÿ¤šÒwŽq¦Ök¯¼’§ÒkÇâ~šà‹©ÃW¸e‡ÂžÝ„”¨T|r¦¥P˜»d±†¾…›Å•›À~—½|›Ëˆ×ð«ã“±æ‡ Çoq‹b‚‘`“¥…Íò_‘©8¾ÝZÅïCÆÎe»÷}×Ü_Ìò=¡±L™ªT”¦I‰°G˜§|…¸Tœ\™½TŽ›W¤Â®¬Ìª¦a´þosŒnp€/ª¢Jw±1]U@zuN{‚F“»:…ªIYnO„˜Zs†bOxcU^¤WdNY‡`>Wl–tCw‹HŠÄjd†6{…[¨±~›Ö`˜ŸaoˆŒ‘²su”Q–Êp_‡Rr‹ssBz•M›Ä•q—¤vˆTTwB:L/BR=Le4T`{ƒÄv’¦U€¨k^†Tr|J:ZD‚˜\}¬Oƒ¡]¨^°Ïj«Ç‚vV~¡Nt•;OcNavZYlNMiF]qwpŠIKj<Tc*Xj6SiNtŠ>auAk„OsO„¤b¼Ë~ƒ˜¨´ãd„<kf5¨ž\¯Ö½Æþ³¯ÜÏ·íÖŸÒ¯Ýð”yŒmw“jŒˆ–´‹‹²ËÝm¯Ã^uŒ_‘§nÉÔ{•¾bt‡eX}EPsQZv=GdaœY‘¥_“ž1GbFPgR[z]f{€e{UD[EVuHcC\tA^vEcuVay?bzMx“J^{Nb…HLb@PlIv™QsŽPk|GjBtƒG LŽžN—°I‡ Rž¨\…¥]†¶g ÏW‡¨eЧr¥Êp²YzŽWvŽd~šhw qr‰Uq‘bx•_h‚Ux‘VsMdVr•du‘Zpw’¹}¼ßwš®DmUyŸm£´u“§e{…LheFYiATX:<I6ASJe“Zh„Nb{Ei„Bk{OVfhXgFbiDR^LSjJbWY|jtvp“d6G/>;-5)-*- | ||
3131 | ?% F7"*;.+3/8+$?5#2:+>4,<%#H6O=$NH*KF1N9.LB4\@5pH._I;^L<XK8XM<VR5IW9GN<GO5KI0@Z5ES:GQ6DL+>P0EL1FO/GP;>R7?L;:I2TI+rT-hW6YT?OY:LV<QP5QY4Z[6N_:KU4<S0FN/VZ-Yb;Sk6Q`8A\1AS4?S*CQ,IV)N[1Y]7Kc7^_9Hl9JgCCd;VW3Lc-Aa3:X5MV1A[*DU1BW(GY5P\0U_7Im7Ua8Sh4Lb6J^1Bb4G[7H]1M`0Si8Ji<Ia>Nc?Tc1P_2Oh<Tf.Ng5Gi6[h7Zr9Zm6Qe6Vs:boAx~FU–M\dC|n6W@NmEOi<Sm@kq4p}?tzL_‹C^tB`p8]u2a{=VtCTf2Vi.^n7Un8ho@bˆ9cˆRZ~PWvDOv:[f4[|Fc|H]xAd{<b|@‚zBq @\‡XZ}IUuAPn;Ll3Rp2`oF`|HfwA[7hu;\|@_v<k3i€BxƒKa¡DjyLM‚BcmAdŒExGrŸC_š=f{8vLf—NSy9S„O`{-p„DY‡AnuCa8^‚:[p>cz@UƒD\}<m‚Db‚I`yHpANClo;r“rgepZtCnBfŽLX~>\{Gbt?V?byR[}=[y=o|Fk‹Vvˆ`|Ab”B\r=ax3t†Gm„H_„N_‡<ix8_‘EsEŒ©Wnˆ5k|FmšR…ŠI…²HtMy‰A~”Oz•H›H•E{’Cl™Er”E˜W~¬a¨_„£Q}£X…™Wˆ¿Fw«Oz”[uš=m‡F¢¡I‹Ærv•Ki”Lt9n•f†ŠP~j€œXy›e•=Šœi©ml‹jy–c~¢^¥¦P…ÇmŠ¡H†ŸS„®Xd›Yt’is—a|Žb…˜Rm“`q“k’¯mn¢no]—’S‡ Y¶“¬Ç‹}³š¥c¡Ð–“¨y‰£d…´•£x–±‰¸Ë‘¨×Ÿ—Ç‘§r¹vŸËp’©V‡ŽN“™`Šž`~µ\}¥e•¯c•Ê~µÝˆ¨Ë†Š³x¡Õ‡”ᆳÁ{Œ¤_¦¥[±¾w¡Æ™¦½g²ã¨óþ¹˜ÛŸ’ÅŽ”±’¾Ë°®–©Ô™Ùv¾ÐiÀÛ–½ßsŸ¿w×ÑmÚÿr¸÷x£©dˆ³…ˆ´“†›L–K–Çm¡¤|¿¿a“e·Xn‘t‡¢Z ¬F³U˜“Kt|AozKl=’ŠqŒ·A`yo__•X’[uœjjy£‚DfozlJg†S_jM^o_£ÅIºÅZt˜h‡X®ˆ…¸XrwCa†1{-vv,n†Mx€F…xSª¨[¡ÆTœP_MTp5<ci¦Xl•]\yb† o\‡†l—Rf”UZ{SYr9|KUo@^q9UtISrDbJu›DmH†›<{htŒK_tIj{Ny“`[}wmkh›¼to}E|€\Ьpy“¯Áæ¡‚˜zˆžŽ”´†¦ ®Z–±gx¢|¬z޶wÂݵÙÿl°]ˆ¤gФzvVap?O\:[r:L^7ksS {žyTv\Yt3TiGsJf{V†‘Kgq7I\9Pk:Wd@VaABU@E\;JfHJeEFUDRjB_q4€”PßåY‹—S}„E|‹J‹U¨¤u¶ÖlÁÛa ÉrêØa…¬Qޝk‘¾l~ `£u|§‘¤Ì|™ÃYw‘]t”e…˜[ZsJWuPgˆLl|]€‘^n…PcyKPu[^‚WV†b_—’—Í’Ÿ±^’“W€…³¥kƒŠ\Q^FCP>CU<BO23C4[kPc‚_yƒJiyVjƒVx‚IZqF\jAT[?YbIapC`n=GkXf†SYvQ'=1$/4&"! | ||
3132 | |||
3133 | 2/)%(!&&& ))(,!3(8(&/9%I7FD':H0B<.C@*J:*i=-YM0RRCML<BL8JP1@T7PI?XS0[U-EZ6EQ2DL.@H'>E)JB);O)@N0<K+;P3BJ']H&kX,YU4HS@FY:IU7AS0MV1VY6N\3DY>BT5HS.WV(R`5Ti6Pg<GX<DZ.HT-BO(@X,EY,U^/Pc4Q_9G`9M]AI]5Kd7Hb3G_:D[/M[0I`1I`2HZ,DW2dZ+Qv5Fe7V_3Tj6Gl=Af6G[3J_6@V2SZ-Uk5ImDT_8Tk1]o:vw;]‰ANr?Ec6J_5Yb5Vr<Vn;NqAOi>Qi=^rAT{R]mHew<Tu^EjE>U2JX0Sf3VlAlsM\€P\wGc~GW€K\{G\€Pav>^t:S:cyAa€8axCZvBdu@[qJtyGg˜;r‚RaŽGh‚AU†LwsHƒ—H} Xqac€M_}@XoDVu<]w?mzBPqH[p?VyMmp<h~JY{A_p8Nq>WmCcrKNŽ?WiQNl6Im@RpGawRU‚NPsCaoGeqLe‡@[}<\w=fy>a…LŠ@z¢Kg¥M\ˆAQz@SrDpwBd–>gŠKb€F‡GЏ]d>d…Uf‰Rk|?hŒSe“Ib‚JZˆ;„wBhŒBw†Ha†2{}Fƒ‡H}®Po£IjŠKe–NjvP^y;l}8zIe•Ot…He‚Nn|Cw°MsœTtšV~š\lŸRt”]„¢FžXz°]’]„Ç]¤\w•LŒ¬f~«sФN‡ºSx¤@‡¢Py¬Up£VŒ¡Yy¹P|·YгYš³Zp°Oz“<z©T~¢ss”Tq™5gIo™SqRžGhŸFo‹Bz–Y~£No¥[i”Of‰Qd’O{’bd‹`ˆ™n˜·~©Å„äQ¢ÅSr¥U|“H~¡TzR‚¡O´d†Ïn•´^vŸnt¤Î‘–´‰o¥av‡s•lˆ½oy¥d–®mƒ¢m”ÀrŽÁt ·|¨s—˜]”¯a¤·kœ°i™ÈkÁm¾kŠÞ^’¿bv•`ªgª¿l£Ãr¸Ï‰¶ß^¬Ù|¶Ý—±Ùn¼Ñg³Ô|˜Ð†§®pr›‰ƒ“¥¤¼ˆ«ÕˆŸ¼g™é‚¢µ\u±|«‡—´‡ û‰Œ´wŸÑ†½Õ˜‘°œÜŸ±ÐŒ–Í‚…«Z ÎnÖb¢¶r½ç¢íÿ°·ýq•ÆlÃÜd›Æg¹öu«ÕcÑi””`£ÆdÂÀeËß[‡¨S·Íj„“e—˜t›aUkRaxR…›|[r1Yk;QNBzZ¤¦HŒ¡a‰¤‰“·cf‡\y‡lœ¹a¡²Qy–Zˆ¤ ~œh‚Še¶qsŒe˜r¥Ä–ˆ£z| Hx€<¬P‚¯„`ƒX…¡Iˆ²`X}AdŠEnJ±_…ou¥hXy>ZwSz¡GGm1v[vš_{˜UjoŽTq‡Li€Gf~Bk†Gr˜Bn„]¡Àr‚‰W•€Ž«oƒŸsu”€y–i–°p«Çm¢½jmkTuz—j˜»rbƒs½¿ÆÛùކžf fe}\†›OŒ™@•š@‡›Flˆ;\sQYmgSYVGVLuK\†UnWo‚slƒhdw=LR3GS6HP;BI8?N-9B7ayE\q'JX7ZmS¾¿ˆÿÿîÿÿÅãíX‚šO|“Vs]wžrªÓ{½xŒ¿š³‡ž¹”§±etŽhtXzˆYqƒt„¢Œžµix˜QcˆY]}Rj~DfvHh‡Je„S`tQSjCKk?Kh?_xCl™Ry ‰±†wkv’a”imŒa[jHQZ1FT6Tc8JT'5A:WkV\yfl‹[r~Tg}T^pHTmJiF]r@ZjGe…Mm}@`uKOpAFaI#&#) | ||
3134 | $",$2$%$)5.97$4;,0;+6:&;9'I:'_H*RG<LE99K8@A4EG2LD6TF1NT4FR=BL8KG.HF(DH+O?(?P)BK,<L(AR(KK(JR)LO/O\9OU<KX9UU/Cc1PS7CZ,AT2BT6IR/DY*FP1MX4Je7GY<CS:;X7PM1A^+FX,LY+R_'Ka5N`4RY/K`:J\5H^8K\3L]6Ba-K\5Ia1?`6RX0Jb0}a3\“GYyBQk>]p<Uw>]l?Iu4Wa8Ae-FW0Na,Fb;_]8as.dtGTKJtQPiBRc3Li6Ij<Uh?JpCNf<Xe=`m8Mu@gh=[†?iqCs…NT†LQp1me%bƒ0qHp‹?mMn‹Hq…<]xJTx;]fBks9v‡C^ŒGqr;lDaGhƒGd…G]‡J_wOu‰S`NU‚P\s=\vKiƒ@xƒZs’igŒZ`„T]zFJyHbhCc>vz@]J^v9im<ZvASjGrpFX}:nb7Qx9gp<bƒCar<bw7]n8]w3Yz0]u?`|:h3j|D’C˜Pm”L]?WrAht>t‡ax lV LZqBi„4Ls6QqE\sBYFzJb£pWSb};\‡OVA^~Nc“F[‡=n‚F_Ž@v~S†SŒ¤Gz±N{žMŠ«fÀ\bŠQz‹Jc—9cu=[zC…Rz¢^jˆAˆ—Et“Fh‰Nb–JjŠIc†Q`Ž]w„Eu•ov˜ZoTc¢S}«cn•L{Q…›W}•Yšbu¦e~–[—O|¶Vv˜M~•Vu—xS«Îrz¨M‡»n|ŽX‰Y´SoœD{|]q¯MzFy¥T{ša…IqHz¨@‹¯b„•DšL“·?pŒL†“I ÐK€¤D€—R‡¡^m§ac¯\Œ™P˜¥PŒµP¥V¾[›³g…˜Z~¯V‘»l¬w†¯rq«Uo‘Fvšf|Š]‘£St³[’±]”¬f|¥jq~§V{¨P~®l £w…—•†°vneŸ|œÒh|°†Ž¸aªS¡»u³Õ|…Åz¤ÃkÅ– è±Å“¡åv¬Òs“¯r¤³l˜ QÂF·e¡ÅŠœÒuÅka“a¢‹K£Rt—[|€qµÚnŸ«nŒºv›±vÊ‚“°‘†«n§Èk‹¨m½Êk£Åd¿ÙŠ¾â¹ºî“Çøuàÿ¡íp¡À|¸ÄzÒáv°á‚°¬d²Înž¸uRcm‡u‡c«Ô‚¾Vtr6†‹NupWµ·Kƒ…Eœ@Œ¦}–’jlp\ÁÁ~}–tx™Ct{Ed}dYo…‰ˆaµksrµÊr†e}Ÿh^†°i`oVg‚j~e½aUiOlG”«pq^y‰NU‰:\‚N`}aš]gJVh8E\ICXG_o-Zx^|£b†£tsžc…¯`z“Y™Gb„AfSvšfˆšYthžV©³ušÍ€‚ª^‰šVp•c™s”¸ÀºÜ‡«Jg€Qm†z¥Yu†níðÏÛô•§WZuV\jN€”]Tqmr‚]atV~‰P°žNnx5Zr4upEWo[XoH\kEG]@BO@Uf=P]5R^;|}3S^1Pi5hq/?YU…™Zìçg±µg“§²“µÿÿÿô·ÉÎÒ{ÿßb £Z…¢]ˆªl{ c{‘khƒzy”ŸŽµq~‘Xd{Qi|Vk€edƒgt˜k€œNl…HKd@GcH\pDKcLdzDmt;Qh9_p9`l>UpLc•w•´—³dx›Nf’Yt˜VoŠHm~Afu6U`5Ic2JX.CL<\qL`z_v^lwN_hJZi=TcMe}MhƒGk…@d„YnQd}CUn=Kb= !+ 3#"# ",2(.401$.3&6/$0:=5!Z6#];*V<8DE1DA2E8#J?+R?'HY+BO9IF.HC%HI$NF1VK+GI,EE1GH)MM-@P(CM.QN-G]2LR8JX0MQ2L]3FS4@S*=R0EN(GT'MY1JZ.G[0\T1Le8JW:BQ2PO)Q[/Mb5J`*Hb/D]4FZ.W^0N^0Xe7Vh3Sd6YZ5Bp0K^=La2Pe1J`)Vc.gl:JŽNOnJPg:Sg9Up>Qt?\o@Yz8Pq<Ie2I_3d]-_m1Zq>TtGXkFbpGq{;VŽ<_rC_z:Wy<WjEKh:Wf6_p7^tP]t6[zH^~B`„JTX]o;Hr4^i@pvNl“JiŠScŠUayRivKWIEy7ce@~xE`ƒR\pD]uAJzNej;X~MRw;ToBz~@w“UP•Ibi9e‚=i„EgMiyQ`Mc…DN€H`cAd{1hyG`ƒDkyQgt<a<rn?\@\uB[sHb|5[ˆKTk6Li>Xm=]m;i|DSAYl>`…8On=Zt>cvDawHmZ”^‚¨Qy˜Oc‚LmQ~ˆMf–aY…:_t<MwIet/T„@}sDjvGX‡VPu<Zt8v{E^“<\t7V€Hb‰Tr~EcˆPcƒ8pxC^˜\Mo“Gn”Hƒ€[ª´B^¥Te|fvŠ@us?z“9z ^yˆF–¯Z_¦W“‰R†ÑKg§Uk“S`‹?‘žDf¡Ht‘Fw£GlŸI{KŠ¡TŒªZ—Ãf´T~²Q_˜f–Su”Pc¦Opt^k–7ƒ”N|¬L‹Ÿv…—Y¹g—¾j„¼k‚—a~³ZšSs¶av•Ož¥_ǰM—âT|¢H’¸O‚´g•œs‹Çp Æ]±]}›Q²kˆ¼j{—^‘ v”®Lй_¨g™¡a†¯j‹¤f©gx¤i–©m†Å†˜ aš¼[ˆ¶Tƒ¡d£ÈX˜¸I›×d‹‘Ss«Zw˜UФV…¯aŒ¡_‡¬YŠŸ^žN§Ám£d~žMn†\šµJ˜¬UÄh—¯_|¦jФp°]¯ršK~¢ux v«¼’Èw–±t¾…űÒp¢Ãf¢Áe²Ëu Îl¶Çr®Ói±ÏK¨Ñƒ˜µ^°ºoËòi¡à•‘Çl…ªjušV€™e|˜‰¢YÇÆ«åw±‘’Æ«×wÁô„ã„Ûï¤Øÿ¶»å‹é霮ò±Ô¯Ñÿ°´ÿµÈ¢°ß~‹ÂQx‘J›W¤½ÛÿwÀÿ\£¹UŸ·W£¢‚‘݃œÚ†·}›¹m¢®^ÃÙv›Sˆ¥T’F…L]€Kk‹ˆQŒe_iI†©r~¢_‘¬L‡¤k޹Xg‚>u–K|¨ejbgŒ;x˜bm•|m›KmŠXXn:\†Nj‹LDhGH]@d‡Fo†5eŒ/NgAHcE\sJ‘µl„®L^€g…¤j Óu€¾KmœRz°k—Çz†¼f€¸ršÀvq©r—·hk’Zj‘T†·w§™Œ´¨¾g˜½^b€Sm‹d~³r_™ËZ’vQkYw¡>dRwTb|:?TCbkF[dhˆ£„Õì†ÜðqÃÆRV`=>TCJaA<L%8L$6F5_s:KYJ[g|¹Én³Sjm9k~lÿÿäüÿ¿ÁÑŒÜÓ…¹ÁÃÑïÔÿÿ»žÂ´»Çˆbzb™š_ž¥Rp€ERdIXeMkr]PgXd~PpƒJv}LitOawRd‡dl{TYp=Ub26I5;U25N;IaM}…DUd?SkMe~;[xOeŽz³sršX_†O¢PwšW|“T{€@FZ;?U4KW3DT4COBXpJPknd‹b^wIOeTexCXfCYiPn€Ru†@d|KSsQLp^›`rŒb !2!$ $"%$+**"#* ')).10B1K9#P@1FJ3A@4F>*BC&@C,EG,PH6@W*E@0=I)AD/BP,>E0H>.YI+QJ2HK3<L,CK-EV0?Q7LQ(MT/HY1PV4TT-WV*PS(Ma/Fb/B[2JX3\W)Ns5S]@J\2K\1MX2Vf4]e6Fs7]\8Tl/Xf0_m5bp@Yp<`j8Qi8Pb=I`5f\%\€2[p<`p7hu8YƒJWk>Um6Xj7Wv?mwC`‡<fƒFN…NVw9Nn-lg9n0Z‹N`zMoy:cF\ƒQZ{UOwCXqCWp<SnTTn:Em6dk6^{;Zy?_r>ht@[‰CfwH\‡:L=Yl9]}?j‰Mm`o†Xb†Id}Gm|J_ˆDRt<dp;jwHS}Eap?i‡EZ‚7KzBDf:Tg1dz-n‰U^}IWt;V{?_sF†Ed£G€Cm”@P…Lbs;kBjˆ@PJYp=]nCrxFZv9WxGdz=O‚E|u6R“Jlz8_€7Ks3\n2Yz9[lBtu2`›?^†Bhy<^€Bi…;[F\ƒGY}ia|W_{URBq{BdŠUtyCY‹A`y2\r5\t?ez3l†;qL]{7K‚3_g9M}MRm5[{Af€8gŒOlGc‰Hp‹Je„Qv‡9b`„†I µL›Òn«ŠY…Ev‰<jR`~Gh„dcŒNRyGl€^p•=X“uH~™Lf¦La‹Ks™SfCh…Po€O`‘Q~Cy³|ˆžpyŸWn‹qx{I|¤Fg„@€¢RkBrWˆ¯Fm‘V€“^{¯qªi€º„¸jQФn}®[±Ä£ÄFyÆgF\Oz}”’¡`}ªc~¡Z¦²N…Éa|Ÿ|uf‰§c¨ÊXžR{œQŒ¾Q…ªYšµ]¹Îb†¸hs˜O†žaÅYy¥Dz˜`“ŸMtžRŽ¿x¢Ìezµ_˜¾r•ªc~¸y‡U|®M~”Tv¢`’¹[fœZ’k—ªbd]OkSƒ„O°b™=“£a¯²j‘‡†—p—U‹¹go|KšÁf~›]{¡]nžO|šj{™h˜±x‰±c˜§q´À€›Ào‚¹€™Á‰¦îˆŸÂŒ«ì¬¦Â‡¡Åo°¹_ºÕ ÕœÁóŒ¸Åm¨ØX¾ÌW¡¹_ Ïc†®\‹}z~”\Œ¨\ÙŽ’½p¬oµÊ~ͤ—¯©Â⺎¾v{–q‘°{§¼{‘¿jˆº€¦Øj¯·Y¯n›Á–È’ºæ‹¼ä~¡Ïq†°gt‘L½a²ãp“ÅX¥Îj™Åw£Å_¡Èb‹°pˆµ\™»N µmËöT€¤AuŽLެj}š]}ŒYŠ¢S«OfMœ¦[m’Do•N`vKyŒYr¬SgMW|FiKnGTy.u};{LZv[x§]Sn5Qh;f|By—dŠŸ[œ±e—Çw¶~q¦cޝ]p˜X›m¡Èsxd˜±ee”\^PNh<C`MbnbmeŠga`i‰SjG†™Vj‘ZnRk|G›¶_t’Y‹ i˜¶{œNqAg@XeOe|®ÛôÈâõ¹ Ãm`~5p‹8p~:CS9Yr%R^,^gI–˜X• n«·ŒŒd¿¾Ošž’»áÿ¶Ó¨¾Û»Û잷ŧ£Äƻƪƒ}”‘cmaQ€ql»•Nnx7U`9ZjL{’B`t@t‹Qs‰LxtKrhDpuF`tOO_@K`9I\,>O(3G#7K,HYGNe@P`8UnH_zJ[{Nks—½[c…V•k§SUnI_wEB^6@V3Rc=]j6S]0QW:Ti8F`Nd‡nxŠIvKfvO_rC]ZIObO]uLg„;Rm;8OYGvs€ ~ #.!$& ""&&(&$'&(,,*./3:5 E>&<E,@>2K>/?D*9G-@C*IB,=U0>=/=F)@J0AM/@G,LG-TK-ST6GU29N6GC0JS/JV:OO.LT1MW2MX3T[-TS3QX0Yc;Ke:E`;PY4RZ+Rb;Fb?S]2Od3Z\0Mn3[`8`r7Vr<ek?g|6b{<boE`nClo?_uBOpCVa-_k*nw=d~Ip„D[ƒK`uTVo7PlDcr8kwHPŒLlnF]‡Fe|HM}DNh6ea1x~9n‘X[LrƒJ`˜R[wOd}Ha’EbCL{8]lE`}<Xƒ:hz>f?p}G‰@t—@\VdvMg|Ep‰Gj‰D`ˆJm{FTŽPauUkuGf…Tˆ…L„ªZu—bm‹FmŽGpRmGˆ˜Hi›WaƒHn„;c†<V|6lt?kŽHl?f‘Ck€=ŸŽE†Êo¦Vm…\b‰K}~:v DwŒ^iKfA~„>yOa†H[DW‹6k{Kn’;r`mš@J†°J}©Gd‘=l‡@i‹C’Ph¢Kc€Cd~GYƒDg{G]>eu=c‡;jA]{=~z2q¦le‰9v‰Gd’F[ŠNsuAcŒEv‡C‹Fl“Dn‰Jy5ˆžOe±8gƒ<n–HiˆOw†GcSrB|FG‰«P³VvµvwŽkm•Yk‰G’;‡”Ko§@hˆ=Z‰Aq{FgCk‡L‹’Em¤A€:zšUUŠ=g…@q‡Dg4u“Ky’HmPi‡Oq‡Ržen“X‰¡M‚žaˆ Ih—Pp‰M^FtN‹›Jp‘GpHl•InˆOjc^’Lf“Xi‘{˜kÚ„t{‹?i”BwzFnŸp‹`ˆ´q·Î~{ÍRpmQs’S©±hv¹RŒ¡PŠÀe“‘L‰©f›·¢º·‹š±J©¿\ÅÉS¾×S“‹H•ýntŸJ¤F~¿|tŒWŒµ`ަYªaŠd²W€?|£A‚”f…¬Q‡²N•²a|ªR}”9šQ©Ûp›¹r”Þˆ•³‚˜L•P”¬Hy©]{ªX˜ÔT‚¡^{–G”§PбcxžTާdŽºez–`yŸ^nTp•YЧ]~Ÿoˆ¢n˜Ëp¥¹…¾Š¿nŒ¶•‘°rË~ž¶‡ Í{‚²{Ž©e”¤kš©a£½V•©]}T¢Çn¶Ñ•ÍÿUªÔw”Ó²ÍivœU¢«n›Ài¬ÖV¤Àƒ€±o~´^^„[c{Zn‡o„›V|«vºÈ|ªØuÏá’±àu·f£]†›…–°|ÁÞoÝú‡¿æ|ŒÂx“³w€°X‚¦h½zØœ¾ÿ®—Ån§¿^ƒ°s˜¿T¨S Écz®Sz™J[‹sk¢Ve}T“QzicVb{N_ƒJmŠNm|Jq–Gq¡JjP…¦Og•Wu„Kn›Tƒª[¥Ãg´è‚‹É}©keŽ„ƒ§c‡ª`‰±]´rw£pa‰d†Ÿn^†BPq9Fd&FW:dxFj„LrŠPyšIl‘Ujˆ_]‚Sx•U…©Qm–gª~—¸€–¸mp…gŽKb|Kt“Ah€;`}us”¨Ãœg—dªZ¡Ìi‹°G€”?azM‚™]›±fžœcv‰cfwXk€p•œ‹•œuv†–’•ˆŸ¥¯…¥’©†_u‡ ±u•z]šuTžxP…ln°˜™žg°[“¨Sn…SmzMhxX|~Is~KatDdwTmŠBcu4[f1FY.?R*6L.g}?o„FioDSiEbŒc²Ï\¢³_©¾iˆ¤V TtcFcRp‹9_o+;Z'?_4Ok<Yo<n}<\oFb‰;gxLv˜iz—_y•Kf?Ja>JR5PgJZvNkŠTˆ¤<en@=`vz™{ | ||
3135 | !'&*"%%$$!*#&(%(&&-(./-36276?7"E<(TD*=I)=G8;?'<G":E,:G+5F&AE&BG)KM1GK+ZS0VT2QY<JT2UQ*_`.d_8_k0\_9_c9Uk5J^5QW=SV:[^:Wa8^`=Nb7I_2WZ:X_3a_7_h3ck;Xo6Xk<Ql5[c?ne6n;g{DpyIi|Ax„LvLZƒRbq>Tv=ci?V{BWp<dtOcxNTuCRkAbh;r‡Ck’Y\‰RV~P_rOL}HTjA]s3n~<cŽQS‰RYUiƒQYŽKwsEaNPTQ|>Ov<LsCXxHU„KYyE_~>j†?_ŠYcMpzFuˆGdšFT_rtJm“;wX}…;~š=n•XnŽH\ŽY]ZW‡Rf|RrŽFr‘U{šS`¡gn~BhŒB^…\o‚I€›?r¨Mq˜\‚˜W{ \u^u—q\”hj…\{—F„¯G‚°ap[_‚IfzNi}B|TWOanFeŠ@bz<j†Gw—MZšCt‚Q^¤WwƒMg]bQg‚Nf‹Hsƒ_|‹>sBeŠ@€<j˜Hœ£C°´R|¹El–Nv”Dx¢[qœYW‹AoyBX’=rr0_ŒGw‹Iy—Rt—Wx–NbJrˆN arœCr‘TcJ^|BiDs™D†ŸCl¢bt“UvŒ\qjg–Yy‰LsšRoˆKoƒGcŠ`d{OsŽ?3p³Uez=pD˜«†|¿o€°{d•_r›9q—=p’Dy€D‚‘Oƒ®D‚•Tr¸WxŽCu©FŽ€>‘ÁeŒ¬s~¨wh‘N_}HfBt“QjœK|‰Ai–GhŒ5dB^†=މF¯S’‚L|¬ti¢ViˆBsƒB•¬L‹¡M†•Az¤V…ŽS´b—œC‰›SލI˜F•ÈEu”‚vKlWŠ›}²ÂsˆÌ{¸f Á½y¹Å¥ Sžºe®JtœL‚¨mšŒ5x²[›·V}ªT€™M’²k¶LzÅc‡²Mw’BŒ«ku‘JŸ¯QwšV™Y€±aw’I}®w|še}Y©^†¡[‰¨OjªWޱXw¤VvšOw³„¥b~¬\çztŸgbˆCn•Ge’H|•C›¯b{£S€ŸjqžWh‘k“¢[v™\z¤Ws’G{¥`y¦Y}žf†®U|™Wz˜_¢±g•©m«qˆ»V–Àƒ¡¼|†¬m‘ºgœÇrª¯Äo×étš°iŽÎ~˜«e‚²Zq‘IWt>yB•ŸO”¢LÈÁQ™Êƒ‘赫Œ»„¥c†©\£Áf»ÑŒ¶Øœ³Ü«—ªn½ñZНaŠ[ºV˜¹^“Á¥Ú¡ÐšÁ…Ûþc¼úh¤ÅM´Ûp»à_Ùð[¥ÂDÄÍD¤ºJ ¼h„¨Cq?c:b}@sžU•µ^¢ÆdÐìg‡¿P‰©e‚§]nfz˜Iv›[q m\‡„ƒ°gkŸOoDcƒJoR‰µuˆ®ki‰<iHƒ¯l]‰9Mj8Kk*Me7RlOtLpšVp¢ax—Qfˆ[[~Vt—]e“k}¬e†£†š¾—©Ä|Š”X\N{Ln‹Utœ=d†Lk–„w©iv¨`ˆ«{rŸ{¥¿p–ÀSi•Oƒ’`s–m}’\qŒW„£IoVs™p„•MYzIq„Z„‰`oyi‚]isQ‡„u•‘`“xY|t\yf¯›‡œ¢vs““£pµ›l²ž\vySM’ŒI„Ly€U}€Tu‚ARsCw”A{…'@VEhŽZ]}P@QC;L\g–³ëÿ¨ãÿ”×øˆ½Øh©Åw›¯Ww†T}£\Œ(Tr*Uq7]}GyšJu‹Fn}FcRg„R\w]\€Vf‡Ux™Euˆ9MSAlxFZqPSxtx™YYl;G[e^Œ | ||
3136 | |||
3137 | *+(&&##'!!*!*($))%(%*-11*5!-1 =/#C9 K@)=M,5C6;E$>F%GD'9K#9G,HC)MG(ML/QR2UE4UT1TV;M[;IT9YY1d^:wlC_gAzf>ZŠ>HiGO[<Wb0[`6Wd7^_ETb9Pf;ea9li5_oB_h=WoAXlA`a>Xs:[lAih6et>g€?p„NX|LW{\auPMy]WhCcpPX}Gct@TpB^i;\n?^{BT|A[o>TuCWqHU|P_tLMp@Vr>RpHMq2Xq@YzF]I@~HRh@ZsCgtC]‰B`UT‡;Ov@Bc<\d3i}9yŽ>y¡BrŸJl˜P[‡CekHf…Dd”So‡\ˆ˜H€Un¤ec¢^[ŒSiS]ŠQY|JSz@hs>wL\’CyŽPWSŠxWr¦Fk•Ms‹H\“Hw…Mu•W{˜RˆK„¦ap³\‚˜Vz¢Sb–G†‹L|¦em•bˆ—\~°\€ J‚œFƒ¥Eg˜_[|:f†An…LyŸDpNt„J€˜=p±[|™Ab’Fk†CeŽ<sŽMnLm‹E}“FlN¥={™cŽJ»µsÛ~«f«™QŠ»LÉ©U™ÿ[v°>\‹Obu@`zBd„<q„Ok[¡¤WŒóT„’NžIy˜NŠ¡Ft§\z›?Ž™D©«YsÀT|›yx¤pq˜Wq’Um€Fx–O|–^m¨byˆFt–D‰†6e¡Pl„JyKl”PiIŠˆS„©nbŽZwxM~©K‰«Z“¹NŠ’M‡«Ix²[qœHq‘Yˆ‹Ly›XwœHg•Hi‘LdxMs‹D‰œB‚«R}™C`–O„Œ@l§K~“>|9z›>”ªCŒ¯]‹¬F›‘VzGeŒ>ŽŽ@§W•ÇfvšJƒ•T€¨O‹®]u·e~še¥_œc©¸n‚ªLÌ<„œ@ Îb£©r‰Ëk’¢[Œºwg„GwŠXš®j½†ž®P}ÍP£”M‹º^~—VÂ\¡G–E|£d™œWžS¬F–Z~£I½êpt£J€Gx¥_ŽœVƒ¯W|L~•OšA‰ŸV…¦Qf“HwŽS‹›Qw¢Nm†I…P¥ÃdW…v|ŽFš¹Jv¥Uj‚DeŒHn•r„ŽO–Fm¨H¤Gtš`nSi”L…šLk¡Pi“OtŽKt¢\qŠL|£R„©hu•[v™I€¤X‘º~£Å’Š·m•·l˜ÁuÊk—½z}»¦’Ás™È}ƒ¸“ƒ£o¢ÏRƒ¤?¨¯^ŸÄ€šÜŠ¬Æ§”ËÀ¶i±ÿyžÈuÄêb‘¿‰ÆoÄŒ¯ã—Â|Âꘋχ~§j•Ån˜½Y Ír›ÊZ¤§j±Ðl•Ñv—½~œ…—»ŠœÐŒ¶‚®™“˻랿Ƀ©Í†±bŸÁT¡·W˜·^ÃÌjÿÿxªé¨ÜŸÀ\Œ¹fŸÇ}¥×X}¨[§Th—QбH‚¥Zv¡Pu™Qu”R{©`f…^jŒZn€R^…Xp ck›8Qo3Jk6^{?[sO…«_hŽcg“`¥h£¬GrSjŽTX~Il’a~§mƒ¸Š¼yw˜Vp•Qx›\z˜Pk“Ei‰Gj•Ph„DXzYl—Vl–]w¡u‚«l¨Ç_¨Vy—St›K\€Kk‹Tw‘Ne‘T^DLr;n“SeˆTg‰QbƒYi‡UhƒgŽc„ˆ[wŠg–j—šµ£i†‘g‚Šu€ˆmNj\n~Tw…XttXewVn–Yi†Uh†A\sQv¡Ž ¶`„›EcuJSZ4NY0EYNRz° ÜáÍûÎÏñ¦Àù¢ÂॳÉencn™ilŽB{¢L† Np’\xPRgCNgEBW9<b6BZ7C\>KeKQtTkKYjRyMmvAPk\WzPYf0NfKTo€ % -%!"! "+ 6 3'4'0$*"% %*$%#$$'#)&$!'%(2-+8"%5"4+75#=9%8;,7@+>A%>?":B&>K-BF1E@)VK-OW/LT:QR2VS6US1O`:EX?RV0]X3i`;_mEhgHXzI]iPck8dl6cg;Rj9NgDKfAO\9]_<Ye4Ui@VeDKn=Oa?`e8bq:`zJ`nCZrBf{CdƒKQuUKpLemAYzDItBZk;d~Bi‚Eh„Jez@is>\=vv@lFa…Q]rA]rEUx?OpKei1Z~=[t6dy:XAQxIHnKTl7ak0bAP„J\sMZyAZzA\i<t„,k’7Y”Fd„\eTj‰^gˆIq}Btˆ=t—P¨—JuÇf]‘av‚mu¢TYXn}De‹ToŽIc}P‚|>|¢Xv–Mh›R_‚ay€Kl’Yt]mŠTcŠMfuEnŠA[Ž[t^˜js“U‹’I}Ágšc—±[—¸z€Æi™·] ÅvrÊr„Ž\ެcbµw|‡al;uEj“MxLz“KbNeyMbuC`x@~‰:s¢Yk“Rh‡T”‰A„´[–SÀ³I”ë“…œUv³aqŒy~œ\’›d§›¢Yp²šh—woŽSpŸ<m‘Bs‚Lˆ’SqšCo‰J|“loœU…NzŸ\~‰H{žW™’L~ºY‡Ž^®…cL—ŽY´ßY~œS‚šD¡¤eËæP‡¿k—’OŸÀSm³S‰’YŒ¹_²`޶q„°\r¦_nŒOf„\šB‘µm‘£dq³wv¥g~”YŸ_•–Y•Âmk²IzU‘Lm—Ei¨Wx“?h‡LkLy†^‰R…²?~™;˜§b‚œL}¨Zz¥Zˆ£Z~’Hš`z‘Jq X{‡:•Ÿ@}®Qzš`‡–Q²EmœFt“]y–W~¡8qItŽN¡š}›ºd‰šU¤_™¢ƒ–{{—£j†±M…¸rP¬;Ÿ_y¤}™®[€T„¡M‘ \Š•V…œZ¥¤Y½^…¢I a¨s’¡X€Œ[hlÍÅ|–³iÇR¯GŽ–QzY…¢?o¦R‚R‚¡[}›Qc?~—Jn¡yk©cjŽJx›bŠÍ¬fšNv’Pe–apŽcp‡@p£NxGަ`x¯Y€ªP³Ji¤A_£S`…EuQq—Nf“?dˆMk…Ud>u›YvˆKnŸPnHr›T{¤`•¯sмe…³q“¼bz¢ky¡e€¥d–¾h~«g™½Uu¥VŠ©_¢YŠÀƒ„ªd™Ôr‘¶w»Þi¤Þ––Ë‚ÃoµŒ¾b¬Ëm¡Í€±çŠ ÒšÌˆœÃdw”Vœ¼a™ÁZŠ©y“»„”°ˆ´€—Àf‹²€”¿j£Çf˜Åp‰«_ŸÉeŸÐz¬c–¬ˆ†«os–]–ºlÂÞa‚ªe’¯ƒ¾Œ³hg„`w™g{šSަlq”Xj—Tn‘P†©Q~˜WŽ®P”²S‡«O›\i’KiˆLqŒDm„@iDZzHoŽ<[„1>e0Fe9VoBg‹^f˜JlMŸfƒ«fޱSu—T°VŒ«Qzb¦\v‘\nO`ŽMi‰Lpž[‚ŸCy Mq“Ce‡@jŽDnœQm¤QY~Um‹l„ªb_ŠKw›OeEZ…Cp“Gh}BOx9Go4?e/OuFOyFY<OtCYBTzMlƒX_ƒLPp]g‚hj|ueyrqTr}WvyIkxJgR^oNlqRh}N\vO]€K_z9RkD\p]ƒlq¥p–±Nr‚=avO‹®X‡±€’½·Êµš¾—•Ĭ©È¯˜À„”®Yu‰U|•\| h} ^f‰YXj=MW8Uj<Ui4Wr?u‚-Rd&D_6EeZrŒ\„Žaw~Xp}7HdH\x\Œ›>bh=Zu]++,163!.%(&'#)#0$>,61 0-!(&&# %+(+ &,*&,,&,..#04*=2,C&07&<7691B%/9'7;)6?#4=&@B/<D*>@'WK-\V,QU:SR9RR6]W1]_2Rj<WX;\\.dh:b_>]dE\f=li8y{6i|@evALy=S\CLc4D\3XT3_c,Ul;Tj9Th7Uk8Vb2Yj9_xBWyGelHhx?n€D\€IZ{J`z=l~=]†KZv7[u.onDdˆEoJm†J`‹GqyA`KT†[bnKsvE^…@pvOi}3h{Fx|Fa‹GXrZkvD^„Cqu<g†7f|IQwIIbEW_6Rl7\h?`x=}Ng˜PcˆS‚‹Iy¦YdžXk‹TjŽIt•g˜¡Ve¶‡n‹išL‚¡S{¢wŒ¡G`š]\}A•~Y{¾Ms•\[–ia{Mh|?y€F€Fs”KpMq€?{€OŽ’>‚—Im–Ev‚PœœP¾Z€©d{§Z…›Ot¢yb‘bu‹Bq”Weˆ]_€Gg†Nizny’Chn{‚Dt”Uˆ£S‰¢_z©To”P}‡@ƒ“<n¢b Y„¦Xn“Raw?e}htR•‚PˆÆr«i|—Yf LŠ’Xw®\f˜TiyDlŽZ‚›Bƒ¡M”³PtšG€…Gp¨Xj”jƒQlYmV‡”>g–\ƒ`nŸY”{jˆ«{™±A]šŠ=h«Xžžr„˜t„Àet›až¤oœÀŽ‘ÂjŽ}§±_hªPYˆQ^Oy„keVw}Eu‹I]9o‚E›Tj¨c“^o»N€¦L{`x‹Ov pvªxrŒMJ‚“Q^§N^nBf„QqGu‰9Š›dm¯ow’YŒ˜XzŸ]v¥UÉÆi²ÿvŸÊU|™PfœCxGˆ«Z…œU€¨d„¯K…«F¤´t—¤O„®Y‰—=p¤Ke”P’¢C‘ÍUyŽbŠ®[{¬\‡¡ixN‘ fyÃvŠ›Q±ÁA‹¸d‹±\”šN°¾_‡£Yr£M“R}“V~I¨mްb†™E‹[‡´\u›Ož©L§½;šÇuzœaš^ˆž_|±?•Pƒ—P‰¿J{šK‡œHvKœ>… QsœVm“Im?Œ Kƒ»J€FŒŸRvRlŒT‹ŸDf‹Ou—Hx‹TsžO–¶y‰¨Tq¡Bl§>l‘Ah‹EŠ¢T|ŸB„©LvµUw\|¤RpSpšJ_ŠKlƒA¡ªTŒ®eªaw©_£c™·QŒ¯Z¤cˆ£dw±V~ªi|˜J~¦P~¤P|«^Œ¸h¿c‡®Wn¨g«f‰·t†¸f³oœÐv•¹r‰µu¡Ëƒ†¹lŽÈm‹¬s‘¬P¯ÖÈq°†šÑn‘Ær§åp§ØižÚY‰¾d~³qŽÇg«ey§fk›\n›_s¥€n•P¯b¬Õ~žËƒ‡µX¥_š¼l¬M’¶O·U¹Z}®T|Pe‘Ki’Qn“Nn’Vr›]i‰U{’Sy”Sp˜?p”I}£Nh‰Bn‰<eƒ>iŠHqœ=b0a„3n‘>\ƒCg>i‹RgŒVjšZsš\v§Ns›` ²KpŒNxLuŸJo”Gw™Pm™P|¥b‘¾aƒ©Re’JgR|«Z{¤Lk•KaŽ?k’Ro‘Zh†If‡G]ƒM^‚9S~?Fh4Df1Lo,Lf*Il4\x9b€:Wy:Hr8Qr;EgAEa3=S>\{XKtˆCIa@Ld_q‰Jb{HcvE_xMl‹Q\rJa{GYuHMr9av9SrBe‡Qn˜}•¾†½Ã`‡˜ir®t‡«w¡Ï‡~¤„x™beš“’³’‹Â‘™Áj‚©Vq^hhp‘]nŽP^y?WeJg€Kf}BY~]{”Ccv,D[6AaZ^€|†™x‡oŒ…>]eRhwmVu\`t=OlG.2$3$('0"1'6&1& :(97:1!,4)-"%'$%"#&(*##*&&3%11'9#(,$.#:2A> C? 9F&L8(OQ>L5;H2A>,<>";C(9?*9<&:>#@C'BE'BD%FF*NJ*PY0UU;\[:jW6md6cm0SsFYa<Sg:`b:ck3dnCXo:_c>[r:duGevFeyHhn=O|KT`?Xe3jo:^|D[j<V`<Kn:EZ9p\2ax7^vIewAdwD`€QUxT`sGo}A`“DeJT~GVn:ve7i‹=d…KquPq…IgƒMr‚B_‰L\AbuDu=›_IuFƒ‡[a€KfxUljEw{=t{S„€Gb~IfwI\eGSi?@m4V\2Yr6PsGkvFO‰ZgmQwƒ@k‘ebbs„DlšPtšiŽ™Wv¬ee™cgUZ}R[}UmƒUv•oXMd{G_‘eqƒe‘\]—>‘y@¨O‚œa€£VuŸYx‡K¤“Kª¯JŽ®qƒ¥TzˆTs¤Lu’pYšT†|`µRWÕvtmJt•Np„Nm”][‹T^zEh~:†ƒB‚žS†¤K„³dsžV{žrs¦e~ˆ^uD‹“Tw¤Oq™FrYl—^p[d”Ho‰?i•Qq‰\s‡]w>¿˜R¼ãO’×`ƒ•O{¤EuˆG{Cs—_£hf™~uŽJ‘œ[|ªH«‹PÛd“AnÜkŒ^ƒL¦Sˆ¢Vz¡gz«w|‘fp˜Oš˜N¢²`©¼‚®Ëd‰ãbWRf‹aj‡^”‹S˜±gr¬‡q˜F`‹Ej‘K}œRlYkDt¡S}ž?qVp…U`ŒIf‚\¦]†Àe€›C›Ä^k¤Œ·`w½OxŸ^g›cz—F~™=y©FY<l|DœÕ]ÃNƒ¯W~˜Yƒ•Lrµ_€›–w¯dwŸbn’OlŽBˆ•Ju˜ao„Gz–Dz”M‰§Qpœ]ƒ†d…§A’œf’±N…©Mt‡bn¢Kt’^wŸQ{¥[~›Q‚‹Iˆ´e~ºZ¬¨£_|¿j†b˜»t—¾k ´K•¬bÂVœLr²X—]‹¢_p¡`wˆQu¢KxŸU«¶}¼^‚ T¡ÅO†Ä`ƒ›\–¶Sƒ˜Bp‘hgŽJ‚OtT–œ[w°SŽœOiªH[„A{†R{¥uz«RtU„žX‡«H fq’Kl‚I”HhAt ft˜\oƒIv–\tœ=o€T¿af”gt”UlIxZs«aw›To‰Fsš<l@€§lw·d”ª``”[n•[x¬junm_‡¡YrœR‚¬bv‘No™X…¡NošO¨i{¤e€«]tŸTŒ±lšÃguª^~¥mÍ‚µev§mu¡d…[x§c|§Y¢´g€°k¿s‡¶m—²qœÔk…i¢º…³ä|«Þn{©Y‚µd–¯\‰²PŠ[‰¿]™¾_ÍRƒ¬r†®xy¨h„´]} Z|³gy£f‚°b«asŸa€¡S€¦Y¥Un‘Ns›QmQe‘Oc‹M|œ`y§O~œNq—EoImšHn”Kn—B`OzœQ{žDj”Sk’Iz“?v•NpžCgC{’Mg’NeŒTl’Uo•gl“IdK_Uu—KqRnŸNw]x¤is Lq“EvY‚ `~¢M_…BaˆNX‚O\~M\€=Y~@\~Ka7Qq3Kh2Vr?x‡5W:^…Dc>]~9Rv7U{;\v5Qe+DX+H[8OuXfƒeužY†£@bwSl…N^}@Z†O§VsƒJi„EiyH[}?^sBjtH‰§wÖÚp›½„¤Ë®©º{‰¥Q~Tj‰sƒ¤zk—bq“[{ ƒ—Á–Æš Évz–Yj…O]ƒU_…_tŒV[{EarPj–O^„GR^[xGK[2B_;NiWh~wgzew}z~Ja\KS`J@S?-LELkJ1,3+..+1#5, ?-A7"G:&G=&AH)=9-79%<:"8@ 86 105+B2(E!87,J=IV9V3;<)C>QE H\,EB.WC0XN.NW0KO<NN9RF2ST*LQ2UJ1@J.9H-7G(>?(GD%TC#^T,K_3S[7^b2c^=tl?S€C[fP]eAVsAYm?_f9ep=Ty?_h?`q9_s=ZrGRwLduIa|WluJ_{Cr{Ht„D`{Ijh<\z>ze=s/lC]ˆJRG`lA]|EazNhtAyC~šMl™S\†YZp>€o<t‡Df{SqƒKbvMw‚`g’NoRq€BqNžBfŽ?[qLZpQUlDFoMT\1Qk2ddD‡~H‡ƒS[–VTfEDh?DV?OY$Vl3^z=jt7yTZ›CdsBT„KWvTz|4pŸMn‘X_•caŒvj…cs‚Z~“D€šC§Ul¯Tc~iYvD`nH[‡QQ|PwkT}Œ8sŠli€RzŒQs“cvYœ•\~ºTˆ•„z©g“š\˜ªm¶W§WhÂUc†`j€|p|Jr†On„H˜ŽQy™^pvK•=–—P«·e‚Õzs cU•jvxH~˜Ca«cl}M€“[~šg€¤Wz›[m™]p…Y‚ªRhŒTv…;v™IŽFŠ‘O…¡X´´¢„ã£m›l}wP•KƒNv’U†’K~‰Yv—@бIh§gY„Q|…pˆ³Xƒ§m¥ªP”ßp½|j³€Š]¨i„šWgšQŒPh¬kŠŠdšªt‘ÓnœW|Ez7޶`ªwžµeœÈ€hŸ\{˜9lLh[}O—¤ug•Nh~<h‹=‚Œ`Y€Kq„H‚œ\”ÉhbŸqb}As‡Fz¡b|©S‰¨JqŸNjœOr‘Z}³Th—1’g•²X„ªi€–PgN`rXu‰BlRy—NfŠG—<•²]¨Uu¡=‚—Y‚‚J´ÞQ¢§G}Ç^|²W§]~ Z|§UŠœBÇZ‚¯MúRuØfw‹Ps£I’T³\—©L¤Øqt²„z†Fx£g—½œ{Äcs•ZŠWz–RiŽP{›GœR‡žSwœ=‹ M{žOrŸX{–Vq“U„ªXžZu¡K¤°X{¬k€¤Lyœ>Œ¥U€¨VS‰Ðak¤_{–M}ž@šQc‰W~™Ry˜Oq£Z|¢XxU«E…–E®Dz™PqžPl•QhˆEiŠMr‘O‰¥X…µ~iMt™MbŽ>mŒPeWu¤Sv˜Hl›Nš£Kw§g•ÈXkœgk†=m‘C\‡Ij‰LiP‚™gk‘D•®V€µHl›Rs—RrŠDs›StŒL€¥YxžJw ^vemFƒ“Tr˜eªm²R’°_z¥P„¡Lw£S’§k²Ë”ÿÿw~º\„lr™[wœ\™·k×vª×zŒ±[…¤^f›is¢[v¦ne’[q¬fv¨hwšUtšXj“^‚¬sd”ScˆIeMyQc’\e•Op–SiŒ^bŠMnŽNs“L^}<`}Ba‚IW~Sc‰LuŠWdŽH^…Je„I`Ie‚=\}Cl‰WgŽDfŠKhKc‹OyœKÙ¯Iw•IcJ^Da…IgI\Ke‚Gb‡Jt“EiOmXf”Mo™Gu‘V_†HhŒNkšUgWaŽJb‰?^…Ca|:\w=`|9]|Aa€C]|Amˆ:^{3c„Fd>Xv>Ur8Pu<P{3Kn9Pv8[|>k~3Vf6Vk6SgAeˆQhW_…Pd€SqŠLjˆBu›l«Äo|“Mx‹Kr{ByuCjrDtj²ßÌôÿ´ÌÙ›©‚UwX]ŠeвSpŠcl‹_yšf¬p¢É¨Ìò™žµup‘giWX†Gm˜]|¤d…§MZt@cFb‘6d;V…Uo€<OdALhJe…`„œi‹YNagY^INI9ME06M2NbFYx]KBR@"PD'IN)TB*bP$SU2UK;GL2FD3HC4WJ+UU)MY/MP*BI%DB&W@#;Y0<F?SD%N\(Oc<X[7dY(ah/Jq<QF=rC.`_+VVGaS;bU6Y]3\h8i_:ra8\b2NZ:<D6><)O>X?$xS*hk5bt>\u<ik<qB]“QgaQYpAOnGVc;r^9h{5a€KhrFZ€5Xo>Tn<JpA`bBQr8bjHfwAr{InŠM^‚VuuHj€FguMw‚EbŠP_„^Y{Kep;s†GhŒHfFn€Kp“OeˆWc‚`V{CkpCrƒDmOc|JcoCtrM\zIigKlByKž…B`—_[iNMk:E`9DV1ST(Rh,am6]z4ruHTˆ\[h:Qc5`c+f|&^‚=Wx<rzAmˆS€šHl_PMXkK]|5a†RR‹S`zHz>u˜Ip’V‡‹O¾¦>a¿eZyR{|MyŒ?t‰HoŒMl†Hk~?’Ce™po„C•‡Kk RrhBy€Ok’On„Mh’Zc†H•‹f„·hq¢mŠŠq¹¹UÑ[ƒ£Gt£eu‡So]™i˜Yy¥Mj—_}Šf‰o·^v—X‹DŒ•>a˜PX;ƒˆ=rSwš\n”Pm‡X¢¨M|pp›Iƒ—@Ž«Z‘¼]§Y£œZpÁcw’rˆ¢\o¯>’JŠ®UdR¡‰PÊ~¦²Z“ñ^‚¥`‰¨H‡»Mš¿Xxµ„†©Z»„n¸~}ŒW¨F€Ám£¨o„¡VAŒ¯^À«^õ[…ꀱŠyR‰¤Wq¡VƒA’¡w€¥€nžMŒ]g‘P]EyˆEt¦a‘‹S‹›Mt¢Q‰–<qE`”>h’Rb—Wd‘Blƒ/l›?†§KwUhMe‹Fi|>s‘C{¢\Œ¨BŽUžËon£L}“?Z—Nf€>X‚M}Ad…Kq‰Ii‹G~›iw©[{¢NxœLx”>¿è½¬·i‘ùRy‘N†ºRl’@‹Re£]n‡Sk‹R‰š^…¶ƒ‹7w°wÀFˆ¨€y›Gg©‚s}nœLrGp¡S„™au¢R†V‚‘Ré;©Ó>¼âVn¡QšgwƒY™cy”Mƒ³I{œEˆ©Oj‘EA˜ºki”GŠ•C{¬Et’L‰Ÿ^xµ_q›\k’?w”Tc˜S…”E…§Gz¬Z{¦KnFu¥UzEr¤bm˜]qœRm•Af”<‚›=„¹Bg’Gh}=iPf„HfƒCp’DyHg‘>p=›ÎQ|£Vu¡Pƒ¨eƒ¨Oqav§H‚?~¢Cª:v„Hy°HnLnN_ƒE_…Ut—No—OšU’±O}›Pw’^€žLœRw§OyœJl’ZwžZy c|¤gu¢U‰¬Qp¢br˜Mƒ³b¥w›µ¶‰ÁZv›R„¬U‘²Op™^…°wx§]u˜ZhD^ˆ8q†Gn‡G†¨Zt¢NhŽFj’L|¡SpŸJ\‚LlEYAr…NužXa€>eŽHlJc‚=]}?qC†›K[|1q‚@c~@¤©L¿ÔJj†Ls—=]†8a†Em—B—@rŒDq”FeŠ=[~?c†?a~Gh‹?g‚I_‰AX~:Pz9[7^„:[‡?]ˆ@\€FVJ_…Bf„Db‡Kp˜Ta‘Hf=Y{KcŒK[†GrŽQn‘Di‹J`~>c>^†?\}>X:b~Jp‹Ec…9c‚>Xr9Vt2Ai.Mr1Qt4Uo-Uq5Y~EnˆFwF{†AyƒCr”Ip‹Et…KhƒKgzG_xCh†t‡ži“]““U˜’S›J†ŒP”´”µè̬罻ܒ£Ki€8`ŒXb‹EHvEL|NX‰l`‰‡zª®–Ìšˆ«Qc€K[xOcƒWf”}š¼°Vg@ay;\ƒ?Y„H\~Vd‰Il‰R_ƒfi”w€¢oq…Q^nCEF6=C:HS7DWL`v^iu_bG%fN.jn6UsGT]C[`;W_<ZWBSRBaO?O\6]\5[X5]^:hd:c]4[X4R\5Rb3?Z=LT-X`-Ng=XV:k`8dz>TlH`T@lY,hc8_pDafDd_6ci3hsDei<se>jf>`kGXZBNV3fO+mX-v]0}s;i‹JetT^rEjp@a€OaqRPh<]dB[s=o[9lv>o{Vu…JTŽKTpKRl<Xo6am9Vs4Xp>cq;rDs„Jj„Hc‡JUyHVaIld:Sw@hq[f}@S{BblBexFe}KX„K]sGeqD\†I^€O`}Mi€Bˆ~@j–UmxMquAyyHazAf}EqvMonHˆO]€VZm<[l6U]7Ra.Qh+jl2W:YlBdp@fk5Vr3bn=_4J{OYl;_6q}Am•DeWZP[s;h|3bŽ4b„@g€=‚†?išIpŽN‚~X[¤Kg‡g|>s‡8yMdŽM{€\t–GS‚VjsF\ŒJwƒHh—Uo€[€‰Ao‹Sp‚L•C¦žQ™¸Fp¯Oy˜krœgŽQ|¾i˜ªig¼m„ˆUˆ£E‚¨Yr©ck_n”K’ŒA¡¸f‡Âk‹°WŒ½g¶´_}Á`pGY™5ovHZ~QrJf’Tz˜Rb„‰…WÀf‡_oŸ]z‚g}ŒZw‘r] Wm…DcˆZ€yMdœŒnˆažœ.nªs‚Œow³‘q m³\¦Á_~Ãt`°‡b‚[ŽT¦}¥£I±n^²rNtW_‹ªpu©hžb‡W½Ÿ˜ÒXĹUš¾[|°WvˆOˆ”Qœ¸T}Çc’œK½Q‰¤G‚£Rz›V¢°KŸ×S˜«YÝpqŽg…–VY£I‚3b=Y|9‘Vj“^oŸgu”Kw«Pz¶6¬]€§K…®I‹´J‚ªo~š[u›@ˆ¡Bw¥>i|6gˆ<\ŠLq…;aŒTg™H|ŒPˆ£_r¢[y˜H¥›©en´“uKd„]„”D·Qz¦WqBzœG^‰Zf‚\o;v˜U¿¤Zk“kYWt‚7œZ“®Hy¬jƒ ]ÙØVÍIø×Pƒš_r¶sg£‡Rj¦O_>t‰Hp˜Jo˜_‹Kz™f„ŸKƒY®d|ÄL†£L|—a~¤Ll‘M‘¯^o’Ri“Cz£Nx Kp‰Lw•Mx“Pu Si‡CcŒV`†KiˆNl8iRd?g>f“Hh‰U}žLb@—NzŒBl;m“GfFi›FoŽ?k—nx—VqŽWiœlhUšTq§cj’Qw£X}§Lc†Ly‰WA™©KdŽ>dŠB… Ci¬[œ«_›ÌVy§Xz§[y§TmŒW]ŠNe‹NnCdƒLu M~—T‡¯Xv®T|—Fx›U{™S U„©lÂÝnx¡Nƒ¦[½Xp–IzªUЬPpšFƒžA™>i‰I~—K‰ e}¨ZŠÅI|¨JpšV†¦Wx’E„§Po:y‚L|…S’J€›ErD;cu9{‹Iƒ•Ll‚?o€LC‚ÀÿÿÊš»Dn‘RoŽ?uŒ<hHqJr‹KtE^‡:[>[E[};a…=dƒAz—<h‡5[~/Z7_~2]@e…9fƒ7i‡6^ˆ9a‰I{ =b~AT€@f‰FjŠ<cˆ:\|@^‹D^~Cj…H[€?nJ`†;e~7\y<`ˆBi‘<Tx8[|4`5a~-Sj'Xw-Zq8av7dv6fF~‹LsKz„Kq€JhvM““R©ˆV}Lw…ApŒH~‘\š™d˜bˆ„ZŽ’fŸ—_œœh³¿Ž¤ÅœÁš¤²ku’F„¨2Bl)+F"-I!Vƒ3W‚GJf^c†koŽeaƒMf•He‚Vi}Q\€s]tsJrS[wEJh;Y€?Pv@Cc7JjNR}T`[^‡nTuRG_OOh?PP*3=A[`@MUSGYSJ_CvY6po;X‘NRsZRdJbWBe^6of@maDen<_k@ab>^\5f\9id;mc?e^@UeDXd;Me9S\4WY-W`?YY5]e9`qEaaHeg>ai:yfCozD]tEfb>`l:_kFn`@rmCmm:YrHdjCml7oh8oi8eg:auERLddRVsCbmDdtFVuRRj?[lBVt9lf@fv?l{Ox}L]†P]uRee:Ym9\u>\q<]pBMm@Vl=Zj8it@f†YbwUhp=hy4ZzB\uIVv@Zn>up<f‰?lCXxLSrBMr6Sn=dqEkz=pErEg‡[wzSj‚Q|CeB^vTetGenFcxI[}O_oDce4ql9]Bnt@[?Vx@Zs;ew6TxDEk@Va=\m7]yGX€=O~4brA[…@e‡MX„Cdƒ9aŒDX‰B`|>lx@i–Jf“XŽQhD_ŠO`ŒGj€Kk‚Ws€M~–Lz Px™V`WjyLY‹F‹x<ˆ¦Hv RuUz‚X “H¨Q˰bÅñ‘ÐžŠ¦\’›Q€K ’_†¼]ƒ³OdŸq{Li˜T|ƒYŸ‰YÌP…´V{¡G~§bš¥ny°ƒd¤f““]q·x`’f}AŽ•Lz©HgsOQ„;n~F…[—F™R“¨f}ª[iUyŒG†I~¦Ue–6W§Olo0dŒIs€Fw¬Z›ª‚¿_“g\¢Jv~>ª¸_w§}`”fw†ed¦Hš€d®Þk‡Àzy¯_~š@œ”[~¿X‡¢[k›Q•‡[€Å[zq}šiz–t’]ޤFw¶eˆŠN¾cvªnu¬p‡œ\–µX’¤RªI†©ˆs·^—ŸZ€¬T~—Zh™Zw€9gIR€9u>‹I“½G‚˜v™bй]u©Iq¤Ršil¹c„—T’ŽMw§WbˆYoƒ^{ŒFk‡GŸFj”6—œDmLˆž;„£Rš£Ho Fj…0~MgŽRp‡Gm©F|’Cy–]qˆQqŸQo¡LpŠMx;t•Dh“Er…K™[t£AlžM~›P†žn…¶mW‚’S|¡|~K¢ŽQt’^o‹FbŒOgCm…Uo¯L}˜:§KÝF¬ÿIŸOs§Nx™Nz–WÂÂep¢Zw“[‰ÉcgŸJ‰¨VšC{¥Eœ¯Y‡®]rS—¼>oŒFl”Ow‚=iŽ@o@gCe7j”Fq-\€Cz˜Li‹>ƒŒHr‘?h‘L|ŒMxœ?zKm‰Ex›BtšLsEq¤Ap–Hd…4_‰AgPn£El…Fp—[j JR}6l‡@g?sOhŽBfŒG`‚]o™Ru–lc•dƒ¦@oFz‰Hh‡>p‰Hf‘9zU‚ž@v¢Crd|”Q‚¥_‡žUs˜Q}¡U™¦kx˜Tˆ¯’Âby°xpšm~¦Gc†´ZŒÇJe’]v¡^’S˜Çqöÿ›×o‘Ám˜¼\œËt”°n‹W|‘n†¥T›²Z¹Yž¥^š¡S˜«Rƒ\–H˜^¾§h«¨IŒwBzpGjÇÀÿÿÿp‹ŽW…Q‹U‹JœMš˜R„Oˆ˜Eq†7`z>|‰=ŠžIHt”Js:y‹=p…AvŒ=o‹?g?nŒA_‰N™³Hš`}¨llŠ<[|3^„DdBo>a7V‚>g’Nm„Aj‘Cn”Ba†<b†>a?T‚AX†7[8j„3b‡6d~9_{3\~=_€?lƒDm‹>|‹EoCdƒH{ŠFy„@…T—¥cš–WšPU’ªqÄÉd—©`‰œ[ޤ\²ÅwËÕm®Æ{žÆƒ“Å‹šÉ‡‘²b˜>U{/Hg1M:PUq/Gj=`iDZoNYvOQsIo‰Re„JEdMFdHSn:E_DMgBi‹M|˜H}’?j+Ok7FhJaˆOa}OapBOeETqAT\)>L:5>;8E9>M2;P8‹`?t‹?`“fRc]VbHi\9uh0|}DsKksPljChqCXsB]a:g[:lk@^nE]hF[d?S_5`a6\a1Ra=Q_:b\4cp=feFtg<\r>`jMdrCWtI[gAab8he?_8|{BfqIYlK_b4[a;oe@pw=`„DhqUXwK_iH\v>_sFPqG]bFXr=]q>hp@f|CdyPj‚Nm}HZ|M\kFhi8jp5e{EfuAYyFDsAP^;Ve,as:huCctSrmFrŠ@b…U^yN^€?ZnApx;[‡IivKOwCOnDLl8[`/_k-]{;bxIeq?h‰MYAbzd]~@_}OVrOSu@PpHqeCp‡IfzJmu:u‡<og^|PM{ANrEeh;[}FMyFElA<i.fY/e‚3]‰TP{<Xs:Zƒ<r|4v’?ƒ—EešL]Ib@k‰:WŠIt|Iv˜MeFr{NtLfC‹{>h¦K›R{®^n[g„Ob„?oˆM{“>z”`c•X“†OnIƒ€C® {´dy´~„‚‚‚ŠJ“X…`j‘]~£bmžc¿‹k̳K†´VžžR°Èl‘È{·sZŒQQrLHn8eyFY€Z{m?n©b_vQaoR”‚\‘¹or®up¢Q…žW§šR•Zi‘[˜heŽZw~K§Id’[«†V†±T‹±GjµK^˜So…NnUu•ez—c‚´W¬…jk´[¤ˆJ†Ôl›HmPn|cš“<©ý“¢Á‹‹Ñ}~¡S~žb}®|Ьvw“\f„\…nÔ¥W¶ÏMÁAo§L€ŽD[¢\–ˆH½`}ÄVi™L”O†ÎkŸ¹i‘»b‹¥Ll Vtˆap˜e•I„¡R‚?n”J_‹Em‰?pak¬L‹œO“´mv¦fŸ`s¢Qx£Yw§e¨’Mžµ<`±Ögƒ¼E¯°]êW}·U~™T¤×Zf·X‘™Rf’_qQ”–IyŒFx“@v‡Am¤HvˆIošRv˜He€Cr›TZƒNh†<|šRl°MjŠCyœTs–MqS|…IÉÿ[h±WŽ’]s³Z‡¬Sm™]²¯>†©G‡¦IvƒFqž@{9jƒ3o«LŽN£ÅyÃßr¶ó¯–ÒO‡³It•P‚¥Bu›q…šK°¼C·Rg—HŠSu¨PtŸR|®Oš¥]Ž´Km›O|¼Y^„:rIv–=n“>]‹<t‰Cr‰H}?f—3|HZ“;hMb†?czDhƒKk–C„•PsFt‡A¤J}¢SjŠKuœPm‰Fc…7p‘ApŒKy©>cFc…?i…B}˜QˆJqŸQg“>m˜Iq‹7s“8y¨?jB—Vv‘^t“Grˆ<lœ;cDi†N~žZ¦×kqŸT‚¡cžØoc“PfŠPˆ¦Y”ºawœ^ew¯^b•V‚©X}¹VµdˆlœÞ_bœ<\N„¨lЬo´Ù¨t¦dŒ¯v¤x‹»i‡®]{©Qq‘Wrši¥jz›\ˆžc‚¢e¡½hŸ®i ÁcÑÅfÿû˜ÑéƒÄ¹]²·V¯¤a¯ž˜·½ž£¤Tš Z¥»XŠš^¹¨n—“pt‚Kk‚Mu‡F~ƒJžœf¶ÆW{†L‰M€†EŒ‰O’‰L•Pu‡HfvC{–Fm‘^‚¨guŸ`z—L^„>_Ž<`„?f‰DiCiAf‹Af‰Oh—GvœIx™@uŒDo‹@fƒ>cƒ<h‘Bq“?n†=Z†:b†9Y>i‡@c‡?]ƒ<c‡Jf‡Ggƒ=b€@g„H†˜K‰¡`•±`¦u±¼lÁÃe‰—|s…m¤¦g´»{Þî®÷ÿ¹øÿ©éÿ™Ó÷z𽋗¿~¨rf}@FX?] Fd+Pc6Mk@VsIfOboDQdT`vNi~Za|HQj?VrEXyJYvPp„Uhˆc]~Z^Y]r<Nd6X}H_„Ys“NnŒXy–[} Qm‚:]o3O],DU2BX/=H0qb1d}?\l^[`P[kEf^@lk?xJc†KcgRht?`v=RzI_iDlc8ks>YlF`hI^d?\g>be=Ti8Ql;H]8[V0_f2kbDcc9YnBRiMQh;T]:Ne=ad;ng8gg<]xG[aMUlB\[:Un:vc=eˆA_†YqjR]ƒG[rK_qJRyHKfJY_;Xn:X|F^|A[{JavVp~MmwN\~K^rLmy8xz5tv=c„Kn~RusF„Ž5N¢<hsMou8SvDilK`ƒEq~Nm„Jo‰P\ˆHmzFb…Ia~R]wA\zD\r9…l5~…4gK^tMri:_Hp~FcˆUO†GooNY„=ZvJ]{Gcq:p~C[„Rtv?_‚?nu]j„FW‰X`zIIy=Ti=Pw6KvEEh3a`-p†8R‰NWv<dx-f†@nŠ4eOh‡_‚ŽPi›Cl‘KnŠ;rQn‘Cd“WpŒHu‘S}£]lZ~ŽKf¬T‡Š]xœdfmkŒT`”VnJm„IgˆNd†Kq…:h”]‹F’¸`Ž´—’›d®[žäU™‡b™¦]y„R}—R‘†JŒ£Sãw‡Öx‘e›¥_k¼vœ‚Sl±Q‹ˆDŽ”3ƒ˜1 •J€’Vd¢YRlFŒh*–¦6‰µ‡‹m}‹;—“DŠÏpy™}±L°¶U‚®a_ŠI„“`‡¸c‚¶L~fp‘S„“giŽDk†>Y„AhreoˆY‚•h…¬_o’…sˆJ˜œvhÍn{‡d¦M‹‰S‰ºy—£ƒ‡¼‹~’jŒ€>§Mo¡S_Kt†;ƒ¨@Œž]yŸV…›O™¯Zƒ§cjžLq“4m¦u\bmŠE{ˆBt›jv–E‹œX˜¢_–¿N‘©Nv¶Pl–Tk„Uz”Gu¢Hn…Cq—Ch‘IsŒSp”Y›ª]h¬apŽHs²PsZŒ®_¦Ms³m~›X†Ws¢s’bŒºŒwœZu LpÔ…{ˆHƒµM¹·F²XޏL~¨Oo›Hs‚8{W€Ž=}¡KgŠ@g>i‘Ig:o„9sŠUk“d`ƒ8gFqŒ@|’=…¥L¹Å â{k‹?dH€‰@~¢_|ªKxŽQˆŸV~[uš@~”=•<„¯g„ž?ŒšcŒÀ‰‚ÀYkšRq’\ƒ¤A_ˆQc†Sl†Ut’ƒ~¯‡yN{Àgi‡Ur†DiVq–S‘¬i~¦Fš¯YqŒF~ƒMu“Qw–N€¬@|„@hŠOmPs‘Bp‡NV{2]}Bl‰?f‰@eEp•BjŒLx•Yf›JoG…²NrŸGz¹Gq‡:j;fPgŠAt‘IbAj”@]ŽEo”Vq–Td™CiŠC…§J^”<qŠGˆ T™¼Oc—NyžR‚¤N~¨bq¡RhšGl•Bp”Qw³ep›TqUd‰Yj˜Kh“Jv‰O޼]„³SiVaŠLiEeVk”j`‘d}¢x¥ÛužÌWŒ½T~®Vx¬[‹·u–¶m—Ê`»M]‰Yƒœh¬VX‚Lsˆ]{¦Tœ²f›_£·‰øÿÀäÿº´á¸ÐôÿßöÈÒò©µé´o›©nÈÐr}“k~—[u–rx£cx‘\ª¯t¤¡f•Dq†H´§_¥£[œ¯™ÏÓk”ˆWª¡Zª”^´ e°œež™SŒHuCfCs€PuPr™QrEjFo‘Ou›IuŒIq—Ek‰>^ŠAgFr¡pèÿŠéôRs—Mr•?lŽM|Dk“EsHuŽOx<o‰Ctˆ<q?m…7e…;v–FtK~”=]|9kŽM„§c›°†ÅÚ~£°j‰hNsTVqPw‡e¾©Ç“•££‹¬®‘¯ˆƒ¹‚¿qˆ·rŒ\]sRJg8AR 8K%8S=Ng]mzŒ¬“«‘žiq„tr„dat\]rZxqŽš_]rXQo_hnuŒNNpCRlV]j8AV<MuISwRXx[`…y‘¨xŠ›`p†O]|@WmCe{<Yq,Jd&ec6Sq>YZJk^AgqDeiIdnFowFi€ThpRcpDdpAouJdqJnhFf<h|GnlP[v;XlFcpBW|?njLTh;V]6c`*lj@\uEWgHVgGYl:]`3Kb4`b7Zo.Rq9SkFsa=]Ž?mvKgDzKu“Gx‡be€URXWkZ_r?QuEUdLag5ot:d‹IcyK[‰M\zK|zCb‰ScvXpuKmˆ@n„Ln‚KlŠR|t\”N´¯QSÜ{apsbz<pkDiŒ@\HhzMvEl”MnŒ\gƒPkŠYaƒPlu>z„Qa•Jz€J:pŽgh…cdzJwMt”IbŽ\UŠT^rAZ|HeyEdr=s?b„D[‰Nd~Fb€HW}QurDe•__‡PTO[i7H6Oh6Uk4yx0|œCpUw‰Dr:q—Op¤N[“Td„Q€‹Cn¢[gŽPgBkZ\‡LYzIp‰D…”OqŸR”tx´PqScŒSg|Sp‚EtŒ@b•]Z€RM|KupBm“CqŠAq“D¢ŽD›Âi~¾s››eƼ”§ó™®Û“˜¶‹•^¦¢T‹²Vv°dÑ‹]™Àˆg˜_wG®UqšNµœc”»r˜Ÿ|¸m½®j†Ú–œ lÁSžŸMu›`’HvÑq”e{Ts°‡}uW¡¡dxœot‰ft‰[t¡@wpXŸ[nÂiŠxWµn}¨myhŠJmvE³€@šÀJ…¬rš—a{§Yš^ÍËNrÀ_Xi_Iyšk«Ÿs†›lg…LzQnfl™T˜œTm¬xm¨Zs‘e^ŒF|‹_Š¡\†ºKlšOt†Cp•G‡–@{›9Œ§GŒ£Kް`¨§b“ÍjŠ«O…³Tg˜Sm‹Mr“Pƒ \‚žJ~ªNm›B|œAm“IhzEk>pŽ@w˜Sh©Sg„DYŽLjMg’R€ŠVm£[”§]‰Åku Xu§GhMy•=všG‰ ~z©s{Ÿ[ˆ¦S{©^k;g„H†‰F‚¤yŽ®LŠ«Zf“E_†;u‰<x‡@nŠVƒž<€–7„ˆDŒUm¨X™›iz¬zi‡:lˆAaJyCp—HZˆ=pS›]ˆ¬\§Ád·g{¨C}‚^s‰I_D…‹Jg’Mu§OcD`’Lc‰2e8x‘K‘®[‚—Zl›Ig…7kŽT_Œ@mˆBŒÄdtš^q˜]vŠAŠ—H™Ql˜K{‰Pq¥Xl‹Ef†Gq›CqJ}™Hc€;q“Gl›Hr‘Cm¡Am—JfšH™W€ªYy¥\{–NršT|ToŒCm‡>yŸB^†F]†7g‡DW|Eb…CdE_‡Be‰<w•Kp“:užwc’a«`yžOmœVpŒMv§Ro“<f”=n“Pmže›’<€¢H‘«e¬ì]{®J‹²IaZi‹K„§P}ŸSгM~¬bˆ´KržSh—Dj‹`ƒ¢zm£b–htŸ^v¤]Œ¼mœ»qÈtm“Hn•C–ºÀYmŒ;|”clšf¥¼—¾\pŒqН¢¦c”°Pˆ¬so˜¡§˜œÅsžÆf‚›k}ŸinŽGz•QiSjŽIlN‹£m’a|¢Wƒ›Z¨lgŒ›ƒ«Åw©¡g›¥qÑ¥qáw¦¡dªŸjìeŸžLyD~‘M‹’Z~™O€žLv”Q~ŸOy–QyŽMz‘Nk‘Io<b‡F€¡‹ÓùÒ°Ørj’Iy”GhˆX|¢[¯P“«U|ŽMwŒOj‰@‚œI†™R¡˜C‹ŽLœQ’™OšV‹“S ®Q“™Z‚‰t£t–f£¢Js€KœawÙ¾”Òà€ª¸vµºb{’M†›Yˆ–QdƒZcxH[c2FU0EV*;N0B:F`VB`‚Knœ]€¦_|xUqpQhXVjQGbY_~pgxQS\IUr]n^g…ENgG\iBKd:G\7NvC[nAPYELei\|iTkLQhI\pGK^PYqEUk=Zw3cf<ThFdYBkh3klDtcMfwD`}NjxSetHclB\vCbpIbnAwlE‹p<nŠNrnSczJ^wOo{AjŠJb{ORx>UgEl^/tq7eŒNbl^`iLgp>bj:Ro<[e:Tr5QoE_l8‚l5TJdp]_„Jv|[zŒGwˆSaW`}XUsH\kA\t>]{Ghx9vŠ:pJj„T—W¢Rn¢ba„^]rQso@j“Oy„LV‘O`z]pKTž[•{^d¯k`‹|`‚Ggp@^=dzSazGyt=^”S^vddwJd†Kc‰U|}Di—Lj„X_ˆQs‚8mX§\~¬MmŽe]ŒRw‰^_•Mo}Ku‹Bm’Jh”U{‘M|œNxžXX—Q`wG‡Kj¥<iŽOcŒZZˆMZwAOt:_j7p1y‰Oˆ™_~§cošgš‡Itºdb¥pb—dZ|Hnv4p“Si”Qe—Or…`x˜Ug‘O`‰JzKm˜Y]Ž\iRU”hR}e~pB…8€žJtTiŠK]z;Œy1‚¥G‰œKÁ¢R‚ãj~•|vb‰\—cx®d²io‹r†R^¢h©–…¨y¢n€—o–_¨ŸR§_šŒbº¿B¿µ|v¼i]Š_hq@Ñ’o‘ñnvœƒs—C”y€Ç[˜”j«ÁIs¥N¢I„¾F‰ž[i¬ws„CƒF«Kl‰E“L}§Yz–pÔ«Ošì‡s¶^‚›ToNyO£N~È’n‘j‡‚Q‰™]¹žHÍᬙݪ‘F{Ž6„K‹¬EˆYk•N™B]¨a„@|šIƒ¢I| OeMSŽ@ey)f‰@r—Yc”]pŒOl‘K–šO’¼\€]’U…£f¢‘Xz©\s£LlœfvK_ˆEv‡BiŸKjOŽ\qž?zœJf’W–7„ÆJv½Df„I…›Rt–Fv¥Dz©A|ŽFz¥Gn—jv¤hešnq‚<x=m‹Hr‘G‚ŠF{Èpuœ[€šSz«[wŠ]~V–¦6Ÿ”?—ªX{™Uˆ™Zx•?nŠ9xS¥¥Bv˜D~”Z€dŸ°\“ÏjŒ«Lž°Nu L|’Eo¡Rg4tœS^xLi„1b…?š¯S¢Ïh„ˆÍq„¡^… B€®Q¤Zn¨5fz4ƒ™B…®Du˜Tk‹Bwˆ@„–>b–PoˆFdO_8mˆEc’9bCn˜[oŠ9l‰>k“Ce–QjS{–HqšC^‰A[‘Fiƒ=eFuŠEt crœPašdsOtšR¾c_Fr‘RcLw Sq™MdŽLi‡I}«]ŸMl•A\MW…3WyC`ƒ:Y‚,Yƒ@d9h•InŽBiH‡P´Vb†4g†jv¨Hi‰;h7ušXršE|¢Gx¨W~ŸN‘º]‹¹Z€dƒ´zt¦VhZ_‡A{šV|Ÿ`œ±tn§_v¡`«Â_q®[i“Rl—Mu¢d„«[g’=nMv¤T€¯ey£q{Za…>^sBY‡[Tuc†d®Ö`p]¨‘¸rƒ¬SŒ¸o¿è®äÿ§¿íz™ÃRŒ˜|³Èe…¦]‚±_‹²Ol”D\€EY€A]‡EkŠAiŽHd€Gf‹Gj”PvŸZpšTl†Zv‘bœ¢l£g™¥k m•¥h’£n¤w©`ƒ–R“”^‹“Ps‘Mo—Pr‹On€Lv‡VsŠQy‘T~•Us—Qp–J}šd¼Ç ¡ÁTr‰Bl’X£S~¦n“¼p…¤b‡¬Ry™S¢¹UšŸZ ©iœ¡Z§¤QŽ W ±e°¯n¯¯n|—pœª[«£l³Ãr¥¼‰óÿ‚ÌÙk£Œe‹”|´Â²âæ³Øì®ÈÌh›V¥i„–CYk=VoMsB›D~–7Mb'AQ0=T71D3'?@7OVAYE:ZAIeOg{Lm†N_uQh€Aq…?j’Z~¤`j{J`jITf9CV5C_@[pLb{?Yl6OhGLpMd€?f{AYk<<P><V<Hc?RrFne;`oGmcCjt?hgE‚iGlL^cVq[YeGZe=fmA_m<_xIhlGf|Gf[lqVlyIj|Uo‡Lp†Q_VM~LRkKYd3\l4a€NYy\YqKnkEl†?R„HYfBSy:OlHPi=Yi2MzCYiUQ{DfeEc{>eoUhvTixRS}IboDc|:iKp€FnŒLl~PXQxsQ™‹Ki½wR‹lchI„xDyœRg‡[Q}]vmRr~7R‹dfyYoEU˜q\wUsr=eDS„SYtEcrDavHx|U‘CbµYa}YyxAaŠPwS[žVu~R~•J™ŸeyÀrožqi•]~Or¢Kc—Ub„Rb‰SYar‚Iƒ•Tr¢nXœhazUe‡Ae›M\ˆKqƒNeˆTOƒAaoCh~1sJ€ŒQ„šNªªbZÈtZXmvVp—[h›WeH^‰A_Ad‚E^GgBc’QV‹_NvNWh=`ƒS]‚I_t9h…Es‚;w>‰Gj Xy~LˆNxL{‹Cn•UŠ„lŠªQs®‘}…_e“Zb€S®€G‘¨hr®[f˜>h|?GwByj,u˜GzŽ=±‹I«Ô_¼®pÂÀn±Ét– blyf}f|ŒGs¥B´†WÀ益ٜi«w—›IŒ¬Œ§a§ÃSx¼q˜L‘Æl[fƒQW}>mx>¨y[‰È]ŸFƒtDhœW›“R¤¶Žf°ƒK‚¡^oŸL¢qX’€Ž‚b»Hri{“S¡”n©º~î«nÿgƒœH‡H‚§KŒˆ__¥[fvQxA_wXzŠ@pÄao‚KSo¡C…œG©I¥¿RwÃ]{šKo™Aq¡SV„Q{ƒE€X¿ŸPˆ±gq“Xd¡PZŠFo‹J| <ˆŸP}¼Ks’bx±`zªJ_¢Pi‹3o™Z}ˆJ–±Gl¶KcDsšEa”Lp§Rg§Xc„=dŽ7~¤Gw4{ŒX‘ M¬B‘¶I¡W‰¡@x«Dƒ˜C‹§IœÅf“Ì“®Öh—Éwæå^ƒ³U‡ FwœI†ŒSŠŸ]hT…”G™§@s¯bƒŸgÈ\Ž–Q~ N©aªÿskª>s˜Je¢?o•AWŠEy„Ux¨lt›?xŽT~¯S‚¬N…žWoL|¨Xq>k}Vo‰Cb–Mr“Kož[sš\{@uŸPh—>fŒ;`ŸSm8\„Jf€HkŽ@€š?]…9S‹7X}7`€Uf?n‹8a‰?^‚D[ƒCkˆGg–:Uq;[ŠEXu=u™Cv•QZ‰=f„?m§Az—OmžLj‰9‚¨A‘¹\s–Tx–Mf;^‰<^Š<Pv6n9j‡Jr”?f„;z‰S‰ÌNsOX‚E[}:e‚>d’ElF…ŸO¸IuŸ\Œ²a~¡b¤¾l¶Úp„·Yh•TtŸam›Ed’@xJq“Xk‘fb”b‡•V’¿aƒ³}q”BW{=jƒKƒ·Z€ªdnŽAWxUžggœk]‡_m™@i‰>i‚8\l2]q3dsKtƒYy§_p†c~’Z… IZAaŒ`“~|xmRad—‘´y—\‡ ny¡XcˆFi‹;e<a?i’B_†C[‚CY…<f‹Kk‹Ebƒ;l€Hi‹N‰Ÿ]‚£k†˜Qn^kNo“Wn^Œ±ak^‚¢eЍLm’JlB_€C_AŽQu•O|“[t–RdŠQƒ‘Sƒ¢^£´‚žOy“?m“Z…›m«²n£¶p›¼h–¬W{‘_{g‘ªo”®ZˆžaƒWˆž^Ž«q™°u¿³kƒbŒ¦gu„u¨Ú¸ÿÿÄÊn¦—c¦}”§³¸ÛÎéø´¦€ˆœq†Ÿr‚¤o¯ÇY¢¬`§Ä–ùÿªÿÿ~¿ÇEgv6TS*GR!=U'Up=k‚Dt0^vBUrVi‹FKdF`{S|¥Nx™ZqˆOWnRVfPhk>M[;I_K[}We…EaŠ?c~Gkˆ[ƒ¡a|˜Wn}QowWv{Ux‡JfvDWc:TjEkgGju?W}JgiJiz=^‡^cv_YnE]i9ns9b‡Fg‡RuMrˆHg‹VjnVp‚FbˆU_}Ty€Lv„KV…NOfJRi:Tk7UlAQlOXkEkrCmƒBU‚ZanFVq=MqCNf@Qd1Lf9`^:Lt6R]:K`0Va9SfALkFHkJ`eEsy;iŽKf‚\m†Ot‡QU€PUiL‰f9hZL‚peePf|8RŒWarV_wOzzKv‚Hn•`lŒbhCLŠbUkTbu8W…L[~V_x<cy9l„Hj†@ŽPa²dY…fƒq@` Q]„Sb…Ip€M–N€®`w«|Q™k_pWi†>z†Qmži_ŽSWƒXYxR^€<l€BxŠeW”hKq_NvB[x9V|:d<[ƒN[vDnxC‚8j VWŽRf€O¤†IjÅ…fu`†BZ€LwyKs‘Pf¢br“KbœE`†Uy‡9fGj…SR~SWp,rs8ŒœBx Mm“IyŽZ˜T|–Nƒ¤fsDZ‹Jd{Dz|Mn‹Wr‰J™[Šat®ZUhni:z…Ab‘L™‹_z°Ka™Mi:gx3s’U§\‰ÕYv£˜u“m†•cŽ˜jž²aÁS`‹EEr8•i9£²L~¬s¦¯‘„¹“¤[Ц_o¯eÔžWΆ¦»Ya¬l‘€Ru´sœyNn°4u1£Wž”b{ÁIiŽSœ‡:g Tuzjty8~‚Lzq[s§DfVyu(x}X\€Vj`<p†O•–o´RšÇ“›\’œ?s‘t¤tDj¡?k„9}~9k UjYk‰fd/„”7’«Q„¦B†˜S“Ã]q¥cn¤Q^œ[bŒQv‡Dt“B‚ŠUЬQv¥ud…AlˆIhagšNkfq‡K`ˆ@i“>h‡N€“Ziž`\{>n=o;“Q‚”A—7lž@u‚9k¡CrH}¡F}“3w›Em{<ˆ¶Sr†BŠŸG~°u’˜i¼lšœX€£ZªK†ÄzgŠR€Z{XÝ˱§á¢e¨U††Bx¹PŒž\n’Iw”Iµ[†µT~²QrŒGm‰P™ R„Ä\x ŠnŸoq“Do¥Pp~Mh˜CkŽF}—=a<mƒIx”Jr›Y~Ÿa¬[›»z™½Mn¡Bl•>nŽEd=x”Xm‘Ir—HpKb“Flt?l¥Cv‰WnFyœ3Z‹;`O_ˆ@k†;l•3uˆ?fŠAŠªrc”<u’Cq“A`„DYC`‰2Vr7Pv3ƒ™[eœ>s‘=gŠ5k†Ev”Sn’>sH˜c}«U_F]zEm‡MbŒDs‘?˜šPƒÈQp”O†¥F~™E’¾ZœÀde“S]ƒ:\7k…Grš@l”O‚®e‚£hmŸHn—To•bmšoŸÇŒ•ºr†»Yl›Ytª@{šBn“Bn“KhNhŠLmˆ|hŽadŒWb>W{5ZC`ŽMU‡D]„Du¨9Ih9Nv(rƒE†™N“¯Wc‹CKq3TnEqUx’My—Kcf@ap[`kV‡£2BU/?P9?\@h‡LƒŒiwŽdq‹Sa†YŸJo’@U|F[y9[€BPv5X{8Y~:a6WBWr=_8a}?eˆHwšP|”Q™NfEc‹@[xBb†Nlœ[‡¤U¡V‡¢R”³Nr•=c}>gRtKqˆK€•Uk…El‡Io‹Qx—e¤²m„›Nr‡Gy‹Tœ°j§´»¾k‘®tŒ¡c‰Gh‹Pu›pŒ®XyšR~¢VŒ¯W‘¬dŒ¯tÿzÔÄwÉ×m¬±ih‰»Ÿ³ÞÉàñŠÂÍs²Àm y€žªžŸ™ˆzWN\Pf~[“ÃŒžÍ£¸É}t¬º¬êòÕñ¨µØ‚½ÌMZg8KW0JX5LhNf‹T[‡X€¡LrU}™Gg‚=b‡I]‡Qp“Rm…G\f9LWRlkI^l6CRLZl_ˆ¨kœ³\„”Zr”kvŽi}io‰vy‹{ƒ“rŒ˜Ur€9dj7Ym@mgBhs:R}OZgMfp@\qNalN`kAhxHoyCu€MhŠXxŠ]a‚F_`qiM]~E^}YjyLŠpAiƒ@Vw@NfGOe;Nc5Qe=Wm:UnB]q;vu@]SVxRWb@`oD\v9]j8Wl5i`7Ys4YeHXg5]a4Vi8Lg8N`8Xi9kp9j†Hi|^jƒQwƒUZQSuHao5a„C\tV^pDQw:XpH\m@lu9‰†G€žN‚œgS£hcwSZ~IdxJW;YqK]~Hil;dˆJ}ˆUw‹KfŠTi„WN‡[yp=l“LV‰ckuPyI^—`d…\[…bRv_Zm@`s=byLkVYƒ]_lJm|:]‹=a{ES‹LfsXT‡XSv7Uz*\v1p‡;[”GZ|Ejo?¤‰=o¿og…yl<R<Wsij{MLQMs>uv3]›VL{pnsJ]‰EWTh|;{ŠYp“O`‹ZgGu‡@›XqŸ]r˜Vtœao“M‹“`e¬Y}}YtŸPbCj|@ª…<‘´Pt«I””^v°ZfŽEh‚2€6r¨l‡X„›SqŸb”Fv±P[’P|~=z±^x¢gq‹K¦P²it¬Y_f~ŒgqŒF~„4v¡TyŽZƒ«Bq«n¡js”_u—Y—HÄ™†£eˆ˜^¹8‰Ÿ]¿H¸Ê†Äi¶œUÁÆ[ƒÝ›…”Oy…A€V|ˆR’=M§•K}‹K—}L‰>œHHž“=~š@{t@œœgzˆ”“N‡r[l”`´w5‰¹VxtRu~9‚ Gu˜S{Œ;r›O„•>s¡h‹žXŠ©i†¹uižX€ƒI\/Y~6o{1|Kp™;aœLa‹S[ƒ;l€:}£E`’P};t¦Aošea†Dq—<‚–<z“Xh¨Gj‘UqŸ_j’^y—W‹”Q†®s‚¦<f™4z–Ct’Mˆ›CŒ´{»¸a¬õq‡É]˜¾cz§^”ÏW†¨l€§~y¡LošYkPw—PŒ¡U’·Rƒ¶U˜¬‡¶vžFuIz¢X~¦Kp¤P†³XŒšai´o„ˆD‰¸e|¦pl¶s|„CÀVk™@„£[i‡5n?dŠ?\Œ=tŽJ‘±Q”ÁAŒº]¹XŸµU²_‡¦Vžª\t˜:e‘Ce;qœO‰›Gsž^„˜J~¨Ug‰Iy‘Ot—BhˆB…™@~«Jvœ9u‹7u˜HsŽT>ŒÀ=jLoƒ:a‘Rj‡DožPe’@q=l–-n~>r—Xj™]w•B}œC‹BÏöhÉOŒœPD†ŠL~;s7v’B|™K{—>`ƒMt™bv“St’Mˆ«`x”a©h{Cp’;ަCoŠHb•Ci‹Gk•D†§IwžQƒ£E†³>m’Hs§`–µ{xŸbx¤S}²]ožX[„@p‘aŠ«Jf@kˆWfˆOo—Ip˜Vq•Vd‡9lŠ@c„@LoNf‡KRz+_~7Ww]W€Wg‚OHjCI`>_lE–˜iÕìçÿqŠ©Sgu:[q:jrKt˜$2I.O"@X8B^KjƒVs“MkŽElOlŠN]v<Xs:\~=Qv0_yAW}9w™`v¢Rg…1Ty9^‚Bh‰Fy¢K§Qt”Li”@`6Wr5]…Eu’ajYk“Xa†Ws—Yz›Rd”LmQlˆEz”M}•Xn‡Bv˜W–°Rz™c†œet‹IiŒE‚ŸV¥ºs–¯sŽªe„œXyˆVw†I‚I“«hФRyšY–µwºðÉíx«Çy ¹|´¶…°¹vŠ¡g{¤y¹Õ…»çÌÖÿ·Éó‚®Ðl€¥Rx›erxZdnBf‚ByŠZ~¬—³Î©Ås¥ÍŒºâ¥—Ö™¬€‰«gj€<Rl3F]2:O<JhKSq[o—l†§l’½h‘«ZužIi‡TeŽQkxNpzJk]EWdVz‘?XvDTtp¤•¥zŽœ_sbn—ir†efuw}™|Žªs‚ž[Zt3ns:p~C^xJWtE[uTTiHaoA`n?ZuHX|EToC^o?f~Jj…T_…aQtSPnSebCJx?TiNNkBig?csBLt=Qj=Ko6Jj:Ic8]`7Pq:[nHch<^|MVnMdd@np7`ƒ>]vPYpCvh>T†CGuRgd=[l@Jn;=cCUY>[n1dsAeoIb{OewS\x\aoIOn?Qj8Ym;Mi=Kg?<j2T\=_h1ty7xŒQXŽ^SyfY~V]rGMƒA]p>bvCTtC]qP]v7aˆQf|Mb|Q^zVduGR…GYr;Z~>cZt€KT¡NDr[FfHSe9MwA=e8XU5gy@]ˆR[nKX{BcqD`ƒ>i€IUˆFdrHz„Fe˜K[ŽK^†=mƒIb–Fb„HkyBt‘6h˜kb•c[FdMhƒ<]‹2U‡Mkq-^‘8H‹a^iERu4]y:c|?S6`vDZ„UZyMM|ERo=ruE~”SrcnštxœP‰•Kyªaˆ¡b€ªJ‘¤Xv±c•“Q™ªu“»„‘³Vm˜qj”[w–BXšS‡~N°Q”œGs´pƒˆD«^w«[y˜Fl_z—Lx§M~–;¿¹X‹½ut§Q ˜=§ÁL£Òiˆ´l®£Y¥`‰«[¶œSºU}¥oË£D“Üenžj_~K|{iŒ˜dw“V…–_’z¹²NtÇ~Õ§„©ÕRƒªKt†Tƒ|A˜«j”–ˆ±]Ž ½ºU¥»c¥g~ÇU¶rÏÛ^¯Øa®•fš›Kÿ¶]Áÿ‹™ÉgªÁ\¼¼|ŸÒU…¥U“žVj Ao—?^‘C‡€?€©Ft‘P¢E€¤Wi–R„‡/{›A„Ÿ3m«<yŠL|³P‚£EZ«EZ}N}—6}•yu®H€†?j®Y”„AtšOm‡8c8w’T“¤^w¤I|§a¥Mu”=m–P“²Rq’fvˆYk˜\p XŸvŒ¼zŽ»y¿Íͧ̚¾k¢`y¡u¨ŸZ˜ägnœCh’KhŽGrCm”Nd’Uw¦r©²|šºb‰»Ch’KjU‰¥<c‰Nt W¬Rf–Fj‰Gs£br§\r¢]k–;z™OŽ®9u§[bˆ;aŠOi›5^†G„ŠBj›WgŒSr•Ls‘R¬°eÿÿ™©Ûn~\x¡X|¨D}Œ>h…Gz“T{ŽL²` Lv§?xšX†©BpHuœTgZf†@xˆNœ·Uˆ¸Q{Oi¢sT„5[ˆ@[uE^}6sBT‡Db‚IvŠTjDp“Ml”E¨hp¡T} Z¡¿}˜ÈvŠ£d«cŸQ¯So‰Bj}Lq‡q‡Zk˜9r‚B”I´Pt£MtžO¶ÄX¨Ío—ÌLw£Zi•NyœCz•M‰I‰°J~¤H|–a„¨on—Qx°[p—_pŽOmœVušZm[—>z‹JŠ®xožIZwIt¡`|¥?}™I‡±N~ªQqFr›DœªR¼ïMlLVrCq…Xm@Z~Yd€<TgIfgIXgnq™È¨ÒÞy£U]w24U.EWD‚˜Xd”#D[!FQ*Od1Mo=hvR‡ a|šSb‚AEl5Wr:e„@z›HtœMq£FiƒRg‹NeƒAsƒ4m‡9e…GnŽTc†Qm™HT>Yz9[z2`}K–T‚¤TŒ¯Mu“Ft“IcŠJc„JnGfˆQn”OsYr”Z‚£jˆ³|Àct™R}•I{–SŽªe{œm{ž`Oc“O‚W’¥cŸ«j½x¤½`”±U|¡’Öÿ½¨Ó„…·rŽ´j’¤i†œZ~£N{½Š‹²”“ÉœœÂ˜¹]n“g›À€´×mÏÞn²ÊxÀÓg”«…“À™Â’¶Ø¸Åðš°j€£lt›ºg†ªUkŒC\v@LZ6GVLUlce„``l€žSa„N]|^ƒ p™³zŸa’W}˜pŸµaqThv|–~„ž|§uªy ·p‚™W]sf‚¢|‹¯uƒ GXh"^‘E]‚Z\xVShG_mG`yC_rK_wK^wH^R`lD]xHV{D`nIdwUgxJc„O_tOer>UrINu@Y`AUp;OmC^gFRt>BvEC`:YV+Pp4Re?Qf:\fBQgAh_Abq9\oHOrMWjEon;KGNj[_]=Rm=UlFKlDac;Sz7[iFTkAP^FUgCanN\pL^lGVo>Nd8]]7PnB@o>E_7Ra*To8WxIS{YNvQgqAZ}:`GT~<atFR€ARvK_n:T~JRtRhj=‚v=u@r‹Jb™J`ˆOizI^‘LB‚]=PIMV2db&R‚;Gm5Vc1Nv/boDbt>[€?asDc€BXyIYwGRrBsh7^@l~TlŒIz˜MdŸEqGt•Uu‘EŽPo°bgL_ŠMY‚W\|CTƒ@g},b…Nˆ‡Me«0_‰Tlz>ˆ’GS¨P]pCl€<‚•<`›P[w:^n5P‚A_u[tˆX{‘Bp§J–‹`t·`jŠQs–Dƒ–nz¥ix£už™©fg±pb‹V†ƒB²Qz¤OošM” Mp»m~”O†¨X…§d^žb}|P‡©A¶yq¶ežGžªgw¶s…™g°p•Áoµw„ b‹™Y‘¿u¢¯Pˆ«z˜“S¹ÎN¥´¥¯º[¼l®ÀUžÊ[¶¸lŸÛX‡³a‡qo{™ˆFžªtIJ“ä“–žZ«¥I›Nµ›R“e…¬T„”a™ŠW•Êt’¤LßžpÌÚ“eŽÄZŸµr€Ç±ˆ•[}”Z«µ©Â‹€±]€¨Oz‚T”«:p¤Lxt2ÄQnÎrt…K|ˆXp¤g}‹>•¡e¡ÆU®·Lž´V¶RxšbbŽ`dwKu„C~”Q“²q´Op‘H[‚‘Hy¡M“¸<q›U|›_p™ayžUw Nt¦E{›Zˆ¯Fz™P{˜?‹‘D§ÁB¬¸2yºX†‘9‚°N”±m£|¤§^z½t|ŸF–žnz¶^ŠPwŒ;k—ThL€¯Ex¤^¢n… n~Pa’KrŠA”½Orš;p“<‡–uiDj˜Br‘Ln“=c’C”¬L¡¥V™ÃelMk@2y›2£®Iv£Lr•Tq—QŒ[}¡f›¬Qãÿ݉°†{§VާVy Uo@y•>i£Ef„GbNŠ“Rs£\eŽGhŽKl’Pz¢S{‹U{§E~—\{©mˆ²qu’Sv’Eƒ•Da‰5hŠ?b}8iŠMf‰3cŒ3w¢Ny^p”J|PÁü™|ª:¾¿Vl»YlSx›\f”QnŠ:ƒOw>v—DŽW„®iŠ«[…§~†¡w‡œIn“Cm™V†¨]pXe\t“NŽÃOiŠKk“StŸ]pŽTޝL{˜Y’Ÿ^b“DsQtšRi‹GnLo‘P~¡Lq‘S‚¬h©Ö–Ñî„Õî|ºèzw«]g’`±w˜»e‘µJ‚W•¿~ŒÌ„mMX:…’_k—S|‘RmyL•¨Fl‹:p‰Eh@kˆU|šY{ž@Ro$5O!JZQsœMZs6ŠŽ8…˜R‰§Q|Jˆ¤a—UVv;gƒ?n„J~Ÿ`g‡e²r«Z_„PpŽ^y–V_x\ƒ˜gž¯Vt—KsN…¬O’²F€§Hu’Fh‰Lšcy©kª\‹¢P‚œEc‡M—¢\ˆ¡O~œHªJm–Or•]™Àjp‘tžpy—Q{™L|˜dޝT~¤V~›Ml–GfŽPiˆQw–eƒ fs”q©Æpy™OjŽo·´™Ïm Ðq”±]‹°Y„£QФWŒªb‡£Vp™\Š¡h‡Ÿ`ˆ Y¤k¬Ò¤Ç眤މ²œ‘Ê—±º||}Š¥||˜‹€¨{u†\‹¹”ÒóžÀèqu•]g†MKm9Ie.@]8OhLVoAeŒ`’»X…¢P}i“³ƒ”½–´‰}¤ˆ†¤‚taX}O]udjŠwˆ¥z‰°„—¾‚xškRkOXpanqoŽbf{FV`&XŠXdvaY|KgtGn{Ii‘KV†PdoR\pI^qL]kAN~LPtN]fAgu>nŠKn•VjSl|NZ€M`sJoa>W9UePXk>Sq?QqFTh=d`-Rv.LiAOd>Rc;Ch6TN6Qd8JXDGR=UY5{a2l‡Ef[X=Vd:ai>isDosC^ŠLdsHSrAXZHdb6g{@njIlGUM`lBh{=]{CUtOEs@Xj-Nu6Sl=Mn>cqDfz=P‰AexJb‚Gi„SU|?VlW[t@]}<doJpx8|€8§Pd¤c|ƒgm—YY‰PAdQJ\BYU1Si-]o/\€@Tq8^h1–s9§§Hu±Yo…Xc‚D€n: –Cw´Sg†To{>[@mwLx•Kˆ“ae¯Ne†O\ˆCi{CfŽAmik‹H^‰D]@_y;x€8o“/w–Qn¡W^S§uL“¹Mh®oSoirCfˆLUTNy[Pp=}n5`’7Z€D}v;†ŸP‚¦Bgš]y‹Uk“pp›N}“Su§ZˆV{4…œ[n§k`‹Dp€B’žcŸºtžºf˜ºYm¦j””S…Ñe¤_|²\‚´9ˆ£f§_†ªmn™Sˆ‹N™¨o…ªY’²J™®ig˜|–[™¦dÌ•™n¦¸€aŸu›fƒ®y•Ÿ_J“†Œ\]¨§b°Ðf†»mu¨R ‡\[W›{*œcœ•P|—–¢Y‰¯c›®^‘§Kƒ‘R‘–sƒ—W|ZV~•M—¥U‰žY¬µw»¤p™ä„’¦j”’TÁ£A¹«nœ~Vr”`†‚N€Z„¦Xr”e~¯7¦SÆžh{ÒL°ŒGŒ«Yn’7‡”SƒžY‘›‚«®[¡²S“¦MVÈJ‚•Fz•:q‡X€œkw–T€‰Hy¥PsRpšR‚ƒCsXgŠPq@| F‚›Nº\•ž_¶¾S~ºe‚—F’ mîùàÏÿ®‘ÉIm €x…fž»~нpd‘gxœMm—I’–dަx«Èuƒ²S}¸„¢v€ŸVy•P{‰Ls¬ljˆJŒƒ8kÇ quTk’PdŒRlˆ4u‘=p‡I’”>q¨C™’†ÛüŸ”ä‹t‚Cu¶?…°O¶Á`ŸÄŒ…©OŠÈTo‰Ds˜Vx«g¬ªT˜È´bžYp Z‹¨T‚¡I–Ÿ;˜Õg“”;xŸ:j„7nšLl˜E`ŒCP1v‡;~¦{j‘KbTiŠS“Q»WuˆEzKkek‰@ˆ—Rt‹6—<ˆ£H˜<޵Vm™6xŽCj—Dg›s{™M½é¬u¥HkªZ~™Ru 9‹™Ag•_y‰I“£UšW•Rƒ˜dŠ£T{ªN}X™ÁR‘Ç\„¶lr‘Cw”<ŒPy¤Kg‰HwDe•Dm‹T|¢_~¢Pp“Xˆ¯Ps’^|¤U|›UVs—D‚¯[gƒV£] g‡µ˜rn“c^†E^ŠClJrd”©a‹¸b‹®fk›bkŽJe‘Et•NjHo–h°kzd_†NiPk“O_†JW~Dc~Kƒš1\‰2^‰?cyNo–ni‡|l“_fˆQs™\{›r{˜aYs4d}T~ŸbWsEIaLlŽlb•Sg‰>RzUf‹TnŽLx‹^nTd‚_l”[²amKjEc„JiD‰¥]w—\ޤ^œ`jˆNmƒYšbq“Yq–^hŽThMu•SlYz“P†¢Vn•]¡¸v´Ì{ÔæzËXªUv¡JwžOj–Iv›Un”Kadˆ³ngCb‹Gjšx»’¾h…¦Yv¨o˜Ág•²Q‚¦X³J~¢I¥X¯a“³a’³h·†‡egu]\‚^y˜œefƒqžºgˆšXmŒPpUo˜‘ˆ¿§ªÌtnIVv6Wu=i9lˆ8fuBNnIl”^wž[i‡b†´†°Ü‹£Ä†š¹w`pIfS?cD_wQqSep‹¨lv°¥Äp–¦W}ŒJe€WkS\sBHa:CX-YqNhnKZŽGexRlGa‘TZ„YThWZoGel>qxDW†LbxUo{DaCfŒLiŽU\‡VOaWkQth>w~B_ŠMYnSRj:Pb@hkGfx;\r9Kx@Mb=Zh6dq7Lh>PR4Fd5JU7JH/NY2[c3ps>sƒVg†LilDht:r}Nm‰JsŒ^yŒTd…JklSgt?n†Ch€K`IV‚QZzFm~@g‡Hc…[aLO‰@Ji?Ne4Ni;mu:f‰=U‡ZVrI[t9TwLkfGgHXˆUkuDr…DT“HiyByŠG`¥g_†_aN[ŠQqEc—<Uo:\i8[{<eu9_>fy=†q<”«Xs¾pœ{i’NŽ…A•«Yl«vW~^rzJŽ>«R|¥_‡¦`[³va€MFƒ4Od1po1uCkŽL’Ry¨P}›M—N¼M€¢Q€£Yu¥Z‡‘O®bkšSirt>aDVK]t:Xx2W~4UrDl„Eh—H˜’Rˆº]‚´bZšYazDk~DVŽIktD“ƒO‡·Ny§X‘^v“Oi‡@‹B†«[}©e–˜m‹¸[†±_‰°wv®gŽªe·dŽ¥_¥\¦a…Äi—\{©eƒ¥v‡§R£¬Y™¾xsª[€i<•’GŒT†˜bW€dn€=Tt`Œ@u“I®"™ÈY¿¯Š¥Ån§§W“©Pn¢\yA›¥dŽÎc†¦Pt^ŒŽW¥b”Çu¤¬pž¯m¥»[²V™W¥°T–ÍS¦Ähz¿~š¤‚z¡„£qRkœP®¤Oy»\sO|ƒ?‡—Rh–O‰‰J¹H“¼OÅ·ZÿÁbénvG]ŠIoˆ:—±la¨q•>`¦§€‰Äj~šIzªlŽ¡a‚ˆJt€@Ž’Fp¢JoG{™]o›Lk¹KoŒ=oœ^f‘aj:x<¹`„¼t|ªQ…Ÿi‰«dvˆM™X{°pʲ׀½`‹¤gu¬`›V‰§Ls?{’Fu¤G“¨SžÐF}Pc„Vw‹PŽ·b|ÀetœUj„Qt†Yi?xœHq™c’¯Vn¤9‰£H|¤:“«V¶eœˆNŸ¼|™Îaƒ´ƒ³p¤^ƒ¡IŠ´l‘Áj¸ÂF®ç~q¥‚˜™JœÞTg˜K j|§p}–J\ƒa‚¦Vœºšºhr¾‡¡¬\‰±I{ GŠ«X˜Òe¨ÏPN~0d<wœMo–Lq–Cz”@“´c‚·Iy–Kg‰Eu˜P‰´KrGr•N©P|•K„¦Qu“um¤YZ~Avš7ZŽ5€¤Eyž~o¥[h™:•®U˜²Jx CŠ Hƒ›S”ªY‹²OŸJqœd’«XvQ‰®n}³vv–i®fu’JqŽM~œ^€ZoœA‰¬Mhš`v—K“³Sz§ZnŒZ€•ax›W‰£k¡Ãbz›T“»Xs›Xr‰J†¯e{›^iŠb{”RЬKv™>eˆFuœM{[‰¬ytœLsœfoœLiMc€BeLd‹>|£Nu¢aºR^Ž=eVw¥OršYd‡NlŒRˆ§VŠš;b‰/”T…´QWiF£Qˆ¯[“Ä„‹³xx¦QkPw…Xc‰`SyFUd<]zK^„>];Z}F€›m¡f}“Ye‡BZy@c}Hr”p–·a€ŸAx™F›h~¡buU‘”b~•PlDkŽWrŽPx–KeˆNb†Kz Qw—Us›IeJc‡XŒ¨j²}Œª„u˜z{›]Æq¸Ï_”¬S¯i¥¿\i“DaŒJcNa‹Ft“Dm–b‚ hНgƒœTpœnt¡_k—Rq—YŽºj°Úeµàe¦Ùu¥ÈgŒ¤lš´aƒžFjŠN~–V¤±c„“cm‰gp“sn†Hr†4\yAlƒPe†uq`i‰>k‘?€¥Q‘µUx›C\ƒ;UkEmŒQj‰PjŒ]{ª‚І¶p‚ªOZ~<Wo6MiEb}T`wLYxb…®i•®t‚¡o~lˆ¡Zw‹SiJ]f7@O*8F VkHYj=U}HWrLQrFGuPHoJXbDqr;w„:’Qe˜Z^ŒhpvVhŽJm”ea‘^Z„XY‚SWmJrs:aER{Z^gZJm<UhHfg5Zw5WvEOnEKaBRi7ff<cm:„f?V˜<X_OOR5a[6[h;YmDmyC||F|˜MqP…Ž[}›Mn‹^_‰^v|Sx~Py‘Io‹Sk„U{„Xn—OaˆOhFp‰BbŒZm{ZT‹E_o?_s2g|A_Bc}CW‚UXqIZx<\kDij>r@Q–avjPt”Mt›[KjšTkŠ^f‰MŠLŸD§©Nn×t€iKŒAYfNn|@a…<h€Lt…F„¢S`lUkZ{>ˆ;¡m^‰\miXƒyATšE‰~p|bn kgugƒQ_‚8Zs;gs.~Kƒ§Wj™Qo€SˆP¨™QyÃZy¤fr‘UwTbX6|@6O@TZ6zz-c˜FTxLx3{£Az§Cq“?R†Ei}Av‘Azž^œc]—WjƒAc’HdˆFh‰;^{G„…_j‘eˆ‘9ƒ²Tr YœƒJÁÄZ ×r¬cˆ¯TxžV„™[€›cš˜K‹¹\Œ—]„›L‡¨Z«¢~žºcxÀd˜^¦©SÌR¶«hÑÀXßd¡—I—´cȬZr¿jZ€?š`.ž›UŠÔy¥›[‚ÆmA®Á|”Áy¿¼ix½yˆ’<¥ >šÎs£ÀX¾Sv²M¥ŸV“»^s™h©f¨Ûh¸`œ¬W—ªX’Âk‚ªc¥\¨©W£¸d©À^ŽÍu}©IyœiXŸOdsOq…Oh‹9ƒFºVÃn¬ËP…z¤œ}nƒ>Œ‹@f¤OŠH™ \~¸J”S Çn~˜;w™[•ŽLÿ¿aìÿŨê}”§†Ìeu—\Œ¡Dt»]gœF_y=]€@cˆ7|£@„£Vz›pv^žÃTq®\ŒK‚±o€XŒžHr¥Zy–g§’Z¦æoßÐn’ºNi®mt‰?‘L²c` |t•;†˜6ÑÉn¦ÿ„Ì¿U¡î]j£^›;z¯I‘C¹È^žÉx»¾Qœ¾GÍÃ^Éäh¹ÿg¤¨j—Ç’ˆ°O€°E“›S“Â`z½t‰©_¥X„Y‰À]–žx…¸¡ˆ«E€šavŸ]¨¨BН[‚œN«»fŒ¬\~œU£”€›dw¨Sf‡Kƒp•Ëj™4„Š=½s¨½‡´Ôk™Ã†ÊÊnŽÛX‡»S·Uu™O˜¤h“¸Vˆ”Y ´z·ÖuešLmI|”P€Ž=`˜Vj7p‡N{ŸMe’<n„<…—c‹ŸjЧQd‹Pu“JÄ¿gЬU|œe– Y¦æul™a|`}ªf’ªpŸÀr‰¡Qu™D‰ŸY¶aª_qJƒ¢L{˜gˆ´fsžOjƒK€“`œÓg§Y”«d|£]‚Ÿir‘Rn–L‰®i… f“½`oœZgˆLkLhˆGx“Fl‹EgV_ŠH[zBmLf‘?h†?mŽC`ƒEs–M…¦Y‘·[~¯Hp›X«Uz G„–K|£pÓaƒ´qf5^s_~“KmŒN„¬Z~¨cz§U¥[~žW®MjƒOfyD J\w4\}BŸSoQXsJj‡Vi[g}Ehv7d~>duCp”aq‘Vd€NšYy¢e”©WzŒFg…T€žUŸX“ªt™L\}>X=^†KrOe’LzžE_;l‡M~¢^sœjx•Xn‹FhQu¡…žÌ‹‹®e޲tŒ»Yh’Ahˆ<h7Y~Do“Ep˜`‰©`€¨bk“Tl‘Z…Kj˜Fz–W¶u¹ïšÈù‡¶Ý®Çe¡Çh«Îdœ¼L„¤X‡—h°[tŒOfzKZkGe}Hw P‰§Gn‰=jFf‹Ki‰;m‘Jy£Y…ªTw˜Bk‚?gƒCm„Ic…Pd\…°r‘µo€«]k’Kb‡FzQd~RYtDXrEXye¥m{—RdxSmˆctf\d€IRY+5D7BWeCoh7s}DUŒKSpPHdFOi9fl3r4}›BŠŸal§je›lv~^wGŠd`£b_„ecwR`oJZ{A^oIPsOedEMo4_hIaf3^t:h~IMC\fDeu8fr<qw@ GiÃ]‚x_~EmhMrApKt‰P˜‰C¶³Xy°f‹šjƒ¥Uˆiv–]…T‚‚L{£[V–d\zerxSeŠL‹]k–MlMu€P\ŒUb}Krz?fŒ>c‹RjyKkN`ˆJl{NYŠAYzB\t7]@V|NdpPp€EmUdY[„ZhtM`‰@vJ•˜K¼Zd¾‘dˆjh~In{Fa‘Mm{:[ƒ?cAŠAƒš^w¤Xd‘Q‚Š;ŽOmœ]m}R}p=pQ`ŽObwLl†B|†YoŒK{…Ek>r†<‹~B~žT£q~“Wn@‰T€¡b]©vxxY–“@n¦Ri‡OZ…?`t)b‹6P€HVm9ww7ƒ•Mq«X{U˜¡Du¹Mk Xf”Ir“T‚šRp«Rs€F|’4k’Co“Ct—Xf–V€‹=•¯g·d•Á]qª…€ˆz© j”Òw‘©fªHÑ·SqêVŠW£žOÕÊJã‡h·[a\m…Hœ“YįYŸÏ¸«b޶‚‹‘m‘°e»v|ÆqvŒ´À‹K‘ë]ˆŸViŸ_n“Qi…ZŠŠH˜g§šp§¹a€¥kšŠB— QÿÀ]ãÿš—íy°¯YzÅh‡VŸ±TœÉEŽÂg„¸f¤S…®\œÅc€À^‚©[‡U¨¡R”È{†´¬l‰¥X¤S˜7uœ9‹—=pºLt“Up“d‰„[}I–E‡—Kž¸^z›dŸ™EŸ¬q~¹Z}’p®‹J”°qx>wD¨´Z¬Èe»ê°£ÿ³m¡ymi‚£fgJz“u—¨KbœHcŽ9n~=Z>xF¤]d˜JœVzŒY¢£[†µZ•ÈYy¤tžMi‹Nƒ¦T‚žZ‰¦\{¥p’¨J„¿]—¹dM•kto0vMu‡Aµk¨ÿÂyœ{š›œ—®ƒ†ÇU|¯a~¿m€¡ˆn¢†£µ±×ÞŽ½ÿ©†Ó˜|¥~áí‡Èôº–Î}‰«[x¤PZšT€®MyYtšly‡P{¢fxŸPu\kL‰XsœEˆ¤b‚¥_°^˜¦z‹¡™º^x«Hp–B|D|‘D‡µr™h„C›´²×o•Ö™›Áwnœb¤……Ò~‚£lu©Jd‘R…‹az¨h‘OŒ£q¦Á·L‰¨]‚©T~©Y|£Ax›C”Bk›M}–>w–DšW|±bƒ¾sm¢Ev“U’²„•Ÿ^~›Jy¨zФt†¹K¯Xy˜R›¾l—±ws mlW‚¤W€¢‚j¥OgŽXz¥dЍ]˜ÀarKŠªD‰°^¡ÍsqZa}b{œtgUo”Kx•Qf¡Y~Ÿ`…¤_Š©WeGeˆ;y“L£S\‡9h‚=i†?eˆ<w–Kq‡FŠ¢Dz>^€Bw–O˜Pv£Zz•OžOpšYp›^„¤W‚§j~¢PtKe?wFt‰M¢Dh‰OeGk‹U‹·^S~XHmGTn;n…SfHWxI_†F{“Wx¢Yy¢G{›WƒœQƒKd„>b|Fc…HuOr–=a€Mz—dƒ§e‚¡_{—KŠœNrTv˜cw›]Nt@`ƒ7[~<o†BjŽFy™I}¡I‚§DbˆNo“P«fx£Zp“NwœHag£s|š_¤e’¬]œY|œIm’?a…@mRqŽQsšY‰·Rf‘A`Qv¨d‘¨M~¡X†§p¹‹˜Â• ·q’§{·ß’Ãë~ºã€µÜb¡¾h±XŒ¦V‘¨[¡O•´W¾n™Ì`’¯SˆªT„¢Mzš@g…AiŠKv›PtJj‘O}œFlLi„Iv›fŒ·j”±u¯Ûb•¸K{›Z‹´`\LNuKX}SqŒf{–`l†NmtKf~ViXezXeu>KY#3?"7F-fe9tp:‚|Ic•O\WRwEZs=bu;g~>iŽSj_p’a}›pdŸbSYpoW]•Ol„jbuI`nLg}T]uJ`xEdjAUt8knRdj4fw@h|NU|SXfJcu<h{>{~O¢‹HgÁajˆPƒTnkNw{:qˆT~‹_°˜SÝŸ_„¢s…•q‚‘U‰‘bŠ˜c˜œh‡ž[y¬ggž_W„]grDdDz„Og„KeyXg‚PWƒMnrRu‚9dœQY}YVqGYtGTxE–wKa¤>Swlbb4gw=iƒEjŒI‚{@›šKeÂz_†cy{F|•GŽ•Ip§Z‚˜a–¯zj¬b•|Kz¤Lg’l|…CŽ•N~®N{ TtžWfœXsˆ\VCoo=[„Rb{Uw|6gŽZkˆJbˆFY|4c{?Š€<{œJ`žeouNs~IgŒ\‘}X•V_‘bh…WS’V‚iUW F\|Ft…E¥•T€ºSg¢e_„Squ:„ŽA‡°<}«\œ±m}»kz’g¨]§f[•GtƒE‹”P„¶ieŸZrK„“cf˜K…Ž;‚¥Nj¡Ru‹WhªoW—u[qpJwNÀ€:¢Ùˆš·‰£¯”ºÃx‘è§r©†•¢CÅoyœ™ec¹W€~F…0©œT«Ìqʺ_¶æy¬ØS~¿XÄ’\µ»ožÄV¶µlÚ×tƒÐ‘ŒŒSŒšA‹¦@®’W»·_ÏÏQÂìvºáeÿÞcµÿbÖ»cÆÿíµØ©œ¶nŒ²v¤N„ák}ªh ¤YoÑplHƒœR‚°W£\ÿòPÞÿ§¢Ènr³[ƒ—]¥Ow´aƒ™X”§Cž@}ªAfŽM{ƒ7’´Q¸Mž`g¹oŽOŸ“X®¸rnÜ\viGw~‹ª^xžSt’cw‘QŒ˜GÅ¡GlΛ––]Ç纄¿ƒl‘8z–DZ}Ic‚7„šR‚—R޼L]™Qh4qšO]}‰QˆªXz˜M~œau™cŒ•xáý·lÖ^s“9iŠC_4‡‚S®K ´K–µqnœtfŠ>xŒ6PƒœF’°Z‚“äÏr†ìƃ—TŒ¸_iŒZ d~´Kœr³¯|¬Þn©kb‚O„9ƒ‡]•›x„X™³„~›_x=¡ev—G•³J–»_x«f[p?k˜ai—4qŸX€Wz K€¢J‡—p„¡J•J¢Üav¥E†¢Lƒ·Z£¦>¼g…œ[‹³k´|ƒ˜‰¯z¨âw˜±C|µ`xªYv D‚§Y³âN˜½S€µ]…™S{¤X¤°s àlpS‚˜O~°Y£h‚ŸK‡›fŒ§Py²_s¡LwZj—FšP|²Z“£Y|¬_l“L€®Z£Žišzq˜R‘šw¢Êo‘¥ež\ƒœ`j•JxœVz©X¡¸Jv Y¨V³Ð‚šÓo‚±F¢`’Åz¤Øx‰¤\–°Kl–]‹¥Y|¡O{˜Ws¤MpUfŒNs ]tœHc‰R‹£ky”Hj‹=oŽTw’Gp~P€©q‘»Y“®m¥^rŸ@u”Rd…ct›Ym•SŒ°`qUr•Q^‡On–ct—FXl;…ŒU}•MyœV_YhNŸ:~—QŒ³_z¢4Xs,WpPu’a„Rlš6g…EdQyWg‹J„¦ipŸTsŽZby<ZvBm“Pj‘Qj‘LW>_ƒS]Qv‘SrœRo’Mf‰Fq›\{©Qe‹5`†6`}E`„VŒ¦X{šTnŠRb…CqŽOyd}›c€¡Ne‹Zh‘TnŽIr‹Pr‰Y‡¨s£ÆSj‰NoƒFY}@\„K]}C[|=c†\wœYt”F\…Ak“b~žVp›^‡§W| h{¦t•¨fp˜º‰›Ào‚¦xžÆwŸÃržÉn¦¹iºetˆ_†œm£É‰¬Ùy˜¶fšÀ^ޱV…™NpŽ:eŒMˆºUгW™o¶Õg«Í^¡µI©Yƒ¶fÁÈÿ–Ãã`£ÄežÅXy–=hŽLs˜`{£XdZUhLQWFVeDcqIn‚Pf‚?HV$1:%4>0Yb<`v9jrFm‚M[‰_\~QSmAPoE]s>zAqŒQŽb‚£^c¦iV‡n_nXdq;o‚UcxUdrP{yCwQq‡OqqHbqFksNgm8_EhtLV}L\eBiiAs{Et„H‚NgYV„ZmP‚kB‘?n¦]‹a£“N€«bp‰cb}YgrQƒ}N„–b‹’i}šff‘jv‡fxYn‘PYN\‚Pk{Ez~NjŽQhUƒ‚N~šJt›_cˆWT|K^t;hv0„‚<^¡QY†‚qp=oy<qY[‘PiM‡ƒF`´Š_Žya@r{JvIe—a‰yS©d€˜cƒ‘`y˜KaŽfd~GŠ}K‡Sy¯p‘dsŒVs€=k‡Kz=gŒLa|I\w=n|Nh…AyŠKk•@~‹Dx–;\•Rhqasq?tƒCj”[_ƒHud?|AL©WcbJ`ƒ:H|F‹l1£ 3l´fl‘gj\žip|6 ”PÒrk³ÝŽ^ÇôŸÎ“…©S…¨p€‘L²[y»gbvf‚kizF˜†L«W€ S’ a‹²Wm¬fv›V—ŠMi¶U~ŠTµIЏ¢¯„‚¤c‹§l›¨q³]·ÒYc¯W_:‡m-‹œT£;¹]yÆk•šZ‘¬b¢ÆŒ¢·~Äe·´UÌjаmž®b¥¶tòÈ…ÆÿhžÐbŠ©`œS˜¦hñˇàÿ„Ðí„åÿºô×ÿÛzÔÿ£ÛŒ…¼m¡¬T¢¼O‹¦j}¯UŸN€®q€PiI˜H~ŸMµ¯e¬ÿÁ—Õœr«Y—š<ŽÍVp£rŒ™Gz¼K—S’¯[~X|²P§`yŠbˆœB‚žR‘‰^užW™¤S¢¾w¬ßZƒ¶Q{µMe“Q{{L >z¬JlŽbe„Ql…=¯¥k™Ý‹„¥Ly¤d±kŒ¨Dv³Q‹˜A‹·i‘6Ë“>„¼R†’O¥ªX–²Oœ´dбQ¢¨W|²l^yN£u¡W}žJ<ž´b‡Ðq”_”ÆyW‹Sat6r}?…d»g®¼x—Îm‰•xªÐn®ÃT‚Ën•Ä`}¥`¨ÊI¥Ïi‹£ˆ†³‡Š¯’‚·fzŒ`~©^„ Ts©_s\t”E|¤H†‘XŽ´Ly£k†½dXŽJc4yˆUuœAƒ¦Iz¤Qw…p§»n‰Ñst“F[€^˜˜‹{Ëj~‘Ns™Qm W„ P„¨]~’gŒ¸€‚¼Yt“KŒÁUƒp©`”·a‘ÊI‘¨F¤Ü{½}¥ºf¡Ð`Áñr‡¬X‘¥s®ÔKœÇR‚šM®[‡§j•Ÿu†¨td¥Ne‘We…B~U„´|xš]§[®N·hÄxemu|L~ªbu˜V’£| µo±\˜¯i„ Q޲R“²N‹¼kØõh½Ú{£ÐŒ´Ûi•Ái…¡i“Ãve™bl–M‚žTˆ¦Pš³g’·ho¦Oz›Fe”Dwž@u—OqNlP†”J‘«O{œTx‘Pz“T˜°RxŸKÈÅmm”HtˆUg‡Nd„Hl‡Ct—D¤]~¤fz¡Ke@d†?v’Zƒ¢R‰šLŒžR‹ NmŽLg„BmŽ@mˆNs–U‰®uޱLy’Dv~Fh€D~“]ˆŸTg‹>Wz<^zFd‰Hy›Zn“Rm”Yj—>lKhŽ]p”Hz–Ib†@Qƒ<o‰As“Mp˜Yp•Eq”PošZЧ\dFb‡@iˆDx™^–«t¨UfƒNw•LžZ›b‰¨kÂi“¶Xl‘Fa†Kl’S›V…¨pœ»Z•©W‰§I€ Kƒ @h“Dg‰?^ƒVv–TlŽ=Y~?`ˆJp‹HdŒP~£e”»_ˆ§Xy`n’j•²tˆ¹nµ¾f”g~°kŠ·z‘ºxÀa°[‰¦n¥Ô‹šÃ}¨Ôu£ÉbžÅ]x V”Rº}Ïõ†Åì|¬ÓÂ爦Âw‡ŸHm“By©d‡¹‰¼ôš»ív°Õp‹ÁS†²P|›Yw”_oŠMSf;AM21;57>6?S7NeO€—@fr7>$54'~xGa‰;\†OmrIT†KeyUsyBqAaBnL|‡Mt\o’g_lOzkRkPri:j€Ak{Gi†Ud}Pr|Kz†PqMoyQx‚SqŽGl€UrwSkuBeeLym9oŠCh‰Q€T{P_cawU‰qDŽ˜K\«li~vl€K{…U}†_dŽVfpPnl7d†IŽy\€Vdon‚TxK`•W`{\[zPTkHH`8SnGbnKn~Hv‹V[‹§_q]d†Oa|Ei€<ƒ‡Jp”bu~GPu>ZlUztHm–Lo†In†Ts’gp‰H…„E¦«TƒÈhy“Q–—cŽ Rpžl‹†M„¡Tn§WRŽGR{HpoTy‹Kˆ˜Pw¡>’QyŸN~™bzžK†„L~£Nz™Q^ Uh€<h‚R^…Tl„R{qAi€<b}Pw~L›‰W“›Ly«P_šql‚>m…9t”Hs‘2hzFf…J[‹C|kR’‹L¸Drœ[d˜a’‰UʶLÝð|¿ç²‰Å}uµaŸh‚¦TŠŸOu•LoH€…KÁU¤è™t¿|l™\ˆ’X‰Ÿ`˜¦T„µjr‰d`xH’Œ6¼Àe—ÜŽs¯gm–dxN‰“]—§^¦º‰‚°Q†•C ±Z°¼a«¿{y«{”L¬£i ¿_¡Ÿt±£Wš¥e¤ƒ` ¬T‘ O£ eó«VÜÿÍÐÿ²ÉÓ”ìtîTàÿ‚œÿÊÂ’ù¡Á€²É©Áܧ}ݵq¡K ¨Ju£Z¤Tÿÿašÿ¢t‘^ЉP¦²\ŽÓ\ƒ·€n³„ƒ¦w}©…y˜`‚¨ey˜h°©b¥Èv}´ƒ›?x¬[‰¥_Ÿ°gw¦hxˆ<–±g„”}ª\~¶g‡›P‘Y®s‹±gs›[p‡4q’?y‹G}®Vh‘Bw‹L_ŒHv„<‹¶|›Ð[|ª`¢l„ŸN™¯D£¿a}ž~‚Q«Rš¾k·®K‰£R”NÚàxªÿh‘·o¤¹]vžOˆ¯[¦¹d‡¤NŒ²g®fЧU‹°N¬¹fp¤Pj{4k†0‚¢EtŒet”[x°{‡“LÇ}~™Y³’O¨ÿ©âÍÒÄû~„®mÿÿ¡«ÿ}œÆcmµ…k‰BvKn”Mo”Zm™O\‹+„}\±¹Y©ò€¥^{¢i`€Fy<|¤EsŸcnMx‚;†´V˜°R¦Åk‹¸h˜´A‚¸J¹`Üÿm~Éc‚ªZ ºc±ß_†¿IiZ‚¨y—Ep‘P\z=™¦Qž½V{Âpx¥m”µjt§Q«W™Ôs§Óp§ÔoµÌu±ævƒÐƒ–¼ž½|•µnp›ni‰G}¤Sq K »I„¸FŽ·fpœ?€§]œ¤r€l…©_z—?nŽIœX}Ÿ]n˜cv˜j—°Xvœ`{›g“Àr½z’nzµ‘{¦kjb®p‰¾h€«p‘¥…~¤M޲Wˆ¦`–Âk‹¬u–ÀpkB[~@†“C~¦U…©Q°Sˆ¯Zw`¯Ìn¼îd·M•ÇR º´¾åuæÿây²KˆŸU‡¢K¦Mu¡R›£_—·S¢K‘¼b‚¦\wœLw”N}Ÿc}pvšjx¦Wp›FxŠ@„‰KsŽ@uXp‰`›}”«_w”P|“Rr™h€œ\t‡Is—;[‡Gv™GeI|Z¹SxœMp‘Ma…Cl‰@]‚HW}Bvš>w“Db†P`‹[k˜Kt“X„¦aa€QW{7X„GXEa„]‡§{•°Y{œUr–`‡£`ž_u¡o†°yеuv—Sy˜Ip›b{¢_|¡d±^šÁw¢Æc¤Ñds¡Kf‡D`‰@YyKbˆMk’=[t?oJƒ•>b[‘¯m·n‹¢KHj@eŽa—·g€£†Ÿ»|ƒ©b°[t g‡£Zƒl–·{¢Çw›Ë…Ђ®×„«Ïk´Úl”°d”»t°Ö˜»÷“§Ôx£ÖŠáv¹Yk‘Ir˜Jg”Us§y¦â“¸è‚¸áa°S€²Sl€I@\MWb@MW3PQ-UL+HB*CS2KXLmˆY›3QW#40€ƒHl–NZahoNntB`~I~xF‘Lz£TY•ejrWc{QSƒgIhSY_POkI`hAq|<h~K]‚WwrQ|{K{M‰‡S…R…’[~ž]p˜az~Nu…Ji}Mx‹Lr’Jn”]]ŒQptJh’PMƒidhD^AL…]Zg\hs9g~D•xO‡©c‚Žpk‹MiˆS‡{Nt£Mm—usŒZVUTtU]kEcuI[qHJk?Wi6kb+b…8\vHcSd‚Rj‚^m€Xz„Up„B‡xB†P~”Sl–Om{Iqƒ9l…Ns‹Y‰G}Ÿeˆ˜`„˜Nž£evÀ~”žpržWi‹UY‚|IŸQ…¯~`¤gF‡XZ[.v}/Ž”D‰´Z}¶o‡§[¢e£Pwœ_‘—^{ºvpœc‚‚GuŸKs›Ie…RtxJˆ6ŸKoT¡{=«ÁfnÁspynl…=pyD½šIŒêsngšPn‘S‰’H™§LsÀl”Žvh¦J´}GÚboÑ|¦£¤¥Ì‹u¼gx g™em¿Z“o‡±]Œ¥UŸ¯W¾’y»z„–c‰±M—¶e’¶zm®ƒˆ…]”žL¥£EŠÍ}|À‡ª‰pœbw•Jn–c†€Py¥Uš“u—¼[{«g—V¢½l˜¤p££XƤOƽpÃÃpØ¿¬»q”©b«f‘¤Y‹—V”“Q¸Ì¹çˆÿê¡ÿ’½¤k—½±ž¼¥ÁwgʉY~U§—3‘϶›ª¤šÆL²°hºä\åó]¥ÿ¹] ¬d‡F“˜G›®cyÅetŸdmœ=®†,¸ìm™Ôiq T‰˜AüK—þ‰tžfkŠa}Q~ @Š’Nf¢\l†A•br¹W‰¥H|Ÿb‰F•G£RŽºd¥²Y‘¡DrŸSp˜DŒQ“°kÇ^€©iu£F›¢G…½ˆŸ¯[µQ‹µJƒ•E†ªP³e•º|®¨džÑ®“³Nɶi¥ÑQº_ €¦Å`—»g’´dŠÈg«`…§U£D ›J¾Æ\Ãn§r„ªp|›7›©:ŠÇaz™Mu™L{“Bd‰D–kkšP™R»Ó“Ÿ¶aŒ¤}¥Ñ}¶Ç’ˆÚ¦ ‘–ÜdšH±ÿNi‹<r˜BŠ–Tz±PrƒRj¦oz}vŒªW{²A}My—Lj“@g’?f’PxMbž^w‡9Œ§Z•µZ‘²Ž¹p¥©]ÀÜqˆÄ\h©j~‚Tÿÿ¦Øÿ“h˜DnŒF‚¢OGt5fs.”²Tª„¥Õ{| Wi™EjŠM¡Lxvž¹]”Ålˆ©rÀÚy×XšÊŠ€¾u„¤~w›Tz–@¬ÑiˆÂcxŸ`q¨‚tœWjˆY†’_¯f†ža‚«i‹±j‹©rx¤f‰ Q‚¨Uz’gw–Zs¢Uƒ“Wºf‚±Zkh†²Mo±WhC‹«KЍiy•Xz°^h“Y‰ ek’\~¢d£·]€¤bx–JŠAr§Dˆ¨k¬]jŽº^¬[ЦÚsi˜k„ª„„ªx¡Ô†ºïÀ‚¨NfŽ]‡§f‹²_z¥dÅÝ“›½{”°c’¼§Ìn´j¨Ê…´ád•ªZ‡©_žÃs¸ÍSºR|¢X º[xŸHw•HŒ¢g¦Äm¢¿R–©]›YsŽZ€™]b‡Gi‡Rs“Pa‡=la“¬gh‹Yp’HdˆNtGl‹G[ƒ<WyQfŒFo‹Cb‹Oy¥^~¥ct™QW{@n9]~>Qw;f‘I…¬gu¤g’µozžYˆ«k} b¹l}¦_w˜e{¢Qj’Q\„ObLs›a¢ÀsŸÂc‹¸€ŸÈmjK¤Qy›Fg†Iz§W|¦H_}ErŠ`’«Vq˜`’Ágˆ®\d„?[zApœoˆ^zšo~¨kŽ®n„¢OeŠI`ˆSw’i‹£wduŽn~šxx£{‡r¡¹o©l‘¼ƒ˜Í~‘Ç…¨ÛsÄ}¬ØzÅóf¦ÀXu Hr“Nlˆhˆ±–ÄtЬ[¤[“Âe|Š+2@:GYBcoCor@ZP3KK.<I-@L>FaYy’Fe{/IPsm?\~MX`XpOmo>T‡?_lQ]wIl{TXmo~`^r:^oMXuOYjIlvIPƒLVsNanDjlG`U„€Ag“XvŠ^r…Y‹ˆY‹žlo¤p|”c„‡UuO€¡]}”Xp]nek{Ua†TKhZeIWo3OyFaa9gq9_‡G{iIzO{qo\g‡]rxTsIr™ru’h\^fxPo{@q~Oq}Hb{?eyDjw8bŒKb{D`…FZƒC_vIbzBmwFl}HuwI|–I{’T}’Yy†PoLS‹X]jMjxH|_Š[Z«[k~[o”Vxi„…Ox€S”ƒA•°S—«cš°yo»ƒc•t‘}8i¥Zƒ‹Gg¤R]“noOw“^‹›^s©Yˆ–\„°prŸf•ƒJ‰¾Td©mv^¨ŠH™˜6~¤q¦b‘»M®¨piÏ|‚bnCZ|Oo:{™}b”|lWgŠB’I…®RbZl{XkFq†C—›arÃq…Y“¦jr³n~a}¦`x¦o“˜Y£®V„·nœž_›À`t©aˆ‘H’®V™ÌZ—¯|f³{…„Pˆ¦d~¦f˜ži‚³]xŸp‡‘]ŒN—AÓ¤Nšßg‘¨cx¸p„›džœ@¼žiÎÑhÞå¹êŸ¿‰‘¯lÿÃ}o÷„rv½±d’Ñ^•K«šZ‡š^Ÿµz‘¦]‘ƒ†–¬W¢sÆÆ¶ƒu U¤ˆ)ŠÁ8S®•¾cb{Ûr•ÊT³©zÓîmzõ¯|Vb§:yyA¥OÏ„gŠE‚•3pƒJgˆ˜t‹t˜™U›»eŒ¸fc´‘x‹Fp‘;Œš@{¤BŠ¢`lš]„‘N‚fh—jš \Œ½{‡žD…±jš²\¡¡my¡u„ŽKÁ‘Mi¼i6Š«]qœX‡Ÿ=žŠdÇÒlóe¿~„¹Šˆ¤F‘Azœl‰¨p˜ŠF¨°q¡µm}§v¨«Œ¬ÑÁp¦jŽœa{¢Y’™n£Y…Ϭ´e™ãmw‰X±±D¾ÝjÁ[“„]¨¿r‡˜Iq‘@ŠšRgIt‚?›•Aq‡Kƒ¥6`“GƒJÿóxµwvX«I¾exŠL‰¤d†©oÛ¡m¢ÿϱZ„ŸPvŒBi„Ui|X§”`y“€œ¯‹bˆ[ˆšF”·K…½<„ž4šÌ\‚ˆBq±@€žU‹ºbš¸]u¢Mw—`¯£¨Šº£‰¼}¯`zœA¢¿ï²Õ½±ÎzƒÈ_^{C°ž>½òQ‡µ_y¢Jy™Uv€FnŽ@~¥9–ŸSp‘Gx˜c€•^{–A•”¼h… y𾇥¬J€¤Xƒ˜pˆ¨}š¼p¨Wxš8¤ÎT޹VбZ˜Ácj‹^}‘X†¹ht¨M€œRbˆL‰ž[g–M|’a~¦Q~Ža’¯€^Cs‹R}¬`…¦\Yˆµm|ŸX|£TœX«\z©Oh•Wmˆ]~¤rx—]¡©Zƒ¤P´Ù‡”Áf†«^~¡ZdŒ\r¦qmŽºT´E¬gjŒW…Ÿyœ±`wŽHfLPvK^€Hw£]s£o…¤f°Èbn“Qj‹a£jŽvz®vž¼`|[‘¶y‘µqÂv‰¦X„·dzšW§Y}Ÿf¯ÍŸœÂ‚‰¢dt•Ro‰`˜·a„ªCg‰St•GUu7gˆT’NjˆNfJ[JjŒXkSg…=g?kˆDa}AfHr•bp›e`}G]„IZƒJXx5aˆIu¢LgŠ]yž]r˜_c‰Ij–]d…Us–h‚ªT|žXxªSmŽOh‡Fp“SuœaŒ¬u¡Ëi–¸oޤWwˆXƒ¦vƒ¨d{£u½Öy¢·^®Z‹³i„šUw–W€¢tˆµQs’Ar”Hti^zž\pŽ[j‘dz¤Ir>jƒJr•i¯pªMhJmQn’Rm…µbt˜\n§tˆ®y•¾‚µßˆ¬ÓŒÅøšÊö·ØhÄV}±QlŽXo‹d‰®Zm„@T|\€±u˜µ5We/gEl}LDX=JS5BX/AY,Kb2I]F]ŒQ…›Dgk/^k?Vj8ceHiq;t{GdˆHfuRuxN~vEbKh‡c_}J{lKp‹Oh‡Zq{QU„Q<sOTT@]c1qjFx|Hl”_i‡a_zLrpE‰ˆMy£dnšxz„du‰XŠ‹i—W_¥cu„|{Mv’Qe‹dm„R†x9s•HktFc|=oxEduCj„Jk…M‚PfWcpQk{<gZ]Žm]o\xqS~‚Fz‘Q†…IwNi—R~zKlšVi‡Uk†Ao„JZ…MmsIy{B‚…Gh†Ob}Bv†OŠKƒXršT?”fa^Eiy1nŠIkŒTO“^beLmz5pz[q‚T‹€Q|žUuŸs}–ƒ…“qf¢{_nx~>k¢\•‰Lt¿ZK“f\f;tz@‚‘Kd‰NstR“Wj±Y\…¶[_œt‘sP¹¡Loªe‡›jœ¢N•¿fµºu¥àq\²{ewDs†Lq“=aˆT]|M]|6…=†¦[s›O|ˆJ‚DŒƒ<t–@”Ne¦_zŒKs“S~“Ro¢Z\„H‚‚GqUsa{”dp c‚‘Q…ŸUy£H€P¨±\޳†[{œb›]{°Uƒ–V§[zµWŽ©K¡®[€²v‹žm¡Á‡¯Ã„™Âe¢¼W„¯aÀO×ÖvÏÞ’¸¹‹ªr ³‘£W°a§ªM‡ºf‘¡aº³e³òv‘›Ãi˜°\Ôbž½[f“QF]akQ||€X”¤T‰±u“Ã_§œ™ÆQ…®H_oQwPql1fvM…„@°—[˜Ñ„SdŠzYU¡e‚ƒAUŽid~[dtPYƒCToOj€@}‘D¨¦X¶Ò}–Ñ—×Íl ãt¬Ì>b¡X¬[Ì”_t¸m’j¢Òywgu‰P¨±X´U„’[‡—=}v‰‘@½‡M޲Q—vw®nx’€¼Ç~‚ËG‰œW‡•V‘«G”ŽJ¤f—®PНMi²P›’B‚ÊlŽ…=¬ñrѽU©ÔGp®q—›E»ËŠŠÛa®ªg“Ïž|™s‚–[Œ¥fƒ¯I—œ;y bx—L…‹,¦ÏzvŽ=¨•TŽ¥P~ŸFÝ‹~ÏYŒœAª´\‰œZv²G—˜Y ½S°¹t’ „z¢Rz\†—R_…D€|4„w‰‰HӿЕÎf¦²k Ê’kºHos.•žR–ÌP‡´†y—ax’I€¨Q}¤R˜Z}„VjVU‰UiuZTŒP^[.£´~–æt¡©Rt¥^‡¡m¢§Ââss£:ƒŸNy¹Up‹:x•Xu“GÈOo£D¦¢\¹Ý`·éoˆ²`ÇÁu¹åt°Í”®ØvœÍXŸºe•Â|€´djZ‡ªž½d} bµql“SbtQwŒYvŽN‚šTp™Ln†QtšEt’Jr–X~¥i{œUsŽR‘²`¯e‰¶gœÈu‚žVt’P³zž»}¦×u€¦L‚™J‰©P’´M„©O‚¤W—ºe…µwx¨\s“^y–Ye™pƒšth“[Ÿsz²vxd‰µU¢Ä{œÈe˜ÌVr“=ˆ—5޲EŸ¥VªÖZ´ÄqÊb”Pn‡C‘ž]€¥]ƒª`¥gƒ¨g„¶`|gqš]vžl£Åj•¶Z™ºc‡©O}¦r„£o¨Òs€KƒŸJwœu¦½Š³áOg‘Tq™=\ˆMfŠIs˜AWz:\„;l’Fp•IfŠ<r‰M|•JVz6Z|FWYrŽBt“Dw›Maˆ:s•D{ŸWR~Aq’Xp‘F\ƒ?m’=x›Kl”Mn‘^|a}¤f°SsšU—´^~§Vl”S}žqÆž¼˜´_vPb€VrXk“q©{¤sŸÇw‰ªmª·_Š¢Xu—[vŽ\¦UxTg†]ql†£e—œ\˜P{œVWp‡FmŒ`nŽng‹MgPy¤Z‡²{¬Ïa‡±Xi“Hl™ck•w‡¬ŒšÊ‹›Ó‘Æö«»ð²Ýy¿æ~ºÖmÄÞa›¾qµÔl¯ËPЬc¡ÉvªÐZ£T…£Qq@cv:[wBlHq‰S”©V¥±W˜¯lžÂSbh8ZxMVa<S_6Xc;imGiJ`‰VtRƒ|Ar¨Tkll‚RztSv‘KNŠlEr]G^?9n@US4jd%_…BnvMx]c”aV~RmlDmƒ<bŒdbqdr`ixR“L‘ª[²upštmˆ]z~Ug‰XUyVjiJjƒLl|Hw‰K†{K“ŽDjšZpƒ[‚oGZ‚KdnS]x>b{Ng€[lzFzwIq„KmŠWu‚Xs—a_yƒOg’Rm}enBj‚TUnQmkB|>o•J\‰SpqL„†I{ŸJ†ŠX\œU[‰ek4|‘4u¥\]ŽZnhFG~A]c=xv8\’NtQP‘W_jh‰xV¤š_}‘kˆ›Zj£Ol‹Vt‹Db“cojanwBh‡EnEj{Ivt4u¤?¯™W¶Ô^ÄÎk±ãq¾Ãp¾«W§È‘Äu‰¹TgojƒT¥œOiÂy‰ŠU‚°Ht§Y|’H`©HQ‹Tvo8k”B’Vm”M¦L”žHƒžQ‡‘N~b™Hr¦T~JWˆ§B{šAvždx“m‘–[f¯{l„Fƒ‘O‹§Y«EƒQœ›k”Âi³«fÇp˜½`v«_ŠšLu¬T¨ˆT˜¼f‰¾„¡±dh´x¤sK¡Ë‚~´€“©o›˜Qæ˜fí«¿ˆ¦hôPxÛjšU‘¸]€¦bÞÅ\Áþi¥ÏožÄ}®^•£cŒ½n„¢žˆ¦[O¢AtU‘*…ŽNšŸT°QŸ¶l–Fª¼uœ¾sf¡d{€.ÉŒ?¥¦Hj–P™U¥Ák`›a|Œ/m”Auƒ]}†@g@c~C^v2«F›Ñf™¢\v£ŒŒy¿Ìnж°†j|¬}l‹Tx§8¥„D„«w¥¹B…éas’^j—:}Ÿ`~¬{˜NŠ—MŸŽb‘Óe¼»\½Ü‹…ÍU{§aЇA•¢^˜Ãr‚ŸxŒªVsžRŸ…;~Îq‘ŒC–µau¢H€<€ªaz¶U›¦†Ôß·ªé¡ÀØi³ýh—Û‡¦wÃl}ÁWA¯ÒIˆ«Lˆ¶q©e”®S…ÎHjBšƒYlyL¬Z’±KœŸXª¶cƒ¤L}H£¬`w¥Jy—U˜„_»Ô}v›g…[m SŒO–Î[‚¶GªE¦Í_¨½sŒÜœ¢¢‡íñs¿ÿ“…«Rl©G¦¦F˜®sµí‡·Óf} ‚©v£Å\ˆ»R¨]q™d_ŠDd‰K¨7z’>zžS°ªPg‘J‰¸f¡¥“Â¥®ßuž¹W˜Ã^†£X«W…™Y’¾gs¤ZŠŸP¹h’Çn¸Â£Äá¢Þø°¬õŸ‰³h´Ç§¶ßªšÀzpžS’¡\u@ˆ«PmQœ–l‹¶S…¨U‹—F£XwšSi—Sx‘Nm{O—¡_qFcGi‘WsV‘±iÀÅw{²f©Y»[~¬MlHz›v޳€®ÈŽÐ{gšY€\ƒŸa‹¿[˜Y±cy¤c‡£_€§Q}žR~°E\xMf‡P‚œZƒªV—½k‚´e‰´€ ¿yªÜ•ÁßeyšK›¦b¸ÔzÝûŸÇ䫤¿ƒ’¯u—´]”¥X¦c²»j‹©tˆ¦jl™Pu_‡§XŠ©`…—^‹Ÿ[xžb‘±h¼l‡¬b‚¤q†¦Vv–ZbŽL_|yвœ˜ÀP_ŒS]„FZ‚?jHfŠAlŒNt”Xq–OmŽ?‰•Xn’Ci‰AYDUw:W|C^‡Hp‘Pi‘Er–\y¢LeD`ŒLi’=`‡Bm“Pr›[kŽQt˜n…«`nŽ^k—HjŽaw¦sŒ°[u–Sf“i§oŒ¬s‘¨`r”IjHsPx”Rw’^…¬~Ãp„¤ft]c†\jŽRoŒ]z¡]xŽHuQt‘aw“\y‹Ti‘SeZz‘Ol{Ei‰Gb‚B`tCeŒVs¢o•Á‹´s†§Lm’Rt‘Ru_ˆ–g¢|‰©¨Ù”ŸÂ|±£Ç{ Ò…©Õz˜ÆŽØŽ²ØsªÚv©Þw™Íq§Ñl ¾h¢³T†›GnŽOb€TVkd†§m£²ayošÇmŸ¯<N†YI[OJ\8Yd7YlAfmBi~Nn„Qh{Mv|Uk{W^}[Z}S^vNO}`XZN\e-Zq7tc=w}8TšM`o_‡yJzžYyg}‘V^šOCwaURN]_<qlF‰zB„¦Q|Ÿ`”peth[|PbrP_jBvtFqGy‚S‚‘U†“[~˜_bœc\m^j@\K]pNRp;XlHulEdŠM{vKlŒNy‚`q‹Rb‰bi€Vt}DTŠS[`Tƒq5£}Jq•P|{TzCl‚Gc†T„tCY™Q`EŠpPd˜Pe‹ihy-}ŠAZš[fƒ[`ˆ=YOzoDr”Cº•O°ÌSfÅq[†Y{t2™’E’°mg«oVVorR›‘Dª¹my_’”I§·cŽÔr‰¨l˜šJ£ÆTÓ‰·z“¯ƒ³¿ÆÖ‰Ëå•Ëé•ãÔ’ßëŽ§ê ”¼d¢²]‚Ák•¨n°³M•ÁfÇÂXŒï”„¯{pŸH`…I_…N€Q›@”³`q¡kŸ›P™Äw˜ew›bgŠMŸ†T°ËM¾†“V‰©dƒµMpžti’^‘€<tªišŸP Øda¾yj€s‰•Dj™‡§‹h”º]©}±»j»êkŠ×‘¶¯|¿úc…Й½—O½ö~ªæ{{°b°“W²Ál½è¯àؔ冸r–Ôt¶šY×ãÚц›ÿ|g¥†‰\¤_‰šUq«[i‰[ }G“¶p¦¬cÉd€£cQÀ¾xÁâf“Ør px¬Šžz†§lD‰”?²dÔµk³òIm©™ŒV¡˜:«ßu“Éh¬ÀMÚЂªíso™Ov„9“”`§qa“¹tÄaz²u—•oŸ°dŽ”XŒW•³nœÀm…¡fy¦u€™vŽˆ@¢¡:Œ—d€[Œ¦^”ŸN§eŽÐc¦§[«µ ·€›Ó~Œ¶>©Ò\Ÿ¾v—¸`«°a‹Ìh°Ì^®Å[Êßkêÿp°ÿ¡ƒ½qœªG¥É_¼ù`qÆ~n €œ«`¬Ág‡¿rŒ¸a«·_¾ÇoŒÄnŸaŠ£d£W‰’k®K‘¡yƒœW„˜;‰?ŽŒy–Žc”™n§¯b˜W¥±Fs¤m‡Gœ¡M§Ã~·®zžç€†¿M–·N¯5–¸“¦°_¦×pÎɈu®Oi‹?{œy}¬”sH—ÃV±w†Ç…¿s âÅ™¬b|Ò†Š’W’Á€½j»S±Dy‹Fd‹M…‡²»{»ÈgÝÿ’޳ƒ¬Êk¢˜y‰²mp‰ƒÀ©W´p‚‹[·æt•®r²…j“JŸ¡bŒºƒŒš}Ÿu˜Ê•†¯ŠŸÃs¢©`s˜ar˜W‚¨Ww’Aw›j}‹Vy”Lƒ›W¤]˜¦m±Än¼Zt†MšQ„³WŸËeXˆ? ³€‡¿_ˆ›Jƒ IŠ¿I ¢jˆÂŒe]”©†ºj‰¹n}–K¦e¢ÏiެoŒµbþWµëq„µchˆQy…i§g‡¨aÃZ‡£\j[‘¤O™¥Kh™JoŠg–¹lŒªp~¢jh“^{ €…§‰~«s¿i°ÄwÝ÷›ŠÅ—ƒ§[œÈÂÛ¥•ÀVЦ\£Ìb›¶d ¼h®ºdmI‡—fÁÂw¤¹b—¥g‘´S¦ÂnÈæ{‰¦`q–K|šPn›St–Te8Rm@o‡m˜©mwŸ<]€<c†@t–KoSkFkˆPgŒH{‰J} ci™CjŒ<[z=U|;f„8Uz:f€Cd‹IwŽMp›V“¯\x˜OiŠCzœT¥UxŸZuŸZЍ_n“g…œSk“@aˆOpœq޼e{¥TyœQvŸg†±•»`pŠPk•XŠZ‚œ_}ƒJdqмt‹°[}’Gm‹CdŠL|˜[‚’^Š›_‡¬SmŠLmJ€™Y‘¯M‰˜^”¸U{•BcC^|@`}=`„Joœd€ns”UfŒS}šZzV…¥]|’Hl‡Xn’q›º†®mšh¥³l™Ál‚¤pœwˆ¶yŽs™Äz•¹s“¾{—Ãi|šrŒ±g I^€EWpAfrDhzUawEOfb¸}¬ÍPJƒZGbSGZ2Na4O^9ag?_tB\~S[lNvbG}yEp•W`–aYyPagHjC^‡2gsEktFkyHSƒYanWk~Ay‹Q€’^xŸ]b‰i\~kga?dl4‚sB~r=w‘OhŒcUsWh_IYƒCowQlz<ŠRU˜Hoqjy€Nt‘^Œ‚h€Ÿjhžo[|KKzIxc9uƒ4i˜S{~OJŒR{hL…‹>Žb~ªYh–mw{Rt…8z}F€ƒCi„I‡tAiˆQŽ‹v{—P~ƒV}„LmMdŠ`YxE‡k;‡—M‹£fdºTt†Go”IV|Vup6k„E‚}=™—Qµ¸aŠÎjˆ¼¡m§nž|=§U²„¥d¸d‡¨Z¾§[‘Ђ²Ž¦µSÁ̓Æî•牳€•®c‡»ŒŸ¤l‡¸cnŸq¶šo˜Ñ–~µŸu•|ˆžvƒ¡žà˜•õ}‡»’i£Y‘b„m¡¯Q ½œ~Æ’až}†‰Q³´T¨ÇS‹Õh‘¥pž¤l¯µV“ß‚—Ärp°a‡Pv®@¥šgªÇ}‰ÁƒŒ³vp°jŠ•cx¬^k‰NNPm½bkƒdj„>‡‹8y¨\fšmhˆQ³~M¥¯[¿Å¨¿˜«ÇÒ °µ•á}¼Åˆ¢Þº³~£”EÔâl†÷¦˜¢š¿³¦˜ê›Ž·y¸Æo¿ß}˜ÐµÁz“¯‡±Xv–X‚Šs‘Ve†N~;‘–m”е K»Ï|¹ƒ©½j´ÕS³ÝiwµcZiTv{;›‚<•Ø\Ÿºn‹¡L£Dt·|¦“a¥ÞZh¡{¬§…sË‚…”g·£y·Åį®z·@•™WŽŸŽ®Ïp¦Ùˆ‡J·†<…q¦™StÇ>Š“;”LOƒ—9©w“?² G‹´ŒwžW¤gltR„«TŒ›€†¦_pŠ^£p‘Õ’É|ޤc°Z–Ëx´ZvÂ`“·_œ„õÆj§öÞÝ…ŠŸv~ªM‘Ôtl‡q`^–{&†Á=wƒa•¬Rv™W“›d•·vœahyRzšLЇO—§_v‡J»§Tšälx´Y{EưN´Çh›³]¸°Q²¾`ÊÕd»Ø\‰¤EmŒQ‰„bÀp¿rªt€¿ˆl’Y’”\|’^™®n’¤g‹ªOpˆ•žG`¦Lg4kˆWl~@‹¨M—¸]™¯°v`ˆ—\z”tr›yz”Vm•JlƒIy’W±½q|¦…•¢mËæyxÃ?s[z”U“»a£Ë`ÿÊzx”aŒ–[¯¸•²ïƒ{¬VzžO¥V•U£Q…¥a†§dŽžM•œY¢¸SˆŸS“¢T‹¤^r‹7s“PxšG|˜C™g„¤qo£vžµ¤àn¤¿[š®nw§Xn€ouCkq‰—wz›V‘”rо|n“Pj„>j=pW¦¹qªy¥Éx—ÄŽz—v¯g¥ÍwˆŸl¥¾tªÔe–ÄL}Wy›Y‡´tn”Wˆ¸]dYibp‘g›Ås¡Ðk¤Îc…±elŒElNsNvš\³i¶às™º‰…´¤Åãz}±ww |Žœ|ïÿ°ÿÿ“Þÿ•ëÿs¥´l”´Xh‹A«°i¹Ôƒ„±i—²}¹ä‚‰¾¤ŒºŒ¤ak“T{§]¢bq QdyAg†4qJ‰ºy£¾IužKžD¦JeA\‹@Y‚?X:c…Hj’Nj’U‡©Ig…WÁ߈Åá^¬ÁKwŽG~ OgŠM‡¨wÌá~‘¯K_ŠElŽUp–Z†¥^ƒ«mžÃg‘ºb¦]|¦ReR\‰So£g~¯Sp˜[„®{Нy `v–Cd†c`}¤RmŒA]ƒQmšfŠ£b™^‘¨X~˜Eq’[vœ_}ži•¸_€™Iqža³x—¹rˆ§yÃ{‰§InŽJp™HyL‡¡]¸t“²eŸTl•Zz›Xo“c…¨]„ŸIy”P j–«d®s‡Ÿm†¯f‚§_g„`~˜cl‡[U{l{°v‘§n†£j}œ]{žn˜Ç{±Ëc¦ÂO…£I‚”K|Dc€:UrYˆ¨s¸`RIRrSSh9Sl:Wb8_t@ew@k|MgfRz{D‘ŒA]v¬ln•en‡`‰‚JT˜PZm_`h>[nB`hCewJjHp…QiƒMg…^sˆ]€„TŠMŽGƒU}ˆGu“\aƒTllG~yC_?fv^u…Gs”Z6‰PIH]TZ+SnD…fPŒ”G_³vo{Z\„RauFxz:}œ\yVt^eƒWl…C«{V…Å_}œ‚x‚Rn‡M…|Dˆ†Ji…[m†RowGŽ{`†œU—šfx[VT‡}^”œF~¥]”yR¬«Z”¹||¬Zq˜Xƒ†Y€’CqžQZ‘S€{NxšQw“kin”^œCŸ½Y¾€v®b¥®qrÆ{}™‰‚˜v‰šqr©\‘h¬–{ÍŸ|›—„¥^~r‹¢]„¬hˆ«h”«Xm¿r‡ƒ`˜Ÿcb½\‚wP³—H»aœzMruSb@ˆq0©°F›ÛjW¡•€rK‹•8yªi‹žy¬¦ŠãÄq°üŠÅà’”Þ¦¶—§¨wÇdoºƒe©©nwÑ•yžmUŠ]izPg‡M±Uƺ]›É‡š²«²n«¼VxÔ`o”bИGªÒP‹®a¤§ZÓ׊ަ¬^uŸ|ž‘Pšºmðl»éfÁÓ˜jȼ{ð¡·´W°öƒ{Ç—˜§U›°‹“±’wšž™}]°žY–·xkŸVŠ“5„¡4V—DYiIœ‡Cš¬fã°Sy䞊žZ´ |®¨œ²c‡¤n§”R³¸@§¥‚}§´•Y£¯w‘Áh‚§dy f‰Žr… qœ¬PuÊ]€?w¢]¨Œn¾Íuw؉¤Se§cxNn•^‚›p…W‘â?¥¥m¦¡¨›©VެdžÀRoÎ`x¥`‘¦IË^ˆ¡XzºO¡Ÿaœ¤I•Às ©F«ÖSš«\¾dsºŽ]|[‡•q|¤’–H}³Rb›Vl{`¯ s]àˆjoG}™bƒ›E}žLmW´·J~½Pkœ:À—‡šë®‘–d›[r¼cw“_z§V„‡=g²OˆŽHž¬ouF‘˜Z’¿hp°lu…FïÞ¢Àÿ¯Ûó£Àð{‰²gƒ—qÁ“L§üe‰¶=|‹Q–]€¸l ¨L‹Ø~…±Kˆ’G¾Ív‡Ã]†¥S|‘S}D„›Rbœ8l‰H\ƒ@p„>‹“Sy¯XŸÈk£¤€ŸÁj©KkŽJp™Kn‘TiV€“L[ƒŸeyšH¡§fÔàë®î§š±c|•_”®v‡¥e±vŽ“M|”NŒ±|…«ot™N€IŸÉk–Ãk¤³f´Ðq…´fšV˜¢m¡Ú—}•Uz¢Sr”Js”<s“RŒ N„´a”»u¤Äz}¨Pw‰Mw~‡¹l™¼‚ŒÇu±ÍJ‡§UÞ÷hÈèqÃòv¶ãX}¼Nt|IÊR„²^œNx˜i‰¼_–¾ªÖ_¢àcŒª^rŸomk¶o Ô–ƒºložDq•W’½qhŸSr•R®Vtª@{«nk˜fu‡a~§op›]Š¡Sƒ¥\vžR‚¦Oxš]“¹uf•\ewW€Œy¬Z½ÛW±Íj¢Ã©–¹¨`‹–ˆªr¥Ê_Œ´SŒ¦iuŸkŒ«dœ¯g»Ý~ƒ³|Äk¤l°y¬t„k}ŸZp—GTu>cNn“NmŸ_‚¥nšËk®Ó†¦Ð[r£GW€6hŽEk‰Bh…O}¨MgŠI_Fk‹Oz¢¯”Ä•o˜mi‹O‚§]„Yš²“µØŒn•LY…>i“OpZ}¤f‚¦[‰}“´k–½]{ [p@gEg—\ˆ²Usj—ºj¦^d`}©Ps•WrbtœZu“FfU›f”°ex•oˆ¡ft‹P_‚Xw–eˆ§esœdq“Wm—fm›esšiw™m€žpu“WšW{™[„¢jƒžv†¹™šÇ{ušTt˜T~–Yƒ§fЦ`“°^Šš_zšdx‹c’ k•³d”¯Zl‚I[sRuVnƒOv›s¨Îˆ¤Çp±m–¯`“¸o„©†‰¯|†¦fƒ—Zo„Ww‘JgEo‰WŒ£m³cbRV~Y\i@XzDgu>f‚CmxK}…Ma‚Xk~S„}IqVq“{q›my–ho’aW[[m]oh5_|?mpEn‚DiMm}\jƒLg„Jo€UwŽV€‹U‰“`tŽ_t‰_m‹X_€U‹dLoŸFQajrfq‡CL”W2jH;B;ZJ vk$r}Ay‰If£c‡†`‡Ig do‚Rp…IŠ€O„Ÿ`J•rVq_{u?T™Ry}x…C•–V‡‘Mƒ“Um[XŒ\WoWkZDmuIzˆfjŠY~W™”Ww±W}£}†„P¢›K¦¥}Œ·m°{aŽd_qO]†_IzaXf6Ao8xcKe‘Do‹C¢G¼n¯Î|…Ï›ŒºŸa¯w†kq›`{ŒhyŸX‡’P„ Lu¸rqŠoqŽ^œš_x²mŠj›´dŸÁh˜¾oz±f¿…a{ÄqW…`afBqtUKO\cNœn7•Æ6“¾tq¶w˜}‹´NuªS[_gzIŠƒK~¯¢¥™§šj¼‡Ž…nˆ°d›_¿R³ªf²~ŠÉŒ¬œTUÍv[h>©}2ǤP ºb©¬o²Êu©°ftÂx| žƒ™UÞ¥_•ý–½©|¡Ô~–Á‹¢§±h ¶T™ÎF…Î~q“|—“`‘d¹YbŠR„Šp§¹‹_ЂUv[{f+w”Aw•XusLŠŠ5|¥D‘¡ahšVÞ†D¿ûec¹SŽk+‘¢>¼U…ºsŒœh‡¤wzcy˜C˜‡X€ž\mš\‡sL—v‡¨P’ªa—¹]^šw}~3ažTs‚=™•Gy±Py•_ƒƒ6|ªM~‚RŸ¼k©|¥±OtÙn˜6ƒ@T˜Yhh*ú³nwÿw‰»@¿¡l“ÿ}SoŽ`u–hyœXy’?‘Ÿm”›Oš½l“¦w}¼e˜™Wm¬u›_n—Doƒ?‡›T¨»d{žS” jv˜[cƒQ{‰=ŠU–÷º•ˆ<¸¬Kz£CŠ=‚¡Km¨]YpR£†QžÉKŽr±£@§ªYÁN†ŠWa‚£Bcƒ^w›J²¦rx¤q~™Vk išUØÐU»Ù{ˆÍ¦”´zެБ±N¼ªL´×qΩod¸ªHx®yŽ—b•FqR¯À`¥Ûm¡}ŒÖQ—Lr‰Iˆ›^ˆ©_—»Cx£WbHx?ŽI—’sÃà‚ÑÎ|–¯w†´e²` ¾k¬JRzE_nl¿–w·õ°a¾¯UÙïs‚»iŠŽCŠ‘;´ÀdyžW~”c«·oŽ‘Qy¦^Š”Wƒ¦c‘evs¬¬vÛƒv¨x•³“¹S„¹u…¸m—RØåx§JŠ–b}—K|–L‚£\›¬ƒe—mf€Ed8~ªV{^ƒŽcœÖ‡¤³ƒ¢Ä~„²ØX€p› ¢Ïê¥åþ×çÿŽÁòÓäÿŸx¸Tu[žq‡±m–ÂrŠ¡q ΦszOœºv¯æ…„·i{£ZlˆW’¬g‡µHs¡[®i“É~h‚=}—S”ÆX†°`m”O‰¥x‹¥fiŠQuGv•Y°cn“Dd=‹žR…nš®»×y•Ác‰™c‚¤N—Á Éô´¡Ý«{ Ðr—Åb‘¹q•l¤f«j‡¯Y”º[t˜Sb†>mXu’?l8v–b ¿bfI…Ÿj±j€£ke‰H[ƒNiŒAs•Pa> ]l‰BTw4^€?…¤Sy¨d³x•¿f¯e—®fŒ©\u”rv\a‰8]?l‹Tˆ¤OuŸe¨µc‰«[y¡c‡µ]wœOj“L¥Éaš¾qˆ±_}mŒ²vsšT^ŽTy¬t°Yˆ®^…¢QmEn…W„ŽvϾdrŽTj†Sn…Ol†RlŒ^‚šOhŽQe†Nh˜MrNY†Tn’i‹¶b‹¨Wq”Zl—`}›]t¤m²~…¬gn–Qq“T‚¨j™ÈjŽ¢W†¢j—¼o¢ÂfŸ¶a—¹dªÉh¦Åj¤¿VŸQy˜\~žU„¥}ž¸‘ŸÀ{¤Ì†Êf‡¦g„ªcЍ_¤Zo„Hk‚Hh…P[xRbUv l’·]ipLcPZsI]~DjzAg9l|KoM\Ujw[q€HmŽM{†W€”]s‘`f”cf‚_njI€p8k‘F^ƒQbuN]iNdtHj}D_€H`vOmwK}vGƒ~M|~T†[ƒOƒ‡Q›ƒMy¡Tf’t[wW_x;N‚QIpCMY'wY"y‚*`‹Nm‚]}†C—–P¯]v§u}”dd˜R‡~L’§Nd¥€}yUb™?LzVxdNj“.‚XtUzŒhƒya_‹__wOn_2Xn8[kJQnB€dCL“³sˆ«|£Z’–Xt˜q‰’hˆ°m\¯uRiJZiMuq8d‘8W‚=u<w´?q]}›H‰®Z—®b²°‘¡×°¶Œ¤_y°f‹”Z†©QQgØlI›…e]=šz7–½Viºx[²ÈfwÞœ_pvo_•ŠEi¦q}^ˆ—F{¡SkŸRhE’2šª^xu‚ušXwÕmo‡w ƒAÇCMbžKb‚[ŠuCo† ‰[…¨y´“b£äd¬p—¬m¶¹eŠ¿g€ Z^€4ï1ÿÙqàÎ|Æêv°ô«Éƒ~´vr¬j£’‚ÍžR€Ó¥|‡^»„ažÀZ¡vpiAŽ–O¡®JËÒf‘êŽižf¥¦[¢ÁhÃlrŸAˆN¬Äd™Âg¡Â|“Ãl»n‘ˆI|ŸDŠZ`›R˜wS”ŽHÔÙ–¼Þ—ÂÁJ¹°K‹Ži‚±o©“O|©]”ˆL·£`‡Š^’Isid©¯MØ^–”|“²„¥p`>œtM‰ÆAœpnÌ~j[„„`êsýUm§I}c¢¢W‚¯v|žK¶˜Ui»gŠŠ(l©E–o”ÆZ•¹‡”Ù©“x{D€ƒX‚¨YL›ÎNz®[h¨fz†Pƒ¤iŠ«`‰¬Fy’et£W}V¢±]s¸PuŠCu€Hœ™V¬Ø[gG£‹U›Ã€µ‚HÍÙq‘ËŠh}J–‹gaœFm‡-©Æ=ÝãÿÿØÊÿˆ¹ÿ‹ª×•|žnw¦mzgcx0‹œJ¹Ó‚|•UxŸFŒ¥V†¡FÏ™`òÿ£ˆåˆx›Lv©k¸Ä`çëj•aºÇX¢»†”Õb{[„³e‹“IÄT‹´Š˜¯_˜°l¬ÎY«Üf–¿R€°ažXh“Hj‰=„œDcŽ;£¡:£y¸Ù›Äo‡¥`~›K ¨}†v[~,q~1£°V¿ºp°çm¶Ä¡ÈÊ®§éJ£¿K’¬T›¦lŠB—¾XŽ·T½Ä~Ôe`˜KŠTˆžV´×t¡Ñ^ÉØŽ•¹oƒµbœÅn„½c‹ªN¢ÀY›¿’|¸U˜¬W”œMm™K„ WvˆTt©R_v<n‘S|˜F„\d}Jš¹|Ñ믕À[}“f‹¬P‰¿K¦´Ð°Þ€Öâ¬ëÿ¿®ó³©ÒW´iu {]‹pz˜]i…\‡«„q‰p„c…¸x|ªZ|–XŠ«U“ÇbŒªZµ½cÿÿ^œÊ‡”ÃnfŒH`‰bz¢oŒÆ{q™Dl‹n°ÀhyˆE}•K}œ^uœdu¡NhŒWgŽnw”euUŠ™e•·gŒº~Ÿ·M‰°j}§†w¢^u¡[“±¢úÿÉËõh„´;Z|Ii—L”¦bˆ™UªSy”Dq’Kq”S•¶\s—g\€J\~FhˆV©^~®am¡YVwOf‰N‰§[uŸOp”NY|4Tu3j“Vˆ±X‹¬`¨Ç‚¢Ãb‰®WxšL|¢HeˆEm‰=\}=lŒHlW„Ÿ_Ž®o˜¯hw›Sa`‡¸a_‹IošW¬|žÏ|‘ºUgŒ] Z{¤Ns˜Wulw¦^wžmލYv“@]ˆU‚ž˜«k{šKgƒEpŠPr‹Jl•\|žPb}>YrMy£j…¯VwX’¬oš¼lm˜Qb“Muž_€¸bm”`k—pqœb‚©Vt¤[ƒ´ªàЧºSu£dƒv…¼„ Âv¤Ærš¸mºy²q‰¦Tz˜d‰ lœ¯wš¢w~œšÁŽ©Ên™³j‰^Šªe°]¨QwœY„ Xr’RwšVu˜e{¨Zr|Hl€I[{LRwMXlAXvA]sFzhMl”O„\~B[“YVsYlwJ‰}RržZd_kvF_zAt}D^‰Y\tReeCrw8[|FSwE[iE^q@ph7vr<yK€•X¥~Uf£Tv„gw~ShˆhpyV|†CQœJdlMa|0v;c‘DN‡Z]lNij7‹zDu¨eŽpžb{ešnŽ¢L|£}ƒ˜^z®Yd‰Zn†Ag„8`€Y||Jx`žŽUвc_§nsJŒEp’TW…Pc?Lq–^n™|—™g†¦]n£j‡”[‰¨P†¨nfŸTowMiŽ<zŠT•B|”[X§[b…diTS“ZlrJ«‡YÙ¡²Ž§×o‰áˆ„¯l{¨eŽ¢SfÀgf‹ubr+“{=œµktÃŽ„’g §[‡¶“lšy€>]•?}ZÉŸ:~Íh¤žw˜Ñ\gÁ[‡7e•PSc}hW™¡^‡¶fs—t¨šF’¾fÁ£a{Ä^†‹[c–CˆsW±£Bo¬—hPdL›V‡¬cš¢~ƒ¯`“”_z¦D—•MמR¶¯S¤eµÄŸ¼»v…¼“„”]v†RouK‘hQ•ªQ¬‡BÐj¬ô¢ÕÍVÚ{ š€“Ç„ŠÂ……¬Zp’Q”—@²uj¥d‰K·»Då“™Þ£oºZuP‰T°œV¤ÑipŽTt‚W|\’ªgË–bˆåqŽqff³€rl6¬y‰M˜@}”Pg}Ajƒ6£”>‰Êna€tŽ.w›d“ Iˆ¦S°ªf¾ßr”°k—elÑ4ˆ‚8ž»qfš™g¦[yLešJ}„[¢ºo¿lh¯rOZ H‘–>‡µ€›ªLœÓ|ͼyƒá|R‘Q…~N§S¤Å—ÐænaÄ€‡D§Ít ¯cšB{šT…¡Yv¦F‚ŸY¤Å y¦Syu@}’YŠ¢kœ¤Zž¹Z²“b” P߯…˜ÅŽ›Îj‰°U’«Nˆ—>¬~•¾s‰£„’¸’¾q€šW”‘`ÒºVìÍN§ØOŒ\`}g²µ…•³†¿ƒ‹½n¥½‚¡Ä£~°ŒmXz”Ov’n†•ltš^¦Ko«rž¤p~¯a‚Ÿd–›gŽêy“€d«V³Ÿczž`«\Œµt‰»ZnA… b¢QišC|ƒQˆ¤a»¶Ž§Îp¸Ó¬ŸÀj£Ôpçø|µçlËg”¸e•ºgÊ€Óy„»“©^¦«x‘¶y~¦u™–a¼_o¡dl¡ˆv—z¸»ºÑ›„ÎdŸ®E§Ãg•±r£Â~µÅ™–Án“¼_”¬”¿tr“~v^wœzn˜Tp†S—¬shŒSs€Cg‡A[sAx’Fl‰V‡ ]‹¹uoŠW•ºb¶{ºrr¢gy¶£Êò–ÀЯ¢Ú€Íëšy pµÏW}«m£°i“µhrhx¥RužN\r;W‡`hŒ`rbt¡}¢²å¿sÿÿ¾ÿÿÿÿÿÿÿÿ“qcvY–±b¨Ôj„¸^cˆ;kXx¢me…?b…Pi„N}’f_‚CRw8Xu<nL”«bshwšcj„Zt_|›Q†¤f¼uŠÍ_z£|¯È³”Çz†¨\–¹^ÀÏZޤu‰«jŒ•n‹®P„šO…«\m˜Y‚”G^ƒ5U|?p‘Kj‹Zqžea…Gd|A_†Q“¬jw¤[€œESs:_„6q™Yƒ¥fˆ·i‚ª{«¾°ÌVƒ«[žÁf”¬Ig…=j’HnŽNk„[‡ž]}¤e©Idˆ@eŒRoŠJd†XŒÀu‘Âl€±o‚¦RcŠNyšc“Á`x ^€§Wš¿pžËm•Ãl‰¬ThŒTy—bŸ^p’Ie‹O{¡`‘£PmŠX}—Kd‰Hx‰Sy˜gx¥]z `€¨lgˆVb‡Qy›Sw•Rr—I]†Jd~PjŠf‹°l˜ÈjŽ´‹²¢ÎqŸ¶Yqˆ]y˜q“±p™Ãz ·gŽ k{”ZgŒVv™]€›m›¯s˜¨f ¾¡w¨¾ž¬j£g“¤pš·o•§g‘©k”µm’µ_‹ŸQr‹TwScoA[mGbnOR}L]oBSs?SrIrUBa†G`Œ\i|OV‰XBoSJ_9r[4m†D]‡b^pPI?aY?YoDVhLae;as7VL^lKVm8dt;ds:pt6oIŒ–b¥ŽWf²Xy{‹†Ex‘[x‹d‡Ln[p—ahŽHuyUe€JI‹WXhG_l.xm>t‹WƒŽfq£^]“tpwj…–R‹™^™ `”²fŠ®pƒ®cp˜Xc“`•wKŒ¶R¡n§dv¼€”o’©V°vx´}ƒ‰T`Ž]lwN•‡\r¯Z|—aª]´·iŒËn©§o‡Àkl˜pqŒNt…T†Ž@`£[yŽ_©›SpÙSW•s[r=^„BˆRŒœWl¹lT™mZyhp{R_€¤Pd™ekŒ2gˆPYˆPwp]•‘]š±lp®qjŒj[Bso@dŒU£Š@‹¾„»¥{Šàm~¥’kœRj~[b€Fn{9†‘Uk¨fkƒnp‹Jrm–—W¯«„…–„n|OÙpL…ÄBx•²jDrt=Š5ž•uÔÏ[ü…Š‹i‚§Xg¤X©…Gƒ‘`ʼnJœ»v{¬r³œF‘©W‚”WžzV¼¦KÀìt¾Û‘ŸÐv··Z¡Òwp±~¿uI²Æx¡³…«Ê›ŠÈw˜¢a{«\µ›J›¿rÁ¶o¡ä¬Ž`ª´vµŒ£’@™L¹¯MÚÖsܘyŽO”>ƱP¡Ôed¢hvt)£M™±c¡²N{a~•H_ŸJlu6fˆ7w¨*mt|”–JÎÃ[òY—£Q¡°R«S‰È©lœxkyYs¨gu]‹…q‰¡km^ž‰C‡Í`˜9oŽWt‘cŠZe™Tr…Jv®K—‹Hž˜sÌxˆ´~•¿šx›Ww¦>ŸO“ÁN\§ockH‘t:¹ä©„˜wº®jžâi}¶v}Œ]z˜cl”T‘•KMžUgo8ƒ‡?¡œiŸ£g«‘c¯¹n³®už Z•°`žQœ¶_z¾ˆš{‡¼‘t‚_”iû°ƒÿÿÿÿwÿÿÇÿÿõÿÿ¹˜×V·Ôf¯æi‹œL‹ÀjhžaŠ›Rƒ›xvŽLaŒN’”]n—U¡›rl¢kx _„—U¼Yœ–}¹qœ¹^o£mc‡8k…>š±fu½cUeCˆ‡_ŽªV¥UxÊaq…DhA‡u¯¸pŒÀc§`˜¬kƒ±~™ t´¿ŽªÛ‰›Èa³Åe~¹z£¥j’È{wžetŽc€§\™©[Š«a YfŸN[}2€•P|¦upžI§¾‡˜¸c‘±b”¼u‹Á{̉©uŸÊmÑn•±h |nO…šM‚®P¹M”©S‡¹]¾G’žDq„=VtBs‚F‰œV—U¤Ðv¡Ãa¬ÛqÀbg™k³´ŽƒËguŒRƒµƒi_‡uc“Ks‹Yˆ«’¹{Ÿm’Áz†¥`€–s—¶[«>m”H‰¶L˜¤R{£Ql˜VÀÆ}ÿôÿÿÿÿÿÿÿÿÿús•TRoUdŠRŠªt¶Üd|¨Mm•EtJe‚DaƒGpƒ?vŒX¢P~ž?~KuŠX‡¢Uv”Jc>ršSn†MlŒP„”LnaŒ»mkgвq—Èw®`~“x£v—¡o–J…—T|`r’V€’T{—f“½]z¤@nŠKlWvRg‚ViŠId?`wQ¨·yu”\…¢KZ@}•Dq’YcˆW§Ðw…²d‚œ‹«Ž“ºm€¦^›KaŒLœZ‹®HhƒIcˆSe‹Vp–a†¡Y‘´XƒšMj‘k¡Â~‡¥cy¡c‚¨Jc…Dƒ§r•ÀXs¨Wj_g‰m‹ÂÞ€œÃOi`z›Vz–Ox’LvY•±nš¤^”¥InŽSx]i‹Mi†Q`ŠWy¤X} Um‹AY‚TlŒXsSaA`†MwPb„Tx›i{šeƒ\r•j|Ÿp†¨WœNŽ jަiªy“¥byƒ]j€D`ƒT|¤eŠ¥j‰©fw›nžt|m¢i~›]‰˜c‡¥jŠŸh“^u’et—n‚o“§V{™Kw”RJ];Y[<P_9WjCShBQnFOoJU_<Rk5KrTJdEJh>UiDZe/nh,b;[~WTjcTmEYf:Nl8V^=jj1[{CVnL[gA^u:lq<ƒrAl‡EhŽJ‹ƒX†•P|–g}€o|‹Wˆ‚_g“g~‚dŠ’[^¥kXshoeKn~GT‡V]qX`n7xi>s‡E_~Z`zWSsO`mH€x7œAª¦eš¹e¦»všÀ{ƒ¯os u“‹Rˆ¬]›s™£gƒ½{§ˆƒªkž¢€|¹„vim‡^oL‘‡O„¥T~˜s˜‹I»Ÿb‰Ò™£ƒ“µe{´ƒibr‰Tl„JaŒUšR—Å`ƒÇvt r‘@yŸQ‡ŸEj¤^Z‰_nsDs~L~z5{Pp’EkŠP‘–F^¥_^}B€-j¢T‰‹X„šX¤”]®£J‹ºez£[™Nm§dloxŠ[œmˆšh¢œ_¢·q¤¯dwÄXc–Hm{:‚ˆ1r“U¤C¬§jÒ¥†¨Éiá«Z¢Þc³Œj¿°QŸ£\—\¹“GÄÇn“â«y„twRZHx@‡ŒP³x?’Ø~´vˆ˜=¹–—…°`¬ŠRàã{³ÿÉ©œŸôÉ•ÿÀ£±´ÆqÇÜa«ö€Ò¹p~âxa¦l¤ŠU†ÓiV³Qymi”‘f¼|yº“hk†€[™Jš8¤°h°Âp¯Ã¤·{o·XŸP¬´€k¸x}y8o„4é”N§ÿ§˜Êl»T–‹nuª7iœ8m|-Pz<k3]šmq{exU›ŠqˆÒIl«^zŠb\‡;”‡?Š×O„ŠK{¶k…”H’§;ÁPwÆQ\ŠWŒ“?°Tf›ss>…H‘¢Nw®VWž`‚fLoÛqp§Lb‚Jx‚?˜ Vy¼^y°.¶§1Ê~n°ZƇGméŽ`„CdˆG„ŽA¬ªA{³XcPwr0~ŽUf‘nŒ€jÊœg‡·wWxœo”ƒ`ƒ·fƒœaxœl¥U™Ùņ‰:ÿÌnÿ¹ ÿèÈÌôÚ»ƒw˶‚Šk›ªl c†˜\«Ùxk¦tlkRfvHkŒT\…S]„C‡š?|±Go»c‡O‡Ín‰ŸR t¿¿]s®jfŽfg™Ž>–ÄExœlªx×¥B¦çc§»o‹«J§¹\y¯GmŒH¥ˆW°âr™´‡’ `ÀÌi–ÝtަK‹JÕžÊéj‡¯™“Ãk† R´Ø`›ÃQ†¬J{ªTvyXr”Dˆ¡RgœL¨Ty§kz¬acI…œkV‡¿v‹³lŒÀrŽºY“Íop²l^{O}‹r‰©Y¤×e¼u™Ó|‘´n¦xi‘ZtžfuœIµ³€ˆ¦O|žJŽŠJ‘‚~ž®Šg W~‹Us’c`’D{–x[‚A¢eÁaŠ®L“ªl”§b`‚C¬Ðo~©hx™Y’gdOo–QŠ«d‹®x˜´g‰¹vy¦\š¬S›ÉV‰£˜ºÿp…Ѝ„¦®“¬ll Sg{LŒ¦P¯d”±k}¨_y•Oc‘Cv”Ej?Wt>e|Ey˜Z£dy¢TˆV†›`¦Íh~¥W‚¨Pn‰S}”Qf‹Gy [p›\|“]—©iƒ˜_†¦`Çåp˜¯u”k¦`j‰E^}KgXv™bp’n•©pˆpu–MUz@bƒK`pUˆ›Ab|<[rNz ]~žWW}:PvP¢clAe”Uo“j^|hޱ[˜¶t¦Åo‰²Nd…OjvÆâ’œÂcbŠ<]<jŽ[‚ ]b…`b‰\gŠPphv—\Z„Oc‡bm—Xl‘Jz¤o†°dŒ·Wx–Nm“Wq›w~¤nƒ«NiWw j©L\‡Xzžb}£aƒŸg¢³`•¯f•Pl‰Ry‘NsŽLnŽ^yŸRkQx›Id~J]„HVyKy–Wm”Lg€Ig…OdŒPi”[u ^y—\{˜QrŽMlšf‡¡fŽ™v¡ÀfHl‚FsŽZy¡p† h}bˆ§e‡šVf‰Ti]uŽbu—k‰Ÿe~™^‡”Nk†Pq‚cz gx–Pk€Rm‘aNZDZ[1Ug5RtDGiI`Y=\h<Lp>Ui=VtJan<Qt:Zj?lt4w‚>gŽU\~VWqVclB^sBjzAd=\t:P|HPcA]h:_m9osD—xEˆ§Mz¤i‹Ž_—”T‘dxˆdZ†\blYVoNupZ‚ŽHc£pTrn`iCau@]{KbsOukE©l@r¯LtŽt‚€MVK|qLiŠ1xFŒŒ]ªªf—Ä{¹|‰dg—s]‚`gqM…\’›_„¿}¥vš—hž°p¹cŠ£x]rœU{›S—•Pª¨g’¸e|¨gm ~†z”¢Vs²|R€xehMi|<oˆKŽ‘JŒ¶S†¬f…¥s‚Nd«\f‡Y{dv¡Re‹H\…X§C¦µWÄ»j¢×x§Üh™ÙlˆÍn›±Si·zUyd‹~6 £Z¿ºpšÚ‹n±‹Wz«`ZŽdpAŒ›I´zXÐÀ_¨á’”µ’–µq\“hbn<l€2T†WinB™yEÿ§_¯ñ˜˜ ‹x±~¡YŽ‹n•†Z‹b«¤Dw°o„ˆ[§ž]–Ácv—R‡t@‹=°™JÁÒ…®ÑÐošg˜‡`‹—ŒÈ¥T„å}¡²½X¼€yIU™—ZvJijSšhް¢Ucȃh€OvMU‹cwL„ÅLgUtBg£`[†ieo7Ÿ‰Nº¾\ŠÞ~— e…¯`¡š_—³sl¶nƒ@•£\q¶Z€†Hµ¦MƒÁ©²¦’À©®»e¨×~¤¸x§¯9™jo·X|xC²D™Èr³ÁMt—n–MÐÅZƒÝ{“£G™•„œy’£s°Zy˜L¢¯j˜¯|›Yq¼Qzx„”§Wnµ]€Š9¦O{Qu¥^\„K|‡n|«Vi°fPo5Qq6bHx€,«¢d X€¢R¡žI̧‰ºW”§`h”Lhƒau‡_u’Laˆ9ŠX‰’Y€[ŠWžl a¬Ôk‰ÒMz’Q_~R]s7k};nŠMe~?…“k¤{‘£mt¢¦Vyli–²°pv fz¥Wkƒ`… \UtFda2pv0¾Hg¯^j‰<g|WuŠ>|žWƒ¢R°ŽxÆßoðÿ‘êÿ¡”Ép˜¹t|¬Ez›@t©e€ egši’Ÿ‰´y®¿`»ÒȨƒºD„–[¨Ü€©mÁæ_Œºw“¯‹¹‘¾s¿®dÊÿ¦w xš¤eq˜ˆG§·¢|Uwcw—h««\„ÊT„ŽVlœRpŽHmH~•Rj–V…•e¨N‹¨WÊ銘ß|v Z‹§`ÀNgpA€šKhŽZq•ˆ^Ž^yY€ªa¦Áv€§Gˆ¥«‹°|…‹a²½‡Ž»x—oºÉ]®Éd…¡Zt˜Gs‘AŽ¡\oŸ?kŽ@r†[ƒ£`}‘Eu§kƒ`”ªs¦Áv†¼^š«h‘À\\~;tMu•\¢ÀtvfŽ˜\Нf¨Âƒ‡¾NŽ¡r©Ï£¸CxšVŸ¸k…¬PmŠL’¶]q—piˆN¤U·À]‡²Omš>~‘D†žFv”Mr™`w˜Vœ\–ºt€¢_ž·…œËpv¦TvQ‚¢XtŸEr£KfˆIiQuZ™_lcŸtma„¤^c…[s›X€°Du˜cr—LX?Bf8TnPXxNjƒEp“@f„P~™RX~<q„T¯½iw—O{–<SyCfƒP[|?jSW{>c„Ov |¿×žœÔ‡~¡Mb†?f…q½È¸Óy‚£FmHg„Xd„JYy4Nq:]yFb‚On€H]C\K\K\€]p’d}§q”»mƒ¯Xk–Qk’Ns”c€ŸUg”Vk’^^?Sw`„¬`„£S€^Чq‘¸w‚¡U†Ÿgž´`‘Ok~XyQnV|œarAh‚N]}Om’^{§\~›D\‡GnŒFdˆWp’^ޝeŽœB]‚Jt™U~¥`ƒ®ƒ®Î‚œ¯R‰¢Vƒ^‚¢c‰š_xkˆ²uÆV¦Ko‰Rc~]|Ÿn†¢`‚‘Yr‰Mt—Ij‡]ƒ£_{“Jf‡KfŒ^^fFmnBnuGS…JIjMLU=]c4ag@fkEkxIjyH\€S]|Gk}JuˆKm—U\„dVrXcvHmzIkJXŽKKpT[iMMa;Pi8]d8nr;€H™S‘¤otn”„f¤ W³h}‹jpzVu?•“Arž\pŽely\emJgcDVB\lC}gF°nA“¾U®“ªšTb¿f‰‚n|™B–“]x±Se•an†c[‡khjHdiKjO‘y:Ž™K›˜^’¾hƒ¨r_ŸnŒµs¯•‹ \›•Sk»[hŽl‡…Vl£Yo“zj’eX‰L{pIl‹W}†f‡CDyW™W™]y¢Vp—m€ˆH€¡Hš—W„¯c„_¢™^l»^ L³gм…ˆ®…mµƒv˜¢qš·ic¬jWYbn6‹<âºc˜ûx ´±Ò²MŠí”Ö¨yºíW”Ýv£œfs¤M†Œy‡§y—°l–ŸYt¸T]’Eb5Fy0Ãb ßÀc¬ä¯±w§ÏZ‰GV‡N‚nFʘM—éc•žÀ”@Þçx¸È‘“lœK’¡k‘›`“»bФ}w¦N‚‹I„œX‚ cr”|˜W«¡jAÄN`a;Yi0am;sR{dj fz†bh”E†„MoRŒ‘3m«tsƒM›¦OŒ°]˜±K”¡^§›@¿Y‘Œh€¯Rlªl„™KŒ’NœµG{®T¥Š\©Ã‡ˆ½]›†_ §{u¢ˆò±„ÆÑv©å†›¹Žžw¾âM§Ò_v¡Iœve’XmmnwZàªPÿÿÙïÿá£â¤ˆ¯FµÉD¹ÌYÍwþÊ[Øÿ–øÿy_ø•IoI]n.r„Co›R€WhšYqsI‡sœ¥P{º1š¡I¼ÀŒu¼Jm•9j~Dp|3ª>a’Y‡‰=‚¦i¸¬n£¯u_¬R£Ž]€µ_„Ž:w”>‚Ž>Š´^h‹nE¢¬f½Àc Á‚‚¦fzzZŽRv¨?c{+ˆ„;…µ’brAˆŽ3a†J¡£S€£rݳ\´ÿ~‹º|PƒLdm[|O€}Z‹ž[’x0€Š°•PzM‰Š9«Q¨›]¹Ñ]Øñ}Êÿr¹øÏÌËäÿçÂìºy¹]…™W‚±Ur‘Z€¥Fw”C¤¿S„¸^€©]»Ã‚Á‡¬~z~^Ÿ ”°H®Å‹·f¹åz²æKÓx›×±ÈŽ”Ë[n‹=k™<‚€I¨À_«Çh“½N«×]³®DÖü…Àù`Åõ\{³[Œ¼F’¦PªÑmÄÜ_˜ÀM½oÛá–Áÿ‹Òy`rQ‹¸]h{I–·§j™Sr„O¿e’Ù=ƒ¥S‘j€±_ƒ’Qz³lt}p”®k¯[lxKo`{œ™Š™¨}z i¥ÅM†£`|•n†—`y–P}—[i‡R¥ºZœ´Qu‹kš¶€·èyvœk}¡n‘»[™Ä\x¬X¢kˆ·WhƒI¶k‹«rq•Mb~G~«vj—Hm‚Lާ‚“¸m‘¯l™ÊdfŠE{‡Iv‘b~ŒI„™Kf“8`…Oc‰]‚›N_ˆBp‹LZ€TtŽSo\¡q–®`Œ°Rm–Wz’Zn™UdBSx?]|HlŠYcHWw6h{S©¼‚ªÃc£a‹©gh‹g}˜hw˜M`9c;ZwB_DxYlƒQ˜j¦Àkf4bŠkªŽr‘@l†e{“Ll‚A]z3C_<OeNZ{\mˆnª‚¥sŒ£f‚šIs‹Rdsu›~x’nŸ\s‹Sh„Se„?bzIu‹?Pn>`pCcuF[€NtŽHWwKaƒ_l•iƒœbv¡`sQmU|¤Wk›Of“Oi‰Pj”AdŠR~ WlŠUŸRs“h‡q—²i‹£q•³as™\‡”\‡žR“Vz–UkŠU}œUmƒPh…Tl–b¡Ec…E\ƒLpŽX—j”½u†œKnL³l—ºj†¢€—Á|Œ°o˜´jªe“²i’£Xpi‚©‚´ÎlŒ£Us…Kk~ZoŽh… [l†Jm„IqŽPi‰Wt’Zl…Nq“b‹pfwAguFiqNT~Q\bZGg>Qa8W^0NhDcbCfyEa~QSŠWciMm|F[S_vWT|ZXpJqv>k‹BUŽ]FyYneE`2OoKl]:sp3czLiƒLƒ…Ut¡`ƒ‘hŠŸXy¥x†m‹M«•KrÆ]g‹~}mZorD‹mJvSg~J•tG¨zA¶~E¶œX® …”jr¢stm—‘Hš¬]n¿tH†qX`Ixi7b}C`d?nuA˜‹<–¦WŠ¥mt¥on–kq†[‚~L}žc¨’p— b‘£kqµrx‘pp‹@G•V…cV^”CZx_uA”“>b¦Y™{KŒ±Z‹u–£e†¥k„œ]Ÿ]§¹YtÌa†s bŽSŽœW†¢j¬šZ®ÐoÄÏŠÝŠ¦p¼©`˜Ëh•¯`‡½q}£`¬–BÿÏEÜÿgï®”užÄ¥O}Ҩ΄všÞj¸²¹Ã[‡¿}u›]”‚PŒS‰¥j›¯‡Q®LukQa‰H€x?Ç‘n«×†~¶¬˜˜a¦»tv·tZ‚G‹sOŬr£ÐpÆ¡bÑÄf]Ò³zo‰™_³Ž^ÍÙzÿ“쉅ðÆ›NÈßS݈g“K‘‡>e½DJoeOX({p+©“HÒÜs^ÅZM]{FZŠHl4v‡pQŒ^klHS~E_^3†‚~vžzƒ™fuŸ|¸™MƒÌZªp[Y}1¡»^]¾uzR™¹Tq¤p^ˆX^kcmtK{{CMˆ]‰eO±ËŸcª§ƒ>¯æ«u¹š—§dƒÆF~“KŒŸ;ä§Löÿ»ÿÿÊÖÿû`£c_ž…‘zÊ ¦‰|ÿÿ’ÿÿÿ®ÿûš¦‚âFdKc“MjuHAr3’a(t¾V_N]}DVƒZƒn9±²‡|½h•\{¢3mx, cZHtx,•—N¦«yŒ¢²Œ\ÒÚkqÂy œTq«P—–<~®d‰™F¼¢;¬îg¹¨\ÈÛvk®l°d§¶‡ØßTvÐ7l„H–`˜ºT_Uer5•XÀÕtv‡m§¢™Š½h…‡S¬ë:ÿÿ]ÿÿ³Çÿ—q·QbpC‹‘Tw‘TogWt”Yž‘Lˆ¦~™{k›•†—f›»tÇÅÁ”Í¡_|AhrBuOyŒL_Lsˆ3¥Ÿnœ¸~™½c‘¡Z}–`tƒ@x•BŽ•xž[c{Ož¢f»€˜Âh‘ÀŒˆ²_¯žÁ}vEŠŒBظZ˜Î£¥™{ÿÿîªØf¨âİԫ°Ò«—À›r”b–¿p‘¡YÒÞÓÿ½¨È›‰¹˜”¿{’É£h›M©£^°ï„•¯U¾Ð‡ÎU‡¹T}žiy j|•S‡ža™È_™»g²ÃPœÎUž¸|´Ëƒ›¼d—ÏH{€GŠˆcw–Vƒ²d–°]ž¯f—§l‡¡t|C•¤J´n€¡c~g¢³uÎü¨±æ‹¦Ãn{œqŽ·i‰ke]m‘ka‚>r’_Ž«a\…2qA\ˆU€ŸZpQy£[r£Xy i°c“²EaƒJn‹Jn—P’a} Sm”I|—dЍifŠ?o‘Ds‹Bi™EZ}ApXf“h~ \t™QhMv˜Te‘Cg~Fl•<w•Ias=mƒDuQ|‰‡¤€³Ëƒ¬TjŽKp„X^‚JQtA]}Cfs>eƒMgƒDf†Fg‰n—±v|’?_‚M{“lw–IbyV`y=Hh:Kf+Ro+Ll0Lt7UuO¢oŸÈ``WOjLToHpŒTb…\`ak‚\f{PkzRb‚Jl~TtK‹Iˆ‰P‡Rše‹˜iqˆH[wTb|Ya‚Ym‹Xx›Rm‘Yy e„£e€¢Xl™kŠ·i‘µ[y§Pt•[wœ^‘oµv›biƒRb…Jp„Wƒ›m|‰Oc‚QrVo‹b§] M_zFl˜vÐÿ¿áOe”g™³c{n¬¿z¢]~—e‡©p†¨ao›^m‡k‚¯}¯Ës¡Êw¸n›¤^˜_‚£xš½j‰—OoŠPr‡Xx‘fuŠMiŠJpˆFhPqLbzDVy]tyŸÀ{V~J\pTTkKPnOc`H\r8RdAQg9Fe5XQ<dk7exAE}IYbK^i5\q;WmOUnGXj?iq=ˆ|?}™Yl‘b†‹S•KiŒViwGw‚BmM`ŒYn…Kx{>g’\u„Ww‘_tY¢~J‹§OUµxeirla:gqB§wHÆyBÛŠVÒŽS»~[ÙoYüŽ]‘®ˆwƒ]”ufr]|ƒKq˜U_Ÿ|NuahdCiu,}?‰œHŒ¤XǨT‘˜_i•qrŠkf‡ZryLƒŠDw¥VyŽeu™nlta^ˆg}vVƒ‹F^¡fYsMjz=ƒ†K›’9…¼aq n‚Š]€•Jq”k‡V†žlo³c“U¬gœÅŸÀ‡¢po§W‹‰Q“œUŒ§^´¡cÆÐ†–à›lµš¸XÈÏx–ë~Ž®v•¢b®dÀ¢V‡åšJ…Ÿ‡SX‰‘7¥q”šSÞ¡WÈб‘Zkf`„i€dL{¢Dm‹Wm‹M`~apf8`:l}F³D«Ç›Á~¿¿k{Õb_ІL|Gw:ËÓ]°ìŸ¡º{²h`˜ƒw‰F°¥<¡ËNÃÙšµñÊrʆ‰•_¬=äåb£é˜w®ea—UmƒXq€BgŽ;v=³C«èyìÐ’Ìÿv^ÈšVsBuw ZŽ^dqJb~:M}8Ig;d{œˆH¸ÜSÀ¹]Úÿf‘ÿ¹¢ymŠmf…7q<‘žn†Çnb•y†to‰Â>”•A˜ÎBY—ZTnEam0Ò˜C¨ÿ—ˆ°|Á³`¢îЦÍUwÍv”‡VƒÄièkÖ뾡ê×|¤Ç~šmFx;‹u$W¥`[ƒNÂ]èëÙ±ÿú`£…yŽ[e•B[ƒAS€PFh4r\+…›kl”8bmP¢9ž°Xo™vpš<œ¡R{·_|iE¥–AÇa’«x•ªYšÁKš³Jž·”“Æ~ާYl•Fy—a€£j§¦pŽ¢_±~v¿Š¯±k¢µs˜Æf®h‘³Ìq¯†x@}¡Kg‡Rx:ŒCz©A‘yZv˜G—{:œÏm•_ÿÂŒÿÿÿñÿÿÝÿÙÆú«—±`„To[£¯@‹±[{‹muxZHyo`t¤po}]†Ža¥ÜzlD‡ÎU• Q‚©fyª^{…H¥¶` yz£l‘³R·c¤±‚¿ažœf~¶X—”S”Ž]¯³“˜Ér•¨u™¤‚w´f‘ªqr£i› pª„ªƒV„RNw6ksTf—TX‚O_zUy¨ƒ]~l‰©uq•g—«ˆ´Ô°k®mr£Nw¨vw™^ŠÁt~}·ªÁu¹Ó’x¤^’¸pf‘O¡²:˜ËN–ÅPŠ»t¡^ªuš¿}~¥{„•|“Âj†¡V•˜@ƒ±[ƒ™d˜¿d§¶ešË–~p¦ºj¢ªb‘µjŽ›cdVyž^•ª…ŽÀ™‘¹rŽa|–N«cq“@a‚J®V[€FŒ§^rŸU•H`y=m“=|c}›Gm“DsœOb‡X¤µfyžWm’G^t=n@rŒRy‘Bh‘]˜¼U_CeƒFa„GfŽJ]ƒ8bƒ?YƒB_~En‘Nm…Mxš^g‚Hb‘CyŽInˆTrHh~6TnN~¢UlHk‰cq”ZZIh„TcAUlFdzQ_‰;gzC`wAzŒTmŠVh‹Sk†\u†NsHezZˆ™Mg„@Vr;Xo0Mc8]l=Zr<i…H¬`£¹‡ÑÿsiˆHOf5>Y4QhK_{Ff|VuWmnQnoBssLteuƒt‰ž{œ§o¥s·¸‘Ó¥·“W™‡QzsU‚lÏ®vÈ¿uŸÀilŽazœax—Z|˜c|©nxŸe‡°l•³iš}¥Ð’©¿tw’J\wAuŒRhU{”auˆLu’OsRqXv“ew•\yˆRt¯–ÞÿÁÝÿ‚®Ðˆ¶ÖŠ«µy¿yŒ®cub‚¡]yœRs˜Ru‚]{˜ ÅžÃ{–¡n’WrŠUzšgƒ¯k†šJh“OsUu”U¤R¨V†¥Y„¨Xx‘Iev>Y€\z¢xˆ³sdŠG\†ZQqLL^G]b4[s:YqBOuCOfA\^>]s3_mFTgCNoFW]8Sg;JrDV[GNa=R[5mf=_~Kw}cxX}kq™blŠg„Js‰L\˜_\{Xdd7zpD¤ŠIj£Q`e€xGržJb’r]xVpj4pr;yF”w<ƒLhlSEkSfLT|V:QzgP[c?lcVXWbr=}yLd—W_~Z~yD“= ¤WȱfÿÙƒÿž‚À}`ldP„yXoxY¦zT{¡Ia˜^p†^e‡_WoY:oJrRA‡{4QŸvul[‘•=ˆ«^¬ªb“Æ‚Ž¦…œ\l™Sk|HtBi‘VegxAzCÅ›lo¹W`uV{HyzLÅ›>£×o˸m°çƒcÖ““„‚r™S¼Š^¡ò“¸´™Ðt‹¼t½©YpÜtP‚uŽd4˜ŸHŒ¥lžšdÁ¸eÇ¡t…±p‚—`c¥‚–C¬¹]zÊXƒYq˜_oœ?Z‚Omy7f7TxežwW¢È‹¬¾s¢ k¶c¬¯@…Åm†¥Ãá¼v¨÷މÅ`ÖµFî—V¤‘LiHw|c”–fe²^^‡5tˆYfˆgyˆG—•J€°A¨›I¤Öa¥l~˜v–”f°}®‰{·WŒR~(»=¯åQ^ÈXCgL…n5l;rˆ.oŽW‘^¢¼™žÖ«©±‘Ëu®’]xÍ]`xCe„E—’[¯ªj±wdŠU‚SYSOl7bf3³¡>Ãÿ¥k±Ÿ–~GÂÛ–”÷Å“Ÿ‚y—vƒn…ÁSv•X…ªykŒ|=rªN`‡<[oEN}Fss3’¥eœ½œ²pˆ«B˜¡<n±Q€e@Œ¿X^›%Õ¡@žêr{˜Bf£?ZN^¢•D³Çðña ÿŽ™±g¡£J˜Ÿn±¶Yt«€¡‰RƒÁfŠXz£^‘¨odDdq8¨®[p²b«˜fyÅm˜¥W”Òˆ [’½Yˆ‚{°QÆ¡\€ŸQÊ¿J˜Ê¦q˜H¹¤`•¬”°ä€ŒOŒn¬p1‰ªpV‰;¥}T¼é¤³Û¸ÊϘ¢ë¦Ÿ³qd’Rn‚2bŠc…†`ާUf|T}PŒ…Rk”Y‰Dv¦Vu„O—¦Lw°––¢J€[‘¯zŒ¤LÄàr”ªj§D„•n‡ŒV«¬a˜«eÍÔm•Ñ“„¬E‡‘H×ò†x\ _¹[dˆW©¬‚ªÊq}®k‚Œ]B}BAQ`w={4dŽ@‚ˆ9w 6ŠRs¸>ˆš]†›cƒ¦[}‹U›Âmnž^™]ƒ’[v \…™O¡Åx¯È›„´xŽ™Tt’a~<v‹d–®ˆ~ªVq¤xuyvšcZ<ak;QdDq^yNÂÍkW‰6™g½Ç˜¸ËŒ»å‹“¶]ž^p’n˜¸n¯·U›~€ž[¹Ìiœ¿l›¸k–¹V“·jƒ“g‘i‰¤^yžX^y?xe}žXŒ›TrR¯´m˜¶^›Ér‚ŸD{ŸMVx?ƒœp‰°J¨ShˆNcŒNˆŸ\Š P|ŸP|˜_‡°Ck‡HhPpŠCm™9iˆH_v9cˆLz•Ww˜_n“Hc†D—™ZsŒLd|Iv‘Oh†9f‹Bl‡fo„G{˜R¨JdŽ>kJj‚@a|>rˆCmMsNp‡@tWw˜NoŽQw‰U‡ŸZ{˜KoK‰’VƒˆM†•J\v5h|AtŸO{ŸS¯Ìe„¬t€“zlŠj]sJ\s4W_)LY>aqUmvY¤|F”„N± Lµ©O×®Sž^®“gÆœˆÆØ…³Ö’½£v•~k°j£Sxch”‚ѵÌȃ• [¢m·×l‘¼c’¶k²eˆ²wŸ¿‡¢p‡¯’¡¸cl>j†N†–WqO_T|WЍ^…¥Y“¢Z}ŽJo‰Pq’U‰®Çô¯Éø£Ãð–±ÚŸ¶Ïƒ®ÒuŠ®^ƒ¦b‡¨d€¥[¤X™\‰žn|¢ow•^u”g·fŒ²Xˆ§h‡¥dŽMlM{šZ…«i•½kªËs¦Ãiˆ¤XrŒLo‰Gt“\xiˆ¦bbŽF[…aNpPP\LX\5\n9]q9]f@inA`t?E@FVKRF:Mk7Pg:_g4OyET_IM\:IU3C^9K\4]ZGisCcz]N„`Mr[k[Jps;O”VNo_Pb6ea1t<qPpvgŠNj‹M~ƒYe‘RgyGx6k’Pm€RS€BfoAP…9Ki<V[*My?Pg7bn:dm@Z=em=`|Pixc}„Q‚˜Rr¦gÿ~cÿ¼rÿ€wåsTW[EifD“m?¿VÃbx¢]f‘ef|OAuI8S4yH,yq'ajrwf’A™¨g‰·‹™Ÿ‚”¬o±ti¤pglV_tBGt<M]EÈi'c¡:`}aZqFxoXp’=iŽO£y.»p{ºq£xS˜txoSaŽM´vF ÛkvÀª^¥xWŽXjEwª[]†e‚^:¬’1§²gÎÉo¹ö©üÅj¦ÿœv•y{‚[§‡=àÒe›ÿsªmÒ[ƒûm““½·G™¾_¨J¡¤<‘¦q˜®\q¸b‡„^{œWÄ¡l›ñh…ÈoQžž‡fˆÇ§Pkð~tÛ´4qû[f•L]Ž>T{0_tDzM“¬V©‹jªt‰X¤¢b£d{ŽZv{2y‡:˜Š1ºÇl„áo™IΪ\{ÛÒh}~ƒy`c†C£t;˜£DVšc‡y,¢Ÿ`–ÇŠ£«‡ К“Àyf«cS„_oy;qU}ERžgS_OŠ&zÇno~1|œ.£©>u³‡ ]…¦Us‹um¤raYƒƒWq¢g¥Ke•cm“N`0ek-X{Kiu>bŽ9QlLje5¯V±¹b‹ÙiSš_Nt/Rw7Rt(§„P…Óœa¡8ktPŠŠb²ìi†°:²[‘°o£Š‹Âƒ|ÉM‰Ž]ÞV|«^i‰X˜„A’¸p‚µfužTh~K[†Icp1T‰¬’f´P“V Ãa¡¥p²Óc˜°ZºZ|¸j}‡i†”JÇu““n†`‘¡Fˆ°bÆ« éÿ×ñÀÜmªVX{$y˜) ¦Wßÿ»‘Ñp……WY§caq)iŠ1ovR`–9tŽGU~?|—InQ~fq”H€‘FYBz„K`ŠN•—`ƒ¢X§`€~bµ¼‚|¹–jxW„ŠNi„@m}L^JfoKTr.l{39´â¹oªWiŒ9‚Žd‰Ptž†{”dk}I}¦gjœ=fm.š¸\‡½GzšB¦¸Z¥ÃS¨J¢Ñoqžnn‚Zs˜[~’T°Õ~ŸÜdd—Wcrwh…[¢q«¾{tŽpf€XˆŒ[ž»q‡–h^™0r’B|¥WjŽ<|{^ª™|t¸][pO¨µN°ÛV´Ð}¥h‰ BޝBu–‡’¦v…°Š¢²i„ši„ O ¶c–´r{¦H‘´n‰ªm±¸§·æm‚¥v—Ÿl—µG}£]}œ†Tt@^z@{Ž\q™Eg‚GaK‚¡m…”j¹[޹pmKg‚@jN_†¬Ty™djŠZ}¡k{¢j¤`y•bw¦Rh‹Dn„:†¡R§RmKs•Y‘Pc‚F`xCb}Lv‡E[r\zNo‡Gt”Z{£]–[”ªW›¡X_‡\YƒIW~:^€Cr“M¢H‹ Ušdz—LbˆL}a—¬f«[r•_oX‚›X}¡f[¬dpœ_o•Or™h–¯wÃô°Ãõ£©Îpœ¿QoRŽ™Yi…:kK‹¥O‚L•vWÆ•Z¤Ho‰N¼¨`ÚfعiÀ®mÅ·ŠÞÄÂÁˆËÉw¢›e€—y™…r‘…˯¬òº¶÷¸›Þ¿{Õ¡v–žr“¤s¥Æ‹»Þ‚¡Ì…ÉЇš¬vžµ®Éoƒ›M{‘`{šU}‘L}Žc|”cƒ n¶¶i‘¢e˜N„V•`¯y¥Ô’®ë›¹ç˜²Ø˜²É‡ÁmÁu”±g‚•]v•^ kŸ¶g}™Xl•Vf‰Op—`‰»¨Ö€£Öw޳]vŒJo“_ƒ¡^³}¨Í†¼ß¤Àrt†Oq“P~ŸRs—Wwb{”]QŽLJvXGlQEaDO`8]i1^q3cn8nlC]…HOtQO^FOV4Tf1Rs;Un:Kn?NbNZ^@Wm5Gk?M_<F_/Q`9][:=vMG]G\Y3^p+OEYuKTj8Zj3Xl4rd;€„P‹ŸR€´bz–]›ep`h‡KW†Q`rN†|@‚›;kªZm€P~y:gŸH[IZo:tp:e‰FTySPlMŠcC£M†°i†žrÿvXÿ‰BÿmBÿzDfXBiu9t|4Š€FŒ©pŽ•i|¨iXŸpGkIn^4`z/mrB…G”¦b|§\n’an€v|…_IxŠiYœvdmScv>PmDn`6xo(K‹>ZlNXiHzq=MH2_dcE2ww?S}^ƒeRy L`˜R„v?q™NY‰UMxwlhXe…=ƒ{9°§R`¼m`jOu4}™c¡˜R§À•ÇÈŒžÝ¿•©~›Yª˜@³ÍhŽØ¡›¬}«ÄisÔ™‡yk”G‰W~™o§‹W¶¼dè·hÿîŒÿÿ‘»ÿ½ÑÑv€á𖍉†½t®¥>ÍÝmⳇ£€¬ˆ|¬zÚW‘ß]´´QT³Z‡p2ŽZxªM¥‘OÙÎsµ·y ®y|…_s{A¯’9‹ß_¤±l|®‹wLªž2ÉpmšF†@ë}^íÿO‡Ñ…Sƒeaq0Z€@mŠ>nGtŠw¬šp¨ƒ€¼ŒTŽ\–j6v»\ O˜¢R—´RwÇ\qBg›4‚bU—pWi=NsOXbNT}=Jq8n_<€ŸMZŽP`7O2kw;i=hr6…zFPvTVt.ed*q¤K¥;`àlgŠOkˆ$¦ž,d¶Z{iRs»iˆ™[´¯U…«Bn•dƒ¢b„¶^Dw‘R‘œ@tªN¨Sq¨WfŽBY—.‹s2‚®P§¢h°ÀKf’:\{=Xr2†•2W‚Op€YzzH½ªw†ñŒ©—Š”ð¥s‚Rޏh¢š>š¾mŠ¥|[qVš~n»êŒ{gƒ‡U‹§€²¡ŸsŒuz’`—AdŒGÆ»GÇÿŸÑÿ‘ÚoiŠYt=h‚1nŽ3hBrHrƒG‰}} jÄmÆåŽf¥SR|9yDTXt†X_xXVdIˆ@¢µ‡o}J€sKs”Wvƒ8›£K ÅV`5hhDx›Ya’y³‚{‘ßw«ÌjŠ£àðg}Á6{“Ri€@j{C_ŠIbxP†bûõš’ÛbŒY]…WcsXŠ£‚o¤Q‹E|O]~Tw“k¡²w~§Yn‘R}šKºo¤ƒ·[p˜a‹ŽnŒŸµ·ywhƒ£Zp‘S~›VŸGn}AŠ˜bhŽMrxT¯Ç”¿æƒx¬Pm‚[ªz¹ËŠªR‰¯g–Ë~‘±hšÒ”¾‚…£h¼j©ro…’£v ”šµygŒ_„™[bNpSs8zBkŠP“ªPu‘>kŒAsšP‰¨kj’]¨im’Jm“Uu‰T‚|}¢s‡¢T€[hV}˜^‘¬\t•SwŽU‘¨YÅð‘·{§XqŽYh‰N‰‘WvQv‡GxˆL€—HkˆD|„L‚Lk‚b‡¡jjyMsŽ_ƒ£]j•ASp0_|EgƒJŠŸNg‹gŸ³Z…‘_nŒIdˆHz•\žšei…N˜Pz§Xk˜gw›HvšRu¡c•d£Éd¢ÀLj„xм’€³„„¢tª[‡£_…œY–eºä–Ñøˆ žW¨~c®Qn7Š•V¬k§yâǘÿô†ÎÐ~ñωÒÉ’Òð·Ûÿƒ¼Û„®ÍŒÃÑ“éÌ»âª귟Ũ›Ä½’Ë´qĤ⼓ÖÐðø¹äÛ{Œ®„¼‚§{—j“²lµa™¦Y‘eŠžiœs~›Wˆˆgš] ›]˜™h›v®Ûˆ¶éš®Ý—¯ß§¿Úw ½p·cxšZpŒVt—]ˆ£{±Âw•«dš¼aŸ³Q}_~¯‚ÄŒ™Ãƒ³Sq‹Ri‹Voeƒ¦z«Ëƒž´gr‡Tg}Qt”]‰¢U|¢Zz¡UoQQŠ\Tm\`lDPuGh^?]r-btFbtBlqHaJnzNgxAUoHknAH|@P_?Uf7\g?im>S}>F}GB_ANZ1MY:X`1Ku<TeP`h8ku2my@XJ\yDks<dsEƒu?s•D„‹Y}fq£vwžaTœ\VvcU}M]p3‡q.ƒ¡>pµtvi‡œLƒªolŸqiwSkNl„L‹Tq‰Qg{Mw†H„`Ü”bÿ¢Yÿ¥XÿpKÿs8”ZD‹©Pu£S~Qz}Tv‰`yxRˆ‹s«˜Xº±PˆËq¡–w¶±X{ÞŒ‰†Š–Wq«^f€VfoCuyGQg‡R`ƒEbs=epAhr1^vBpjK¥€C¸Nz°]j‡W{h3†{5|‚FƒŒH›•E”¬c¡¬icºdb{Ujp8‚s4m‡A•{]¹b›Ú…s°‡‘ƒB²O¨S¦YcÂjšue™jrŒX¢‘O‚Òq{©j•‰iœ³{T¸{SgYw{>\£Ašv>‹ŒVp§Zlua‘Œ\S³€[qsaTDrkdt.p>w”=NXÏng¼Þfª×g}˶¨7l×u“†HÀ©`¬ÿQØÎg‘ê…›¸eµ‘_¤œsž«‚–¦`ÎÅDŽð…•{…–c‚`{§_|•ds€eb{< wBº«Q²»…Ë•s—†^W5g9\Ž4McDˆ_6x“a•~`Ìß”sñQ|<§t>”Æh‚°³u p“®}±…ѳNæÿ–“ÿ¾nc™C^€?CV?…X'f“<cžGKh<CZ!D]Kc‹`%•±YZŽTŠN„¯fm©8‹ƒQ‘²dpÎzu9nŒh‘T½ãއÁUtŠMb„EYm>}ŠTN”Th{/b…Tg|/Ž®/…¯Y©>gŸbl€Ck‰7‰‡Hy’I¤¶O™ÈR’mšªp\°O”,ˆÔ‚¦:XŠOtd+mCw¥„|‰8c²„pt2¡|i®`c~WJXRNk4qk3›µŠ™¹t¨Ô?ƒ¨Iht:jr0…–D{H¼¸dÐú©±å«ó‘‘g`™Jlr2‚r9j±Adh/`pKTi3RrFat]rˆK’ƒIy¸eY€?c}<Um:‹™e_d7dr2†i“ša”“S‚|C…ŠV˜V¨½™šÃV¯¾GÕð_xµLNz=iY8“®j‚¦nr¢U¼Ë©‹ÈvmŽN^9ko9_u:Me3ss_ÿÿ¾|Ì}‡§hfŒAb…LizG”³_ˆ²]‘ÆA¡h[_ž}†¥d’_»ÂvªÏUšT£¦‹¼¾a“µKƒ¤Z«°b¡b©½`œ—ŒØÿ„”¬r‰˜XÀÔ‚Š±OŒ£A˜¦q¬skŠGƒ§Ao‘H€›jožc‘šHœ¾P`]s}Tœ±l¥ÐstŽ_™ˆPŠ“<މMŠ–OޤU€¥LwœGe}=jŠPx”`˜¬c|ŽH”a‡šoƒ£`ÐÙ–ÛuX~9dwQ^wD™²_–Çt»l”¿m_…Uh‹_ƒŸv²º” ¾Yo‡MoŠVŠ“p§ÌŸÌ‡–±_’R{‹C„T…„U|™Ul_z’Vu†Ln‚RoV€•W]rC[rH’¨^“·aw—[kŠOÓûsÈYœ«~£É[ƒœkÆõe¸Ûgºøs•Ë›¾i’ÆR”®kƒªb}šR~ ^†žbk‘XZtJd„k¨_†žAkŒMz˜OS€•G…™lž¹^‚—Uy¥”»Ì ›Y§xPjˆ@_l?z^RŠuSœ—_¼©‡ÓÇ ÄÃzܵ®¨t¢¶¦¶ÐÄãÿ¶ÜÿœÎíüñÍÿÿÁíÔ”¸¯‰ÃÁ˜ÎÛŒ™´‚•·˜¹Û´ñïµÔ¶w•±o·vޝz·qœ¸r¸Èƒ½ÐU}™`Œ´q¦¹`z˜W¢n’Ÿg‘›h’g’¸v¢Åv—ǤՖ¦Å“£ÂtŸXf—[jŒTm’c~¦`ˆvx¢hv¡h†¯oˆ©\„£Yp˜t€²¨ÔxžÅZx“N{•Vz™]„e{¥^vQbAe}Ou˜Xn‹RnSg…TmOgkXbeNUnG]uFogEfv5c|Ok}Pl}Kp…Ov~PtvAe…UZ{Z?rBHUDIW+g\-wv8eŠFYŽ`YwI]d<\j2cn:Z}>`vIfq9mr:u:\‡KduTapKwqBЉA{–TjšdxT|žal›`P‡`DmZEdCcf …}&i¥=bqzsVF„‘d¡”s|”_h“_{zI‰”Yt•`u‰d|ŽS’›Sï¢_ÿ¯jÿªmÿwmÿr-ŒO?„”K’¥fy†SzwLpPuvJ‹G«‹`‡°qqž•v{€¤‘Y”À„™”ƒ“¦`’£jœœr—Q™¥W¢b[„VntIWy9MjRQ_1YR1we<y>§ÁZ Å™ÂzeŽdlkH~u9ž~Bº«pyÏj†¤‘ˆ›n”’g…«K~›_t…\~™Q‡ŽJV¤xutY—•Z³Y…šqs•[y…sŒ‘E|[|Œd“žNz¶dzŠ[{‚;•_°c²œLµÖLêÕˆ¨úÛº†ÿvv¥|n©H[FUvIRy7V{A|q(ˆˆ@}šPs‘N–@ƒµ{—¢•Ëw̾cꀌ±Nšžl©©e©µiÍ̆¯ßˆÊƉªÞ˜–Ïwª¸eÇÄQgÖ³‹…Q—mrºpW“]rvG{’P|‚Rn‘Ky{Irœf^€[ca:{Ž,j‘R}˜^d‰huy8Í‹>ÂûkTЩmjRja‚,wŸ_Ca³Q_yCh‡Y’|DŽˆb¦›jGŠdu´_u™EXu>Yy2Jw.FeKc%qj)€*d~=€xX” {—Çi›¨l†·y–’E»Ô„ÛŒ„œXhƒbšM¾s¡‹¢¥Wd˜SYy/C_/nN$»Æ@b±<ˆ'ˆ¾8q°aamD~~RdxLƒšD|m\u¢:…›ar’‹ŒŒN¹Y‹«v~©Z¢¬~£Ý–{¤\q<p‹HsL‡„7\œtbo;}ŽDRvcl9iw.qp?†–St~ŒŠ¿eˆ†aƒ|EŸ|6†™Vc‘g}j@„°z‡–^¥¼aj£}z‹DvžSzn;ЦO|—Opš=gz8m†3sŠ3Xi@|ŸI†—D|ŠEk¥\gz0z•?›¶U†©„–{™®Sk‹L·¥Wm•V?kŠPr‹T€ E¤Êt®É¢x¤de—<•u3ÔÿtY¿Gme9’¿†bšuŒQ…¤G¡ElC~2ÊÓd…ΕoŠH’¾o¼^y™>¦R„¥cl‚di‘\w‘G—œj}¦d¢šdŸ¸‚—¯¨¨‹xˆj€ŽJ̽p±ÆWk‹A£‡W¥µo†‹_sF¥ž›®·—}ªf›±£—²l·hq‘O‹ªƒtœ[vªj{˜IЦ]eTu’D©a€¶HÌê‹“ÆpЬg±Òq‡¦j”±Y‰P˜j¥v€¥Oi‡i—¥P~£Hq‘G‰œjx—Vˆ¡S®šF¯FiN®nž³\|³:azNŠ¢u°ÈžÀ€b†<b~DpŒFkŒ\Œ¢xkŠfžIr™M›ªp‡®nu‘qÀ欴Þs¨½b©Îf¨Uj„Clz=k…G¡¬X‘±[u¢PcŽAarG„“Y‹±‹¶i¢Yt™‘ÆðІ»t•ªp¯q†ŸeªÊÓ—–– ½£·|¾žÅ뻕Âe »]‹ÃaЏušÁ_©ÎBf‡[Œ´^œ«\½ÕcÀpŒ£s€”J~ƒ]††^s„Cc\ª…®¾x¨ÀSˆ¦G‚¢HopKn_TŽ›j¹¤µ´Ñ–¨ÊqsšRb‡hж„¿ªÖ—˜¦ŠÆ©¨ÀÔÔÕƒ¡´o~ª}¿u|¤c˜§x¿ÅŸªÐН”~£•j‡£|œ·u„¨†ÀÕ‚¨Â¥Ê|«´wµÏ‡µÜoŒ¨Yty³Åy±¸t–µk’´m‹«aˆ¹{›¿ƒ¼|‡´gk…C[Š\v¡`~šYm“iŒ²k„ªc€¥VqŽSkŽT~ŒXy‹k‹³ˆÔ}’¾j”³Ov˜[x—ak™^z£^y™NoKlŽW|œTtŒOwŠMi…Tm‘YXS;[[1`o>ewEdmHqt@m‡PeƒUdwKjySduO‚kOrŽUKdEhTEW<JW*^^+~v.–EoŸ[k{]v„L]‰COpP`kAZnCUsEbn=no4]y@azHinGgpFxzF’„Kc{¦fb—bXz\]VGnPIfBnb1~$T Lqq]WDaoQx}GWi”bq‹j—‡Q^~£j…ŸZyª\€¡cü˜eÿ•^ÿŠMÿyuÿm0—T>€˜CpªciŒ\gSk‹>^zMao8‡oQy‡WsŠd^”ZlvNz€B„‡dw•g‰‡Z›V~ªSžrŸf\ÃeY€ev`/cjFo\3d~+€vCžœF€Âo•Ÿƒ‰¶‡ri~Ck…>Ð{:Þ醟ñ–‚Ä i¡{l|g™wRu²k•‰c‘½bk _H‰XSk;ˆw5l¥XYŒfe^Pi|A€EˆœN~£eQˆ]^t;\q6]a*rbHfžX’zPºy…˜©‚†¬Ž³ƒŠ›m…®zs¢^~—`{^n¨Px‚;…x<~Oy†;G‚XkaB–m9 ¾nÿ¥Š…ízrŸjj‰O¤„8¥°b¡§oŹxêćñÿÇÿ£˜õ|Lª…ƒwRwMŒ‡Xq¤}¡˜]Ÿ¿F Ì|eœazˆO¥´;M¬[;j7od&~†ELzXms:tŽ8x£0Ÿ©@xÁœ[ŠwNb?{x ‚ˆVh—e•¤aR¥šRe=rk>~”R¿°BÆÒƒŒê†x~‚pªqbtj]{[Fp9rc#€ª$f˜:†-x„<‰=k€<||GÙµ\„Û`€¢hˆ£[ÅÍttÚ‚|Io¸j–Kt¶z‰R„-gªHrp8¤¥>èèWïÿÓrÅioˆ:–s€•OÈÌSâr…Fª–Ys³dp‹M’c‚£SvžcŽ}†yr|Ȇˆ‡RÄi§jN@kt8ŠY¼?VPj>_r4[k5cs?hkKk‚BŽJg•B|zJk~9–Kº¹ºˆÆƒœ¨ZŸÂrp•H–ŒWm}Z|y<€E~›@»“g½å|»°e°õe…¬Sn…M|€C~¬M›Éeµˆ~Ø]fˆO^tDczB_|Fk…J…ŽP€—p‘ÏUh‰Pr>ƒa¤lclFb„Oz€^† Q…\vt[…°hv¤…^|4œ¿Ch¥qu‚I‹³[e™lOv:_rHvˆK•¥«…žsµ¿R©ánšÅ€^Šb~™UjKo‹OXr@oŠM¬]f„E‡‘G¢œjœ°~§·L¡¤Uˆ«^‘|•ª‡…”cš¹— uƒž^ŽN~šYšZd‚Dstt¡º{‘²Ty¤Jr–X•JXŽ^t€aª¾|Úv‘¬v‡°xz—’£”x©WnŽHo˜m¤¤…¿×h‚™Zš¥Y“»dœ]€Uo…`Ž©Rx—Hm’Y¢¼oÇP…ƒSh€g}’e×çŒÛÿklœPy—d’¦ƒÆ–‡¨zg‹R_ƒDsˆJ²Éb{¡K]‰4x‰L‚ `”°da…SuŽP}u…©j§ªt‡œrz˜q]z@q‡Ex Ul’W„ _~°ky–i¸Z‡§_·jz¨VdŽZlœ^ƒ¦rŽ®V|žLdSl”k™Å„©Ðx‘±\—Ãfƒ¢qªÈÓÿËUޝ‰Ñõ ¦ã°ØšÞuy˜OµÒt¤Íˆ½à–šÇUo{J}{QЇO‘©o×p«vˆyŒ°’«Ùƒ§Éd£Ìd”¿T›¬hž¹”Œ»y~¢‰±–€£yЬWy¡T~˜lz¥l¨p¥Åjš°yœ²Œ¢»‰ »`všPi™_y j¹¶›¬… Î~¢£o©[œ™d–¼sް“©ÐŸÐï®ÊᎵڶÒ}Œ¸n ¿Ž»Øš¸Üƒ¥Èu¶[„`~´wšÃ§Ð§Ïcp•G^…OqœhššUy v«Éq »av§]ušEtV~¤SgŽq³x™»o‡ªl†ª[~˜Sn’fs›nŠ»p‰®]~¢d†œh—±e†Y~OjWw”oSV*Tb/Vg9bkCcqEbxJllMZ†MZzTwrVmJuX|’K[›iGxbJ`?QZ3fd/ty9j|AZƒ]jgU`~E]€MWkN`o>So:SjA\f7nj0by9_O_nP`q@mxBv{>p“V\ŒfW{jQvZUwTjqNRFcsEUu0GdLZ[MHx@qhJƒŒ>ˆ•Vlšk|„is–N{“]†h V›cwµfÿ\ÿ…Hÿq0ÿVÿk7¯Q;’¨?{°}j™m_†Sf†<lŒ2[l8|h7…‘A‡’Ym¦`ƒŠewAw‡L~„T¥‹Qž¬Kªh–“i•¼gf³p„op‰<[sF„dCY“N†|bg§Ehˆ“„L€´bª˜^mµGn‹c»3ºçy”î³~¼£b©|€G¥“Iiºowu–Xk‚fb‘H^‰@†v2s˜_‚ŠL†}A‹I”ŒW“µt€¯l^e—~7z½Ou›YYŽ7\t?Gs0ChDXW3…^>n˜^‡P£PpžY§„^«ÌfÁׇxÛ“YOfy4©•K.¦‡2@@\O%tu4hAg;ž‹nžÊa˜š]•ˆGk KŽUÀ³Q´ÄŸÅÔÑüÃd±ˆZvt§‚5‰¿sV¤_‚n<Y–i/`SLU>use•²V‡³^_›†W†jE|h[n9Z}#Z‡@h€3^›0[t0m|SoqHrŽ:’€AiŠP~ŠFc—OPyB\l0VnP~yEýÎRÖÿœ›ô¸H¥f@WCeZ<ev1jo<Pw0jŸ.crRw~3ptZr‡Kr\F}|2“‹EfŒ n~P‡M—¬kd¢u[d/]n/™I|×x‰˜HÎÅy†ÃˆÞ¾UÆÓn¹ê ܧy¶‚?¥p¹Ýxh¸›n…[Âp•¼zp½x_{5 u/vªHw«’f’xz:…’lp™l˜–cºÒ_ÇKÊå]¸ìp~²® U` Fd^,h]G³wE«Éyk‡D“ŽSl[‡U––\š²`…‡AsIwwV–“iˆ_U}/Vq4xf.{–nŽ©Mˆ‘šŒª€_ŒHu€X‰ŠIÈÊj…Øgs†Kxz{»Ø~šÈ…€”Vs–Nf :†—E—µGqUpxE‹Ë‰‡‰>¥ˆ?”©Y|ŒP’I‚”1“§:„£d¬Ãx]–It‡I«´NšÅV|—ˆ’ŸaŸØi~ÒkX5]n1es3Ck/qucƒ©g‚™b±ÆnŸÍl”9w…QpƒGt};‡—?“IŽ¥]¥³Dœ›bž®lŽ\m‰= Ÿ_„œ[‹™P€•R¿vŒ›^§¼y¥OŽ´P¤ªo“¯h~žLtŒJžºb¥¼Œ³du¦Q„©hž<p—E¦OElAv~E‡¢]žÌS‚¥Hh“Xn…]tšKzd¨¨»ÙcŽ©\‰«qˆnU†ŽY®aƒžc¥ÄbÍä°ÿÿÜËÔ~ˆ£F~šJ¥¢µÜ»‰®Qn˜RfVfe“Nˆ¢Y€¤PŠŸe¾Ê•r›Rdu†~©Æˆ™Åb}™@sHhŽYޏc‡Ÿa“ª^Iw’Em‰Y¬]w›RobiŒbqŽPx–kˆ¥}³Ì¨¸Øy£ÇSl¨Kpœbµß¥žÇ\[xI†¤‰Âã¶·Ñ{Œ²f–Æs£Š”Áž¦Ü»Êis•ki˜p”¹ŸËﱻ⎻ãrÂæ¤Ã쟜ĉ©h‚›P‰ˆqºÙyœÍ{zn‘›[xŒjЧ º›œÅyµÖÿŒŠ³d”w’³†¢Å†¤^VsZ`yk…©ht¢TeUr™f¥ƒ Âcf‚RdtXkxVq‘EcŽO{¢tÛÒt w¿w˜½q¢ºo·¸d¡¾j’°׵³ãÅÈñŒÓ”Óÿ¦µážÂ}‘~…©Ž§Ô‹¸qt•\g[y¦|›¹~™¸€žÁh{šT…©d‘±k‘ªWs•g‚¥k~¨sšÁ{™ÆaŒ£nžËg£^mŠdr—c•`{—`i…MdXu“o~¡nxše…hr›v’¸r“±d˜TqˆZ}”lhr6Xg9ga=mk6dxEdvV~fO}ˆBq˜V–{VwŽKl|dd}VdvYUySTnFol8g7s~RZ|MPuWiV@^z9kqIel=Ln;Te<]e8Zx6oo6]Ž?S€Vfa?rl;i@€uA_œQm{^bQl{SL|_`e]Ty5OvRQj1Ka6e\9{{5wJlŽX…[…§Zœ™wrÄdy“q›”Xˆ±WŠ¡lz£dÿ‹cÿƒ@ÿj(ÿu4ÿl;ÉY6“£Ap¥‘a‰pqrO}•B†œMy~E‡}F˜DrƒQ‰€P~’S£U‚œ^†ŒY¤L}£h†pšžekÀyt~i¬ˆBj‘QbYMZr8Vj8kqDŸ…=à³n´ÄdжmŽ—x³¦]ŸÂy¹dºq”¢} £uÀž»Yiœpj^¶ŽOw›E‚’bbŸDj†W“x4•K¢¡bÄÂj©¹f¦œb”šn‚¢_]°h€Nq‰B_”|^…8ƒ=p½IKt>UT„b)í—E^êuqzbŽEóÄxÇÿ‡Úõš›í™‘¹u{§UX¢Q:kis^n“1˜…<“«Wª¡iœ§Vœ›f–¦Jošeˆ’SˆŸ>wœ]nX˜‹I×Ö—ú’¥°ot»f¨ŽY…éŸiŒXt~C˜{:zÐ<”Sb¸Lh‡RMˆ7ab*^ˆXcxV}ˆ:‘š>˜³‚†¼”b”lMxIdY1f\9ˆ—Cn¨EDo˜LgŸCZy1Œs9›šgÿÞy¶ÿúi²¦d‚sm-Ds+”`>–³}}‡=p¤^€„<lzA˜†?v—r¾£Q‘¿hƒ{fP›Plm/‰E€ Z{‹j^h^lL=¢Ÿi¥êƒ¼°yÅÕ’¯â¦£³oDŸ‰qo&p i‹›Mt¤Ow~j³Ts©FxžGW|Tu.Œª?rIdz_œlM–ÎVzu,peUŽŸBx¡AdtPxw>z`²È£ŸÏ£ÒÒ‚Üéâ÷”ÎþZÐßX’ÿ™®Aª¨W£ _ÿÿqÃÿ¦¦¦}´›QÌÐ]„{k¦‹U~¦Gav1D|2LR gq-ˆ”=’™E|¸Xi6sC•¦?ŠªYˆ’€—›T‹¯R~¨otS†¡\œÂt‚ª[qBWxUjvP„xA„ªd¢¥Q{²`¸¤]‰¹O¤ŒQŽ›J¥£¿`žm_pR{S·amŒ@o—>”h¿ç¬zň¡?›ÀLlƒ/ÂØa—Ðgƒ·tSwC‘‡ƒ²p]‘J“Œk™©PžG‚…WƒTºÃ`¨³}Öe“iO¡°Q°l°kÏ_§¤nz´i—°_Œ¾|‡£G ²rÄ×…s²ZpšUf‰[xˆ€}ƒg–Yož›f¨èJxF€‰Q|“V‰§M~‹i„œf{RŠ¢IkayvQ›i®Ë‚”ܰcy®Mhy_x›]”°]˜£mÅu¹Þ”޽‚›¾±“£Œ±·y`‚XSrB…”dœ´}w”eh˜Dj‘a~“n|¬a|žX’¬b¼‰±ÍMª5šNšºk›Å^w¢?XyDr–rvŸz VƒšPrV€¨I_xY€”Tª„›¶o¦NœÆo¨Ia†GgXp™SKlnqmt“Zj†‘´ÐŠi•B\v^“¨³Ûÿ€v¡Psªj›Ã‡ÿÿ¬—ÅU_oP_v=eˆILlgy–~¨Í£Íšw«›«}¨ÀZœnŸ§`š®‡¬Ê–ƒ´esŽMu‰W–¢NoSl‰cp‹v•»‰ª–®²nrŒf~Ÿv‰³o¯pµÙ^|¥O‹µzŽÄX`‹Qz›Tw¡[¤c†·Iw•O}˜NjšSsQo‘c€¢nz‘Xw¦nˆ®p¢Ç~·Ém¤œmµÄ“¬Ï¤ºç®±É Éñ²Ñõ°©Å…œ½|аb‚°‰¨ØŒ¡Ìf“¯[}žOgŠbsŠgy—lºeuc}§j“¸ržTs™Rf•S^Œp‚§‡¤q޳µß|˜Ã[t™Y|]n‡Se‡Qk”Dp‘TwŽ`uˆXr’`†š\~žo Àx¦Æh–ŸXy‰X€™mdM[sM_lM]l=KsKTdTs[?Ž}6p’c~Šq_ŠX^z_RnFpjMrCq€Ov‰Oq‡QoŽc[t]Pz`\Y?as>opHcw9UzMcdLxq6jŠ?}{Qa•OS„cwZ9k=lzTp}LUŒK_kRY‚BKv\WfKvhRV;\xXc€6|}4}‹?t”K_–Yer[}xP€‘Dš‘tÅ~„¡‹–œ`vºbp”x€yMÿ{Xÿ‚?ÿf$ÿo+ÿj2á[8š…7š™}Žš]ŒžR–°c£Z‹W|–J€œ\›QŠ”T~ˆG‡ŠX“S” ^}Æ~˜‰~˜]¡¡Zœ½€¡§€”¬S‰g…Xš€P„“UY–”Nž¬u±°s¦°|¦‚x„Q„ˆ_± i¤Èyz¡g¦—_ŠÎeŒ®†R¢{v;ŽŸ/ž‘I€ÀopªTy“J˜“D´ŸR¢±^‚¢s—‰_|Ÿd~žm†™\ˆ²„b¸r_…3‹‡:€Å4¡¢[eÀoc~\|h*fg;ht:B€vZaDSqG]vM`ZG€oA_…ReJmtTUŒ[ym<m£?c€]xp:݈>áëKží}—s†PoƒD …@Êdtžy‘ŒH¦Ì^™¾‹›¦‚¶€«¤nà×Yÿÿ}·ÿÏÇxp¬E¹·Tí„b¡UuyDn”RT‰<”ƒ(„Ç;£„]i´s‘’v¨³™^§gV]@O9tl&|~h{Ÿsf\j‘?^HaEkŒ-]j6BdWgiR\¨)¶˜2¥ô–c„yŒ<‚ŽIw@ƒ¥`dˆPj‚;Y€8f]m›•}w¯nlƒQ_~R…‡4é|<²¿k¶Ë}X¶s\aNˆ‘Z‹…E”¾_‘¿‡VzsyoœÂÄ’>¿yB^ ^o7c€AYy={0¤·~q½µ”}<ÁÊ2tÉ1§‚¥Å½ €{FIª¦{›{CáXœÍ†gn‰ob>ž|[ ª€¥ž†kmÀ~‹“™|•_Tz‡–f…~UµW£°pªàj¡±}p¬`©^¼¥i¼Î}‹¼p|O‡c†Š?w}CšF´½fµÿ`‚¯Bu¥Qi~0ŰX…‚Zš¨^i_Dxˆcˆ¢rT”gfs9¨ÆqfJX‰NOl9]ƒ0Uw:ee1sŒX‘^^\8]T½Ò‡À¤g«¶Uƒ¢RŒ•NlœpX{3Œ„8„µg}ŠOb„Yt‚5s‚Ry_p|P‡Ÿv—M‚v^ƒNuil‚8v£Fo‹cƒ™[¾ÕP¨O¤¢mÃçt®ßg²Ò~}®TŽ{~—™l‹®Jª¬z—atW‹®|…«‚]€‘v~¯a®gˆžm¦¯mvŽKŒ7©·7j–8Um2t„DtInZXrOšž±¹Ò¯ÜY…¦e|”jl~Y‡šq—¯]s›K~ŒBf~>“³‚rcÃÜ}¥¹{s§Tv¤UyŽV}˜bÀnw¤{ožu„–UªV¥¯pÈë_ÎPLo?“ y¸Öst¬[Op*rw[¹Öa£ØYhfcl~ nŽhe„Nt_x•hs—Xg|V~•K{›pz \ryZm`h{>ezK‚–aŠ`£»n™ÀkÄÖ r¦J^‹@UvGaƒIN|0B]2e{R}™a›Ë‹«Ûpƒ«T¥Ó˜ìÿ¯¡ÌW›¶i®èûõÈíkuš5p‹Gt‹Gb‚Co’Yo’{‚¨•¨eŠ…¤½m«ft¥c~•jvkhŒ[i‰]bi›e]wScƒLczjœ´‘¬Ò~“³Vn–Wh‡VY~\bˆfa‚uƒµqŠ·~„¥eŠYy¨f~¦Mfžfбbs£SZ€X‰¶jp–GbPn”[r•Uh”t¨q}¦{’§c‚ˆo¯†Œ®¨Å•¾Ãª¬Ð°¿è‚޹€¤Ô¥×{£ÍˆŸÌ£©Ì†¡¿r‡®MhŠOs„To‘m¶nŒ¯mœÂpx§_s‘Up›Ux¡Vpe€™a˜e€©ƒ–¿x“Áw¥²j™R€‡Lp’O}¡Y‹¤R…_x†Tt˜f~—c„«o—µr™¿kФZw—^„¢niuS[~TUoGVfCPnEXhDna5…}8|‹Ng™jW‡g\jVhmH†tF{™Ps•ohŽfi‰[_‚jTl[SnR^eC„h3s‰Eh}MW‚PXkJif:^}CTƒ`QoFqwK{<W©O^shoqGkxBbMe‡N_qRk_Aa|<W{KlgZZ„9^sCho?fvYjƒSnQg…Ed€Jt}Rj’X|Š|†¥df¹d\‰iŒk=ÿt:ÿy:ÿl$ÿp+ÿm6ÿb/e1¼e§¼d†Åo–¯†š·g‡²vf›g~b“™V{²q|’Z„Ž`ƒœR™’Z„½—Š“ ˆX¹¬U‘Õwo¹„„ˆZˆ˜nv¬w™bš™S¬»ksÑrˆŽz¢Yzžk]–i\€SZFjwQ{˜R„YͰg’æo…²f¬cg™Az‰+”EŽÆyhªxqƒQ|”L‰ŽP˜‡J‘¨g´¬R’¹Y™¸n´t•·Œš¸ˆ€ÆhwšWm™Nn‚ij_x‹di”SO|@Dn,HV1I[)LU1~b$a/Hj6fj%…“-ŸOœ«h^Ã=y†Ds˜HxTR’Xvev¿‘c¯¹]Õׄµÿ†‚½tv¦e”FmžPz˜Tv–xc‚c›|S—Ätq¢‰“ žf²¯V“o€t-šªS‘²¦z¯Œ¨•8 ÚZ…²~|¡_k}fK¥n‘o¿Y®•´ŸIxÆsJdGrt(|…[lƒ@lA‹}:j‡?VŠ]Fg,Ês µÿblÀwv£O—oP©VTS5]kF]t2[uVUD‹q;–Sr‘I‚H’˜tÖšW¬¼nƒÇy¥…F¤¶wz¡€j„{¸ªA†Ÿ`w«PjŒk£G}¾3‡Ž# °MF§tBUob/`Œ6bhPŒ™Z¬ŠuŸˆØ¨Q俨ué™xb3âv[m±têÉ_¯Ob{‰sæ‡Abr=wh4“oM|Plq3x‡5}9~sV•³<¸²G³þTŒßJáÊw¹å»’¹ª˜–qaL{oMàÁZ±ÿU´Y¡Ûmq†I®§dÈžvÙó•¦ßd{˜J’šf{‹[‡—P‚‹7p: “:äœi…¹Sy6h€PYx3}fWtVel4kS`“7br.Ro7ky3cRƒˆJ¿âgæÿ€¶Ë’¸Ði¡©U’±WµžXa¢PzkF~_”™kXLj{?wFv›LV‰4fr7jwGoƒPoŠKiŠ+YwCq›RQ}G†‹]`Š:]|Mlz>z•m…¢…¾Á–¼Ü—‚s¨ÀTÁÍ“ÏX¨µU‰¯WyœLŒ³kiI‰Nx N‹µ[‘¹c–ÊG®½‚‰µO‚£W_}”Li|<¢‚s›Uj”<e„K|–Mw™c{€[¯SwŸVr‚Q¤´h¬bžµllƒF•ªm’¯sƒ”_ª´‹¤Æv‚³t~•u޲]s¢Io¡egŒP]‡Mn†c_~iƒ{a’Ä…–º}m—n©µx•¯‹’Qˆ¬L„¦Y´{¾ášµÓcy–G™§_jJs¡Dz›Dr˜H™`|ŠO~LƒXr~C_wLkA`oFdxFz‘`g]›±“¶çŠŠ°qkL¢¸r¶ÎWi›LXŠE`‹=kzH“ŽZ—±…š½t¤…—§¶Ò÷´ÙÿŽËòª¼Ü”•‰£^„©Hq Oe’DUq=T}AUxIZw]j…n€¥‡v¥yyžciˆhƒ—V`€I£Wq^k‘`f’Hs“Rt¢VЦf¥³ŽÄêœÄòx›=Da9KdG]zLlˆZl’mli`{W`zFPgT]}Xr”Vrš[¦W{¨mŒ«w–¬\sŽG[€Y|’Jy¨o’Æk‰²e…¥Xc|KWbQc{l“²ˆ®¿}¥Ì™±×ªÓ†¹Õ“±Ê¡¨Â€ªµ“¼‡ŸÁ”»e‹¨a˜±o‰©l{œls—lf–^oši…µc‰§W|£i§o‰›n‚œl‚¥fv¥g}©y‡©Wy’W|]nŒXr–]z”Z}†Sp‡VxŒ[x‰Vr•dŠªoºv’»d~«cv–`VmLZrSZlKSi>TmDmjDip7ŠuE~†Nah^€dLtJh]7{u7~™g† ‚m¦}\’qZ{]ojO`…I{wQŠ|>p—SpsWY…SdcITt<IlD]bEvr@‰‘=s¨LLžlPab[n<oh8r‰LZQa\KZ`2_i3^ZC\UATo9ViA_e7kCyƒF†ˆMx•Qs Pp‰Kj‰FxzJ}–Rw¡UpˆVš{Cÿv8ÿv9ÿl#ÿy/ÿs6ÿb5X-‡—S‹”^Ÿ°t‹º|Ÿkh²ˆG‹{Z_JŠj@…›cx›q‚ˆcrS~_s™{‰‚w¡šOžT¤º‹˜¿–†¨tq£fp‘r‰O”¡k¡»{±Ë¼Öuzçwk‰rp‡R_…LPz@^\>ux5êŠ?ÌÿŠÕ★Út“o–œAsÄRP“nehYM†KgrQ{Š7‹f€œZ§rr‘l“’n¬ÄkœÅj•®mw¦ƒo“zi–e“5µ¤MÑpœ§r Z•U§9¶¶W|¿Qa“Nny:sxQ†1…ŸE¤‹dËU‘Ÿ‡Äv‡¿gyLŸv3·Éi·ZÊËcµï¢±Þ€xØ©X“cWwEVs4XuCƒ1¼§U™ÒZg¶F…ƒP«§{ŒÍOpžs~£:„¡EôÆGÔàv¹À¿ài|䘅W`¢t‡rCv“NX…Hnb9“‰AŒ¸bžd‚•œž?…žEe‘PKi?lj1x3w•Jˆ˜C^¨HzT(Ü»xЬƒžCa±HC^‡BU$pU,›=yW=†ŽS¢:§Ì]lÈ[F^’OmXÆ´hÓŽXdKq?KSGps3ruDŸ´w~«eŸ´]´ëŠ»Ç”Äü™Àð–ôDF‹6mj&g›Lm›:v<‡”m_‰_s‡*{ŸnÈ>¶át©xÎÓ²Ýz̼;ÿ·`ÚáÚÍËbÇ´Km¯…µ•Aÿÿwäÿ¯ÝöŒ·Ö‡¿½€›Ý›’К·¦•·wWzcn‰A9W:R&Xf'ˆj™®»p {„Žv™_u¢n›CÒç—~œiUo;‡ƒ`‰‘f”ªk°Å`‰Ô?V{SVg9zE`yier>u‹H[sKcu?qu8v–LvœUq€6p‹InmXi?qnE“Ž|£ËÕw¶Æ…¢í]{‘RŸruSž4ޏDŒ¼¤Ávަk}›Onƒ@œŽ[ÏpxÀpo{Gm†Pg‡Ad{8–]d•onY|‹jM^j>X‚9r‹B…¯qv™X¬¥TÎÌ˩ʱ χ|˜K‹¾nv©RzžbaCl>jNošfx–xލ”¿~ƒ£y}š{c‹O€–l‰^‰OŽ»XŽÅ`f„B”²Rm–@ˆ›[—Ç`^~Pf}F¤^Œ¨m”´ej€;’©Sª«G§µQz˜c©w¢¯ny«a•[Ý„p§STwAs•Q„U„¤:•ºWvxŒ›€k“[‚¥fq‰B~–eÐïŒÁÿd•ÉSŒ°bazai}\—¨i†´Vr‰hïßžÿÿ¡¬ÕLieA\kB~L‡ˆJ‹ŒMVwBšªXœËQ|”Nž®aÇu‰¬yh™GVt<kŠ…Œ«Žg–vIq?v™W‡¸Fc”U¥Î„Þÿ‰¶ég‚•]†›™§¸”ލrvŽ`ˆ¬g¯Ü_²éz”Ø]c‹D}¥QÎÿ}¯ÜUvžBnLw–f‡¡p{ŽLmk—¬r²ÎyÚù}¢ÔQ{¥e–²u¡Ã„“Äp…ªi†º|¥ÑŽ‚·ah;`€@jŽ7ZzMaƒ_z”dg„N[yEdtHXu9^€BWyCa‹\x h˜eqgz˜WdEx—Uzcƒ¾ˆŸÃrŒ¦i€¦W{Ž;nz:v‚\†n}—hƒ¡z™±nšÂ‹Ÿ¼w¶zyŒs˜mq“gx¡ce‰_p›w}z fn‘ZgˆRp”Zr inšvx ^nny§n|jz˜as’b|¥^{›kŽ®V}–Tn’Xq“g¡amŽQg‚OmŠZ}ŽSm„OkŒ^ud{¤zžÈlš¾Y{£T`nPŒqRp|D^‚UWwRqrDl>~H|‹Of’md{hDvDQ\<nf2z…O‚‘l\e‰yxrQ‹’JxµSifY‚SLyQN`CJhGNR;9`<H[EnY:„…?x¢\q–r[‰iooY^ˆ>fnG_zLJkHSXAhb(iq:xp3g|DauFlu;‰‘A¶St¦k„‡[†ŽS|©ap–bk‹Pi}BuzFƒ‚Dx”VÒŽYÿIÿj0ÿo$ÿ€.ÿ†>ÿh=³P1r§O‹[„¥Mn–zra_…hC_:YEjQ3v>j¦ks™o~‘S{‘Vm‰W‹•M£¶PnÄpoŒtv†P‰‘b{¶\h”jŠxP„šc¥Ÿfþêœ`̺‚{ggšSO€^h>¨Œ6‰ÖZ§±jÝx¾«gµ‚f²µTÕ˜g°‘‚@¼X‚¬_v£[Š”Oš°Te»m‚}\¦•=’¦v‘©mzŸr|—^m—UouFjC‘>x¦{w«imR¢|M¯©]»¹pxÛ™Nwrbc5¤ˆ8ξ9¶¡X]³[€ˆcï«K€ðru‹†q–IÍ9Êï|”Ö®›p´´”¡Ö’«Ï†~µ?˜M]V0o2^6|cCº¤JªÄ–c´f‘l;¼¤c«Ò‡‰½„„“\Yªb’qG¥¨d›‰x²‹™Z_±HD“”ci–\YkLˆ{<i–JÔ‹K ïn¦Øq½Žc‹§]Z¤¥G¬Èdªmu†`…yk]™SŠoNS¤{<hNPH.oi7;^MjB-|•OÿG’òt okŒÆ—at~{.gŠ2‹š/‚°tw¥sl‹P@|S-U%aD!cqUœvN…»`³…N¢ëǬ¯…Ć‚o{¤™X‰…‘)‘æZE„pkf%{Ž8ÍDY±Vzq+¬q¿ÊŽ‹¦`ÚÞ§øÛšÿÿæÿå˜ÿÞœ›Ÿ}¯Âƒª¢`»°9ÿÿ¿Åÿ³Æ»„˜åli˜i†}\ƶP©ã¤±Úœ‚¯jnŸlIj1Op(†2~œYœ¨‚q²_}K²L€žNk¥J{ˆ`| RZ‰Ltˆ9pChqi¢‡s}ÝwO|F_i,S‡Aw1f¤Sf_)ezI]…GiZ'u’P…‡Up‹9‹œMlŸ9|ŽJ{‰A©¹Jˆ zazBµ¹×ÿÅd™}…ŽB‚œT”£rŸò`Ž—Y«Ç”sœY„™w¡³K¹\„}wƯ’¤áZNT_afZɼ`²ë‡g§H_nPiihmxT]w=v‹A®¹t¨c‹Œ\j~`a‚™sa{Hx›Tx˜K`¡\Yj5|‘Fp›[o”K€•]Œ§]†®Bp°@u†Pi~AhBo‹<}”W|“Y¸l[†6{Dš>Š¢T˜«€ƒša›šK–ºªaš¼x‘™ht¸Ve„LlGj…Pk€QhNW?^tKj‘~`ŒD[wLnŽgª¢œ¯•u«S}”R†ŸiªÂÛœªP—¥Z¥Ç©èñÉùÿ ¾Z˜erŽAŒ’p¡Äcš`ÇмÇç¾¼¾wÈ®Z•IuT|‹Vn†ERr2iy}¨Èƒ¡Èc‹¨h‰¦ˆupoœHp‹En‹[p”T‹Nr›V‹°ŒÙÿ¡Áÿ„žÐ¸Ïþµ¢Ï„°×Œ²\xœd§Áy¤ÍuÌâ½âú¬»Í”¡Èv‘Äj¡Ø¡ÔÿÀ}¬k¢Sg•9Or9Io5Rr4M†dz ˆ±°©È¦´äŒ}—x·Îq˜ap—fx¢Xy¥}¥Æ‚™º[‚¨e‰©‚‹®}q’cg‹`r™Rg†Pb†FYrS•`‹´by G_zRkŽUaSj…Qw•bx£Vo¨cw¦ht¦}•Ìir‘ZfJbSt‰NmŠZ~¡f…™NhƒSa^m”€¥ºg|’UjYy–JfŠOo™^‚®[~²dq›\g‰Ob€HY„LbŽ__ŒTe\lXl’e‰±s‰®cw‘[v—Xl–`s”_j’Zp”Pp“\pq‡œd‰›GZƒWtœ_oŽVb|Ma~L`xUcƒr|¦v³džHeySvxM{~I\ˆggl^leDwmDŠxC€…MNˆqPn\HfJ@d?O\5\a4u_Gp…]`ˆlƒxUƒžQz³i[—{gl^^|HK{JGbJD^.Kd<[i8fh6vK^”Y`uoYqMclIZ€@\rWPrAFl>PZ.V^%mn4z:_May_io9‰…Go—]\†loZ‚{EŽžTl—_o{TpŽJr~K{r?‹ŠIÿ—aÿ†Xÿm,ÿmÿ€*ÿ’XÿzX¸P3|}E‚N–FpšnuqWZ€MDnWXaAhn4‚}<}ex¨og™iˆ‰^|ŽEuœLd—VS|awrZt€3y‰M[žWNv_ggBgM]“_“zb¯wh»¢]‰j~9f¦_’}?ž§F”¶¸…©·~‹Å€Š¯s³Q›´o»™f³¡T›Åƒ}Õ‘€®„ŒœbX“œ`†˜Z‘£J¦Žl‘³_£gÔÙk†çuV—NŒi6·¢H«ç™ŠÏ¢ YwŸE—}D»»^£å zŇ‘ŒPñ¬C¶ü¸Ä’xÕsoœO€~Gq„|™’>~—bŒ|Xs¬Xy¦…’W‰“oy§a˜b‰ªvL‘nic5—ƒ3‡EXl<q`5¤P›¨r¤–c£³]l¦qp•K‘E³®[‹Â€¹¬nШ{Žò|¥{Ž¢fz”Ey£;˜G”²I¡ K’¨:}®H””e–©r©¥•‚ɈŒ¥H˜]…œw€¼yêœD‡Û€‹ºC L˜·IŽt3ÖÜ9q®o‡o3Øã1˜ùE«³A„ΈŸ´M¹hºÃ¢ŸÄl¥muqjc‰Kko]ž†dÿ¾lÒÿ¯iÇ€w>{r=cœP——<a·ŽŒ…`P”R]UˆzG ¯lQ‚ŠWaTWj5tgFTTJpTPî¸}Òÿ½¼ù}‹“U¯Oç¿~ÚôµØÿ¹»¾¶³¤ÌŠ°Ñ™”ëmíÄŒ±ÿȲ¾¨Êsˆ×tls<}š/²¶dÌÌ ¦ðºoŸŒ£’Jƒ§[|OsŒX€Hµòc[ªEvl3½Ëq—µgd_i‹GQ~&yj/²µbs·m}{>}±^Ç“€rÉcWj7†lšÇc‹Fs|Kf“A‹¤VL¨Òm‰Ãm‚f£¼|j•‰šœm˜«r¾Õ~§ëi´¹A•Ýu¥b‹iƒ•Z€“nyfx‚€¿ _¬ë€»Ås¾Ó¡¼Ï›š¼_t›[lvVެ[§T¤8rƒ2¥›“ÃèѬçlнI¬_›Åy¤º]x©h´wg|E¾kñÕl¢«k†[j„9{˜O‘«Xg¥Gh‚=wœM_ŠKg…En„I…O¬¹q¢àY€»;{”:‚•Rx‘5‘±[l©Uk‹Sc:\{?wBs™I‰¦d˜Ëkq‡avˆEš¶`¦ÒkеRv¥JhxQs“`hEd‚X[wCOm5Wr?žem§;Py9`zOp_o‡RŠ f™¤v‡¬mž¡_¡¶_™[„™]… d²ÊªÍòºšÈ[–T^ƒ;v}f¢q‚¤C‰˜s›ªl¬o–©YŒQ™˜f ³i‚¦RtQÃÝzÑæÃÛŸÐÿrЏ`ˆ¯Sj•]kKZv=žTz\‚¡c…”f°ˆ¯Îqš´vž‰n”b~w›Ð^ Ätª×йЫבÎð›çÿŽ¡Ã‘œ¸·–}¬gu£B WpŸAu®4d‘7p‹@o”\f‚eyžˆ‚ |l†VXyV r—µb¾ãkd–JU€MbŽh‚t›·t{¥]c„`u”c{§hs™OX}LY~Lm~DYvYVl[V{LLkC[zEV{DZ{Od~]mŠe{’\ Ra‰k™·oiƒL]~CY}Id‰Kh‡]~ wŒ[}˜MpŽRj]t}Mo†R”¬e‹ªVœl›Ä½ßr}ªc{›Sx‘_yœ]v©k™Âkƒ¥OZzASwCZ…h…©t‚ŽX^ƒPh“Uw§pµ´Tv”\}‘Xo~Xo…eavŽFY~Qw™b{•UmƒJgyI_tDVvb|¢q€®q†«RwwJdyPelMohJewMloEgyEhvEljMIiZJdUL]28f4CO<?T2ZF3je/W~T{kW‰D{µmj›xzrTp‡@‚`xŽ^mœSf’R[PYlD[nIipI_eJVl?Xo;]p;SzFOnHPb4Te-QZ+Vi,kq<oˆQZƒTmsDmuA]kHUfRh^@su/‚‰Lt—Qw„Xs•P~V…‹H°QÿÉnÿ¡bÿk*ÿm ÿ%ÿ˜[ÿˆfÿVA~G.}~:–“Wd¶xpqkg„?ƒEh‹KpU|…Hj–YV‰ea~Z|†Gx¤KT‹W`WPdj2j}7„z=y‘N•T~ [n‡Tu€TSŒZjh@{Œ:fŸƒ…„|‚›P£WfšVx‰M…ž[Ž›V„©h‚œw‚—l_ži†MŒª^„¿{®b”¼s‚³˜œ¤”‘Ÿh»£X¤äd£Çw´µq‡šm]°©\Ýà‡€ÿ´Y¥ˆj‹D•…>i«gŽh¸¢f¡Ê‰zÎcfšx©€¶¿‹g¦e‰@|]•©™¸fuªŒtRMsJzb:^‚F‚†E|›ZÅ‹T‡µaf¦[]€Qtt9„›=˜š_}d¥‡HnMwm7^b+„W#¨¶^§ÏZw‘f\‚ae€4bQ«f“Å‚¿[’¹qa¨ŒƒzNsÃKiŒaz’FŸªI¹ªl®¦eÞÐ_Ïô‹§¿§¿q²ÐzÊ›Œ£W¹«Y‰·ƒ‚¸o ©d¤¼™€Èq„ŒDqtMuˆHžy¢©È«u»Ø™ÿð¼Öÿ²·ÿ˜“¿op…p€]ÃÈU›ºŠÜ¿SÖÿÊÅò…ÒœBšû¯>q–_]?€c?b¦L[~=asBg•EqmCj¼2MLJªTˆ}Y\Ã6šx)–šF™ŠB‘¸?™ @³¥xÒÛ¥Ìÿ½ÃÖ»Ù·lÍþ‹pÉ„a]¹¨…ý…l¥Z¬¶^‹¡‚¿æqs‘{™WÕ°‚ö¡¿ÆQ‘ç‹q¢Pzƒm®œiª»WÁälˆÀgv’B£¥C²ãY½†KuV†`'†Õk`£<Xm0‘}KÆÏN ¾^cŽDeqcŠ˜TŒ–u}‰1‹ztu1“’9¤³q²ÅM›JršX†¢U–Vl«˜`j_lrOmySi¤NzYqžEy°JiN‹£9S‹Xrƒ<\wMcx8m‹A|Z¼¹`ÐýˉÑp”pŒzŒœY‡¯^|¬Ÿ¤TÂjr‘H‚¢K^ŽFxV¯Ë•²æÀ¶Óˉ¸z«är†“nŽºX¡Ò…bˆ7«ŽYƒ¤QƒŸ]x¥Uˆ–I¥½pzÀ[}Ÿb¯Ã’˜Ì²Pi¦6V|3_wE|†Q‰¬v{¨r…ŒW¿ce†LmƒDg‡o…´Zl–MaA€¯Vpª[n‹Z—«ˆw›WiˆHj‚EftIe„e¼]оqz¢Rd‡Xd…H\…=Rp:Kg4]vZa™<`€7nŽOœ›Q““Y^}DjyPŒ–¨³£ºvU¢¡\Éá…Ïß Ûü•¨É†§Ík’§]}Ÿjo†Yk‚E‡¢P´¨TÔº¨®QŒªV•ŸY~œIœ½mˆ¹fJpS‡ŒrÓçÀìÿÑ¢¹ˆzŸUQu?W€=Xw4y—qœÒcx«^zž`Œ¶uƒ¯o†£]¹sfl™Œäþàÿ™œÊYV[_ƒ{…¡”À똟ºcs˜Ty™L\‡Iy£KkZœ¿–«Ì‹”»JXo@]`;[mGŠ•Jn BeŽJj‹Pu“bl—ŠÛòŽŸÓZšÅ\‡¸d–Á‚·ß‹²É]Фc‚žZ¯t}«Ul‹Fb€ZŽš`nKg€I\wIc€GkƒMy–Z‡²Oo“P`‘DOpGbb@ThRy•owˆ9YxGq U¤JgƒVs™pz«jb…«cw“Qq‹Kx c‹¸te”¤ˆ—éºè’š·dw”T|’boe{¨|µu~œNlQ€£Mcƒf…§]kƒGcŠNqR}¢¯®r…’mt”P`vT]z`k†Yd@RxWZˆX`ƒ^l•^t™HrŽAZ[|§m‰¨t£Ts„GO}NhkU‹nAcE]sRYqGNoQEcKIW>M]:G]/?\.>R:=J.WK(Kj2PhJldM‚n=j—[^‘wcuWowH‹ƒT}¦`r¬uidY„]UgLPbCTZ8Wa5gi7p;o†P^“VRvPKa=Og,gd+\w.dnH~~@f˜Gd†WWmCT^<^k3ol0Y5j}Mx}@h–dwP§}P–ºOœ´ÿ¹qÿ›cÿe&ÿlÿ|(ÿžPÿ„nÿYH¤=#xx-z{L}“ncœ“D‡¬_j¨gz“js’[bgWmUvmC¥?œËow’dv†LsEo•P’ŒRƒ¢T“¥eŒ®bušyP•\woPÄ’4xâjW¢w\sd||Ly¨Va¢^uŠ\M“QqvT{ŒWe©^_€Kc†MœŒK‚¿G§q‰¯d}¯t{—o‚˜{—‘[°¿cˆé°‘¯¥^‘ºyŸ©qœ¿n‘œªˆÊÇzªÒgÊÌruÈvc‘Rp‡F˜‡`Ь•w¬h›M„Oo‡_J~C[b3^f8ÍpP£Ö˜œ]˜b«¡E Ox~P†…a‡“R©‹V}…Jo_ng#}Ž:—–bqQª‰G©c‚‹O …QºÊLh‘¢xkŽ„m|<nt?HzE…T,†|Xƒ‹UH|VZbAt”)^…ap„5j„Hi…H“€;ž¹S½•w¬½šÊu¯¸a„Ès‡©uu¡eŠžV~‡h’g ³s¯•oœ{{zQ†Fc©9S…1pl!ˆ•[d¦b§šK¨Û±ŒÇ©¶ÉZ‰¸ZŒ¯>i²bog]——XŸ¹¨¦˜¿þ䀿ÿ¼ ÷YØÛny¼wer_[„E¶˜0sÃb‹yjF{wJ'r”6Zb-‹‚=“µKˆ®QUqcÁq6‘žf’F‰–’—µ¡®Ê®¯¾}Å̰Õÿ¥‘Ë_·¥\€Ð~… Mƒ¿|²¨7…¿‹`’O`†-¨¹,}Ø ’†˜zϱ›NpÄiyqX™°¢z y~yž[ T«°†ªÅΗ˜H´¯Q˜Î€[u__fTw}<ˆŽT†šbµ¤g˜Ôª‚‚”@q[GnxB•`D§”Z¬¡v¦ß‹„¬ov•C„£ax\w•Sm‰Jk‡<yŠM©£ˆx›Xu¡]ËÁŠf<~ŽXY‚?Vt6}{=‘Æ[bŒA‘?Àꬥ¿¨›Û™zšcs‰2‰“g}œ}—k”voi‹‡dŠœRj‘=ˆ‰@˜¬Š†´‘›[¢Æn¶ô®¾m“eš³gÍÿiºä}ka“±ƒy£p™–[‰¯}g‹CitCd‰]wnX€RXqH_~?b„>r„L]mWŽ’k†Ã~ZV9aw:o]Hf0_jLm‘JšMo‰Q€ÀTr™Or‘_ƒ¡H|Mxƒ@xŽEi‚Ix™O}‘Zµd–”dÁV\ŒAW~<Mo/Vr0\|DZEx•Tn‚@iF€£Iœ¾_“wz¨zŒ´„•Ã\°sÆÓ„–Á|´ÆŸ–±s¥´‚„“a°«z¬Û[Œ‘J’¥r¹ºcŠ–p£µy…¤k®½u“v§¾ƒ¦´y´ÝH~ž_˜ª »„ªO_~P`}6_}3dŠ6e—\¼˜µëvz¶Zj‰zÃâ|™ºg|¯i[„R±Ö¨Æé˜¥Õ°Ç£ÉíiÁ݇«ß„…·w½Öž»v“Àn¤ÒnÍw´ÜsŸÀq€¨‚Œ®o¯ÎW|BkŠM«l½Ðir£KRwF{“`“ªm©Ó«Ìë—³Õ”Ñꂾˆ¾Ô¶ÿÿ›¦ºi¢q³jd…JY…Ng‹Ux‹[f}R`q>VgFc~b{”Pl‚[y›uvœjuŠEks<`d2NoBaƒcrŽA\|Vsšiž²YrRz”`Šmš±z‰©Ws•SwSlše|¨y‹´p…–sƒ¢žÈ¥¤¼_r‘az–Yt”]thw•cdŒXpf ^h”Zm\q’KfKnˆWtŽu•¢iw‡_wšTo“Mf…^l’Xy˜Kl‹GoŒYw”b…¦r–´`ƒRm”g‡°j†¤dp”SzHu\€”fx•]m‚`[{aJpLDeI7TG=M>GK,:Z)=J1;U2MQ1[U*Dq4HVEKV5dP*^p<P€UFlXMY7c]:`…Fp}fqƒUZ}SScIM^;Z^=fb;xq@m‰Dr‹Ya‹aTxULbFVh6]s*Hg:E]EV_8[y8v|SnŽLm†UkˆJoxCTEayQ]y=WƒK_iB¦k?zJ‰¢ÿ€bÿtNÿm"ÿmÿ{,ÿ Tÿ‰iÿtLÿ_*ÿf,kc?‚IŒ–M‡ˆYx›kŒŠl’¦cˆ¨{—¡‚bŽbtwLƒE‘¤zŒ s•¦h~¯tuœc‚Pšb„¤^i¨lYtcNmN¬j;Ï»<oñ´@‡œqSEœ5z¾Se™l}Bw˜Di“ZyErš\€”R€œS€®gj«Hi{`‰MA~lReOzg<…Lv˜cm•e}v[v—Eƒ_‡ ccÂQ–_jwV²›Q†Ôy†Ÿ|•˜a‚º_h˜HypI™‡AvÃeS’j_iF³t-xSyŒ;y=³}Tޝt£‰t®°o©«u—°f¨©^©·_z©T‘}B–Oq“T Œ<yÌCsŒbnLŒG†¸Zo…\•zAo‹Zi\@ƒu?ˆ•L˜¡L–§X™ÁFˆƒA’N«¢Ld…V’z.u¥ScŠ;„DkGŒu:”ÁS{Z”…O’RÀv’Àovžlx•Y‚ŒGŒJU`…s7e’GNf=h2 3džXZ€LF‡;k^"¼œJÌì…Ñù”ÎøŒžØ…P”nvZCyˆWyƒhSƒ›Ap•Z„†b žz{•ŽvœŠ[hc€?Ч_Ùÿà÷°¤ì¥¹QÓãYÞÿŒ“úÒ‚tj¸G¢»W‡½e™n:¦ÇI®‘Kйd²Ég†º^–¼oÿ•‡ÿÿí«ëåt·~{¥a¬ÅbÆÔ[Ñÿª¹ÞÉ®Ëkx¡X›¥[©Ç¹Z ‰Kt+‹–fOzAn„<|”>t›}¶Åz³¹:×ê„~Æe€€K€uGŽN€B”®ˆ¯¾|“Àh–šj—¹V‰†L~‡fuuRÅzf‚¢rwƒ;‡oR³ Xœ£X°¡V—Ë“²u¦¼W®ÿWg}Gw™p’{fƒ…NÑÿhšÈ”мQ°kÅ`§ÁLp¾Oj7i†?~–JyVh–BmvFœ²²u‡Zw…uz†PŸ´W—Ñ_–C ŸC—JŠ™Uk…8fŽY]q'£Tn“<ŽP‡’ZÊð}„ϣʟn‰NºÎ¦âÖmzhmœ]“¥Q‹ÉS™m†µt}“Yw‘[«d‘Âup˜g\tLYt5cwS‚ˆH´Õ=sºlYpBhŒ>[w8lyYW„8\‚?Tv8m}L^~Qp}qmQ‘ cjTv•U}ŸIzEl†L„¦Y{ŽV°\“¬g}ªma}D]{@Xv2r}Bw›DгW«Án…¤L…ŒF—¬‰–¦s|¨Xg’OŽšdšµn„¤j~¨Oi›i®~o˜hšXl—P·Æ†ª×f€™g…œ}©ªwšs‡¡ox™W€•Xu˜^›«V}§W—^[{NQq@WuFmKMr6;W2AX;i}Lg‡Q[†v‡§{UxMi}iƒŸpbSSu;s•h–Á‘…Žnœi¤y¨Æ’Ñý˜Îé«ýÿ¦»ÿkr“}¾Ý¦°Ý•f‹cr…h‰®h˜¼X‘Àz¿õ¶Í˜Ìñv‡¸xz¯]k›Fm˜>\ŠETwAiˆpŒ·sƒ°ƒ}¥|‚hv }§Æ‰¡·`s˜sŒ§_Q€8RxHjXapKVfCZjCNf:H[S{Vh|Dk†Q\‚OcŠIq–RvAqƒLk‡[hŒLm…RŒ_jŠUiˆIk…W‡ gy“bw›[s•Yv˜Qq’Y¹nŽdv“\|™q¬Œ‘¶^ c£Tj“^u™er—Xq˜Yx—Yt©l³Zi‰QmO`…DaƒGdy\m‡Zj‰Uq’i•¬`‰—Zjf|”[z‰N\u[fˆ[gƒrxžo} g{•fy¡hw“V€“Ey˜L‰Ž^|žhZ™qreghqOQzRY`J@_;?P=KK.A[*BZ:>R/:T*=J'/F-<96OA)aPng.`|FUrK]^>Yf5SlAscNg|APpMMbA]\6gj;lr9u€Gk}SS†fLjWU]BW\7Ts:Zn9GZ4FR5ƒT.n‹- qM†¬FZ¥pcU{zHx’Ed™_^ƒRUyHRZ4qd*Zv9‡ylÿhFÿt8ÿf!ÿqÿƒ+ÿNÿˆhÿmJÿY0ÿQ)›H5ŽœBœ^’ŒPzœk´QŠÏom¤®‡ztoVq‰RJˆSioX¿{OÉãu“ò p©‚„‹c‘—O·œ]ˆf”bFf?]L/Æy5h÷r‘…¤“EŽÈN–·kÑ|cŽZ`ƒEWˆP[rEpvAtŽ?—=‚·csŸVH“dea8b’>D‹AFi$Gd,GaNie$i;g}Fy‚?{—V„–eq®tk•Ij€Eo’Qe‹S“’IŒ³pŠ¿Z{½^l²Rr|]|J™ªN¨®_†‘Qs~Le@°ˆPÆœc‡µ£ŠPŽ j‹«l´}a‰c‘m`¦x@¡¥L¹œ_¾Ùsƒè†‘YX•S‰vN¤©dcÃ|€}K™¯k»°lÒÙ`ÂÝ•´†¢·zœ–å `“¶wÑ•€¼‚©“c°b™ªpªÒRs¸iwP‡^œ½uˆ¤d’“IŒµcz®fVm¨dŸ‰=c}U|pBRd„h–t4t´A·†0\´{Vo3jg0j–+zU𬙂°¢³{{u¨zH~FAllW)ĉ@Ïb…¦E{¯duˆ2–i¨–W»ÍŽÈüzˆÔpµºU·Ù‡Åៗôž¹ÑcºÓ›Æù¸½«¿Ôƒ¾Ìƒ°ó¥†¦ZÁ±uÝÿ¼Ÿôˆ®²”¹ÓxtÁ ]Žbir:®–>¶é¥¢ÌM˜`áw›Æ–~‹‚ÝÒ€«á¨}¼š¸½N–핎[‰Ær8˜ßMàÍdÙúžÜÿz£ÿ}mºÌ•’»K›»TÑËsÒÿv—Îq•²w›l³Á‘¾¦KÆÑcº™Y‰”H‡vIÖwQf‚s{zHÆ„J¢Çnê|—釘¡N’Ä^\…CdoVr{]a™BgLÎrjŠZ¤¥]„Äql’=o`f—KˆMk”W¬›hã_g‘O€‰Fn=oˆ;}¢R”¯iq s†—yªqš§b½\sSn—CyŒ5t¤Jf•1Jk*vvAc†+uBy¥”Qi5}’8£Q©‡a¨7\z*eŠ:¬zt©\ƒ“OŒÈbGVFdgGs€¹qQ8Od+Zn/}”LŽ¡J|¡fo…L’²KWz:^u9oNh€EfN{œJuT\3an?w—Kj„O~ŒWw¥Uq‰Su²M_8›±jv”H|žPr™[| Z„¬if’<f‚D€§Fr¤W„«Mr’aÃ覣Áa‹±XfŽEf†A]ˆB¢¶he€Pby=X|>v¢hvPm˜Y‘®”¶aŸœ¤€±c¥°_œµZ¯Ún{ŸV³`g•KpšOa…\ˆ’o’¯[Lm-Wr7?m&J`.bŠH_x1Zs-Iu*Us:Z‰7Ie:f„U6Q3k{Tr–f‚’gŠ©Z½j…¯\‹®Uƒ¨Z§Îdm˜h·Î˜¼“ÚöÝÿÿ¯Ýÿœ¸áz™Liœ@~œf¹ßt‚¾x±Ý®Ãç‡x £Ë“¡¾©ÎvŸÁpµˆž¾im–X¨kpŸVyžTmœFf–Yˆ®ršÅtž»b{œj|¨_‡¡Si‰DPl@az8Tf6\nG|—Ba~=UiGrƒNw‘[‰›b”±¡Âp VVxGj†P`‡U|‰`oˆNf„MbDd†\p—cqUlŒ[p”[mQpŽ`r•e€¡hަo¯iŠªzœÈvžÃgj”Rf^t—jz™_r’akŽc‚±o„¨XgXu—WqœSvžHZ€JZQhƒMg…b~¢gŒ¯Yy]jŠYcBSzHb’Ynšby–m|›_b€Tf‹\s–YmˆOj}Ny}`]‘]I„ja]_`g8LuIf]OFf;BXFMU;CZ-F[BPX31a83I))=#;1]=pb%Y‡6aqRnnKmEmyBWzSg[Ilp:g~VXxT]^9zo9qCn–hdiYvXQoS[c=Oi3?lEGYEHM1LU3[^.ch$blPinDh’_‡‚Wˆ O{£XwžkušfW‰RPp?Zj+\f.‹g?ÿm6ÿq3ÿcÿhÿz'ÿ›Sÿ‹nÿiJÿK+ÿ>%«M(‰—U•j®Yz˜l’ySs²h\‘—™fOš¹Q}³d€‘hh•Z¾rP¸Âh–è¹u´˜’gްY§µu‰Æ‡s¬iGŒfyW3»-•ノ¸‰m¶x©[þÁfÏÿ·Çÿ˜ŸØwc«db‚G…4ˆ¢G‰®lžªm~¬YQ‘jvxGq˜Da¬OT‡H‹y-€©C†§>Y®K]pLvz2¦T“ÂTÁ®P°äukÐytˆbŒ˜Hy²a~¡{†œU‰mv¥eo[v–6¦Ei¡T‘~`õEçÓž¸râ{iˆÔœpragQugLˆA¬ƒR¦ƒL¤O™ŒCuwažŒI¢¾rr̈iŽOsŒA“ŸGwšjg‰aŸ–O¸š‚´rˆ¢Wn‘edmT—8¬xt‚©w¹†a‘ªde•YskBÍvSƒÉ~x}oyŒC|vS š\–Ä‹k¥x™‚n“¡j_ˆA„|J™ŠKhwTm…>~–FB|Nll>p]d›=nd<jiC_wDDbHÄŒ?Üò²§ûä‡Íd…V„µY|p;ž¯KÎÏG–÷À˜´{®¯“•ü Éžeµÿ€îÛmÈÿÌ` ²¯ŠDÑô”ßÿÄâ¬j¢Xp’8t‹e€A®†k©Ú‚ ë–©K³|×›µ¤ÿ¤}ž|ˆwiq‰•Yzƒq–Pƒ‚^‰®b†©SF‰U‹qBc•pNc>…ujy¥‹éÏqwѺ̛Uéü¤Ãÿµ³É¦Âݵ¬ä‰Øú¢ƒêx{@rÁPkDt„S” ¥£«±“ȰòÒ˜ÄüŒ¡ŒLàœžÆ¨w¥BÆ–`®]༃¶Ä\»ƒxÐí‘Æ¬~Á¨ˆ}§ky‚L‚“cz‡T“šU^©@vrL•¦n}•H’†Vs…^yƒe^y4€9…“R…¤c„>Ž¥T`x=ª®kx™€hŽJb}4zN„ydŽL ‹Ujfs›MÈ£¶ŸÒf¨Ä|ãbŒ¹gnYÂöLz¹A‹˜NƒŸOz¬<‹€Yš´™›µs“¤rwªS_‘8l„\j‘GW‚<hw@Ÿreh1|š:^tBvˆ_„£m¾Vj™?€šVÎioBFhŠP^o1jBy‰aƒ‹LfHXrFk†CcŒB¦¯UÈe‡¦ctžWXŠ6dt?ržF}ŸPxˆP‡žZ]}M—lÀižÈvºXl‚SŸÀ…°×‚™ÍppžU—»…˜X{’]y¤Jm˜B°ºwh–bcyAc|Mf‡Pn˜RkŸNc‘\ernu‹Z†¦OYƒ7c}M~™dvt©b˜ÃvªÙ^t®]®i{šMd{Qo¥/Rn@pŽIRf3n…]y¢KlCa‡E…°d~¶H`7Sy13F'Sg^r‡Ks‘Oj–Sx¤csX„¦_œ¸i“º\gb™±Ž¹v¦–Ñõ˱ÛgU…°d¨Ún´x† ky£^ޱ‹¾Ôo†¦[pSm–f|¦uz²jŒ²kгj¬Vi–Mj™IbˆHkK©d Æœ±Ú•¶``~Os¡eˆªY}§UsŸ_¨^mzAczPgWiŒKi}Hc€Qr—Wa…^…›x‰©^u™Wl‘HaGi’Wwš[oŽXrŠToˆPi‚Qe‡\sŠN_ƒWkŒP\uHY{F]xJYxT[|SazY_ˆoy¬ŽšÂhtšUp”^o_h’Tc]q˜fžnw aq—iw—Xu•`z©Td†Oz–Vk„Rp‘Y|—kŽ´X‹”Qk‚O`‚Jh`‚©s‘d~Yc}ITrK_|QeƒEYxDckCpkBZ…JA‚[F`JHa8EbGX^HD\8:VGKS8HZ6QV8_]6Cl?>S>BJ&TI'yZ!†‡9cŸXYxdahEb€Bn{Pa~OcjPomGq‡YlŠ^vtS|‰Rm^i‡y`xglxUm…QtƒJN…M?nO>\BFO-KQ/e`1[i+hi7mf9„‡9‹£N–]|¬hƒšmŠœcm¨gZ\Lx@ZW5¼o/ÿ4ÿn.ÿa#ÿpÿ|(ÿŸSÿ…jÿaEÿD"íN$k*€ˆNƒU—¡]±rŽ”c`žOsj^°E{Ès–ˆo”o\|k‡hOw“Fp¡…p”eŒƒW|®o”¦sj¯||‰cfbˆ„OšµO|¼yk£lsƒh‡ƒHÕ¥MçØ©Àÿ»{ôÁv¤o~˜]ƒŸ?“£XŒ¿rp¥f…–h‡’I¦[k¶fyšU“ ]y©[›™_íÌV‹ÿmª{ª7‹Év¸µgÑÓy¨÷·”ÏŸˆÇ€§Xƒ®€ºx§U¦Áum¨yp [oˆ:aQ|Œkq—l—¡L |©œ·blÀ~z{~Z|Cvr<“ˆOÿ‡FèÇ}{´Šl|PMr5RV?n[Aizi}tC Zf¥F|~KžDv¨mw“W}˜X~§Y`‹T†Œ+u LzXa„G•Yl|^„a6†‰?Ù kÄÏr¢”g‡Ÿa¤Œ^¤°ƒ¦Î±¦¹“¬ S‹¶VœK®šHµÀk€Î›~MUqO\tGl…LVo6_v%qa)¼›C…¨†zˆVvŠSœŠB‡È½Š}D®¹X±À\Úpb¢;šlT†Às¶R{·{¦‹Vÿùèÿãâÿê‡Ù§‹©Y¨¥~¬ñ¸›ÐáÑyžôÁ¹¾mPA°i/¹ñŠ¡¿r¿¾€Äà[öÿ¬ 󽉚ctˆY‚”S~mz°E€|S¯³Y–â]¤×W}“F‡®=l…Wl0mž9~?Îì…sª…°ŒbèáÀ°ÿÓµ¨™À놧Չ€Ê_b‹Ry0£¬q¹Õg{×Tu}5±ÔY•ÔuÀÎŽË©‡{ÖÁ|ΕfÿÅ{Ìÿ³ØÏiŸÿêQnQ‚l2À—‚±¡qÌnºq®¡ÑǾŸV¬·Vš8‡>{H‡ƒa˜D¡ƒS|€CwŠJy†\”‹[s¡u…—Mg‘Tcv8o€Ev‰Ds‰Lb{/w€2~¦=q‰G°—Q“¿l• mv¯\Á¹Ä·Û˜ÒÔ”Übœ¦h¥á‡»y‚¢W´ `Åþ® °]«Ô~„t’¤ck Ky™[by1oš@g*cs>”†]•Ìg¥³“„«aVy8]p@`kB€‡X–¿e‡¬Wo‘Bb†JW_6{J…‹@¡”Mm‚F`nPqlJn™UUx;w‡qŽ¥eu¥Ju”NRq;Zp=YxEkzStŸGl‘Md~Ea‹Ocw?r“kn‚J”½i¡Åt„¤S Dq–F‹•]kŒ=w…I`tHXjFWpPNk5`wV‚–O°V‘º}’Àoq‘ROk)`};¦Ù_€·<q–CiƒR–UyžXr›c³ÖŽ™ÌrŒY”®f³\k^Ob2XhFq}?q˜WŽ®’ ÄnqˆOz…fš«qužSa{7Rs<„¦Q¡A{“gÒé„¢Ñck‰Bx¦d’Åm~©Wn…Tœª|aƒTcŒZ›¹‡„±e£½o§É¢Ê…”²]‚¡Jf†Eo‘…³ÄŒœLp…O]…D|˜aŠ´zˆ²hfNtŒ[”°ViAPy@p†JfŠb‹®}¤nu’VhŒRq”f“»e‹¾h‰Ànw¤QTlDZ€ZŠ dšh©Âf‘¨m˜´s…]‹žkx‘Lj‘Oc‡Eh„DZMkO_„F]oUiySfxCYxLi‚LbŒZjŒH_{D\I[…DTr;Oh7Kk>SyUq—w™¹m{œ_u f¤Yp‘OnŽYr’_mŠekfq“ep”hoscv™js˜\u–Vt–cŠŸv–·a‹ Z‚ Ru—u“¿}‘¸r£_~‘Mkz?f}>^wI`z<UvDRo<Zc;Yp<HsJF^O@]8ET<GT1>X09Q8CN1DR%ZT4h\2Ym@MiGW`<fb4{s<t‘JkŽ^ZrgarE_x<dtJv{Dg€SinOuqBn†SuqU\Œ[[yogoevpS{‚Oy‘]mŒ\U‚_FrPGc=cW.ef,fk@ct8seC{w;w–Eš“[ªhw°{Œfn”Vމmm–ZIŽa_a?äf2ÿŒ@ÿk<ÿeÿg ÿz'ÿ¤Wÿ†oÿ\Bæ>#‡Nc{9j|Bh~@‡xOƒ†V’ai–Z{eX‚@r‘gŠ}nŽ”W‹šd¯P—±^›¸wŒ¼aˆ¬Zj±p†œo†±lˆ·mm½m†‹a˜ÅNlÅzZ“w“yIw»DVo€hY™’u}…j‘m…>p›B„W„Ÿ€ššOv·poP‰†I„žg•KjŸiN|PPdF£s/™Î|Ñ›m©TiŒRu”:…lŸ°•¡ÈŠ‚Ý—y~xžXŽ‚«Â[›ºrÀÑbˆÙ‡i–ZyŠJ…©Yª¶bƒË†¢V®O‘¾¤~¥p{…¤ŸI•Ógv°m–NÈ^ƒœ†zoiuqUCV0TH`h#Qf3_jMp|Qiq2‡ˆ.Q±tcvAuŒ&U`bnGg~:}‹I 9fˆjx}RutKwJfƒAz^7b}3|hXˆ‚Z_l^\P§»I‚Ã…„’z‹¨vr|ZŠ{Yw¸^uZu†Z¦Ž;œžiaˆWi}/qo8kª@Šs-™½R†Çri‹?ˆz@^”lkHžž?‡£[ª¦lÏs~´i{©JL‡lbn]qtIœU¦Ã€öÿŠ|ÿ¬cjvw…R y@¾«Í•]Ñô™ˆÚ ~i¡±S»‚=‘Žz«žE¦åm¾³oÂÁ€¢øˆ‹°\aœ<u;}ŸcÆgº÷bÐꂳö±½Ï¶{™\}Ž^†˜_„›}œ¾U Ða×oz•Kµ°]Ýâ“¥ÿŽÓT¼Úœˆ t›§ZŒŸG”¾Q]ªI_eJr|Dz–Sã_¢×{£xhˆF_q2g…H’J‚²q’•„—¶\[•bw{5–˜O§¦q¯¬WÊÿo…†NÓÆh䯍š¼t®œe¢˜h“‡Vy‹P€eª¨Y–ru—Z¥“[¯ºbgyK\{;t†J‚‹Og‘GqŽCW‚<]n;gŒCv‹fŽš[ЦZsvV®f§·Q–pgŒIlC~—:Šq€ˆ‘·„q—dc“[d–À²y}}¢vŽ–8p«RhŽgWqO\†1]xLdƒ7^|6}‘E£©x“‘X{Ÿ`\y6jo>‚yE„}Wb‰[‘wƒl«3Zt3Yu({Rm{Kk‹Ex[˜VŠ bu¢Jh–AW~7q‚L~£Xf‰KZ<Tj7Wz2mŽ>t’`hKc“;],Xr?X|?XlJUtHOf3F\8j€Mtš?k„HMl2b{<em5]r5€ªC…ÀJ†ºEºis‰–®‚v`‰™`j’:\„<‡xªÔŸÄ[iRж_}¬Tn€@¦f¦¾ºÕÿ‹t_u—P_y4aƒ:ƒ•`ªØk‡¨„lU_„NoPYy>…Œw¸PuœZz¦ox¤}nŽOp™c|•v˜²ny£]°‹”ÉzaWsˆV}˜iy›Y¯]†³Yoši¢mv‘ez¡UcˆWtŽMw{Nx]¸À}•ºNqŠFk‰Kiax¤q“ÇlqžN k{¢^c„@lŠM‡§P…ž`r•eœSeM]„Kc‚\‚˜z¨Äu•h“¬TxMv’k˜±}‚šp„¯upšio‰mhˆWc‰P`}<[Af‹E`x=ZpFb|He…Ef~=UnEYtA\wLg‘Vj‹O_}OlŒWoKdƒCUu:Kf=UtBX{L[‚dadv“Wl”m[nŽOlQ]HVuL^P]‚]fŽf{£u‘ªo€žknpƒžap•kp˜{žp}¡ftšiƒ«‚Á‹ Áu‹–YvNhxRuŒNt‰K_xNmzJTd1P_1Nf3@i;:V=?V2HQ3>]6?S/IP/MN.K['Jd6X`9ZoBbcLxgEcq=_sJlrIiy[fxTs}H~{Do‰Nq{NVqPgRIZf<YhHmW?fŠLQ‹c\sV…iDsŽEj“oR}]PnU[gCUw?ff:Zq2YsBVc>f`Ez6s–XxŠ[„šhSmnu`vy<•ƒU£Usªw‡`ÿyHÿˆCÿe2ÿg!ÿk"ÿ~*ÿšOÿ{qÿM9ÿ9e4_c.yl;f >iyOoj:zzDh’SWtLpx<sŽJ•Y”ŽTkža~ic¦`©ÕvåÍŠÚÿqÿÃwy{¡b˜«e”Ë{²µm½émoàžr qt¡>\š^R„e(uBo?"g9M…]‰{@sCi›^z€Ml•Se—xdPg€Bc{Ir|1I}H;k4Ia!bogˆS©¤UwÑr„¥g]ªGr‘O„Œa¯¬cyÍ‹Zlj€Sˆ=‹½a”¶}—®^[´}uAŽžVv¯{MŽgsbNsxG¡ž[n§kzGƒ}jš¥\Œ¢†´… Ñ]ÿxyçš‘|YvƒVZ|]oj9rt2`‰9qo(™‡6Ÿ¨RÖ¾Q‘Ö‚‡“m_›XhMŠC®¤Bu«b±’[z’S™‚:œšX†¡h«ÄU‹žrkhNsXÝÅFh¾}W^:^GG—z|Q®g€a5›ŠK}ŸOu›ZˆV¦‰g™Ñb¥«ir§i ŒBv«V§ŽK’·Yy™i”§usŸraƒA®”C«ÒTŒ¶†Z„D[VJ¡¤F“¯v¾szBY‹C|j+«ÇKŠÒ‚´¦›¿ø»¼Ô‹Á¶P—ˆPÙŸ|½ÒeÃÄÊÿ’¨˜g´¶ŒÀÐkŽÎcÊ‹S–¤n§Ág«¡[{YI“Mxu;œAT BŠe6ͯª™ûÌvžf•‰]cYn‡Hœ”<|¾X€“U²§wŠÎ|«zÛ¹‚ÇÙ°½ÿâ¬Ê†¦À°¡Ÿyÿð›ÿó ¾ÿŽ´ß›{¤oh‡K†K‘¹’€›{k‰<y–IR1J`7Œ‰D¦¸e›§z¨w£ÑyÃÓsÇÿËÏs±ÿ€ŒÖ£€~eåÞ…Ïÿy›§_š©]wTì£_‚ŸT—O˜ m®Â‹¤W¿ŸW°¾iµÎPˆ’Q©Ájªi‚Êuv HpŒ:r˜6oˆUP¡–ml•Wci=}†Bš¢‡sžL›~u pYs;†Œtk’<m~JpšPuJs€DjX€F_E`k;lwN•ÍYk©*dz:b‚6ty4¢W„SË»¨álc”Mi…9y›Kq—E—V[€1ds1q†;z™I†“I™M[p4jq:n|Bˆ‹NŽÆfW†7vŸEP€9enJfxIm~I„¦]vœTvœCs¥B\‹;k{Mа`e¡8Ps4t‹Qwª~¯je¢>fz:gP† {¯Us–6{žBq|L¦h‘¯Ž‹Àz¶~†²xp‘x™afƒZ‹©jmž?Zs;m‡Dp‡LkQj„G^€T\wEnƒO²n“Ë‹§Ú²³ÇwЬOw™T‚ªg›Á~™Ä|v©Vw¡Ol©Hs¦Ux=e‰ROxAV}R{©fŒ¿eiŽPwGl’Vu’[×t¤Õ‚´Øv…¡Q¢³g¡ºb›½|Ê눱Øo~¶m–²i„ \Y®À[˜®T›¥NuƒN~Šf‹¡drœV|œX}¥l{®j}©qˆ·l}°gt¤k—¾X€«V’_ˆ ^†²kœ´du—Oa7V|@]v]’œh}œV|•^‰Ÿdp–[l›QZyTz™`n‹PhNl‘Xˆ¯cŽ£Ga~IjR‡ƒ<I`8[kH‚“\™£\xR~še‘`“¬afƒDRhJ]~Rd‚SjˆMmŠE`xD`|CYyDVqHRuIcVm—g‚—a—Rn’HWyD[{BTwHU{O^|\w˜ku¡tz”aq“h‚’aqŠaigsŸfw’`kˆes—n£i„jOcJgUt”RlŽDc‰MjŠHUd6gX3Ry4LkC@\=CS1GS0QT1DR1AR3NQ1[X'Zj=YlFhk?YlBo\?‚pCn‘Xh‚WvoNhwMawKjkDTtJ@eREU@RV<Q[-Rc<gW/x9Z˜eXt]fsAe{@Yb@oQR_LZn9Iv<J_CW[5gh7hj@vqBnŒ?_gV‡XgyS]…JilLpv;vŠRÛmPuÂex†xÿ€Lÿ‡@ÿe'ÿi"ÿl!ÿ{%ÿœ^ÿ~dÿJ7ÿ:k6TN&’\0p¢Dœc¯›G´¾iÏ…y“a}›Ps”QYŠ]•lFª]…¡dÖŸLÈÝ}ôÞ¢¿ÿ´lÔèz’“˜¤Zº^‚Ás¯§kÑ‘~°«¦i¤Öh«ÄurÆiLkWz5Vo/gjW‘ˆ4ƒ¯sh¤ŠwVt¡[ZˆX_wCO~A[a=Tz(f5c²DyOu¯G€ŸSp®PkŽsh„_¦Ž]QÊd„kNv–=v”fc›Y‰C|–CH—cPc[ŒoUn«tq‚ae†E[{_Up?rm5hu?~jEŠ™P`MNbK³x/w¤_ŸŸg™¹cË©{áÖ”ƒ·d\‰I‡z7É1¢å~t¶˜…=º¶>¥±dƒšžŠK…fnvJ‚’8‰˜K‹µB~Ÿp¨xLuO\W:Os:bg+~…Uƒ‰MŒª]Œ†QÿªYT¿ƒ4>;S1$el*y{Gƒ±?g¬Jk=€–N½<‹ÍiÛµy±Ûª|¬Z™…eÅè`rÊtbp“IfeOYŒ~_n<`zQpWSºšKöYm¶[¡‰t’Ì^t¨bƒN¦ÝYg³tomYm‰f·“~²Î{ˆ¾kFu;m[$š¯kŠ®t·q¬Ï]³ð‰~ɤ¨ŽdÄ©“™Ðz†m£¯i›ž`K‘X|m%{ž^w²^‡;¸ÆQŽÁ“~¥k¢Z©§rÐÌhÀÜik¸‰:l,ÎaAáÏr„¥U°Þqˆ£‹vNkNwo?·‰wÿ§h×ÿÿˆ¡Zˆ³h¥¿Œ¬[¨·Re£Mdj/^—w[X)€©(h¦?À¹bÈØ…¾Þo¸ÿzu¥˜”‰“µÇ§žÏ·uœo°—j²ìv¨˜‡À•oÂÜ‚¨VõŒr«Åœµ¼lÈÏ›¦·w¡¬g¿ºz“¤kìË”…ªl—«{ŽaŠÄ€t’^f…Cz‚GãÞ™ˆßo}|PVsHjvD†‰C«p„«„‰“k‹Ÿxn;tyTÄÇNƒÃUœ¤r‡¹€]|:h“[L[-Ç¡g’ê€T\dX_I\yB\c7ƒg=‘ƒTVxƒU–w«Èž¡³b«Ço¦ÝnÀþjÓUk˜1]|1vyC™£Mzœiq¡Ã}µØ€’ɤɃžÎp‡ÐCm¢Nz¡D†ÁNo£6_ˆ8¤[Üÿt~®?vœ?rª=iŠ>}¦Sl”@\}7q‡:|®C³Ï€Àfj‚C[Zl~\u†Kp>l‡JEf‚C–ºw‘ÃpÈvjš\€ž]çö˜Žº|Ž’•œÂiwžI“žqŒ¶h“»vŽÃv‡·UŸ²d˜`r„z‡wÀv†¸i »j…±ot“¥¾‡¤ºŽ—³cq–ivŽw”¹~ƒ°hrœMOg8uš\Нe¢Ã„‡§Q²jƒœaj†\{¥½fk‹@xŒb•™uÁº‚ÈÙ«»Û’£Ä„¡¿z„ªrƒ¤a–¢tœÀyš«sÊÌ‚‹£Lq†>|˜gŽÀVYKX€Xu•e€ x‰«np•^e’Yl†cª¥bsˆQ]~v€ ¤ÙÖ ÀdpŒDl‰Lm‰GbŒ_v§anžQp¡`‡»tªÆ`uEhƒJqV›ªfŽªfxŸySn—Yyd€JWp;h‰W|—dš¡oŸ`y‹zƒ™nnŠY`~AeyJs‹L{–b\{›QhˆNoŒYm’O`ˆO]yBYuQ{š`v”Sg‚Lbv9KlGb}MczOa|IVzNY€SZ‡W_‚Wi‹Xc„Sj†Vi‹d«rŠ¥b…‘^u“Vj†Yu–Uo“Jr“Y|˜`~Lk‰IlŒVuŽLQe=`\5Sn1LkLIXEGS9PN5UQ0\P+K[9UT1QP,OY3PX?l`=fi=mjJ{lAi~Ybmh^]OWcCQdE[]9Pc5B_?DR4QR(\a*kn;oƒ6hMa„ad}VY~JqnGexH^vR]ƒKbzLV„Bbu>cv=b|<yrAz~FsŠMm†`q…Pq‹Vr’OeƒFhyGqŒP›{GŒ™S³„‚ÿ¯Wÿ•\ÿ`.ÿd ÿm!ÿ~*ÿšVÿxcÿB4ÿ:·<tT y>‡G}“YˆV£˜zˆÁ”rœ‹PŒeAoPCTJuW5…~<Š£f…_‚¥ur¤{M“†_c}b…S|…P…—K” _f½cl…lg|LyDuos“V…rQtWM{=cb§o1€³Nk±‰g”t{Ll“S`Š_n|@`z>RuCWr4…r5{ªW‰“nb›o†{|‡at®[]¤Cm€Bˆ“N€¤Lu¢Tl’bT‡OEe0\N.Mq>Ri8Qf2bd/_<S~>h~ARxCj_;„s9e{>v`F”„Q©²V« M€‰W–œ@Á¡lÿ¡f›í}»žž˜^ÿ‘GâÔeËË•Œ£¶–w[´²”ÞÖ‚œó»´•ƒ~”¦‘MµÊt¤Ôƒ™½d“vžƒO™´mupdYrCrm2€q>S‹ar_BvœS‘‰S¨€XŒ¬W©Ÿ=öe³PxÜ»ošbpˆU–‡D´Ç;k«˜{ƒIrSvrZ†›Qžƒ@¡±ž¸k¶lZ€Bƒn,Õ:T§DZZ0yk>‰§?k‘i —yåg~•l^‡a¨”3£¿~¬Üâæ˜Âø”¼ßxpÏd‡xJÓ»PÕ÷n‰Þk¯]Y—pXo*k_;‰mI^oW˜l?{É“Œ@ÄÍq½æ¡šôrŽØM_„S}†HâðX”ñÑ¥_˜œyj´x~€Ožªz‡‡hq;Rs2‡‹ Ã^`½={À¦›ÞÇã¥d‘<ŽŒK™‘zÁœQÍËõijÝíyðû´™ÿ°\ŠwVkHUXP®{Pûÿ®¦Û©†»h…‘E›¯L•¾v{£†E{;>>#dj‡z:ÄÞ”äÙ…Ý™–…d—iïÄ™¥Å^´‘m‹¢ƒ’šv®Àf¯ÓVØÃkËוǵiÿûÀ€¬j– ce‹Tc<iˆR•S}ƒ<š¼a«º£ÞŠ^~?o~1Úæ‘§öŽ‘¼fŠ–P„¢YiuUPw9…y®»°{¥‚lK…¦HX{Zun/°À[ŒÌ„\m3Xy,~Ÿ?vyE°Bƒ6ŽVŽM ¾X¥³t}Ÿy~›ƒ˜Ç²ß–¤ìbŒÃLp¨:€®?€Ÿuˆ¦e£ÆŒ¢Û~ºÜ„¸q‰ºw¨wr—x…œtmd{‹zsgw‘W Ñ}¥ä’¹×²›M’©fi”IkŠYUv9j‚;ƒV–Æ€ªÔœy¬`ƒ§~°kc=fu7\‚1X€=ŽcŠ©Kv^…¤\Œ»O’»ji•VyB‹N‘ÆW‡¼|x¥W‰mg€AU[Kgj[n]›s®²s€³PdŠJY{[Yv]p}[]zEY9f‰Txœi†¥m‡®WSz4Hg=mWiƒB~‹T„¬•ΘžÃ†l‡Pn‰ZržZr£Rˆ¥`{ž<^ˆ9f†AmU¶Ÿ¼Œ–·€v]y™g¢Áuާ]ªn¬Ìr£·t™´^}œVzHœ´…¤×Zo’Id…Et•Xw–Uq—Vk‡Qr¡W|¡N|˜n¯ÕtÌh™¸ˆ ¸}ˆ‡…—e€›V¤g™ÆmÑú|Ìÿt°ì’Øÿž°Óp†ª=d’Gs Se‰t W]‰[[‰RXuPh‹YwU]ˆªe”•`{‰c~Pc‰XfŠWxž\®f‚ XlŽSm‘fl–avšXl’Yg—kt—`t—]rFWyL\„f€”VY}>Sh1EbC]zGTkGXsRmˆSm‰N[{DZzVn…XsŒ\~•UeŠi€žzˆ›lw‡fz’^r‘QjRrŽZv˜aq–bi•BRp=KnP`‡TUsE[e7]h;_qBfaCLaAfQ:j[3o[5bf6_jDcZ9N_9IQ7gW4mw0U„NZdN8_KODNPF:XJ0MW2RW4Wh3Os:Z_:ir.e€5czFVuCUpN\iNMqFDeDRZ:V`7^kF`wKjsNgBoƒU{Gl”Ir„SpEmˆUttQuŽ[|’[y‡Xv—Pq‰W‹UŠ¡L{eÑ‚bÿÍ\ÿ§…ÿa3ÿd"ÿk!ÿ}'ÿœUÿhbÒ;0‚VZs1PX#fb<aƒAYzOdjK|wH‚–Yb™sXr[9tFVQ0Sh%Lf2^gAe{AaƒR]yNBUUe4Vx:et1]ƒ<‹€CZ²jb„`UŽ5piClGOifsX~„5L‰M[b%‚o3…Q¦‚ª]`Ÿv`uW\uNrv>‘Ež_dÐdswWi:>…PKK2[i5‚v2‹«r…§v’¦`ˆ·yušRg‰UZw[FrJPF4Ym+[v=FsB@S3VZ/€/‡ŽY^ kkyWsk4Š}5¦~:‡ŠGž|O‰T|VäŒU™ÿp„’vüƒN¿ÃŠ‹›s‹ŒkÄŽ]˜¬nÏcÜ™ìæ{ªô©š¡šÈµµïÁ‚²‚±ŸOš×“¤Æyp§ŠkWª‡GU´€gk,oz6wˆD¡ŠMz”x{ˆf»‰Tg¸„Èo;É’nÈ¿S؃•H{Ãm˜Tl“Fso8…™Xª]…šcòn]³ojt4‚‘@U›YyWS¢_Á¦Tà·xvÔ°`qs€4z”5|‡c¬YtÄ\„ˆ]ˆœbŽVªäpªÛ£¡w˜Ç’L˜{m^Xx°]œ™\‚kÀ¦sb¯¸ƒJÙâ~éÔy×ÿµ¦·›«‚£Ÿ\™ºs¸¹|Æ—™’vÔò„¥ùt°d¨½Vx«šm~}Ä¢M§ÿ·c³ÅN×Ì¢Þf¡–TÄÿQ¨½:“º‚ƒÃrl’{‚eGŽ‚U¡àŸ€ dŸPz†Cç³g®}ž°t–š€ÿõ²ÿÿÿýÿïŽÚ‚r\¢µ@ŠªUd€`nT|¦dQr@^^/‘‘f‘´xŽ£RÑÉ|ÿõÊÎÿÒÞħ|Æ‚€n<™€VÂq§—½¶x ˜pª¢l†•[¬›Z–v€}Hü«\ÍÿöŒ…3`¬qOc+@mON'|™E–©D Á˜‰ª\¯ÌinÁC«¬cËÿô°ËŽž«‚‰ÄkwˆG…‘KŸ LŸ\YBc~Ld>pŠN”¬^|›GZ€>…šVšq„£LƒGŽ€;š„jè‡Ã´°ØÿÅe®Pb„=krQ`€;£”‡óÿ¬ôÿŲژ»íœÁئŒ¯Ž{‹hq„biš]“jz„an•icyYd˜[h€4`z8pPeNT‚<f|[ÁĦ¯ß„Óõ©ÉñŽr¨Lhc€¤Yi€W†§„’¸~V–KnƒX—½ŒžÉl‘?ax,dˆ5½ElŸFxiÂd”¸o·mŸ¾n£ÇsŽ£z¯z“¶g•¨d‰½‚Íçrj—>Hf@Kp@oEd—R‰§gyŸ`b’6PkMyŸO†·^y®b‰±Sr•Vq”Me‹^i“[k›Lp¦V…²\N}>^‰Pnšin‰j} g›¸[¡¸b ³szœp™¼}°Ù‰°Öfj‡J‘šm§tz—pp‘Rw™GtžU}”l™·w¦Åm’¹} Êt“·Wƒ—fy–T¥À––¿U]|AUHl˜\´Öj³èVy¨Nt–\Äs·×|Åì¨ÐÿŸÆë›©Ñe°UŽŽdœi‘Çi“¿qĨ¿ížÏý’‡§j{ª¨É_žQl‘EL{LjNc‡FjGW‰KbŒ\{–d‰©‡¸Üs†–ItƒP—Fp’S{œj¥ÉÁã…¦Ä]{•X}•Ti‚Nm–`~£V¡cp–VeŠau˜Rf†@_sQ^vLQi7Ki2Eh@_zFZuAUrQhxVdyHcx=SoPaˆet¤p‡¬i…©t f{™YhŠT_Xl[dYaˆ\t–WrYtF`z9SwL]ƒTTiSTa<Md6U`>]X2Yd6d[Boe:zrEayFaeIa];cn;juIxtGh‡@VŽQYjUHU2gC:eN'iN7]P1f]@bo9TxAt^B…ˆ:fœML†VIYCP[:HV:Ia9PZ8\W0Yg.MhDZc?hh@a|>fwOxrG_ŒOgU`yJepBevExqKpW›z^—W™“o€š`WŸpNulÀ[Bÿ¯Pÿš—ÿd5ÿb!ÿf#ÿy%ÿ™Qÿ^bqA+cn'JwJU]0sb E<<\KaX({…?{ŽEB”]:YI8L9`@.5c/BM8mW"OŠDJmJYj5X|?[v8Q‡?pu1r–DqŒ>d‹cz’L8JnNG™8xµj‰œd‹«W~”\S—Y`o?^L†|JŒž[NˆMbW}s.› G¢®`ªÉqrБt–{i™S\ŽSk€6w“9lŸUn‡R]Ž^hvT†Shª]]€X_z8cxEcƒ:X‚H`zS}ƒ>‹—Hf¬]l‚Hš~E›ËdxÃr~O»¼N©¨\”§\®¼w§ÆV±ŠR¦¡]§•w£§ƒ†U}–ud‚P eS¯”H†•^‚‹I®o_¯Š‡y«Æb{`KvGkK:ŠŠT€™Kv™bŒ¢bsh‚„IqR`T‚]thBG{?D_K‰V#” ^t¶MryW¼k’–h‰qO¯TŸ¸uh£Hk–[t”H|6“œIgªLn†:§Om¥ylmih~=eŽ<d„. …Q{¨v€œRŒ—F{—Vš©Rd”sw‚1]|Ez€?€’Z}œH“™KÎÃu¶âž﷟½|¨fXW&cf>Nd7MV+rƒFl‰Lw¬eŽŽfÖ¡{¾ŸbŽ\nw\{zXd•\ŽšD¾Ãny¯tž®uÁ˜¦ªNf¦b{<„‡-¯ÑG·Ð¢ÑÅůOŹhÿÿüÿÇÿÿË©ÿ¨vÂ\}@x•B•¨x“J£Ê—y¢SkˆC«‹LüÏxÁ¥Xg3Sm(©ve~ºŽ¶œ“†¼q‡;_šL6B*xv$h—>fr5’´]ƒ†?ÙÈBÇЈ™¼jb’[zwx™gcÁ²h¸´iÿtŨqº}f£ÂXøvÿÁ{üøeã÷•ÜÿWŠÓOª»}°g—Õ°ŒRž·@PŽ1ihšŽ:ÔºhÒ©v†j§§f–Ägu“T¬ÇnЬލ§l•¬P¶ãm¢¶sªÄc“ÀUv°E™£^”Ùjƒ@n†<bp7„u2·š8ÙÕo¸·”°³o•°sÓΚÑÿ…—˜Wž¤¯¦µÿ²rSp•C€ŸV|£hÊ»¤ÝáÖ…Æb`rK…—qr‹PQ}5ks:Цhv®KqˆCr…:—·Vx]ŸÄl£h—¨b‡¾JVw2nI¹˜´ˆ‘š‡±j·v”ÞlkœH™´Y¡Ôfw™lÀøƒ¯b¶g«À¡¦âor›\…¦V”¢pšc¯n¢Êˆ|¢’^ˆ|NcS€˜]~«nŠ´lx©_‡¯o¹b‹¯¥ÁÍij¬;OsC^y>]yLŒ‘XWyD]tAMw5TpJk‰UgˆQp’`šf\‚>Rr=iŠQ{’VtŒf¢³j£Æ\´ï}¦Üp~©Wz—h®q„f¼Ñ|‚¨Tt“ƒ’°…¹gƒ¨ZlYx˜dw’VrLm„D\Fh…S‘µ~‘©u±Æ¦îÿ¡±Ó…ªÄf^„S‘¬}–ÀU[A_ˆI‹¨k”·…¥ÁnVq>TnQ|¤¶â’¸ñ·Ïû¤·ã“™¸r‘ÈYlžT´a–¿dr™Rx¡mœÅ…ªÉma?j‘ƒ±Zt“K{žPq™Gb„L{¡c¤c‚¨f€Ÿb{’Zx•t–Ám“¯PnHgV|ªgˆÁ|žÎœ±ÚŠ”Áf€œ_‰™Ww—Yr¤_|®^^{U`†h‡°x«^t’O\m@YuJ_z:Rq8[xJgƒLg‚Fe†RsšQcLZxAXv?RtTfˆo€§w©z~¨g|žZgTo‘_tš\z˜SeŠWrVmŽSlŽCSl@\zOk‚RScUYe8@oC<\EYG*bZ&rm<ql>mnAbyI^pI`fChk=j{@p‚Ny‰Va˜ba}efe@yZ<lV5[Z;\W:UZBZb@ZiGrmGs†>vyGUŸWM^MI`2SV4K}:Te>ci+Yw7[r=OjFXa=\[7mrGy=fŠHN‡ga^D^]2Zk:dk:ruBoa|‰O¬‡d˜¬lx·„\’yÂhFÿ¯?ÿ~uÿ\1ÿf ÿl ÿx)ÿOÓV\cZ(jh5H„IL\8[`'j}E›„Mƒ©8~®ax±`A¨Y&]H05#Q6Wk*^y>ar9VFdvG]y.o|4U†=Ko@zc.f|?pNI‰dRf?Hp9pi.Y€;{whb‘`‰]¢ž[É”Œ°w}²mq¬]iwExxU‘ŽN¼\—Ïw‰ÔŠ›«}€ÓЧw”¸rk½d]w\u…HT•eYnQ@r=lO9}Aƒ“O[«c{4–²>‚žu§bdšPmuCƒDjˆj~g§}=½ƒp‚–mUÓ\¦¶ýÄs«ç‰Ò©’åđ»pÔfÊ«hŒ¼htw›uA±„\á…Z°€¦‹S‰…UCo[1:V*M<*1$,BN/'tc-zgL¥ƒLÃÀs„{r}lJOƒ3HX5XS-En-fc!e[8—ŽP„˜S¸ÂJ˦™•Và«TÇÿ”u¶u]–QPrB~Š2šJ\p„~;£ŠH¨¬xp€D€7ƒ¢JtŸRw=›M›c¢œV¸·Zµç‡“Ä_¦§g’¥Vp˜F~~A¤§JŽÄf‚›Vu¨Ž©Š€±ó•—Ãva‹nX™Afˆ,e‡6uŠ+±¯Fš©d«ãªçpsÄt_ct®µ3{Ö2‘1Ú¿^Áû¨¼è»x˜~¶¬V傪«wŽÜ„ˆ‡>p™oEp†4BA\Q>̘_ÓÁ•£ ¥ÄÉñm’¤€^ŸFbxCO{7otSfˆSŒe£¾|‘Ï ÌZº¥ˆx¦yµªXÊ`‘¢B•—€£Ÿq“½u{‚RѰ”Êvvd¾˜j€æf‡yS†xTl¸Tž3jzN®“T±©[‹MÍÐq‹zv²eH^&fr0ŠiÆÑ–Ýï®Íôˆÿÿ¸ÿÿÿÖÿ¶ÀÂÕáŸÒ‡žÏhܯQá¹…—±†ÐÊ›Á쀔ÂMƒªIž®boKe‰9p„RrWÉÀe·|”µc·ÏiãÿÙÝþëýƨå~¨Èp§–LzŒDr²5Fp!•¢Y¯Ô¥Ò€§Íc´Ó”Áع›ì‚„œgs—`ŠtœÇ™™¼j† ƒ‹©|¶ËtÔíªÖÿ–«ç‚¹XTlFW_E[f3ˆŸE…žI‹£`o˜Dœ¦R|R‹ cv¥†v©[›™k ¾sl…Ko‡`W“PZp8t‘h¯bˆ“jŽŸi_–7z—d}¨e‡²sq ƒew`r¥`Š·{‹ÅmgžE†œZd~PawFo’T~ zp˜SSh7^pLaZmˆh†°d^Bx‹Y|¢vްr†¥€ŽÃtt¤Gz“VªPvšQ\yHe‹?c‡2Sw=^‚BeŒH„¥`nŒOiv<Xp>f“CnœK‚±Wv‘U‚šeš¿^n“ty•VXyNp¬\•¹vš¾u¥Xm‚gh”XZ€hŽ”tœ¡d¡e|–Z‘œH˜¥g…–Wx™dk„Z€šhƒ¥“Œ±|vŸjеcv™bµÌ“°Sb„H_…HiTdŠL^zJb‡4c˜Fu®{®Û±±Ö…„†Œ£t‚PxšKˆ®Mn PU}@MvLy”U{’\{–TqVk‹^”Y[{BPlKSs?QrJ]sT[sa‚”]vRizKƒ˜kª±q’¹]|”Cf…e§ÃŠ•Ñ‡—É™£Ñ•›¼s‚¥hŒ eˆ¥^ƒ£aƒ¤H`xJf…j{Žsw•VWxI_qD^|Zs”Ol…LcƒSošd~«s‰²t¥Æož½Tq—Nl‡D`vARsPa…ceŒp„·Ž¯Ïq…£Ysˆbl‡Yf’UeˆSd†Nh…Vq”L\s?`pJv{Id[\{IKwNUcI`d2wr.vtGlyMoKŒˆNw¢]i“dusVm|Dx_˜‘[w°fqmwPYqMiTD\X=M^<FN4wX4w:uƒYQvInBAfz8puRšƒC…šJH«^zaU|…2t•OjŒ[\rOVlBmg4€}<Gj–R>–lO[USX*e]3ds=}r?„lNŸ„^ [¹´p«µŽf¬˜³|lÿ’PÿmXÿc)ÿf"ÿb!ÿr)ÿ‡N‰^Wpr.‡j;l¬W`wTdq4w‚By›Wˆ”W–Ÿot¾un›gPž]]gFyi$“Eo›_l†beˆJJƒGuq6r‘5HˆN7X?DQ%QX)Ok5SrErd:qX'nAu—J_ŠNUuDbnJ‡„<Š€ªŒepNf>f@mP$Š=˜ÈuœÉ‚k½š~’{s’rv’eš‘rޤ‡¨¯qiÅjQ‡VmZIs|ITMwlCzžNi”JÁƒGsNx˜r‰—c†‡l”J€™\Syw{[;`4deMšcK—›D¦´X´»Ž{ž…²‚m¯¨p¶¦sÂ’i´šS¸±{°Í—½´uì¦Z·šbÐf¼°p×£Rm‚y[d¦3~³mo£RwˆFzw3xŽCTqMta-§¢OªµuI–{AV@OYSr'|~)JŠ=wY&l|Hm†M€aˆu‰f¼~V–â™™‰µ^—eË“N†ÙufŠEœ8]ź“zÙ©š´IÁÌ]—¸eƒ¤W‡‘Jy©NÂ¥Pž»ˆl™l¦iQÿ¤S¯ÿ°“nd€N¦|Cf‘fc?ŽÂ=ŸÇ”t°|gx[y‚2™[‚½fqš]ŠRɱZž¶hµÃ–ÚÿÀ„ÿ»¸”Lõÿ˜ªÿÃw´[•¦LµÅq·¬Ê’Nòÿ£Žòšd¹WbfXlq<R|JQoGXƒ){„%Õ¹YаNœÌch¹My\]–´Y´Ëˆs©‡nŠ;^ph•€Xš¤W”¸YŸ£[×·œ ï´sŸA…œC…‘Fí¶u¯´€›ˆ@¤àdІe{qJ}›>k NP`+{U=}ƒLo«E|^B‚‘R”A™Ž]œ¢d÷§jëØ²®»z¿±jšË_–ŸX—ÇY…ZÏ»ˆãß´ÿõ»ÿÿÿ£þ¯µ³x¡ÇŒˆ¨t–¥‰ž²[–¡M¤»`‘°{¡—Ž‹˜v›£‚„¡m›“`ƒšSƒ¢[¢ÉkªÕtޝ`Ž¥›Ño“»o¤«’“º‡¯S•}GÇÁ_¢ßq•µl†ÄmŸ¯ÏÿÑœ”q”’„›‘…—vi…Xgm6n—:h‹H¦r‘¼uy©Yi}KrhdzRº¿¶‡®‹Rh2\{&Xj2ep+‡uL†G……VkKjLv€@y¡aPg@Om,Fb>_oI†œd_‡KyˆP²´ˆ Ä|”~cw¬O_@n„b—±]޵fv¦Nx˜Mc˜C[‚Fo^›RZŒDi“KnH´v¤³o•ºXyÀD[ŠNe†YmžYiŠ[e8Lw?WqD€™_j|Hv~R€“[Š«T~±jk•4Qt0T{=RŒ,Ou/Dg0PqMQjOPm<VsCZz3Wy?q“S{“Wv‹V]KczGSp@PsFx¡pÉ…‹¸`TyK_‡ONv;YsCb€>{~W’r€au‡gr–Vz“iv”Vb}Dk{UZoguˆ_x•X|™gi”VbXŒ”hlCZs?Pq8[|Jj“Rt–OlS}±fz²a¡{«Ä‰”»b_}GDh0JwB~ Rq˜2Yˆ5[„Gn‚AexG†Ok–Rf‹JY„Vt›e‹´b†§GY€:Rk7FfAZTrƒNrŒYm~RlsKXnQiˆ>Z|`€”ƒ‹‰Œ¶Š‰plbfŒYk…Tj€RrUe~EZmMl„^[XjLb…A_v=azU‡•`‹PizLi‘cy›iq—n—w‹¨dx[o–Zj†;Fh<HiMW€q~¤²Ü•¤ÁWf~NXyNg„XiIZ{H\sLX|TqŠNz‚BavDV„SgsUcpL|F}‘Ml’ShyVh|WqpO~X‡¢mr¥tlofŠSy…bˆ–dnjk™‹q€ieuXscOkl>NoEpO7œ1x±Wt‰p>ˆ^RLEki.…yC²˜T†ËfQ®”‚bj‡‰7udˆ†gm‰SW~MQnDde6„rA}‹OY—hRsl[hAtf5i€AqvNnLˆsQ‚`^šlPswa[WÏhUÿ‡Cÿe9ÿ]!ÿ^%ÿhÿt,°vQ_uP`rEˆS0„Jc¤iƒƒM¦NrŸ_tŸby™Xa©l–`†¦U…œj—IŠ´bzdUˆkZnM_v>R|CSn=:j<5L5GK)I_%MZ5Vl9ssAn‚3€“Bq¥aAd`[=hkC@CI^UˆVUuSMŒe4r:MYwy5r©b?`KXOgv>uPC…CTVGg=z¦i”{Lªy=WCK+_Mhc“St–^‚T–”SY“bKiKMQPT@3}K5lcHgc7M]@dI,ƒn6‰yAgZŠ~R‹|U—‹R´²e×¾_贀ʒuÜ®t«í–´¥gÜiÇa¤ljõ¡h³Ç† }]|}_•aZ±uLVU¡`Q¯»f›¿t}…nŒf0}¼Oa][n|<lœ9TjBdv:—€;^\Yf<„z1€˜`n¤TsŠ5~Ž@³šZoÿjAIQeh.ˆŒCxFmBh‹Ecu<µwAÌê~›Ók•“È~lŽgu†<i|JuŒ:¢@®ÃSçŸcóÿ§æÉy…§¡^vq¢kD†¨Ve°ule>©meÄ„vˆN~™6‰Ž8c\ÛŸRz±h£S‘”mg¥~ƒAÓ˜Žªÿä‹®R»ÒstÑ‚‰žJ®K~~KÄT›ÅKˆÅyµ‡k¥áÿóe¦ÿŸ²¶W¼×s¸ÎzªÂmå Põɧ¥Õ‰n»ž^¹Óy¾í¢e‰\…Hƒ·Ll‰?ŒyR“s¼Ö€u¨x˜ŠP¦çˆ€rI¨ŠL•¯cιdžÈˆÒÝÚŸk’¡cT~5ydK›¢‹›ŒF›Ty‘W±ªT©Ÿw¯¶~›£]Ê»dÇæ£øç„ÿÿ³Îý••ÔʱsÎð t£u´¿‚Æ]·ñ¨á£`ŸF†wR•Œ™m•¥h‘žX°Î|•¿gQfNƒsI²š^mœARŠ?Q^*Ž€M¤¸p”´k§³ƒwÊdl‚<rxC|«Mˆ”@™§]·f„•:¹Âp~spO¡¬ˆž’{Ñ}š“RÄÌ—ŸÚ~ˆÚXt{^ŸËfa|6™ÈH]~0¦s‹Èu޲M`–J?N6TGCjp9h„FxlOtrR€‚XvzN††Bt’Jš©z¥Ér‚¯c„¦fk—=m5oŠEƵo¼êy¢´eÁÊn¹Ùz™Ánˆ¯hg‘Sc|ZV†:Oj=\=crISŒ6EH5i}Akx\kˆQh•F¤ÄoeDCYCpzpƒ§WªØk‹Ó]€´Pºi¾diXdyC\wFqŠUp™n~¥_s¤^WƒZt—hqšjr“HWz5Ut<Ss6T€.Gm+Nn?OhC\tElvH^z1[m;jŽAr“Ve‚GHc1IY1NU-`‡Qx§sx°pq“`n‹`ƒ¡Zp£DUw8g…>rƒHc…Ow‚Q|ƒYs™[oœQvŸJi~Fz‡Jo}A\{Ig{>WzLeKYwO}Yj‚7Nr1Oj/Qn3W}G`†K^‡_vq™«i‰«i‹¦…‹§gše{ŸMhEu‡G|KsOtR’’Ds„Nx—_x¥ZjŒLhŠ]‹¦x‚¢ij‰R\yFk–Rn—JwˆT”Z€—Vw•DlŠ9Zp:\nD^w;SyUjbn‘^ZˆQd‚CX~Pn…Oh‡Qk‰Pl‚Ne}V‹¥y¡ºƒºá‚«ÒZqBiƒNp€Th}FXmEk}Zz{EMY?AXHViL[x]nŸdyžD[v3PoIc~ZjŠ|w¡—¢¼`lŽCb|PdƒJcwG^InvAUxL`yTv„Fk‹JFjIa]Glk:€‚Dh“YW…`Hw\\gJcoJpx[‚kVUm«ij‘hl„Z†{Z€§]_©”etfwGcnChs?uxG¨vB¸Mv¸u–ˆn‡¬Tr•gp„JrBÉ V Ðuc±¡~na‚v>„rRž‡T’¬Uo«h]_ulG`z7pr@zvVtˆdt‡`”„Gz\zmrjOolG^vOF{MHdKbU-ÿ^*ÿ”=ÿ[6ÿ]ÿ`!ÿb"|m+Š€Ef¢M:XN:-`Z%eˆ`†‡O ¡U“¾qŽÉœ¶tr²fd”g~yH›ŒOµfv§nq‡`Ye\vMcq'S~J\d?av+Xn<ck1M{5m]3„y3€˜Su…]eŠHgV_tOfv0‚ƒ@Z©GJpVLY$f[9ou8ŠFd¥BSqUMoIpM7z<„¥Mo k^wNx[;˜ƒ4J›`oSP{‹@†‡]ªy9r±dy€S~Gu|H€{Lz}O‰tN«›K”ƒE…oMnv6[=–gB±€D‚yK‡|GvpL…tD‹«cz³_zG¡¤^à®\«è¤œ¼mOŠiQ΄[¿ŸPˆ]•€M£Z¼~g¾Ÿi……l‘„N ®g¨Õ4³h^86l‰1Hw@DJ'¤p/c¥BUƒ6Qr$vqž™DK‰HfM5š{:ä£cq²€qppT}‰;b8‡U'W¼Wh|(qƒ7clAyk<h‡C¢{To‘U‹n=–u—®c¾ÁoƒÑh„el}D`dG†jF’¦†°´n˜Ã]ì®lÿò—èþ¹o™wjvG¢…Lp³}[}N‘{8 Ô‘vÃZž—Je—eÅŠIÌÿ¤§ÓzÜÿe‚Èh½¶GãÇžÔêˆðÿŽMõKY0ed7j«GU‹*Us?‰CÈõ–Ýÿ‚¢ÎQ¾¾‘µÛ¯ÿìŸÿ™d‘iy{:g;§œ4ÇŸT°Ø§‹ªmÉN¹he ’q…V‡ha«¦t¦–ªsƒ–e¤¥n–‘v€‚by‰I”‹€¡Ìm˜¦rÿ´ŠÁÓ¨éþ²ùòÃ¥³“`Œ•E›¿e³«d¥´w½¹ˆÞÌ‚µÐzš¤P›N£¦¥«™¤«ùÎÁùÿÓÍﱩɖu ~}m°Ëo»ÜƒÅõ¶ŸÜ‰f•>vD}€XŸ©V´Ï…”¯€øÔžîŠ‚„O‡Lÿ®m©Vp„PYo-}•Se…?…xR“‰‘€µ}wW†£Y‘³a€³X„™R‚°g¼ž™œ×Œ®º~¬±O°ÉdÇöª\ŠGŸd »k¢r‰Vÿß±ßÿ°“šcÌÈ™ßazzR‡ËZl¯XW8h{+l£1pŽ;„„Apr6„wU^^<uxOspSbo3š©q®Äƒl‹HXv@i~Tv—gˆ½q”´y²º¤ªÎp¹ë•y™S~‹[•”fy–Pl;„°l†¿ia—/jwSˆ[¸mu–[}žBy§Mp€l–¢“}¨O:['Zs=rww£}¢ co•ClŒj tX{6Ol.Hg+WnA…¯tyªgyª`i’PQsSl‰SPmPhwQi‹KXuFYwVqGˆ±Mg›?m’ab…>^{NyŽKTyKŽ»cyŠ?w“<`r@`xB\ƒAHwJPoJQ}GdvZtXq LZ{<v‚V‹ž_› ]sMrY€ NªWw°GY|<uxXš¢]Š›WЉFm„D{C{ŠQ˜[m‘EX~3[{7[v:d~EnGcE\‹Idƒ\kƒS^zLmƒV†©\dŠUiRˆT}ŒL{‡KŒ“VˆŽO~c£Áq—²dpŒQ^„Vtˆb‚©PcAlTx t§f•¤m†˜d‹Ÿ^޵]™¯RyŽ;Nk;[‡On•MoU~¡Uw¢SbƒNp‚Qq‚MlŽTczXn„Wpˆc|¡ƒ…Œ|¤“¼sžXv”Jp†Sm„Zy•^š¨_vt1HR2FR1VuOwXi’fl“WaE[‚ENrKZvV^}v€¡gy˜SgŠUm…QkˆXsš]zLx~C\rNf…R{‰VMZ3c^<kf4aFh„RtzUn’P|ŠYt†Ng•_€r^‹rFƒ£`yšnqa…ˆ\„Ÿ]Фa®‡nsY}}@|ŽY|ˆU“…He©[\Ž€xp^ƒA|¡x}‡j|“W}SzŽad‹ucv^rE„uA‡œL€¦Xˆ°sr£ue‹fpsCYyClm<~‚A‡€bœœiy¬k{~yuvPuwI_{MeoLQl;Ra1èa5ÿ€6ÿ]6ÿ\$ÿ["–X&ƒ}5«^z½bH–„=DBcF[|:Yu@“xE‹¼\°„¢™t|Ëq]¬yo~Wy“CR¤f>xXPN4OP-dg+g-fyLvr;Š7l—K]oKgqFa‡<e{@ŠwPl¥mn‰[|€<_…I‰{:n—M[‡O‚s\8Ž=?J@NJˆ`@N´XFp`Kj-V\)jf>O‹N}qQw’Qƒ–T„“Xƒ—fƒ{B…w/—–^‚\È„ƒ»byŠcŠvQcŒFgoCnIœ¼XÖ¢eâ»b}¼t™w<ut?£fL¸mD±‚gržfœvB”§Rгs¦©qz¿n°Mtµjn€X„dN˜t=|nd®qJÅšT—½_Å‘iÏŸfø _ÃÕyŠ rƒwG´Ž\wÓàE¬ü<ÄkgWx’<SvPW€-t~%~;££Y‡±o—Jh‚Iƒm9Š›b|—LYcƒpFcgˆ~\¡¨g×pnÆQgZ]tL¨v4¥¡„Š‘U˜¾|žµsËØ–åÌ„‚eYzJ„[.«I¾Xÿ¼vº¸–{¡}˜„M¦®o‹¬‰uqC ÂBob€H¶Q¶ÙŠ¸Ú´žÇjÛÏsÅÿ½èªé›Òâ“Éî£Æÿyº ²ÿÿƒÿÿé³ÿÝtwbxc>µ‚zÔ‘a©Ed}6wwJÿ»yéÿÿ™Õ“z—H´s‡Ä…e‘‘Nq‡e‚QβY©{³ÑlÜÿÕ“±w{¤Xc~1y 6\`å¥nf«—‰ŽF™¤W¸Ô…«Ñ_ˆ·Xv“S™Ÿ\¯¾ib‘V„~F¯¨€žÁi’§i½S˜žV™Õ}ƒ‹Hž¦Y»ÐjÞòÍçdÇa“™V©oÒúº¥õ}¥²]Æ‘¡§á´x•Xq‡NeƒF›¦hÄÑ·§ã§n”k‚UœË†‘•i¦Í}‹¼d‘“}·»¡ÙêîˆÌÍtÖ—]Äð„q=“|E~˜B¯¬\Œ¦Y|ž<–W†‡O®½vÏïÜoŒŠy9}›b†žBuK¼Ž|äÜɯϔ¡‚]€<^}5{ŒQŒHЏ`L‚7j‡Þþ©€Íe…”kš¦zœË†yœ]£Èt‰Ìp‰¤„—¶p…–cqS¬Z¾Ñ`§ñ[ƒ•Iq{AŠˆi›^f7jŠ;„¢Huu[h‚Qj|`°®y¹Óªºô”›Ætƒ¾Vy‹X¸L“±c¡×y®Þ“¡åhÂq·Wk–\uP”ÁP‡¿N\vDh‚Li–Ec‘DU~8`{NoY”~š¶yt‡_f“OawHp}AW,Im?YfWz¦es¨LCq65P.=Q<[rZu‘CFl-C`)Fc+Db>PsLGgR€±sƒ²dsŠFsOjŒ\¢·–xŸNq‚Ke„=e’=j–D_ŒJf‡MtŸYvzHYmB‡£]`ƒ<m’S„œ^~™rsƒMdQd}BuXsEg€:bVm–X‹•cƒ‘[™Kj‡Nƒš_€œc‡—Wo‡6Xu8S|@i‰FYsA`xNb‚FbzHh„<]s<fmJ„ŽSq™i¦¶a‡ŽCdIˆ‚Vƒ^°a… [Ÿe€IpuE]yKXrYu£\o•TtŸYožgw¦|‡¨~”±i¦o¯[z›S„£U|˜T|¢q–Ài†]…£m›¸^y‘Q{ŠQvŒJh‘Mk€Jo}UvZ]rn‚ jw—`o—i‰ª\z’W|£‚¸à±Çq„‡=YlCmyNŽ–p§\h~Zu•z—¶cˆ”\‹—Sj‚JW|Xy›g}”]rža‰šhžtªÄsƒ•W|Qm„Oeˆc}ZRU([a3g`3h‡Js~YyŒJƒ—[xœo„ƒl…—_ŒhnxOXsSio\ryPn˜Sh]ˆ„qj p^Švq{Ot„Ro–mc‹bYrT_z_vcAnj5j‚U|~apW[|ZRyFOeH^nC_z9rwDt‰L›X´aeªjfŒhssPdtD`}MivOƒ}Px“[€iš†g†ŽTLp]SWId_>VvAGiD [6ÿ‚5ÿ^2ÿX%•Q#Q\%jd5uvF`ˆaGxp<TJ\?!8j,KO>Ÿ]&‚³?”¨ƒÅ¢Ywñ‚z•ƒ£¡a°Åh™Ëˆf»kN†UVZ'po&‰˜;v§a“Y~¤Do˜Xg‚^†uQy I|jŒLtž]„«X~žPŽ‹Tw¨OYŠac\C”w=R¦cŽc+Œr,œ¤C©Ïm•ݘ€µzkšYz“Hj•Kp—T¿ŽX×ào‘ö§‹²~Œ¬f¡P¸Z žX‘©|Œav¢esGŽˆL‹xW›ŸMƒªr¸–]ÿ¾zz¿»È›7ª¥c«ŽXŸœZ·uPœŠt~…X‚{G˜œkw…eyˆ]‘ŽHâ®XÕçrÿÌx¹Âxå’kÛóŽås™‹k¼˜TÅ£\ß§b²î«ž~lW{h@„–M®`f»šJM_L-u‚DŒ›L]¸G‰|.ÿžUˆÿµz±f~9 ©Zi±mŠY=}¸A_z_G†R0]*LI"yB̉}”²]¡l„u<‰ŽK|§c˜ŒC¨k—™nPž‘uYYo =PfA~k.ˆyJ•yQ±‰Z݇p –‡»²py¸~š•O»ÓFŽÃ…¯gn“ZzŽubŒj™˜?tž‘Ÿ¯TžÕ„ƒi©É‡ïÝ‚àÿÈ|ÌœŸ¤W·Û|«Ä¯“Ç}Q‹Iq\#ThT[Tâ[[yCZtN¯;€»q ªa~£Gs“K˜©T«³p–¥q„ŸGluW‰†Vx‰kªV~‚OjŽW…Dj¬IeˆDœ²pȦWž¦i£¨L©O£ž[ˆžgŠºŠ‰‰R‡§pÛÕ‘Ò_‡žKŒ”f‰²aŒ©R ™`šœ€µŠ…¦]¨£’¨§‘›§c ˆ–ž]„¨_ z»éÀªØu‘ªoo|\œ¥V“¦g…¥eRtZ\qtjfW‹’U¼»]€øŒ}@çÔ¡ò„ÈØpœÞ„ÊÊžäÿ¿gʨ\Ç»”Ðz¼ël¥¬i¯‹‰¬{™†\¢¹T~š[©˜\v ]Œ’g©Ö{s—Lhz;w|Eœ¤{‹„ikOWk7mŒWŒ„>šÉR§b„‘{žÌ~{·J¶Ín»ô}‹Æ\u qš[Ô]]…L¯±¢†¥Y²ÊpÝú»Áý¯¡×‹²è‰›æx›c‹ÂVŠP¬¼l„–dwZb…CVd:\i1ƒ“Wsu@skX¬«¬¢ØŠ˜ºƒ•À…•ÄŒžÆƒ©Ì‚‡¬u™ºz–¾ƒ ²z|¡W Ì}§ío{¼hzPk™LŸX{¢?c‘=hŽOh‹_nŽ]‚ŸntŽWJe?rGGr4Om>^xJvdŽªld”ZF_-E`#=L3Ga.Mb9Vl8Jo(A\0Nj;^{CY‹Uckn‰_hyO‹ž`ƒ±aŽÂ‚ˆ]w“n˜¼~¬Èx…ªL_DMhAx˜_®]ƒEhz@n„FŽ‹r“°„…ªoj‚Gy‚MuœV¤ÐqžÈi—Á[n£^ºkr¨[‚¢`’LkŠIa„I”¢[„–Zz•FeŠOn˜T[}3Ks=]wLex<Ow4\tBmzCesAh}KrcƒW~ŒY™X’R„ˆk•žjw”a‚”^‰„Wu„KpƒGeyDXxNaMo™Uz¢g‹³†”¹‚‘³„𮄙¯[kˆIi}[k‚Qa}drŸzœ¿q“´€ Áw“ Yk}HbvIrŒ^‡—Tp‡P{‘Fk€c‰onw`b…dnXhk†Â›²Ò„„¢^b‡Yv£h¦r ¯|ƒ™MZ†W[…tƒ ms…_mz[o‰So–]uš\x‘a‹°v¨¶}¤°w•¦bwUy‘az“cŒ`€‘Wa],Wi1Ul2Xp?‹lDu¥Gu‡o`‹hcveuvJ[‰VM{dI^JO\=`c3ez5^Xk}Xr…RZ‡Wg}Uvz@pš\Zf_lQVtJR`IS]8a^=foBTJcqE_tAQt>Yg=Td:`m>{w@„–N†«eo£pnŽi‘‚LŒŽLd™fopX\q?ntC‹€O†¤Pk„XYi^{fFxy4]…PVl@€c.ÿ€9ÿm:ÿZ nR#Az3C]8A`(GS.8g=9M/G94cQO+jo"i€@«ƒcªÉeoàŠv—yŽ–]—´oªÁ—~ÃzJ¤ŽmjQy“3‚F•«hËqx\QlZlRpq6’E“›l‘°fžy€Àor–o}X€žWupgro?†…<P£€jXG}W,«–D ΙŽÈ”z¸™…žw‚¦azf§–XšµlÐÇl½ãŸvÛ”f”Z‹Ÿ9Œ¤lˆŸ\™—d©»j¤¹v‡”b‹ŠHr\|‹V‹‚}“lKŒ‰_|ƒx’>— ]š¬e}a†tQ„]o‰njmHjp:qzGoqS‚“E~šI}–ˆ°—YÏ¢XÖãhÌÿ…ïÁ…¡Ï¦¬µlo¡ƒ‚‚BΡbºæØƒ˜¡d”ªFÙÄPÛœ¾fKxWtt1ŠM„m™¤>Ì£g‡°™‡¸m£…[¹Ès´s‹ŸF†¥|g¡goˆFg\Y‹Eƒ€)Ÿš\›[´‹†™=žPœ²O©[†³o_qRn–Bˆ§AA•k:> q_!‰–\Õ»`—«Z«f?ŽmÉÖ~šv¬¡^ݺ“Êå®»ä—g¯†Mt9h€A\–:€€Ba¡_³Eµê‚‚˜‰ÆsŸšTÝÅ}§ÓœŸaö¡S’¯l™£O—ºZ¹–`̯c§ÿ¨ª¡OÓ]ËʼÄݾq‹h„›U€’Yˆ=¡°‰Ã«Vºrž Y~¨Q}’\~¢RbŠ9Vu#Rr5V{=pn<tfy¿¥h”°\¨˜NŽ®_hˆ]ƒ•Yߘd˜ç{q£k»œx¥ÕŸÈÿt„Éf»©i‡¤n»`~oz³Å‰•W´ŒK¢ÃtŸ©[}¤GµªŽÒñˆ½–p€@’´[‰lº¦`y<yˆa¤ŽfÈnT‚Jfi.óe«»yÑØ¯ÚüÉÖÿÒ“°YŠ®T¢Ø¡u—fÊÄŽÌÿÈÍÉŸÔË¡ªy£´…¨ªjÜÀ†œ eËÙqÑÀoǨzÿà’ðÿ£›ÄO½Äz¸õŸ¥Ñ†€¢M ^Šœi‹˜Rk™?GO,¥¡]¦h”¬’z¡[Go(g_Ev“Y°¢¹Ô}¢Ü]rÆGi„Q‹§qV‚:j„GzŒG…¡i†d‡ˆ¦ÆˆxÂft†R`zSC[DDc7”‹„‚¨urƒW†™b~¤Hœ¦‰¥ÔŠŸb‹½m¤Ð»ÜŸŽºx‹¿b€¦\„¤^ƒ½P’P_qE„¢l‚¦cu‹MyŽqŠœƒ‹£s˜`k˜^]‹K\ŽHXtSNgCsuGs†_„pi’LRw6Ea@r‘AdŠ:g’D[z5?h2LbGnŠ0El#Ik.Jr2V~5Kl9Nk2=Y%=])?_,G_Ef|>t Ld{Hq„NMlWjsgfzaœ¹¤¿‘¯Úms V…±YW‚2dzÏÄÑÿÿ´ˆ³Ns’d§Ž±Ã…›°xޝo¤¾xžÈ{ŸÂƒ’¾‚›Ç…–¼†š½u‚¨iŸ¨gŒµYy²I]ŒI`xEVzJ[ˆQyª{нic…:XrM[jBYf<^w6f}Ck{G[q<Zl@gyPˆJyNwH`uFv}U‹–_šoŸŸg—WovCy€Oop:Zo=kŒJa‘^{§nv™v~¤tƒ¢r£s‚ p‡¥N`tSz—?_|;fˆm ¿}žÐ€¸Å¯¸j–§WsŒVjŠk£p‘¨f•©Z‡¨v±»l‰¢\y™`mWdŠZxŸœÇŒ›ºdt‰BPt_y¤u¬szŸc~•Y|¤^t¨dw˜co€DRnKi[u—j¨j€žb‡ sˆ£o†«htVtŠ_žw’žd„‹\pŽY^†AVyMgw?]x<~^9S‹9XtheiEk‚LƒŒX£[x“ii‰\wyEl™Lp•Q_‘TQ}[TmHlY>c‰Ko~JuˆKsŽV‡}Q]ŽKGl]NY<_^*et0WƒF]xGdt;i‚D_zGcs=jy<u“?ˆK’\s•joŠar‡aw…SZŒdVzfPt6gg3t<hŽPgoV`a:GsDAS=BS?TZ6dg%ÿ{Aÿ†9ÿ]%Sb$@t9<e-E] H]%?]'NW)TPjq&›CqÆN€c¡™F¤½cÇ‚x¹}}•p‡ŽTt¯mu”howx„eXCx}A‘¥K£»_|Ìwr¢uo†]‹H²`°¦t•Ӄċs»lƒˆz¤zQwŸD|…j‚’JņSÏÔx¯ØŒ£Æl—¯h§²{wÍ„osw‰]†U•²Z{¼‚¾˜\¼ÌvˆÄ•]¥Œ—„5wµE\¤°H¤µp»¸w¾½‡“Ñ„îŒbð¬_†«‚Œ—`®mRÜxR°¥_»£U¹g€“‚‘gL‡mJwZEhRkzYekP†u6ОXÓ䦅ìm}¢e“™WãÂ[Òç§èù¿¿ÿ¥¬Ê…›ÊŠq¸x€?¾®Qùë…¨ÿå¿–œ´€ºŸ]zžƒcŽŸS{Â`¡f·ž\žª^ªd³p„Êp°“Y‘»i}”tŒŒsz˜]men€Jr¦O™§Z”ÂaXO|(fª`~z;³±f~Ä…¨¡H€ªzQy—t5‹E,KIMhƒ°{3äõ•Øþ©¸½vß‚~…^‡‘D¤¼[¬·„¾ ŠrX’My4hx,›Rm™IŠ‘KvÏO^…L}”5if™§m‰²S¥Æe´ºg¾Îq±¹”Ä᎕¤Ay|H™™B™ý¯Y®Úqˆºa—V´“U¦Åde‘Iš‹8©¿‚²_ÕÁŠ~¹~_~Ovs6Tl8¦sSª²’ ¥pqŸN€‹J‹˜I±¬jÁÃsq¤_¨ ZsˆE˜¨Bõᣬ{˜ž^˃‹ \®Ä±}Ãd|’Td}XwzKt€1ëŒq¼œw~\š˜pŸªƒ‡¨y¶¬z’©¥°¿‡kŽN¦ƒŒ¯±k‰´pt…DºŽp‘¬d¡Ž‘©¬]•“dзd‹c4U'mBC¶´šµÎyËíÛËØÇV—[œˆH·ê Š¡l˜±m¢ºm‚o¤rð¸~Ïÿ¡¿ÍÎÓÐf§oˆ•O}…ƒ§¡Œg‘Ÿ\h9e†aQ^7grQqwQ}ž?«P¢–a´¡Œ£¯v”½Ak¤:w“=k>‡[lžJkfJ}’YU}<Zk,Zm-„¤D·Êv½¸}öïΩݕ{ºEjpI‘’?|˜YLw@Gb)U~,r¡D’¸ru–T—¤XËÉv€§Xe½³†‹±xŸ‹¦Å‰¥Ö„‚°^}”O’žap—By~V¯ºh¦tV…BYs:i>]}GWpKWv?csAl„XWsYJgZ^YEVk9m…Dj‘QÁec†1Uz0MwHb‰L`o=Ml/>V4Ea3[jJmyNYy59Y$AT8K_5E`/Lf*K_*V€.b¢3fœ8TwJvs‡ªZDs'La.\vAo›nаnr¡Va†Y–«¿¾l_nGTnns‘¯¨Â‹€µnˆ¶t}®|¬Új˜Ìo„³sˆ£en\r“fyŸkq”`ziu£r}§|†Â|‡¶m}³JeŒKq™Js z’¦Š£È‚“¸cd„8JU)BW5Sk@c„Igƒ=h{DX}3OmI[xF{ƒV”Ÿ]¬Uyƒ[Œ…W‹q’¸{ŽªYupBvsDno<jk@c|U|œn•kˆ‘g‹µh‰»f|°dy«sy•PPiTt›Rv™Hu§p®všu¨¢i‹m‹£s«Ån °iƒ¢ik”m€—]vŸ•¼~ºo–»l†¤aw“k„¡zŸ»šYl},JkL]ƒn€£du [s•s³}–Íqu¡S`tEZqTh\iŠiz›n~•[y”\u™`‚ _oŽa|œo‚ q†¢`kSe‚iU?_|R\xGYDZnBPw?LlLpj:w>™`†¢g¥œx¡ iµ®a‘Ïpk¼}Z–qFv`RYMdV2Z‰:YsV`iF_vCttGfyJS…n`cIfk7dx4W~ChrNev>k‰LsˆVn—Y…‰VvNxYl{Rj‡bl|Tt…Sg—XWY_uOmy;y{<k•A=ŒZB`O>J$?M8RS4ii&rƒ;‹ŽE·›NÿªRÈb7ba)Yw7Gs1A^)NX$Tb%Ol*RT,Wg)ksK;ŒjcGX€`5¯–OºkY»FliPV<Fd?xd;v DAŠaqbD‡¤5žžP¯µtÄpœ—rŠ_‡€O„f²‹pŠÃ‡Î’—zªmƒ§xgYi>zƒUIfaÂDKÕÀoÊÕº“ܲr²¥{—N„›jg¤i]xPƒqI¢@t£„ž£`‹¬[uœ^lŠN{{C¦•A‡¢O‡®O€Œa¢–W£ºt™»y·¤k£f³¨i¡p˜–\—…S²¬Y§Ëm”Ïy|º}±oKt›Y´{=¥—C½»d˜»jtžQ|–hmY’‡Wƒ¬x’dƒ„N¶«`ÒÜo‰Øºzu‘w©•†žLÓ¦\±·eŠ”of™¥n‹™Y‡¬SŠ\¸d—¿s™µfjšom~KgnNŒJ{Âptygw‘Kf{O ¨K“Í|x“jš›P~·u†œi‚Àn‰¸j†¹Z…Ÿnu¥^ª†G•¼m¸·N®Ù|£»¦y<¢ROD D{&sl-å¨Wôô¯°Ò½ïˆkÙ ¡Œ?¡µI´`„ŠYMyZqd3ft7‰¤[i \Y{Ej…N}”Dk—cr‘cv•S8†IyK Ûd»ÙŸ¹Ì|¬ó{¾‹ÅÂ\†½…¢C¸¿fˆÍªxšcš¢u¤¡c«p§³l—™e~–WŸ‡OË¥k—¨Š™¡|u–Z˜?pŠNxi9fƒPooDoƒi“†`«Á„¤Òj”¥c·°…¸¢sª¼m§¨hÿ¶qîÿ¶©Áv©År‡ºh…en—Yt‚Ng{F—€P®xgŹxÛo—å¯fŒ/•“_mŠ^Œ¢_—£w‹Hµ”ƒ±ÇqÞ½œ‘¨h\ŠŠB~žMršP‘GžTw–D¢¬e¹Y`n7c1Z1mKˆŽY¤eŸ·`žºLÓÚ²³ò¨v¿lƒ¸j§‡NºÕuz•[Œ—EºéY¡ézŠ•Gš–eŠ¥o}]|\YƒIR^2LL xa7¨™^gš2exIUx.€‹8j”NwY|º«v¨¿G¶Õ{ÍíÕä—oÄGSuCw™;i‡4ŠIìµ—öÁ†Ç±„iz~††™_§±|º¼w_~N{L~©Z’œn±Û|¥à‡–»g›·j…»\ŒÂNƒ¿N†˜N‡‘O†‹O~‚h˜Š€£±r;e€HiJ“‹_esFVt=Q‚%c—4“ÉY’Üb^’?Y|8c…Cap<ap5T~.Ke+Xi6m•Jp˜e‚œrr•`|Ÿ[v¨GP}?nUSo9Gc,?_/Tu:cwPwšDgŽ;jy:Vp-Tn@jBmH˜¾o†µfŒ¼Q`›Eiˆ`{„ZšÂGi¥:^Œ9]†`u˜ae‰Bm{Bk^š±yy›@Zw9Tv:[{`n‘gt•h—®”î쵂°jmŽXkŠThŽOh‚Sm‹[g‹>Rz]ˆ³€z¦md‹ro’lr•]a‹c~¢x‡¡[]‡Yr’fUgMYnBTr6Om4[nTƒZ„›Vo‚PTtGe~Sj„U|—k¬¹|—ŸUŠ‘czšh’®‚¡ÄްRstL‚}SŽGjmBbqS_sKctWƒ{]ŠŠkšsЧz€§mr›M[zSw£o’¯h‚±n~ž[w‘bœfŸ¥]¤w‘±niŠXƒ¨jˆ¶n‰¬Zi”Uu¤sŸ·}—Èpt^mŽdnh|•bn‰@H_2A`CUt\l‘[r•[h’et™u’¼‚¶Îk§Nb~SeXl‚^h‚Qj‡\z§k«d‚Rd[pƒhr‹m‡©b‰¡RdzWIY<bh8qy:YMa|Tlx=_ˆ>c€KjƒC{†J†•^ˆ¯q—m“£aвnj®„d†uOtMh]Coq3aŒA]s[ggBhs8iyH}zL~‡MqƒRdE\€C\}Lcx?n‚:~™O˜[qš^r“iq€N€}QtLr|Y}ˆM†‘M\¤PY}aicDz{C…†B¢›Xr¹ks•ulr5RƒHrr7qw3ˆE¦ŽS¤_ÿkpzKLq39k20D31?/^Adv$Eƒ=VN4Ch$U\>8h7?G/eOr* ž^jµzJ‡a_[.†o,™—6iŸV\{_dn?En=}PL~ƒ`h ‚]|}<yTD<:iW3z‹LQ¤clef…‡O˜§ke¼k”}P|˜Gf^p?yp:y{ql‚}h—zhˆ6`˜bk‚Kw•Pb“>s‚H‚‚Gj©M†‹VÉ£MŠ«Wb¯Ag†K…ˆ<v“SwlŽ’P…©\¬¡o•Æb|§h·–\”œf¢¦d••p“®f Ó~œÒ‰°¿uÀÎxºØ“·ëŸvÓƒ·¤uÍ„¼‡Z—z[h;„Š3œ¬I–Å‘¢e²¼nŸÜ¯sW›Sžp?…Äl˜©`‡´jyoYVwGf4ƒq=¼¾Q¹áЇ«z¤džª‘¢Áv„¶}]yGv~>l‰Z€¡Czd‚…QŸ…L¥Ýnn–ŠˆzKu£qU€ZžC´ˆ¶l’|dŠÉ€q¨\œ}G³WŒ«Uy£_†¬TÈ¥J¤òr¿¶LÉïŸñcƒ¦Wt·h{T¡LƒÂ`Xÿ§K¢º§M¥Jÿ®@tÙlM|–?s›A¡;‹™Rµf†˜Xp‘LuƒR £bµÌaŸ£«ÃŠ–¹…Å·oÆãwŽ¿‚§u…Ϻ™wD—Àj¤Æh”à„‘–I€ŽQzBæ³eÁÿ¦—ч‰¥f Žc¤vŽF´¤B³¼c}ÂV¥E©eÄæ¿ÃÚ–Á¥lİw¸µn¸×€ñÒmüÿêϿ…{O¥Ãf ”a®¤U{ÅT]u6‚y5ž•Z‡šG–šk“ƒZ¥Ê€œÄVË£S´ƒ³S´¹Tš³]žÍ”˜h¾çtÄ_‘»Q‚™T»o‰Çkg™NrnY“°d“¦Ww¬}€u0µcÉŠ©H»¨o ÀskžZD·—b¹ð¬¬è‹Y˜RˆBÄå¤s®S¢{€Å²¸§Íç¯[›ù…^q1e€Bwsb¥x ¬_QŒ2GV aZ3_‰9Rˆ2j\Iëÿ¦¤òƒ¦l;¬•V¨€„b^[~‘p•œ„h”\dnQº¹nwUŽŽl™´t–ÉYIi=:O&DK5yŠayVg˜Np—Dlp>xž[Œ¿tx±iolT£™xÔ¦hÒ®h¿º†¤žƒˆŒX€ƒLv†J ‰Qf…1v{JgAsžH‚µY˜±jŒ§D{•N•Ás¤Òv¸îŠf^|DUuEg„Nh‡4Wi:NV3Rb2Nf4yZŒÂr…ÆcˆÀgn©SwŒU`:Mx.Rw;`‡FYƒ;e}Jwœ^w–_X}7eŠQƒ¬UXACfUzk£Q<W/r oœÑys”@Gk7O`@SyRi[~~±p_‰¨QW|”^mŒJp…Dd=_~>\vSuŠ`‚«pXzUSz@Zt<mŸSˆ¿cs¡Tt®Zl’Kg_„¨~wou‰bQhC;X9RpKd{Isc|¬g`?J_;bvRo‚@]i:`qS‘Š\‰—V•e–ºtˆ´_s—Zo—b’£n{™[xk„¥y|’pzšeƒ—Z~žV{Š`²šZ{;^wCo€LTdsHku`rno…n¢g„«]pdˆ§¥¢hh‡Yd}YŒŸo ¯z™Æy…©l…©^z—WiŒrn’}šew˜W†¿m‹¹cu–FKkDZyUsZeƒFUl-;N0Da@P‰KZ…^gku“\o‰gr•Œž¾~Ÿ±WpX|“TiLoˆZwšg„´yŒÂ_~›LlLguTt‰l…h‹MeyEaaEvr*u}>]“IeSs=h”D\\}pN”C€¬U~ªqt™ok“^mŒfc‰^[zURpIn_:†2j›Wh}btvN„ƒHk–afyfvuRyRy„M~ŠQ“O~„JŽžLq²[i™jl[g‘azuP„K‰~QzXm‚Ot‚S]ŠIJzT]b3ww:tz=›‚R¬–^ŒÈ¢›nj´kV„jYh9rpG…‘Bƒ¨`„¢ft‹Is‘CA“K$YH<<"Kv-\ŽSGCS_,Iy3I]4KR(d^&Pn/X]?eqWz‹`H˜T?NNCJ3lZBrgCN–A<U7:H-œE!ÀY„ž€`°a°z@ÀÉB¹ìŒ|Ö™Šƒ{žºZµÈhuÜŒ¢Šoœ›Yuœ{Vpi\dE‹pE£Ah°eŠ9‘«]™§NµZ`iª>ƒÉZx–kvžP‡¨IšŒLŠËju¡sš¯R³beŸ]e~In‚=K›ˆjxg—’^ª™K¡um˜TU“¸d©€‘Ä…©»zÝïvzÿªÍƒ‚ãÉj•Æ™w€ºle¤K{•?w¥Vj™|„ŽQާo Ã`m±ƒb¦]Ε;—÷²Êi–Û•[¨e^l/”t/q”h—ˆdŸŸ€¸ƒl–_ŽŽj{©x‚ztp¤]noKx“A¡©WkrKØÐ?q뎒fƒÈ\}²uSrNTl8io;Wi8ih2`vc{`J‡‚K®«`„Äu–½R„¡[sŸ€y¦J—¢?“ÀŠ}¶‚“N„_Ɉm¨»vb›mˆm'µšSʵ„“{Ÿ—r¡fݸ^ø›ÀµK´ÿj»ÅežÕk»ßjj°ie‡?”§GÈ]y£r‘´^¶²`™Æv‡Š`w˜Qº~RŒÍ‚…du¸‹D¤ÃR᪇äáÊzÔ‚˜DÒ™[³ÿ±½Ì ò„uŠ@yG§¢L×£_®ÏpôÍqõܬŒÿ°¿†KÞþµ«ë˜—¤JŠ—NŸŒXºÚ’}©:ËÁxÌÜÿÿ¡ø‘Èdÿÿ~™Ú|ÚÿS’ÓOõèuéÿÃÅ÷‰¡ñn½ŽØÚ¢‰®jÒ¦`©€}šaŒ€_–ž˜UŽ=bkJ–¢j‰pƒ“WfeTµ—x«s:K)y‚<‘‹sƒpr¶E†‡U“aµ™VÊÿˆžÊQ«Âwœ°`»é‘»ú§œÚn™„u]² ‚kŸZc}9‹“[Z‹7—‹d„½xpƒE‡°L—¯Z’’]Lr5AL XO.voD¨Íi„àaV€#ÈÄ«¨øx—6¢šW‚gDˆª[b†GŽ‹Y‡¦3©§g¦Ç€ÒÏ”q»L·¶wÚÿƒÕTs¯5=€%moUšÝ€„¨gtE‹™Yœ¶”±r^…LižLgkX‹ŒrÕß|•åX€L’gv‡J˜£aÈÜþÿª¸ëf„—QnA˜³|©Ù„±Êq»À®àûžÁìŸ~±blŠMcˆCTl5JT1Yw:Uj1Jb-\lE€¹V~§b†s„xo’R`xATq7\z==S*Hp7n_“Âcƒ¡`©Ya‚Bm‹A{Ÿl„¯kr¡Mz¯V…¹U}ÃXj¥Mt†Ëß™q–K]s:Qk(Rl>‚ bv¥Md}V‰©i‰®ƒ“¿s‹¹doœa}£n]‹=tˆL`„=`‡VeV\zMg|9`‰Rвh…³jw™[ržimžaSzGTr\c€RZ}OEu85R6[v[‚´Np\x·i€¿Y„³Z€‹XxyS‘vJec=WiENcFYqgYs_b~kq™Xaya›vœXt‚]w–W^{Qw”a£h¥žgŽ˜c‘—Y„Hn‰KhƒOj‰Pi‚Hy›]o“K^S`„WiŒ\„—i•˜m‚‰NhxU’—^…¨w–¸‡¬Û’·ØƒœÆhl—NXzTzdlŒMe…d†·u†¥RM^4BqDZ‚OvRm€@Xq;GoEf’g‚´kгv{–gpObsZgƒplŒ\lŠTm‘\}†VdtPm’ftžos¡xcy˜O|‘S‰Ÿf’¬e€†Lf|CVlAejT[u8jo;f„Fnˆ\‰…VYœUS}umhN‹€<ЍYu³rc’nOŒbOmO\b>Sv:Qx6‚i-Œ2s¦`v„jo‰a–~Y„¦lrƒ€c€WyjKsv>ŠyO{†VŠY‡œXm¤^m€c\ˆRoR}wLtƒPuƒTh„Jh†Kd~Qg@qƒFvEuˆFp{I…|E‘‚Spµw•mr™`q•q]yD†rJ£?x³da’rZlLvt>{H|Ÿ\`¢H†s?{§O…›QmªU‡Oc²IWŒ]yo.ž…-†¶Lv®U‡K“PG‰k?A[g;Gf$‰Y+Y§B/kaF<(lIqˆ3¡h…³mè¡l¦Ì|h¶®y|ˆ–a¡®x’¾z²”q©ttkUkm[¥kK»£RŸÏt¶ow±n_…KxpA{ŽEo—c•‹GÁ¼QŽê„b½„‡}Sx¨WrŽMZt`e`†9„‘`m|R]“Ghƒ<|‡OÃJ½à‚ƒÇvwšYxzN§@ÚŠÊi˜¸~¾p…󫅜ɳÉ^®Ûpv¼ˆ±¤HŸÐ„uªw_¯h›£j}Ùyœ®[…¶T¶»\‡ßŒÒ¨_¼Ì—°ŸÑ¤“ŠÓ¡tª^sRC†VGW0^e }{;‚•V~¿T£·U™Íesµ_z¥Wi‘O—€Oo¹uÀ‘D¨ÿ‹ˆ¼£Ã·|Ž¿–œ§”¦v_«w=ƒ˜Bfzf\Š0^k1oŠ9…uFÿ›I“ÿ—}™L{‹5ÓªS±øˆŽÎ—•½†tt€c8‰[L¡‰UȼUx¨‚T—¢hµWÿÄmÿÿ›ÜÿÊäü´ÀÿœØŒ}Žz¹·JÒí’ÿtÿÿ]ÿÿМÿº¸}°Ù…–ÍŠœ³eÍ£RjÃ\{x/q—O’Tq¨r{J–™U—wù©ycÿ¹jƒ-Ûº=ŠÀ¦—›[›»›»W—Ïq³·`¸¬…ÂÊ‚ÜÌ“„ºh™£cŬ[¾Â„¬Ð‰ÇЉÀl¯¡^ÿÂÿÿܱÐj…Sg•8b±»NÿÿÔâÿì–¸Óב¿†¾½—Á®˜“Ô™Š¨cøµk}¾‰™†kÛži‘¡\ÖÍe½Öxy}]v¢DvF|‚H†S†N¶ÃUàÔŠ‰ðXrwK‡«7‚¨kn‰V…ŒPª¾]~ey´Å˜£Ý¢´R’©gs“_©ƒ‚›a’eL–¤Gƒ¡N„‰fkojŸ|U¡wmq“;ˆ‹Q¸Êƒ×ÿš‰yuG•ÎN`ª2WC"mDLß±ØÄÝÕ˜µL£Ï|¶ÖŒ…ª‚—x^¥Âƒnvvka‚dÕ©o§¯§°ƒÓ롟ÑnÀÁŠîÿʋĉ Êwx¸NpIWwI€¦;j–>‰V~ž_v¡g—žu•¯…x·R{–cÀœ¡v€T‹cïã°°Ë„©¢‘¦cKb~?cŽHˆ£k¬¼Ÿ¢¿‹§É‰’É‚w´_Fr@YlS{ P[r/d„8f‰>^x<Xt6A^7Yqal™af‹Vj†\c€DQc2dpGyI’¤H€³c±b‰Ãa…¦X€³Vv”O~œb›²tžÈ~¥Ám„®a„·e½q„¸nm—=fMVh4K]5@V)l~I‚¨i”ÌT€¹i£Ùoq [{•z’¯^pŠY—µ~Ñ‚«Of‡Lc…KdCz«_t²BnžYk¨HUv>Nl<Ed=EeGH_4HZ<YiOf[d–Sf’;LtCoshrˆn‘Ä›Ì‡ŠªoŠš^…[Š“Q¤Ts™9?`6T^Div9YgAQkCsxLv~iˆai€Rj†Qn—Roœ_škœ¸r‘¦`…Vz^ŽYy{AsMhšRl–j…¦c†œbnŒTg‚Uq‚Yq‚m•±O‚™bž¨e”¼xžÂ‘Æê·Îú“žÔqožI[~P_xOi}H]\d’leBQnBužk–°g¦UnŠPk—V«e~Ÿhq½šŸ®`y‹Sv‹Sp”e‰¯\{œLtŠIc{H]…Ok‰du‹al‹ce’\z©aªndž®Í|¡nˆ•TqŒLSpQ`a<og7sw5rŠP~–YP™XStohi:‚‚5v¢Nx fW–e:‚XMQCXj-Wp0^o/xd0{„:“Y›ltq{†ff“cajqWmSjcEbr2in@{k;pˆRwQ[“^M]VgGjnClnB_qFuyNz„H†WqKv„NrKz†NoŽXexM|EJzš`{Žd…€L{‰Tb…OƒxWiŸGqXf”el…JŠ‚Iw§OŒ‘gªZ™›b¤µl¥±Z€Çp~ƒu”^ogM›gye;‰…IH›h1_hP>7DV3YU9_g'Yy8Ÿ|6ZµK5jsIH(TQ%`U0‚r<«Ž`xUWˆnfjVH¦c’Ÿ_†»p•¨|‚ZxŽU”};mz;‡q>•›Pœ]u•a^ŠRgc;–u2i¥g¤…Gï¢VÕö¢fãÉ^Šubz<[zG`v5|t4pŠBlqL†Sf¼be’_‹’T±©X—²Šu¤kƒYr“Ca‰Ex}PŽ—Yw©sœO®Â…–Ö¤ÂÊ™€æ¡•¥i¢¹}¦½l¡»Š†¹—}©X‘”]Š©lÂÊw¦ö®s¸vZyxTubpZ3pm7jxQ”o9à—^‰Æ«œœ[{Àqm–Ru6~“HÞ¹LÎÿ¬Ïñ¯ïÿ¦èÿ¾eó½dsV‡3±÷u°ÁtdŽ™—Zq›q…‰]ÁÐd’Öª²ªt‘Æ€m§Zl|RtaK‰„6‡¥U]™I—‚<«t¥Ïf‚™^ƒ’Cu‰…lŽZu›Uº—EÿÿiÈ僅£vŽšwvŠm…Bÿ„iµÖj~ L—VÀkàÑý«‡™m¶ŸqØýÑÿ¡Øú²ûÿÿÿ¤ÿ×Ñë`ÁÑ©êáƒÄäg~¹…ΜSxÌyp€G¥qDx¿xm…FuƒGn•>W¨¨€©T}œQr²FtP€©CŽª>†¼i‹†Q€±WŒ…G®£c¦“Më왬ߟ¤QÂÀaðp¤§s ’WÞªqÖÁ³ §ˆÊº‘ѽU„<€M©–m¥Ê¢`˜\Z€Swf2¢„]sœa——H¨´wq‰cKa(ªvG˜¢Rµg–¶q±Ü—œÎ| Ét¢h«³D¦ãnšËM®`É}ŒœKi…nq…<{žE¥‡aÉÝ‚”ÖhG{>c/y¯@„¶Q€¨T¤Ýe|ÈOv‰@nz]Wq8a_.gvBGb-Ž]3~{Dÿ¸žÜÿ„fº[ e_qŽ5¶¬©Çò´¸ØŒZuBLG+€‘<Œž]|ªf” _|œO”°\ŠœYuœJq…D†_>Š‹pacIˆ‚a¾Ï¢œÜغßì‹Ú”ƒn¨q¦óv¸j€«as»Io„Ra^WeE~™NzifÃ‘Š²U¡µjùù˜ñÿ™Ôuœ·–‚£]t P3a%ZbFSr@j‡Y|¦|w™n]vRj{a®szµkl©CŒ¸v¨Þ‰ŒÉS“Ït¾áßú«žd¨°s‘¸jfZjIv±CqŸAgM}šZŒ¡nj—Nb|i€œyžpªi‘È~ŠÂsˆµh…[pšco\—_h‡Ih’Pl“Ug‚RhƒTby=Tz5[p?s„WmŒe}ªd~‚”˜‡‡¬UZzAp’MfŒOzws˜zfŠX~‘HiwLx~]y–€“¼‰¨à“Ètq’Ft—?Rj4H^3=U'7J)D_5;OFavf|šgq—?Kn8FoGw¡qx«]X{Fd…aвgj™a~’rrŒGiŒM‡MZj,>^*F_;Qj>LhFhRai8LjLg‹Uj“Vgc€£q•tœÏwšÞhx£Su]Ž£j‹¨`l†S_wWn…Uu‡Lt~Hn‰M•|¢Èz›Ôt”³]w˜o‹¬ÁÒµæì˜¡§ez“PœU—H]~Nsnvžfr’MmMbŒfq¨k}m…±r¥Vc‡DOoDLgfW€•³oЬnƒ¤p~¤r€–V^yG_vHi”Os‰RcuX^alŽ]i”b~¢sбu‡¯±ƒz˜v‹`’^MxEN_=H_0dX6t{Ck_Q‘[^n`ˆm> •>l²Te•_XˆRYwTmmAO9TuCVi=U_;To<‚_J~•Rl¢pc~pNƒYbWV{l5q‚>coFQoBfX<xd;r‘Vl”lNmReL]c9jp:y~BcŒLayQymHjˆA_ˆSowZvvLgNarOvk:|=s“Jf”Sg†Ov‚>ˆ@n©GaZvpB«=¶Z޲s«il‚]‡†;‘–NrŠjbw^[{[vgeŽ“N‹¯[i¯vo•\x¡H‰šP~Ÿg”…D…ŸG‚œRˆ’P‰¨^…´fx¡oŽ“q‘¨Hk‘TjwJz:ŽJ}‰L†|W¢‚D™ÂuÈ‚¨±v•Ȉ}£šŽW³n¦Z¤¬\§ºp»l~~U{kO€‘O„~Jsž?„~K…“c|‰Kƒ‰dŠ£€h¢q\Œ\BDmS-f‹>tM±ŽD³ßZìˆc¬‰€ˆgŽ©Sn˜€€J”§WÔ³\{ì“Tžkbr*M|D{]BƶRœñ†›Ôq‹ÉˆÀ|‡°_|X±’W“Øz£ÐˆÕw¹¶j´ênƒ½ž‚€e¦³By½tnCyxH]yIunKµ‘HÌÌt‚fMŒQkk:_†7•^F¯¬`§º±Î¬°éÞ¿Ÿöà–¡vy ”r–ÐpŒÐv§j²mj¤T†‹MšŸy¤Ä½¼yx®™”wNN€Qpm6˜©; ÀŒzÂqpœaŽzQ›´^«¾j‰Ïf{œO”P‡’\Æ‹L¥°ƒºµeÁ¾\Ÿ¹]«¤TšÏU†—Or–c‘ŠHu—g‡€^ûქÿµoÝKǹ<Éÿ €ëµ—‰ZÝì„ÿÿÀÅÿÏÄÝŒ›³ƒ¯|€×«lj§h›RНijz_ˆ‰?—Çiƒ»`Æ¥FÎe‹Mt<‹¯hn>š‘Ng¿gt‚Em‹J”ºfy½az‹C¶…nÒÞ§Á£oµ¯¢|Ÿi…“Jؾƒu›g™P””Jž¥cuh}†I]mA\eOYg=y‚6t•Pn‚j~„LYxSˆ‘? Å<«¢q›Ã]ŒU¬±e»¯ig‰Cœ Vˆ¢c§Ñm²Ñsya” j»ìm²ôw¥¿†¢±w¸¶j¨Ñ”}Ò‹tC—Ng„-˜¥RbˆI‚VKÍÛ™àÿ¨™Èkv‘Pv—]n€E†c©Üs ·_—Gm[/fvKvƒP~”7Íñd¡Ëq d~·tq6[œuZ¢„Y«¯f«¦}â㪤¸ˆm-¬¯Dž¾Qx’E{“LeyE`p>ІK×ÉyÙÿzªä`gŠ;NT'ni7s‘LYŽ1Xb:g7o‘Sù’þÿÇ·ë¡Ïò¬–£×⽬ú‚qŠXr R{TdnO•²p—¼zmˆW†›‚t¨\…FmŠEpŽYfœA]z0Oƒ(@X*byE\v2_™6Gk,Be.?J5†™’À}“Û`†ÊyqŽƒ‡—×ôȳàžl•T|˜a¡ºjr°W‚£pšÈ…”²‡°¶‹¸Ö{}»lŒuyŸ`h‰QZzAcŒWyšmt¦Nlc¡»˜Ãd˜ÁT_…Gc…Ek…UxšTm–Pr X|ŽYƒ—S|žUsžJyœ\k—`YqNtf\œ«qu˜h´fy—Y\ƒFCj?Z€>\†JxšSp±Yt´am™c~œz| OOhHn…Yf‡Be…>Kv,Tm4_…:@\-2J2AXKlzNcwDctIc|MPhCGaBczfª¨sw~O_xdŸm‡œ\l};Tc2Mf,He5Qj3OkJh‰Wj€BcOdTs˜_‰¡b˜¨n”«s‘ª|¦Í‰“Âo†Ÿb„™k|ZdQv‹a{œb¥Y‰ŽY†°{¼Ó‹³»¯Í“ªZ~”Qt‰c{m~]YsDoŽV‰–atŒ[ªv”¶– q•R\…8[Œ]†³h{¤w{œsrœY^y>Tz@VuOYpi›t‚Ÿry˜`s„]€Mor?`lU‹‹cŽˆNprKs{_pŽeu©kt¢v–®tuwlx“^††RuxWX}LYkDWo?ta;i|<s†\j_o‰Zm‹G}H`V`\`Gh}Io†Ig†KN€LLdCAO88Q7eI4vh-N‹[rdfa|DjsRn{8YJ[jKKb8P^8fc,W„Il|eh’ZcƒXkzDyz?€„IM aFhZ_N5gj1`|NksWcsC_uJOwIW`Bxk4Ce©at”Vq6…€>{’F|’j…‰D®|C€©^Z}_taueCy„CBKLkYrg9w’@x‚\ŒId§gx…s—XÂcpµznŠv“‰YЏel³uœi¥»q˜Êˆ‰ÇЦ’e—¬qy–ymxib†SutIl“GAv`Œ35®[~º“Ÿ~|¤ov‘wt™Ir†I‹W‡a”‹oq¤_}„K‹zA••U‡©Mk¥Y{ƒK£’Jv¢cmJG¢ªUoׂjŒYy‰7^™A}…J›©B“°j—«|y¿†fkˆ{B‚`™CyÀpm}X„}Uz±onžWX‹Kiz3™–8Ÿ×}´Ü„«õ‰zÔ›s m€ˆgh‡HS~|hW[p„L•va¤×nu³‹otS^‡<NqClY+^Y3o;’¡Yz¶Pq¢²žJ‡Š_¨JdÁˆ’i9z”Q|“m¹¦q€× Zl‘–…VyŸrŸ˜M±º~˜Ìƒj¶xZrYŒpA²¨OšÞ€›Ãeg³‹kZEms>£=¦Ïš~’¼Y‹ekcGuˆ8°‰C´l‡]nŠ?h€<x6˜C‘†EÓ…NÀú¸¹ªÌÿ¡‰º”™©gФYp™joMj€?«‚VúÜ©ÀÿÁâݦ²ð³_·™¹z1š•v½ÃškŒž¦˜M¢µvŸÄaŘfµ{ˆFˆªV»£P¯ù®ˆ¢q•¤aɳuŸ³‡u¨Xƒ‘=Œ’GоIcš[ÂŒLnÎuuƒA… [‚—o‡e€€f•cŸ‡^̵^኎š^°—MÂÉSνTq–Edx;jq4Z€CS[!MY'ds4ku5ˆtS½¾‰¥tšSr»Kx©M~”LŸyÿ¶¸ÿÿç»ÿ™ÇØŽ®~}œhŒv”À•aŠ9µ»]½ÓŽƒ»ŽfŽG¯«Iˆ±hÿã•]¼Šwn:m€?±ˆ<¦˜lw¦Kuj:‘–O°od¥UfrMg„=‡[ÊÔýÿØhº†Vd4nz,}‡K£¶kˆ¨~›”«•¢‘vpD}hnx6~“]Œ‡sÆŠqÿ³˜ÿÿùíÿз÷…»ªpš¸‹¡´_}¯Kim<¶spÿÿDZޗ‹£i¢Ê{bœGu™7’¡_¥šh¥·nn¥(@‘¢F…´T²ª‡œÇi©µg•Ømyk¶Á·ÈÇ ³e„›q¬¬jd‹;}„…{]‡¨—Þl‰²fUŠ2Ue=vƒƒÿÿÈËs]Œ7_l:Qx/[p>Y{E`€F^8Y}6{Q‡ÈsÆf_–B^wR£³¸êéмèvÒúªÛÿÁÁ„„Çc}Ÿ[ºê’ÂᢔÉm†¹hk DK_;\w5_u?¼i‡Çp}°e~©džÝt’ÁqmšIGg7M_Dƒ}p[sQi‹ZˆÂYe’Jv‡Rz¤f…¶d¤\qŸ<Q1U|J–²v~¤[}†IgxY¸VdŸ>cGZwN[pZ˜¬{“Äx˜¼^sŸV`7Gc2LaKy–k’Àb·`p˜FJ_0HY,Nb(Cd4I^0A]0E\5h}Jey8XeBdvRo‰OgLu‘qrŠWIc1?V(Ic7Zw;atM|˜X˜Rˆ–U~¦[€¦eµm³ct…Stƒ\…‡gžm”n~fƒ¤p˜±hs¡_l˜\|˜cmVj‘at™w¿ðºÿÿ¨¯¶w‰›v“µcwŠN^†BZ}Tq–Qh„Nj‰]†–`€ ~œÀ’£qku]n„PqJj_ƒ±{§jn|NYvW]Šey™g‡§|·Ç…¤³}вt…¢g’f”˜WvŠPowYz}Z{„Olk@g`CMfby˜o‘˜h‹XzqSjp`w„]}‹Tx‹PUw>kgDs‚@hŠTY}[asYtmIp”Usœ]W•]RwSbrEQy5WqDMr<Tg:Jg19hB7@28D%_B)cc%IrDX^Pai.]{B@{<EX=N^0pN,|l1r‡Dw™Z”£`½_uµhr `oŽW„NTŠRUmV__0kp8h~EZŠWgrQmhA]}CmqG•w5w²Ml™pz…T—9«–G€M€Œb™…K§JxÃmM¢y\nOyc'ž…<–ŸTˆ³]£—LqvKŽTWDigBVzMyhBv™Iqšh·–\ŒÇ[¯°t¹¿wÉÈ“²×‡£×¶ZÖ«F€q_`P›m>`‰R_vNoqGdˆEAqVQ92g`,QwZjrP‰„P~›pycs‡N²•L€›H¡™X|§PU”S‡}=“’?—U”£[šœQ©ºcÁÊtˆñ‘©¦jθfð©‘„˜¤“EÕºW§ä}™ÒqzÉs®™b‰Ê‰w°‚–R˜¡Xº_šË…®£fŸ¾a¡Ôsy³€ƒ¤qq£L |^—ÁlÁÆ£¿Þ”QÙ®Q^JRr)R`<_p5?M;^:;¡„5ªÍ}¢Ñƒ‰Ñ€X«sP];ca-o‡7p’B®§O¼É|©ô–rµŽqeB“{>‡¥x‚E›ƒ>Шeа•w’|I†9 V8“Ÿ}´·p¬ÄsÀƒc¥oŒT¥Fͽ|Áì”Æá§lÚ¤}q@`ŠIr‹=¨œh°µb¨Ë‰[˜~biJs}5°©<ˆ£NlE‹†;>‰H¨€P”¬{˜uËÃŒ÷í”ÿæz§m‡˜Lq”eVtKEo-HQdxqz<i„]ƒ—c„ªnN›qmz-Wz8Yw:Nv*‰ƒ5zÅ_Œ„\¢˜\–že’P˜\Þ²x¹ÿÈ’–`» PÜœ‰ù§Â¾¡—¢e¿a‡—qo¥W…A|Ÿm°‰=€ÄŽ’—B‡¹Wtb‹¡Hɳ\¤µkŠx^¥˜U€œ\–ºV™´l¡¾V…›aP~8ep;x†JO—<sa:ƒ›Gˆ¦Llr—•L¢¿‡v R‡Œn™¢[zB¤ c–œs §•|›‚v‹Yyˆ]y’K{¯ZyŠM’°pmd0ji;€‰FÜÑ{và„Ÿˆƒjªh`9¤”NmIÿ¬hÿÿ·ž¬§›šb¢Ý”½Q·«[š§m–³_ÍÖ¦³ížjž_gx5³Lšb•›vd›Mq€"°áG¯Ç•¯§Šª:„×Cމ7¯“`¥ŸfÏΦ¾¥£×…†”dx’M|ƒP•„Rˆ‘8…]œ³£s]A}ˆ<}qSЂÿÿÞ’Õ„<I&YGJÕ¥’ª·js ^Ja<€qSŸ–RÈÌÊÿ›°µ‘Åç¢ð€RO? Àe¬ÿ]S‚(Xi/|“K³¾®ÕãÂh™Xšµj˜Øap£Pš¸¾Ü¡X€8Ty=j<\}HY~:Ei/wvkvŸXrs^Ë崲㒂¯d\€:cTˆv¡Ñ˜§ÃŽ”±d{ŒwšÍp]™OsˆÍâ§®l`UX4>^)csIX€5Jq:fƒcbƒj¦u[|gbveš\[|F{ HkŽ=]eAyŸYo‹QexPcsV}–b|¬Xr¤^‰µ[z¤Z‡½_„¸h¶bvŒM|’\ªÎ…Ývx²G]~Aj‡Oo~[‰¦tp¤ghŒh‚¢U~´Hu«D[…Sj~hŠabz:Nc1XuCp†N“I[i7FQ.O^JkxVYeGh„VŠŒP^xTy•c|iq—Qp‰E]>iŸd¸o‚¢]x¥q’¤SjƒS„™q•¸r‚¨u|ŽiZtSmŠUwŒ_‘ c€_–·{›»›·p”¤q„£i€‘W޲a©u ¼½à⟲¶hzŽ`€ªavžW Yz t”Æ|б]a„Ok–d„¦ŽËŽ˜¹]^sE`say›hyšdƒ¥tŠ^ZlAQwg‚¡z’®}²›¨Øƒš·m‘ªh…®m†¸ƒ¬Ú¿Íw©¡i£†V™‰]‡†B^]8FVHIZQ^bJh^?ebEh}UqzTo€\ˆ—[{†>Š]¢Nj«d[’v\|Z‡i?vœBX«mS€i^jIpy7ZŽ>ZlO@e9?U/PR%Ga)G[<B[0eK,`Y'Jg=a\9lp(xŽ?h“Na€RMHiVA[0‰ˆG…¨h’¶l€¿mt ~~’ju cX…SQyT_cOgi9f8`qKXzIXxIoe>kŽ;e“Zt‹KfšY]‘fu{G‘y9™ˆBz›^q•c€M´—TªÇnyФU®€xo@Œ‚4žQÀbƒ¥i«©|xËsj}nlt?Œ|4q“Nw“Fy”Mm§Sn’OlŽbt|Yƒg±™eÅÕ™™ìÁ˜½œœ¸h²N™œLp’Um}Nl’L_{O€q?~F„ŽT™¯Oš¿Uv»pˆˆc¢›Gvªg†R‘—WŽ›N¤¥Q–¾V“«\v•W’‰R¡„SƒµqÂŽq|â–„§|w¡Qi—f›Œ\ž¹B©¹i¢Ü‘ɬʊ™ÊŠz´xtlj‚m‡jR† fy¥t}Œ\mvZ[[o‹M†’Pl¤K}ŽO³«@Èš]’|hliaŽKg{/^|4=bFI7#>"•¤B„²m«lh‰bk…Po‡FŒ>²ªJ–Õ|Ít|˜sl¤n…^›‚@šœJš¢c[™el`5w…?€RjˆVqˆQ¬’N±ÏŽ’«›±—h†À“x¢…€h±¬Zÿí¦ÉÿLJ³Æ·¹p”¶o¤‹V©Às Ì‘†·ZdZv‹?¨¾6r¶M}6{}I‡xXž‘e¾¼e£átÇ V’¯™®–_í“¿Õxj¿¬•šOlŠP‰¢Pf”c_”Q[ˆ.U“5…—$œÐSŽÇK‚·ek¢Nk…7¤{=ƒµXf3ŸŠ9y¦uu„P~…M˜¦X°Îm™Ÿ~±¼räÀ|¶Èyª¯k¬½aÏÏ€÷À˜ßˆ|•c©ŸsšŸ ÌÑŠo—w£˜TtŸcœ°W‹¿mt–eƒ©[ËÄWš¥l§Žc‹ŸRy™]Þ\££Yvf~¶[tŒ=ƒ°i‘^¼ªi‡Áz£eŠd•¶i‘™sËÁ„ˆÁ€v‘_{]ƒœc›auƒS‘…]–¶n¡·g†®ai˜OYq@^MX2wŒ.g|/—œLôôœ´ÿÉw•Ow‹{ŽW¶™^´±Oÿ痲äw‡=ÔÌËæÎ™À†¬yvÇP£§sšÑŽs€a•‡JbE~r\“ž‰•g€²r̵i‹Ø‡Tw+]Lž„‡fLÓ¡±´®€Æî“ƒÖmx|DñÓƒpµKj]6†…Ho†@wgE‘|IȽˆ»J‡Mº¬gÆç“Äﮑ¯Vn|E[kB¤xhæÿ¸Ç©·m›´e˜ÇY¿U‘Y‡¸L”®‡¹êŸ¬Ìd´éŽÁä©`=„¡Vˆ²SiŒXpRy“}…¤uŠŸpV{U8R<…—€¿Sn“W}”Rw¦Qa†?Rk6lU`’7i–Y•¡˜‹Å}~¢v¿c QyºRyfvjmŠikˆkˆ¡{Xˆ8hœJØzd•AwN†ÆODq'@]*dnOŒo„›c|Ÿ[~·Vh“:i„GEp2@T:}†Ž¢Ê¬É¼Ûek¦9o—K‡¿[mlTY‡FLo:ZƒK[p`xŒw‹‘nŒ¢w›>S]FЇ–§{oŠI‹^r‘WW}Cibx¤nz›hlŽWZxTe…\]zAG[,6I'CS3L^DyzTutZkfDTa8Vk9]iNk~Hr†a”©e©ªjާl¡Ù|›Év}šboŽk…¬uŸÃ”®Ì…Œœb’¢k„šKSn:Qv\w‘d~£`|ša®´}š¾m„ª_uœi‘ e{ˆ\zZmQ\cPcpUw~PfK[…^… iŸ{Ž´„–Æy‚®\®e³`…§lŽžmz—s|žYk™Tbi}›ol’x‚µƒ”¦X`}_oНn‘¯v—©iˆ›Yy—o£tz©„•Ä‚©¿i¨VkZsŒhu‘~ˆ®”±Æ…†™c‘{c¤Šgƒ”dz›Hi„GdtNs‡Kw}DpyY|’`‚“U|Še„žsmŒPj‹dp‰hb‰bŒme£`w†cp„DK˜h_p^i}?c‰DVˆDQ|RAlBKV<Tc-Yg+ak7^w=fvBƒ^6E\5RP7W]*vo:‚‰Hv¦\]ˆs_{_gp<Hƒ[‚ pf˜qtxq^‹_k†``mH`HhzIzvKo~CYpNh\Fe{7‚sKŒœJ–ªbšµt”´p€³h}¦Z}“Wy‹Sv™Z}’bŒ}LÖS·Ðw©Ù©Ì”Ž«w¦±TÛÀe£ò‰¶Å“™Ñv|¹Žrv{‘}H°°Tгki›p¥P•ÆVsÅuN˜ZXrCvr7¡GÈÁk›ñ¢”Ƕ¨¼p”Ë|¤j—©\r¿mk¨d‹„X¢Jz³`•†Y‚ŒR‰ši}«g“¤aj¢Fe‘]hzDŠv=¤NÄžW£»mdžuQF]nJuk6x}Z{‚Pƒp]€¦|cRr{Bu¦3§™@±OŽ´zn˜t^zb~k]ošgn…;¡„GˆÁ^Y…f†lP‹¡YgzM[gC–t=`rmk;cQW‹Py”ZÄ[ºÞ‡„ægm›rf“BdoA—ƒ:…EÕWwŽTMF`.j`(}€7c—]œ’8¥ÈWh±¶dhŸŽ7rÂYÕ—=Êÿ„lÏ£_@be7>u<QJ/vT9«•F“Àj¥eœ”W™ƒSTLWW1¨p/Ÿ—n–™x~sx©QizTz{OÓšSÁÉ{«u„¤]¶š^Àú£ÜwœhªM™ðc–Îe–YÚ‘n½Ú›°Õ™°r™™i¶ȋ¨Þ¬¢ÅfzÉyÆU¢á‘…ÀZ¯Sƒ±d›”>œài§Üx”áqËz–‚A¸®Qv»Œ|=›ŸDžÒz”ŸPÛ±dáÁ{¾ÇqwˆY²{O¹Ç‡Øßq“¥‡àŸ‰¯éÎÞz•£á¤\l>ŒY‚‘T’¢a°‡sª½‡ƒŸSŒ¦Y;nÿÿÙêÿÖÈÿ¬†Í{¤µY¯˜aâè\á’lÉËzˆÁdq„S“ËukšIr 7b|9ap={ˆ5|¼LnƒO|ŒL¤Ár«¹‚kœ?pt9Š˜P¤©^C„xC—pm¥c‹nc¢‰w•µzn¡Z]z7{qHÄaÂî|¿ò£ªËv¤ë€áM©ø…›´LÿáŒóߘšÞ¡vÓ¨¬ÓœòØàÿÒ¤Ö•—Åiµy—Ì…yX”tJFÀTŠL¥ÐSáÚ•Äfiˆ?¡ªL Çkœ«qÄÕ‘Å´rš²—¿žh`7¨pUä«“×Ô\³ö{¿±hÓÖ•ªÀo‰Íh¯½oÁÞŽÉü©·â™Š¸g¥L…ÒRU‰=¥†œ™ÚY¢´vÚð¢Ûÿ´µÙ|¯\sŒH›£„Úñ¼Âæ–çÿÐ½ð©—Øbz“fˆ—_‘¨njŠFƒ£oˆ«kk«R–—‚È÷…‰Úl“™Št™f ¶ˆ{³Ku£JZ~:‰›Xi=|‡q‡°s|°bkTp›Mªi¤Ñ‚mLPt:`|8iN€œyx—f…j³y‰Ye’OW|DL\'_}1Y‘2W5i’An‘Vk¥JyœJ©FQ‚4uŸQt”PRm;«‚_‚sq½Á’¾ln”H£Tx¤b¡V‰µ\‡•DQo2Us<q–\p“Ov›NhŽRuˆIp8_>q—LYiC^rLVlEn„\Œ˜Iq’Qw¯`jœQR~@U‚Oz VsžGdj<`j?bpDƒµn…Â[sM—vŸ½ˆ®´|¤°ƒ©k~ }‘¨|„¨ln•_o—{ž½‘Ÿµ_sYr„cuŽSd†Nges˜s‚«m‘§op“kp†`o€Wk’c‡œb„„I“[˜Eb†D[€Gm„O‚”V‚˜Nhˆ\{_uŸt‰·¢Èsš©bwŸ]{”r…’PbvDNqQf‡XdŽl®f‚¯tšÀw|’Vn“yŒ¬„Ž{ nœ‘®wŠŸcsrŠ·‹®×~§ËZ†¨@a~/Ag2<]@JpRY€\‚ŽV‚ub¨•o¬º‡¯ÀlŸYy]z‰`‘‡c‘’k‡¡qƒ¥ht‹am}XsTQŒbbr[aqR¸{QfœNe |ZlM[sCm~Mk‹Bn‹I‚‰YwžVY“ZE{KR[;Zl1Z~7a{EK€LNX@=N.<R7QL)zf0˜ˆ0o´Wv…u‚Œc}¢cx¦js–f`„_ajSgx[]C`qRpd;ƒF–¨_ƒ\tŠZRzTj^Ii|1ƒ|P‡¨WŒ¹o‘ªw’¡tš¬yˆ³w“mx‹Z{Xr”\‚ŒWœˆU¢µl›Ç’‚¶}‘®}¡¶gª¯f†ºx‹¤Žg£eZ~‚_JŸ<s©r{‚q‹yX‹uJÄ›R¦ÜО‹œb¦I“¿`«¶e‚¿x‡°´oŸ¶vžÈkƒÇ{–µvy®lˆk¶ˆH‰Ðd«z¾a¨Åi˜Íf¶·y½ÔlÝ‹n«t…‡E¬ R¨¡K ’k”®uw½s¢“o¶ÄVrØ’f‡d}G_¤CysPƒ{8ŠL”7zŒReQ\‚Gz}8u¡;ajPz[=†t9h‡`WqSp‡;r®V`IYS6RU/_m5ge*«›/ Ãecw“h×ÝX¦ÿ²tËO’d}f7ŠˆW¨rnÊuP‰\RV1VK;^s0h{4er8•‹5‹Á‚`¡sRuCƒv6ÁV«å¯½Œæ´ÃŸ`£Ånk¬e‚7–ŽDªKŒ¼m‰°t‡•U««R¥Õƒå€ž›Q›ÍW€Óf˜Gµmw—Qƒ—@‰ˆKƒ¥P`•Ub5º„7½ï‡Þõ”¨î™²–¢Á£Ìÿ„±i‹ePÜ–vïú·›Ü¸h¯p‚N™³bÿ锨ÿõq³Œ‘„dŸºhš°eµàuR{¥1³ÞŽÔÆv©êšØƒr–vz˜<t—M‡ŸA³‡H{ÛwŽJnŠbŒœH‹°]ž _ŸcÏÓ˜Æÿ¶v§~“§C¥£kÝÏ]ïãÑ´z¿ÄvŸ©x¿¨pÈYÿÛz܆ª¬WÚá¡ÜïÌíÿÃÊÿÑ¢³‡‡¼~ŽN׳| }ëÜgúª´ÿ·Á›ì«}‘Ym¸G„p;–Ý_xŠb¹´h³ä‘Ùÿ{øÿwÙÿ“ƒ¾ˆ€˜R²¡c™o‚Miv?†´Xf›2o’0l^9k³Ã••µW¯p¦ªmÜù«Éñ™¼Î•²m¼õ“—Ô‘¢¼kŒÙi† ]–“p›°mØÅsˆ¤W‘¯ŽKUMvt7‡¯[£¢¬Ó›µ]š…R‡‰7ÈO“£YŲ—Ù¿ Ç󽞾–YŒŒ]•–tÏ”‹Í¬zá³½îUÓ¼v¥ØvÒ©c´·^À⛲Ѳ²Ú“œµu®sqŠj¨{éè³ÿÿÚ“ÀkOo-E`#Sn-fx9Ëè~¸çŽíáŠä÷‘·û‹¥Áp¡´W™¿_£Ý|•»~«Ý›‚‘ÐÛÖ¿Öª•¸e}•Gj–C\…?z‡kw°\žl¢Ï†©Ù˜‹°m_˜Eu‰^i|Pºçup¤I”®q¬Ñ…‘îPxÊ`x³i~²fˆœw®Æ£Ò‚”ÍuTr;_‘7Y‹=^‡Ep‹\Zx8dYU~§_Y{aXaOdlFwš\œÀ‚»òœœÈ€—ªw’®Q`|9i…6c–@†«xšÃp™Ôc…¹_¢Ð¨ÒlºôyŒ´\ˆÂcr·TYtQŒ¢|¡ÚŽ Ù€‹®Oo’GxŒd¬¿`l†Xa~5mFqŒEjŠHh…=Ni2Z~B^z?|’Z—Çp¢ºs’©oƒŸi¶fx³k޵|Œ¨k|†Bfs@mŠaˆ´ŠµŒ Ìz†¹r“³ˆŒ w”¨užµSlEc|S§³~ºÕxŽÂ{¡ÐŠ Ée†½dsŒGa~`ªwÇ…˜Ò‰›Ò„¢Å{’±ZSn7GlA`‰dy¦ZtŽTt‡l…š_}žbˆ¦p¨ÂxvªbuSv‡e„˜d™jq¨~’»qzŽNi‹SvŽgŒh‚ OcŒO^ƒYx ‚¡Ñ ¶Ë€Ž“[`xEVudr’o‘¯„µÎ‰£»v›«n„’E^}k©Äw› uš¤iŒ¦?Q|,Hr1Jt:Wu?@dCCd@UnWŒ¥m’³s‰´\q‘ZzTj{Vx†c‚‘o}ŽgxuXgcCUR6q€On‡Os‰dWzVš}LŠ“NNzun^g‰5m…Lz‹I€‰S‡ŸVtŸ_cŠnW{MdiG_n7mw?a…G[WaqJku=iƒKetFhƒDЇF¬[x°Ž‡šn†©pe³f†wfzNblF_qDZxDlrC~B~B„¤[yœho‰amˆPy…PˆŒM•T¤Xr¹l…šb‚W|‰]eŽc~v`p‹Hq…bƒzOr¡ac’hq‹Vކ\ ¨^yÌ}Ui\zMP@blAhx<uƒPlIh:mrNgˆV€’D•–Nµ³b®ÊkiÄ”Œ€_™DjÀ}v•dq“MhŒYS «XœÀh–¿‚¶|jžlk~W„—J~§^~j®–h¤Çn‰º€» tÁ厯è¬f½¡¿rSËO„™t‹g°®`•Ô›¸¦“´á‘pÛ»tˆ‚xˆGs…^‘uI[¥Ek}`;„žQl^ˆ}J”T\Éz{`Fle8{}?t Xm~TŽK‚°a¡¨y‹ÞpXž[In8ni&jœ8VyUjl;t‚Er…SXŒ•`fM\sD…v9~ HŠN‚µpo£[aj5Zq/\n1z{4¤‰<[ÌPok{m¥RW•eUc.ˆs5—®l–¿oé°a˜Ø©¡yy¤|³Ÿ\©½w¹Í’ƒ¾’}£vˆŒhœ¾hÿÕ†~êܳ¯^¶º®yƒ§‚Ms¥oLsKh^0s¤6{FƒŽN}€@Œ‰C†m}صºýÇ}á•¢eŒÂ†„¬p“˜h¬e|¿\l}@z‚Fw¼QœX~¢a€›q²’S¹^‚¦Qœ±Xk–€P‰={5•¼ªa÷¿c†ÿ¸Ž–M—¾g·ªMŸö}ªÉ_ŒÁp²ÜLêý[çÿ’¼ñ‹Öµl¼ÛŽÿ÷¤u¹ÏMgKng8“«S¹Ábª¿£’¢ƒ·Í|´np>’t=ÿ댗úÈŸZš¥bãÀ–Àù¿¦×©²Í{²¸t”ÐfµÖo©Í•’Å}Ÿ³}¤¯x‡™w—«U±Ü–ŠË]u¢j¯V˱ÿÿáÿÿêèÿÙÿÿµ†ç°w†Tk|8·”f‰¾W]v8s‡:¡W”tŠ@m«^pKrNÌÒƒúÿ»°ý¶}m‘·f—ÌhÝϨ–í lœOž–fè댵ÿ‚‡¶j‡®cŒžh·¸ªŒÆ†”I´p¢q§Ò}›»nmg8qo2n’C²‡¦›_¥Âœr…ZHŸ¶o·vcÑÜ©®àŠ›M®‰‹‰žŽ‹p¶Ë•Ë´ùÿ¶Ë·~šº`dˆ?ovA¨©ºÖŒ€´e«Ÿ}ÿÿ½…É[”žX›Ð`T0w‚JËø¬Àá”ÇÒ…åÿ”„»f~zdcuRi‹M¯xi«^atG^q6‘—xœÑ–~ƒS’ŠxÁnv£D]9‚”aŽžv–º”RuHawS”±Š¼ipœN‡“^x¡G™½qØäÃéþïÿÿá¾õŒg•CˆÉU‹¹v–Έ¦×ˆ†¶Z¨Êw©m`•BYm8Jh*7]!F_:[k9Ro2lˆS¹|ªÔ‡¢Ù‘s¹]iŽX©¸y~¯Lju9F^.>T@b„X‚½R¿w¶î¿ÇØ¿½ã¸€mrvsllœ›Qudš¼‡¤Ã€„´h®äzÀÿ—Þÿ¡Ìkt‰Dd}Jq‘Jr—]…ŸLawF^oD\v@ezU‰rƒm{©_ƒ½{ŒÅ‚€¯j}œr±tu¦[i|X~‘v©Õ}£Ñ{•·˜Á’µƒt•fy¦dx¢Z_ƒ;]~J¡t˜¡~ˆ£{’¸}‰Çx…»w~]u \~™s›ÁŒ¤Ú”ŽÅ}x™s‘i‚™T„˜Ty”aŒ o’Ys„QqŒb¡g‰§Œ¯Ø¸âãkg€FHmRi…\|—o¯—n{NkˆZqŽ[p‹`kŒCTmHZ€q…®•¨âÃÏæ„„ŸQWl6IfIKef~œ®Ëš³Âty‰]p}Rx•h‡A5@./IGNlAY@Z…V®e{”G]o7Yr;T}JaŽPsŸ]•ÁtžÅj ±W|Kj€Sy‰Qn}Hce5^Y3iZ0\rFcvDc€LjiRŽuCHR¨jgy}\„:[qGhnEh{BiSG‰]?`UNP6^Y3Xh4gmAtw@rŠNt“Vq“]w‘`pYs‘d‘^Š™`‡¯‚ƒ¹‹³vb nq‚_dŽTftRbrFjNs€Fƒ†Db‰LbyNLvJdrJ™xD‘¦Ss“fdŠUf|Kd‡Uq}Nzm9yuMg‰Z¢Lt£H\œzwsOi—@Q]M|Ijp%‚v3VcO{cKs4Mj&G\'Ne*`k2WnCR:ŸŠ3¡Ápʺe±Ö…¡È“¢qc§pa|Xtu1\Z€zZVš@YhD}r;’K_|Ÿy‚e¡šj³½`|Õwˆ lx«[{ši…£[†±eÄ™a—æz~¼œZotiEŽw:qW©a¤®l£Ê€²»¬ÙŠ„Ò¸u¡ŒhŠ]`‰Jy~D†˜D‰µn‰³]^raw^hu6Š}<m°eƒwV‰žGwÉv~V„ÂW–¸lq¦VŠn˜²fY•€f@„.¥ei±f`‹ERv:’O3†’E¥žQ…É\‹°se¥u‚ƒFo¥[†›Ky¹Kxœ]†©]Ì™P†ÉodŠ‚yž<…²Z†«np‰Zu8\„ d½¤^–Ä«±¥€©µ¼ºf¯Éx•ʆ¢©y~¯`fcR‘u<u·gšb®\~¦XwFkžH†‹@c€F†‚/ºX€¾ftªJj}LCŒ;{\*€«ná¹wÇÿÇŸØp¬{qŠIksE€qCqT[ŠL‘‚Cw·ggŠL|x8aŠMd}8žO‚¾ošps‹Qa›5r†>å“OŠ¿~¶¨W…ã}šOŒ¼`²¨Q™Ï„ÓÀj»ÆŽÿψÝÿŰ쉢Áˆ°¹mÏÞœs±§E^FH\)‹}1ŸÃ{ªÆ§Ê—¶•h¶é¨[¸CY0‚](ÿ‰dšÿÿާV«ö|¥ÀL·™~…ÏœˆÏe¨±L‰µj~T¬©Œ ÆžØz“ÆrtŽa¦ƒ^¡Ü¬×s…¼€‚q‹¦P®¦hæå”ÿÿÓÕÿËÒ헄Ѐyƒ8|€=x¸tf-xžUŠˆQ‡¨[pˆHxfI{f½ÓYÑôŸÓÕ|£ê‡ž´H–âdLÕž™ Ыg†Dw’O„¤_¤”x²Ëp¸Ó‰¡Ä‡m„ž’eœÆXiŸ=›xg™z¶´¯[†DDU"`7ºÂ‰[f;Š0¨·WÑþžØÿ»zÎm•zFº¾q“’M——T…†>–ŽK¦™vïúÚÿÿÿÿÿØÑÓ¤íµ—|›QˆÀ_¹½Š™†Fìè—ÿþ¾Á·ÿÿ·Ãÿ§z±P¹Ô}Ïöà ΪÁ—ŠÛãš’§K‚UËÿˆ“ÿY¦ºx»î•¸vŸ“y¬¡z•\{—=n€DrUt†ejqAr£C…¡Yz¡ar¨Zp|\¤{ÓÕ¬âÿ™É_Œ±UаeyŽar•i—šŒ˜®i²Îu¨Õuvº\\jR_nNIh7mlQž_}ŸgLu"F^0=W+?Q!9PPh>gˆR€™atœh^t]Fl?Zu.Z‹8pƒO…ªHBe.dÔÿ ßÿ§°Ó«¼¤œ³¥¨ºv–;Zw=Ia2kŠR}mKmxOަv¾ÄÌ²èæØãô¹䅊¾]o¡CW‚<fKnŒGG^6\_>_oAa~B[n[€ž‘±„•´oœ^s›liSi~rŠŸc’¬\„£g^Œn…¡ºw}¨aZsYj‚pÌxt›NjwIƒMŠ`žg©d}Ÿj‡¶tƒ«f†¢ŒÕÀv‘®ew¢n‚œw‡˜h]|HZmNexP^xFbCu“Y™p¦½k˜ÊmŠ·kÈš¸Ý¶ÎÑ‘¦bsˆQu‡ST{W[v^d{ZjˆNn“`ža¡Uk:Io;Z„lˆ²¶ãÀÍé‘¡Á_xA^nALlW_vnƒ—…¬dn:BdCdUdˆ7Fi:NqIm‹]q—Ts—w¦g|ŠXoGb„C^ˆ=W…E^[qg|•[g€XeKh{GcrC\[=ej?rs=rc4g]1ig:`„=apD†|DÍFV±[U€T{=Yl=Ws=ay=f‰=RSNuDNX;V^.Tf2Ve9rm5iCaŒR`|ZqzPoŽMcˆbcƒ`~€Q“šd‹½†k‡p…c|ˆ\a¢afdeyEXƒCf~EqHawBsvRa†=g‚Iv|BŠIy\r‚RuˆG^~OdtDme2uu9{ƒJz‰Ux“U`’jsuW^ƒBSuQNh5Z`+\r+:~D4e@AM-fZou sŒD`ŸQrHl; ªK¥¿xµÉ{–׆n¤yy_y’Qt†L‚„Q…’?j‰LU@Wq<g2y”OvˆRd‰X–€L˜¥\¶®b{ˇx•…kŽ^u†^ƒ›X€«]ƒ`~£V|¦sfŽdˆ€Q’§Rµµg‘×~“¡xš½v´ˆ³sª¹†‚Énz£uo¡dj•V¯‰AžÅzŒÂmp§s^–On‚5\q:}m=‰ŠRœUp¥¾ RÆîˆ‹×ˆS“{—xJزW‚ùw´¶]šÉ£y·“n‘vi‰TSqBy\3œ‘A§Â“vƃwšt›X”iyšT‚§Y¤]‰»W›{ªk]ˆQŒšTRªiHr8Gb%MV#cf6e‚@FŒ´u‰¿ƒ“±~޹h¡Å–»‘£Ã‚²‚}cаMoÅw€‰TlœW‹‹dœ¿f¡·…µ]x²If§M¥‰LÐÏ›‚ÿ©‡ÌZr´jªG’¿j˜Öx…Ô}z’l‰^™µx‰ŒJ…L?µ˜S°Ðf±¨[œ¸sd‰@g~6•°G‚¢Tˆ¡cj¦kx]>zQ”™Oõ\wÙ³€€E¬TœžKu¸rŽ•H—~m˜›\ža—§{¦£iy bƒJ¢¾j¸ ]ˆk_x9Um-My1vcAK—dUb#Ž‘2¨‘ŽMœ‡nl.–¬ZÿÄl¢ÿάSûøž^ã”Nf!v…I¾»eÿÿˆÿÿαÿ”Ƶ}¸Ë¸ì‘àwj™F‹h+•šcuŒI}‹cº²c»Æ–±¶{Ä£“ÿý»Ûÿ¼¡Ñ‰†«ižšYŠƒe“¦h‚¢Gp†Ino5`‡E›”Am—Qy`7oj>´Áƒ¹ò‹—¹pl›He‚^‘M’µtiœ[Y}*r›@™ZzœG™X‘wLŸ¤gˆ‰B•Šb˜ÇpnŒ?iŒJ6V#e9BonKnV+±ˆW«r†ÃCzV~]–¯u¾€µáqšÏQ•S‘»gØ´søÿ®’Ñ_׺}æùͺֺÿÿ⋳Z\’0n?{›`™¸fµÕˆ·ÇŠÈÒ°±ÝªåÿßÍúϩϟp“I¯ÎjÖÿ”ƒøMv†EÃǼÞá·ÿÿÿõÿíÿÿ×…éar˜KkŒ=Xo9FJ+eh,hlB[rCuvAy–G¥ª^§½hÛÿ¤ÿÿÃÐÿ~–¼L€ŠVwgiiHv‚I”bŒ€d^q7rqCp‚Prb™±…ØÿŽxé;Uƒ6.E3NHXb`FheNT};:d"8[!6Z=Q"K]1I\4Wv:d‹>Mf8]nX‚‹luš]s¡J¹_ŠÆ\¦Î€©Ó‡ƒ°‰qœ[Z|3`ˆ;[1c’@n–EhDª_‚”Bo`Àx¨éa~™R€Šq±Ÿƒ±ÐÒ|”ÄQkˆA_wAPwA[†KkŠFd…UeEMjA^vqhpn“`mRsŒd‡³i‘£Rt’S~¦Wo¡]…§ahŽ[gƒY²]g†\Œ«q…³cf‹APqHkƒV‚p‹Ì—Çulƒ[i~]xZvšr”¹~¨Ì™Ío}º\azRixY’ŸZ~ŽQy‡Mgy@pŠYz–‚©Ö Àøƒ£¾|•Á™±Íˆ‹¬–¸Õ•™ºfr›`|šNcz9QoHd€XtŽWkSeŠGb…I_†I^‰d„žz‰ŸŽ›¾lr¡gv—QftH^}S¢_£s£¿jŠ¥M|‡U}–n”·n~®fs”\Zofl€_^…\]zSZ}]n[r‘?X…>[†ELg3Ce.@b7BiO[‚KYxNiƒJh~Eg~@ca5`_:Qd4_e.jo8h}>ru?®z<S”MS||YmAgj3iz:gCh~DvvKtK\…RUvFTY9^\3yj1^‹?Iu_S_<ic3e|:txUv–Z}œb~‰Xh”o{t†’\xžio™moˆdk‹H^ˆMizO~‚>tt?o}Va†Gl^wƒ@y‘QyKttE|{DotU_jLZr>_}6vxGdFPuURjFFuFAlI2]COG)Pt4uµ^E¢e;n>V[(ai#t„H~”\Œže…XŒQ—¡[›´t¹„…œtj‹Tf„Oƒz:fŒYŒ|CyšRg¡VM„M‰g9Xš;]d]r?uo?„GªÎpl͆[ƒzep<†wCyªXŠžY’¬a¬·i±Æu{Ï…k¤€rC§ž[w¼{p|lZR\vM{qMžXޱh©lp–fgšP–}H™¦X¤ŸlyžW|’Tœ¬G‚·h‚Šch•Q]oJ™Š@¶Ã[Ąш£r¦¥Z²À¶™‡ €D«tfPI{ŠPŒ¥I«°_’„oŒ®D‰šJy€Q£›m›²mg›kŒŽO…¢fj†YŽ–Lx›J‹“p‰±zmª{eŒW\\Y‹?Wˆ:W|,_Y@z‹Cš˜_wÈxx§]}Œ^¢¸S¿ÜŽwÑnbŒyj•»ƒÄxi¢ok‘Mm=_ŸV‚‡G±´{º¦™àzm¬rs—L~§R® w›Ú¹¸•žÊs€©ˆtž`s˜gbNІAå \‘ìšs®^`yY¹i=ÙÑŸº‚–¥\s°`^1g‰>YyD˜€4Œžgƒ†W²]—Òx ©V„©†ŽBµ¸N{ú‚™¤8c¶E€U7›May_–tQÞ XlÆtcz<~ŽS’cÕÒ}b¥l˜C«»cˆÂj“¹aŒÀn”‘q‰¹eNŒY³Œ<Ðø¤ÑÎ{•’©ÅvåÛƒmÏ…ku0V¤T}Š;¹‘Q×֚昴Uv ?À‡_‰ÐŸÇ¶\¸ø¬l[šœu”ÉL|¥X}§L}§^|tPKÿó̓æyÖGyš:q‰D’TmŽIiz3v~;]k8Yn*xu2À¸jÿ‚Ìèxw¯s~˜<a”>‘²kXT]o0]r(rv<•[‰¹tw“K ¹qrÉG‚’N¦gŸ•[w–Vƒ†YÛæ˜Ñÿ¸Ìÿa£<~–HeƒF†oZŒi]„ŒT˜±el¢`„dLsXƒo›¬Ž~³J‡y;’g¡ÀpÉwµåŽªâiÿîÓÍÿ²Èxc‡M˜€IÅ«‡›]€xPa”¬‹ À–Z–Pgl@¥©zÿÿìÜÿÞºÿ´ŒÇk»Î|¶lîÿÍÔÿÎûÿè×~´Å…˜®i|•L“°Y[x‰V|¡[XeD‰XÆÛ€êÿ¿©Ï¬Óᄐ╙°oŠ–f”‚L‚‡=—˜T¢^Xk>¾É~dš?¢X|©P¨¡‚½ž¤ÛöÄÛäž‘èT>k&7e+9W(kž\… dŒ¨SñÝeÿèed«,7T To-Rz4cƒDbŠQ_{@pzh…¢w‡¢yz•tjŒM|–q§Þ‘¢Þi•ìPež>q™OeŽGW~9]€EsŽa§e’·o«æ€¦Ü¥×g£e¯a¢Ãz¥Æq›ÅeoŸCV:f”Gr›W~¡^fŠIQb7gsJ_’OX‡LYrYw‹c±‡œ´qŠZˆÀv}Á]f•[j„I]O{®zžÄu}hZjSuŒVd’M^Iiˆl’¹•»Úš¬Ó„ˆ¹TaˆEf|Mwl™³„™Þ„›Ó„—¸nrŠW|”g†¤hoPq‰LftDbRoŽa¬ÏÈÿÿ¿Îó}†·x´{w£x—´¦¤Â ½}ƒ Yh|JuSy`tžRl”JqDVsIc…Hf}QrˆUa„co`{ž``xCFXIj‡n’°} µu’¬a„‘Tz…Fm‰i…£uƒ bg„GQuESuGOhPTxSXpOPwOk…I\~Jb†Uq…CWp1?b7NtSq£Xk[c‰Zkž_~›Hhr?f|KR€QRk=Rc7Tn6Pd7gl8Ek7G_Q[`8qe0pƒ9Z†H`{Ph|Jj†EWxUOwP[e8^]4bf0ckATtQLjDZ_1il4oAo‹FRŒjRhWM_Ih`H†pAsŒWqˆin†UmQeŠZnwOˆuB„ŽRw•Xo„[x}Sz‚Gs“W|ˆ\€G}‡Mo{KpzJbN]vNoD€?r–[‚†Ka¢OC…l+]E@=YN£a"“Z}·€Z¨sWwMnj3iƒCz„S€¥\tazrG‰qDŸžlŠ«jrŽiyˆXr–X‚’?gžh¬uR•µQz³uv¡qx“H‹ŠSt ef†Ra{>ž|C˜ÇOW¼ckg\ƒB†LˆÔT|±mr˜er‘j}‘w„¡evžu•œc…ÂiP¬tOsIP~8=xFQ](ro1‡C|°`‚€VkœLe‰Jlq7¡ˆ<¦¸a¥Ú^™½ooˆxyMsr?´j>ÈM¡Ë—Ä|~°–v‹bguiyŠNoŸ\x¡]l¢gc—?{™Jz—Q’r]ožU¥…r©žl¯¹w€Ÿ}p’kZ˜Htu<kžIg>ptKœT§¯x»¹ˆ“ÓfKœhB`@6P/SW$^ƒ,r‘6e“IzJaŠj†?¨Äb}®~ˆ¨kk¹xo™Ql‚T‚žbo¤g{`†ˆ>©¡d~¼xy©c}ƒ`›N½çyˇÇa‘®e‰Ëq²ÈrpÄŒy¡br“cqR ¦M‚Éw…ºkw¥h†šTiÅÓ`ÀË‚Òæ¢°Ý”º…M‘rAi/Na"ux+\’Hwn3‰l<•™O¡mz’Gm<¦–I¯â¥‹¥p{˜Vrl;}|9q®U¿•Dƒ®{·¤u»£b†»z«‘W‘«Že¨WŒ„Hª l¸ÄZš›«k¿±ƒÉ½Á”ÁƒÛņ¥»¦ÿÈ¢ŽÈŒ®Ôj—Ÿ„u¬h§—Z^š^ssE ~MÌÓÄŽ\~Hf…*m….‡µO^‚WmrN]}@½Åg“Ãs¥g†¦di{B¡I•ºeÄ’]¡ò±ÍÊ”o¿ƒj‚9Œ’WpµSŠˆ?^~Bmx<s˜E¥‘]a˜H졟ñ®z|VrN}˜RY}LIo/JV,X`=F[.77&SN+muBm†AyˆX¥¦‘ˆ¢i–d‹™H¶³~ÿÿìèÿç½éد³†„Û†Q€7s€@“¬T‡—pq”jBb6Wj,™ŸU¹Ö~ÉÿŠrÆBo‘:wg>½²ÿÿùëÿ¦Âí–çý±éÿ·”ëZ9O)lL=shI~eGDE-QL1§„[|ŸL˜Ði™×^«½}áýºÿÿÜ×ÿ̟挣Á•m£_P]M—~ºäš¼œÉÙ¹¨Ïa§¯m§Är–Äa‘ t…¦]Un(uNn‘XS_>‚œj¯À‹©Ý‡±£¤²Ýg´bèj¢¸q˜§z¡\´¡Œ‡·T…©dn„e1@>G)^\L“Š|—ªk„ºwµò„¹ø€ÖÿªÆÿ‘³ÓŒÆ®€ÞÇke—Xag3bp8[z;pRŸQBi'\p3dp9R[-0B ?P2gŽv›¸¦¡·©Ù˜ºñ†£Úcf˜7]Hb”P‡ fа€¾ÜžµÙyžZZ|WcwYš{´éms²QtŽLlL|—MošE\xK\wF\~M„µTs¬eйrz¤Zh¦Qn©Y–΃¢ÞnÃf›Åj„«MkƒYs•X`}e€v¡UYu:U[5V†Fc˜GgŠMj^t£|§Õ”µØŠªÀeuDfIbƒLdƒkyžqžÍƒŸÚi„§f€¢[u†e˜“m“¤Xn‡Nz¥]…¦_„¸ºÿÿÿÿÿ®Ìæp©|€™dmrŒ–z‚œsq]w˜h™»›Å¡¹dx{@Un4So@`‰V„¤ZŸ]r†UoYiNZ}/.L3HgOf†fm•o«Xq—=X‚=TƒQeWe‘c«m€¨Zw’MltCU€LX†AJoNb‰MYyReŠfy’Tj{J^ŒYj˜apžV\~HWvSj‘imŠ\h„W|‰a`ˆiY}MflEg‚@a‰KRzKE{DPY9L_.t^.ju-Z~Qb{Si{?awG[xMatDpj<qu4Yz>sk<k}:UzPXc@T_._]5^i1PxUVTA\Q(€c6„l=]zI^jMib?k„;g‡OwrHŽwA‘—Voœdh‰evhKnFrG†UjŸQtzVfxFsvNWvCJnTa_<nf:dLntQl„VIfCeNI^)Zi-|q$y3y«bNŸmGmVgl>su7¢]‡½jWŒm^W@{f2lKNŽfbO™@œc†±Rot¥‰Mµ¹L‹Ï‰e¢yS€V~kTƒ™C|•cq„E•ŽT“©IjµwvN†’J¨žc–ÁcбxnŸZsO~šTd€”i‡Ÿhb›]j_k€:qŠFƒ•YZu9{\3J€®Vz…UTw@WsDiw2‹y/º©F€£}†ªi¨–^ª®s¼¬QŒ`lkŸ“T“Ñk´vwSYx:Äq5†é\žk‰±m•»v—Òq¦·‚©¬rƒÀiRy}ŸsJen\ue[x…O‚ŠRP©J‚o6{¡akZiŽHg~Zl{O|’Qh¡[@}V5K';IpU!~¦Vt§gƒ ^hªQd‰Hi’4yŽGnxN“Dy§~YŒ`~x5WROvB†r9€¢Jn}eeLWlQyoPy‚L×µV„౜ºn²ÎpÔv‰Ö‘¨‚y°wo—drV·¯GÎÛ›¢ÿ¦€än{œL¾Vu§Fe™<£‚;…¬t_‡JQz;W}-]„'x…2€›DŒHi¡Qz„7všRm“MŽ>ˆ§O“¬dŸ›\“£R‘Q˜¢T€ªs¡rO¡`Û³g˜ÿ²|‰ft‹:…wP‹¢o—L¥žoˆs£v^À»m¥q‹K‰qHTƒZp4ñè”¨Ü…Ž½d›·wxÉh“·QdOM_KYR,w‰Ot¥D‚Mv®f¤T‰ b—_n—CXo%Œ‚-qÁd„qH‚¨B ²nžÆs’ÂlœYèÙ˜mãuk‡Bc—C`|3ŠˆA V“¹R–»K§Uv§P[u<Nh9kx5~‘C‚ˆBm}>bl@Tl0ap9]{?@X(SU‡n*®„F‹¤be˜GxqF~m;¥ˆZ‡h—¿|·ª»êʰڌöÿ±Àÿ²vÄbT€>ž˜fˆÃs^‡BEd,ˆ{G¡¸bÆÂŒÞöʨÊr«®Jãÿ”Ÿ¯t¡±p•\ÂæÙ÷®ïÿ¾úÿÑcÍ\bG,¬ŒR ©O¬¦o¨QWu0pT[ͬº‘çt†›J¤ÑˆÇس·Þ¹j|€p{\—²‡wM¤ ”ר‘ŸŸ\¬¯ÁêÎÈëÜŸÔ‘Þ¸¤áŒËwV{5lnBGb.9E!^jCˆŽwª\SŽ5€™Y—¬_‘¬x•’_‘†o‹¤jLr5j]=£Šx¯ÖOIb"c|-b¸3Z‘1†¡]{‹h@HM5=3::\lXs«Ér²ïy¤ÓvöÿÕ´þir}UoyLŠ’_Ëï}¤±m¨¾¶Sp§J_³:\}Z˜¼Ÿ|©r£„Âßµ§½’¼ml˜P«jŸãŠ·ù|´ý‰¬ÿn£[Qm:msR…–VwW”‘~‰fuzSa–54X4V†Ln±Tn•W†§„•Í|‰ºyv’kpše€¬ ÏŠ«Û‚Êw¡Ùwy©Tr–K·f†ÀehHUzASnIhH¨i¦ä~·K]„OmœfŒ°y§x¥¹‚uLm„S„¯nº_w]o›e±ƒ ÖŠ¤Æ€’¤byScrc‹œx‹®†›Àv€©^}œq€©—’¬Š¢qˆ•dv…PkvB\sY|“l„œko‘u“¯£·y‰Laq=Yx=X{H^…h{˜b—t¤¨` v±³`…©Nƒ†AsBdƒHf“m…ŸZtƒ4U|<Y†a‚§m¯}¦¬lv‡ScWxˆUu¡Khˆ?NrJ_ŽYd‰Wc˜ao—_^e‚®n}Ÿ[m…?Uk:PuVdjƒžp|›U_zUm…Pe}S”uQ’—Ge«ppo_”bYvLMg9ha5ym1a…O[‰ZyxDu„AY]TsPkb;fu6FEFcGbS3]i8V]?D^8^\4Wd/CjB]N5rc&ql<Uc@IWA_W9oY0`y>Z‡Mof?{i>qoLbtODy]C]FfR2fb0‚wGh¢R\yk^sGcqJlxFU†OVqMah9if<miB{CWŸ[WZ_ak5p{Au2‡“@„¦Uwšg`–looJ¡‹EœÅnf½ˆnyjŒ^6ŠŒ6”[yº{…“i•M–®_pµhm‰[¡ŒH¸Wš°wo´ƒc‡`”zA˜H„›fm~W|‹Gp•R`¢j‡jI~’Dx…fv’Q…™VaœfVgnoHŠyMzŒZi]k}Mak6Ž~7‚F•MY—L[m@zn7g=I€QSZ=ˆw7¡¤F‚¦al‘P}Lš¹k¨p[—pzt@YŸIrrE¢~3^½t|“UC–HNS2yh.“\šÇmŽÇ{ž¬}€Ó”z|zu‰YƒO †]‡„_YsYŸUA²Io©xW•Ouz7o{M€žR`¸gRwRXa&un:eqE8WjRQ)uk)r„KWdSWbHglO†‰Ccšjuz>ZJj~3e‚Dg‰UUxJLq9rj.WˆN{i;N“QFb=±[.šÆ{¨Ñk«»ož›€²¼|¶ÚzÐׇ‘ç‚s…yt—SŽmƒ¤c¾XŽºU˜¬[j«}–O‡¶nˆŒwx¯br™S’µQ–¶g‰ÓwhŸTX@^W.¢ž?ˆÓq{J¶ŸP®¦z‹—m…ŸXsIeBƒŽCiŒKc‰=\m8€‚GpJ‡•Lf•U…ƒJ¶¶‹sg‘‰EŸiBz¢bmsDt‹M ›Ež[”{s£d¡:›Ë]¡¹Iÿ¨a©ÿò aŸº›è½ŽàËrˆ›U–ÓXƒÉT™V Ävš·Z¤ˆÃrV…JI[,Mf>HS)TZ+’˜ek‘O¤Êj~¦WŽ^œ©x‘—W˜Á{o§}„—,›¾sd«U|:–”g²¿ƒ}“h\ERu=Sw'Kx"kj3ÁKø…½Ã}‹”E“¼[kªCe†2’y>˜®^{‚Fif7€uSy°Y†ŽT€¥J•žfˆ¢z¢w¬‹¡ÂÕí ÀÿÅàÃÓ§ÍŸ‚¬q ¸|–°t•¸{u¢s½˜hœ°~€¨|Fi@fe3Z[-iŒBo~6t…0³rØÿ¤ÖÿµÒú³Ú÷Á¤á‰ž®aÍ©vͯ}†X—¯_¾ÍÚUgº;dCއohžqKK7a>Ff1[c5ad7k|Ejx8LW-V^H‡ƒ´ÉʳÙ˜ϣǢ·Ë¦o–Se©:Pi+AO*`…4H¢&}‘YÀö²¡Ý¬À}ÞåÁßÿ§¼ÿ†»äu¡Ïy¯êzÇÆáÛ«¾¿’Æ¿wÿÿîáÿ¶áþß¼ŒOK64C6FG‚,O2i’J•´wÉàªìÿåÐÿ³ª¾c˜µMŽ©h®ÕŸž×…šÐt˜Ô|½x„Àrv¢r‹¾‚x¹ek”rž}›¯mžÇ‡Ÿ³–œ¶‡´ÌŸÏÿ¡Äÿ–¥½}¼JHy,<P-@[9]q?cGwyO¸ÎtœÝpµ×…©î€˜Ñ{Ë|‰ªˆ¨”|£xˆµ}Œ³k°mx˜tzl„ i„¦pŠšPs²e ·…ÄjfˆU[wQjˆY´e£È®ïv¤FU}Qsžg—®q‹¥XYn=Ia6ZsO}o|™ipŽbw—`m’cnŽh…¢v•²c}[|o‹¹„¨Á”¢Ä‡´ac‰JpSfEbvWšw” ^xž]„¥ZyghŒaj‹b…—xˆ—\€›Ju’Fp“Ra‰L^‡e‹js£o€¡u‰¢v†–o•°lz¬p™Òz¡·q®¥ož–IRZ2C_=Sj[gŒfn’it—_s˜[pƒRh‹\mŒNTo?UwWkžh~ckx k€¦u}¤ny“OYz=HfLYƒgw”s›†¡¶pz™W\{IWwKvfK’z@rˆanˆtg~YS‚[BiCT\;T_,YpAkoJ†zH‚…J\•lYvl_s<bo>?q>6c=MJ&FN!aP*Eh/I[>@\2GT1fM2\d+_^@aeDWbFae>\h6ac7Z‹Jgo@\o=N_BYR7Eb6ElDfS2k^%ƒq?~•Cf‡cvvTg…NzyQu„I|Y‚ŒFsŠFnP’I{£ngq\TnAck@€m0qˆOl€V`|T\nUŒsI‹RŒ°m¨vu™g‚jL›…5¦¶p…Í’X³ŸkoMd…Ca[Z€Fjg?h{?|‹cp‘_{‡c…y@“…W‰™^kŒdjŠDs‚L†šU–”ZrŸXgŒXi…HlQR‹_InFsQ1py5oKjGp„Fj’@WrGia>‰‰?q¨]X“^sv:cŠ=]}Mhd-Š|5„§WŠŽbˆ–V‹OŒ¬…X¤_EW[‡b3žE„·Oœ K‘»ao»hcŽmxš7Ÿ“J™Î€„Ƭz¥€P<‹€zm<v©PŠA¯‚Q˜JtžN¥uM‡µ<pšdaŽUSv=Vg2d@tvEo›Ui’?\ž=Gˆ;ƒb,v¯<h¨NSq=ph0gS>wjA”@a¬ql=^‡FN€+OnBbp-au7Šz:ZMgwB{f<PˆKeR4©9”Äsy®ljY_jCcuI‡‹OŸ·b›eu‡K|Q‹ªf[“gŠmQ~¸prxXBsVwJ#¢¸[ÎÆ^Н•f“tWR^x=žxA›×zTƒt…k8c«s…uC”R™•]ŠWu9ƒ‚7ÏÀL~õ’¡J•bR“M\n%rk<d…G…sApŸ`huBœ¬K«Æ{ÏùhÄÚgx®}˜‹?p±…‹›b~`©¸gŸ®l„¤‚¼®o¨·Á¦a »ŠŽ¢W–¯^Œ¿Z¢«cl®e¥ŽK¾½¢Òp…»izzX˜—T¦®x¤Êzb~Mjp=F`6CR$D_!EZ.bd%½¬iÖ癞ÿw[²>Vz%v{L³œYyàfeˆ%ˆ‹O§¬V«ÕR¨¨pjuBZ‹4[{r¨5Xp0€ŠRgeIŒ€@¶¯sš’PÈ×›¯oe¡Gxœ]l•;kŠHEv¡>sš\z†A–³{m—VQ^;€Q oƒŒe¬Î‚ÂÇ’—µe|žj«Ã†Óíµ‡Î„ÅÒ‡–ù‡cb?ƒ†R’¤jÿÿ®ÿHZ!Š{7Ÿ¦L¼íu¾É¢—€Ç’Ó’†Ä• ¼~¤~OõÓž–·F¨Sq€LgeP©h…€u´š‰¦Òlf“QGW*_w4i–9\\<\…8/6A>-Z\*Pb3glF–Œ‡Ñð¯ÐúÀ‘º‹ˆ¬^t‡HnˆG‹…Kg¥?dLK ·’¼|˜Ê‚ˆ¥cp”C°¡ŠéÿÃéÿÏÂÿ¤íäœÊß—µç}²µm“M›o𦅾»¡Ÿ¤Š¼É|¦ÍQw¶:i‰;ª¼ˆ¤át`ƒ:‚‹r¨Ùm¦ÜŽ¦Û†»Þ„Áÿ—ªÄ|Œ½p²†©ä«ë†žà|q¹ahŽn¤ÅŸÇïž„²XU€<Xt=‡˜cz—emyVWi<EpHQnDf“\x«ft¢Dd™?T}:t†;`~?e“I\‘Wr„oŸÀˆ•¹oyb{•khwPbxxНsrŽ]YlU`wZxŽc‰¢n¹am”\oŒWz¨r–Ƈ«[[z<UzEX‡Svœfs—clŽ]^|Bb“Xy§g©²|€ OQv5Oj2DW5I[5WoD^G[vB_{ESsQt˜p޽{uša¬‹¤¾zuh|•†¡¾kp–R‹ªaˆ¯WxŸUtoŒª~™Éw‘¶iŸa~h‚Ÿfs‡MjW|UtšImŒVyŠSldwnˆ®m~¡rŸc…‹i©{’¸™ÂÊš›Žcmr[‘ŽDg{3D_4?_:GaC[rKi‹i¡by‘YlR^€H`€M]ŠjŠ¢t‡£v¨x‚¦|‡²z‰£lrL^GY{\l”¡v‰¤“˜¿‚”®rS\<g`;ie6js;jPdqQmfO]FTyM[t@Uc;_f6Xu4al>fl8h}PcZUxPRe=Bm58^6?T.IL"]T+Hg.MW=Sb2_^3\V1IV9dJ:fm6nrLo~N_uFge=hw8pd<_e>DlBNQ4]b/]o6aq?[d6qc=v‘<n‰`¢rVƒ›N˜‡hŽ S‚†\Ž}Ji‹TiqK_}F{‚T§€Eg‰?pvNvp6stDkFSp@kd=}r?]…Ubq[ƒpJw‰Pk_i…EŽ…`hžkO„HuI}b'Š›?@ª]PPE_`(loDzwR‹UO~KzaA™–5x¡d|™`vªdŸ™K¢Tn™]h†My}@z|Mh†WYlCoZ4ok1m‚R™{9g–CbzHdGy†Bu‡Oq}Mmgg}?m…Eˆ~J‡†6˜Lq‚\vnIyxBrwZ[†ZwZ?œGW—Mm€?‰‹Fˆ³Y‹¬\¤¾kírŒß`¦“w®Ë‘°Ë´‘Ù—rŸl|‹T¦«H‚Ï“½‹c¨¡^œ¿s•¿e‹‚hœ®Cr»zt•\z…SVxD^m;Pv<__AˆhDƒŒ`QZ[fGrq>n„\_›LVr5Ye4qp;¤œ?n¯}^˜N\y=]†4kƒ8OyEGj<]f0fs9sq4~…ClSˆqXêe`•}yh?_’_Tj;lu<tŽ;tG{Pc”Y…‰2p©UQjBa&I‘XW]0•U5j›Vlj@[s6qt1v>bpH^]A¢{9ŠÀy„Z~¦Nu†K®ŽIuÀuŽzI¡±MjˆF“ƒ@¿Æˆíá¤ÿÿÈìÿé€ù[‡:k{'u•N¥‘S‡®p“¡[¦ÐtaŸn™aoõÇg»Š\ŽLR|.VR@oFC§zŽ›eµ´a‚ËŠ‹O¦Ì`ƒÆ™†¬Y°¿ms¬kxªZjƒN˜†L¤É~›Ïr}»r‰ˆK‡´j˜µj_–bH`&_g.hq9^Œ9¾¡F·ï’HRf@OGKWa:Ut;X[+HmGfIc5jŠ(¥¼\µÖˆˆ–a€š[j{.–¬IeEtd>±‘`¼¸p—Ål¾‹[¢Z÷Ö¬±Ó„‘±…–Ow»H{{8€¸pNx7h{.d@cs?Qw>ER(`kJ™¦pœÔŸ¼pdŸ[EL+QY,oz=ÀÀ‘’ê”±³fìÿÀްk›°pæü¥ëÿì³—‹£N|¹E{@’›a‰TŠxQÔ’g‘ŸM¥‘bËÊñÔ–´¢iÌé›™Àuy¿HÍÝy¤æbËß~¨ÁiÊ푞ª‚Àç×ÿÊÉò¬Œ¾R^v3k•3¯ÿloÌ?ˆ‰MƒR„šn~pަywŠd‰v{x¡VXo0\x6š¡Ugš@‰Œt»à±˜Í‘wœ_t›K¬¾}Âä’ÅâÿÛ¸øý˜¥Ï`µ¦±Ÿ½ppC¼°kÁð‡¾Â’²Yž§r×饿ìk§´W”´~°Å…Wi(^[B™Šo޵\…®T Ü{ÊþÄËýº¼ã—”Îu{«r{”z‚•p“°l—Ös„Áz—Ð]7Go'bŒDz J]’:p¼Bl‡?i•]…³^vªbuj¯„•À•š±iuv6<T,ZZQŒ©`Œ²a‡½`t¦QzŸ[мY^†Emxš²ªfbŠFp“Tt˜Vužm‰¯s‡²c€²b{¯br§V[sCQv?qŽ]k’Z^wWsˆ[vRY€LeŒo{®iy³ifšMQx7Vu3VrB{™U~¬X~©MhŽG^wB_wZŒ·u†ÀoÊ{˜¾€•ËljœHKq[vŒu•Åq¡ÚrÑx“Ùhy£`o‘kz”bi†cxšl„žg…“\u‰H^zPl‚YlˆRl™Vi‹ER‚PdŒr°€–¸o†¢VnˆVqŠp{£©ho}Mg†VŒŽY„ANa:OjAMb3HZ8O`N_yS]KW|SfƒGbVn‹hpŒozœq|¢ot£t js‰Qa~JZ|N[~PX|do†im”‡‘¼…˜´zEL4[J)f]*i}8f‡NZoKbi?dq=VwG[oGZb<gk8Qv:JkBXX0_c7I}HPkVfhAZ‡CZƒLKBMa;WT1V`1ec;_n9Td?HV9OM9Z\3Wh:y[Egm=`tKZiFed5bb9be8q`CvuDu†B|Eg‰M^qG„f:x“=e˜kƒ]šN§®tÄi•¬sx‹khNV{[WkDfx<x6u‚A …Q—v=‚tKh‚J{xH}|CŽ„Hx…Ik‰XŠJxŽLq„adyHb~PO~NIeIUZ8s^-£…6[ÀjO}zeR0Wl6fb7^w:[z<}u?ž¡?ˆÀp‹–zh–k€vS}ŽN^’[cdHx~-}‚?‚HŠyA„ƒ<t‡R{H{†CpŒGpqNm@_c@nƒBrw7`{Ep‰?uC{ŽF·†=XŸIdYJ~n9_t6_rKl†@i’=h…?d‰X†M„›K–ºnjÇ|‰c”aTšp›[=f°[t†z}–ZaˆTvªWe^tB}ŒUllXj„YátF©»dwÈ}j‰Pc{U‚~CišZTƒTnl.nl7{¦AeŠNL†Bij.Àv8ƒéŽ ¹T¯hjŸr—Ž=¿ÆjrËy™PŽÑdQ¦Yƒ}9†Ó_o¢XŽ‚C\Nxƒ6w–_W†Tw„?_`QŒ‰7x‹bRWEm`>t‹7n†OŒ›TK€fTY8W`1KW2Mk*cl=`u@ƒ:°¦Y”“W‡K“˜Mt‡VX}?lƒ.dˆGz~LežVFo9Zh+Ê4’ýž‡Àv}„_~¦W‘³_¯µ|ÿã¦ÿÿðÐÿÛíó™wÜ g’Wf|HÏ”Q|Í…²©Z”·‰m·pk“Gs‰Jx_HvC^c)ThTVJ6‹ƒ={‚d{¥X½¦j¥¼}ަƒ‰¶ˆ›¡t†£‡Š}\ocfpCœ›FãóœÂÿ¢‰é{r¨_wŽG¬J`€;_v'zC‚œP‡¨qžo’¢oLxLBB$;P3IB@M OR"rŠ3N};”ƒUzšWa~4veg|p¦xe†E‹rFž~TW5qm=Š‘C¦v‡Ásk”Jw€O¸u‘™k…Pp…Oq‡NimBŒŽy™zk›:Bk“3‹©cªL‚¾ju¡f®³‹†»©~ƒVf›KŽ]g›Uaz3¦®”~W À~“dw‘_¹³‚Çÿ¬—æcs W`rKzr7£E†„`YL8}bGÊ~r‚}Zˇml¹™cÿÿÐÏÿÄ¥]”u·À‘Ѹ’tÆW}th{„VÐάÿÿïþÿýÿÈîÿ¥ýÿÙçÿÚÊÿ¬˜ÜsÅr„šgiŸRkgZH]0?T,T\8Tg3bp5Þåž‹Å`l†VÀЯ±Û~z¥[Pr8zx`„}h¬Ä}–Í_—¿_µ¶šÔÿ‰œ×^š«X¾ÇŠÊ „Ò›žÍîу©«ÉÕŒ–¹VŒ‹^h_7l_3so>Œa‡Š<uBx‘T¦…¹ô¥èˆšÆƒ~‰_^yCUpTw±q’³~ŽÝwŠ´jy¦S¯ã±öƒ›ãp„Æ‹ÿÿضæj^{Kw„oНw޳lw£c¼rw›R\n(DO+|xQ{œ\u•b|•[u™SJlKJcN]X|œvŽ·‰‘½‰{”^l™Wi•Tz nwP^xSU€QdŒ\g˜KUyH^Jv”Zo–FU€Jz—ae‚DCa=[r^”¦vŸÁ{°\i¡Qh¤LTtGZtTftU…¡jÁ]xžOgŠWw¤sÀŠšÇ„†»€”³…•¹m|ŒF_]{t‘À{™Ê‚Ýt|¡MZ{LhP`…Sv’o…ŒSk‰Pq‡JgIhXqŸUpQg‚KptHo“tŽ·v³s¢Xh~Oc}Wi€n|“h]vˆd°µl…‘Hk‹Mc~HblBdyFksPu…Ue}CX|d¢_l’X_„RY|kt u~ŸaeXc’P[‰DQƒKY{GSrFQmKWx\_‚xŸ|¢sH="QJ"b]/_l:J‚KHfMQU6[e3XtCahBYn9OwG`i?ey=RjCWq?WwHyqS|Br¢Po`_“TM†jIY=TV0c`1Um@WaIXc=€fFaŽGSzZNQBPJ0XX3VYDQh@UW;Yd/]hEsb@w‚Ht{Vq{VllO„dB||Godd…U~rL¯ƒN·žbœyœyi“l]jWlIZtBlt1]>ƒlFˆx=•kLevKqtOæz@ùºW ó™zÓ›h¬skˆNxT„rHh”_N†cAgCPH-nM&¢z1~¹hrzt•WQ‚Q_i;l}:€E”Fz¢[dkir\MˆGUu@{t8Y JUZ<qj'|>‚¥U™›]‚LŠoW‹†A’šXŸažŠSv¹Rm‹Rq~B^ŒD``<½w9”›Iͬk‘½a}„\~|8v|O¡>‘«T„Sºg{Âc†ŸfžšN¢¨G‚¿plzg”kQŒWDc@]\)~¤>…žk ©IzÁ¢q«\w”eƒ‘TzŸf„Iˆ¯VŠœ\½€N”Äag‘MyEdw+|k2˜¦Jj¡\n|G‚‰S[«S^‚MŠ~6r°SÖ°EÿšdŒlYLS|FXe0t|ChŒJ}Œ:„Xžšw‚«„h£nQ{Nil+n‰Kh=x˜K¹ŒSœç{i”eThDo_7\h5x~<œOT†iR]AOU2|o5ÿµO‰ÿ‡~¦Eÿ¾ToÕƒlH¿mBq¡op’>~C™Zy³JZAb€5”©J–¹ov°m^ OŒt6ÎÒØÿ•›ÿ£Çm¶Ü’u®– IÿÙoüÿÈøî«gé¬w–G–˜Q‹µneXƒ¢V”„`reO‚Mhq1\u<bi3k}8w—Rr–T`cOj„MouZ}žBk™Oy‹Cr¢b©`Z˜R{An›Bw‘KµLÐÉ‘éÿ²Òú¥Íð ‘ðˆY|GJ\*a^$g€8`8pBXp=vi6_r=q…>Al+AH"9S"RJŸ˜eOŒLVc.sj4\–EUr(|Er¡c†–L›qQ{CZh1de3fLžŠOˆ•S¤\¬Î\žÆxv›=¶†N|Êka„@n–bu‹Sl‹ZVw:Œ‚G–¸m¡ƒ^|§`–©wƒµ…|¤lg‰Vmd?a¦P*Z!7'&DZ(ng2~•B ŽGÇÙÀ喦ޙs{v_5A oa4ŽhS€T;“‡Cuz@`B²[T¥„cŸ§fì˦ïÿÔÕùµ¤¹‡Ÿ†}_rG^wF~US¨kt–TuZç¿Åÿÿæÿÿÿêÿ¾æÿßËwžÓ•ÎuÉê‹ÃexNEm'WR/e†:}XNb*Zp-|‘X§¸“¶à«ÑßÌ´Ù¦‰˜^Et*RR+Ns(@F2…xJ˜@“¦?›¯w×û©²ê…‰ÚR|>•®^ÈÔ…ÊÝh¨¡_a^=¶˜cžT’„XµkÎza¤•Jph8qq<‘¶`‘½q•¡eHdCyn€¬jgšYnžZ|±h†c’ai†Z¹ƒ³ì˜´î™®ñ›´à„‹½qt Pc†6Nm>`qMHb8SlT‡†^]wDc~=\zEuKs“QnŒTj€_lyGe…GaLod¶d…Ÿa…£tu‹N|«Ut Zm”Mg…Fj¢S•Óu›èp—Èn”¾nwMgˆN}—d~™dj‡JJh-F^/NjDk\oƒ]€ ]f‹Tu [oRpšIj‹W†¡e‡®a|›Xˆ½sŽËm€«q°wŒ¾^r¡Nc„V_€Tušc…¦aŒ¤o€«qŠ®adƒV‚¢l}®^|›MWz>RuRuVk“C^|Ad‚_®|²_~™GUƒVv o…±w«w–¬b{~Y†„TmŠ`s•p‚”c…ƒßЕØÅd§]n‘Ku‡Op…Uo‡Sj|LYlKR|vv©€u¨fh‘fj£l°o‡«p²q„®bx¥Ml…E\x>Qu?QqKS‚mr¨z‡·lNF!WQ!re/f?JŠW>nJNO9ec&ftDoyAh|CZyOb‰Od„Ih|Nl@_–[iƒ`d‚Ef…Uq„LhˆVPgO[Pb[1€<q¢Yo’ho‘Xwˆ\b†WQ‚lZ\H`S2_U8j]>Vz?PdIQS3RW<kU9pl5|TqsL\gQ`W@xa7jqElrR^gI†T;ÃV9º”_²n”Že¡—gd¥k\‚Up{5U’;nlAwn/oyHeƒMžwMÿ—AÿçxÿÿöÿÿÿüÿÿÂÿ½ŸÎ„—p«ì|lФU…eYq?‡b3€‡;›±e›Çn’È‚r«u¦zNs’QM‹g^cJmyN\†JxM†ŸE‚¡Z|¢Vi§_ZvM†u.qŠ@‹‹TÆža–Ï}¨¨h£Ç[¢Æy°Óy®m}¥amœr|–Jnš[c‰Irr:—q7«¨] q‘Mn‰Bžt?—?–¦W«¡e¦¾qÁ|~‘m§¬AºËp¯Ø˜žÖµ’ƘW£‘^pF‹z;j·^j—fÉ–Q¬ô¸ãœ§Ö•¯ØpÔŽ‚¨kvµd•´Z|¸Yž¥Qоjlšf·Š=˜¯XZ“fosI[‚2®„:âÍiœè–€ºiž B¯®gÁ¶Ž˜²¦†·kˆ¡f`™]V‚Hwa1e‰<rƒBx‡Ou•at‹Ig†Qfz:ap@U‚:fr6¶…M‹…q^¨`zo2k¢J€ŠF©“M•؉“ÆmxŸ`³}9ÅÛhÀߋëό{˜ævgœs>€Ž`žŽdÜïjŸ¨’Š¢Qu®ibd€{BŒ¤`«±dƃˆ‡\’¹^â¾oÞÿĬꞫ⤲œah‚}?íê`Þߊ»¿aƒðˆ¬EºÝ”t¹™d _k’I’qP[Œqn„6i”C‰›QÍ\—ç„„škz‡q‰•_r¢ba F€„<‹¢g–¬J¢ÇdŽ”znƒIuu7qv>™]µ“]Àä”Âî±É…Þö›ÿ~K›;^a*nm:|©[¯©>£ÿ€y¼BLn2bQ(zpSub@ED6B5‚X8~cPi=bZ8gjANi7~q:ed8¥®nŠ’]bˆVlf4blDhyGtBÍïp¥Ö…Ķ€¯Ã‰ÿ홢½e©Wƒmƒ‘lJ„0Š~EЧP‘´Q¡”e|p<—‰e—Ãn˜Î—¦·…œ_th?Öew¹ZUÂO*:CT›“Vž‚UÃÊz¨âŠ…¤cLŸ.qœ@¤ÖoŒ×mv—?_z>RK*‘eOZ^8P5(P=/jS>ŒŒXž”dš«ž¬ˆx’COP#N_$`y>Mn4x|Oc|K\sGj{S~pRÞÛµÿÿãÓÿ¬–Þr}ŸY…‰JìÆ¶Ñÿ£sEz—To˜T—¶†X™L=^-=R"D["_pM«Ásrž:q®DœÎV¥§tp2s˜9‡´F¿¯làØ†§´dK|6~…c°§¢«…™Ûa‚¬W…€TzjT§¨ÿÿ¯ÿÿÄÿÍ ®¬^}~O~vA}U²Îw¤ÙvªË™ºÚ“Pq3XS&Yf?šÌæ‰ î~|ÇdrŸbk‰HJTAmŠhhfi†djŠd“°`„º^ˆ£X[‚2O[4W5El'TgHgp0Xi,WuCqX€¨iq¡Xk}Tmr?Nf6SqX}¦i„¬p³m…¨Us¡OxžQw£VXŠ0Gy4RrR† z»è‰¡âƒ¸th’Vi‹R_~Df}N…§]ƒ®BLp,Dk6\yDn‹S}—WqJQtDs’}·ã“Þt³f„°p†¨`†©vÅuŽ»au¢S^glbcƒSl‰f‹®w¢À}‰·loƒ^o€Xcr?MgUšˆ“¬bi~Dq{:c]™¸¤ÉhŽÂj{¤\kŽ[u’\ƒ¯aŒ«j¤mƒ¨heƒfzˆ`|‡Y‡§kŒÀz“ÉnŽ¥Yy„v²»›È¶h€—^ˆž^x¡Vo‹OjzRixF_McŠi}¥xy§~«mx mv«fu˜ro™pwœv„¡x‰›bbObOd’CT}I^ŽxÆ„—ÖxRzC]pE†n:aŠFN`HpQ\Z5\x1Xo>Q]?P_@m\@h„@SšWeuL|x;m›Z^“rZ~X[o?]w@bx=e„Lq€LšwB¬¯Z¥ÎÊ•–©†€¦nm¢psŒh…yTƒkCƒƒL}Xf›^_ydVdDOOHiF7mT*moMobEX]DUK=WJ&kN*vQ/V^DUM6˜R/¢a4nWkNU”tSr›g\•yZ‡G^y2u‡0^ Pm|IfO÷Qÿ©Eÿÿ¬ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíÿÿÒýÿÿÐÿ×µê~жnš§U˜¯d~«tbsKp`\bU–Q8…«_u·S„‘Pšœ> Àiz¹l“§n²ÊgmÛ—’ž?øºTÿÿ€ÿÿ»ÿÿÿÝÿÿÈÿ¯ï½–Ê¢s¯ŽpŠhŠ’Y†±mlsÛalŠ\‡€=™›Jšºh}–_šŽD‚„7ŸzE¢ˆB§°uÍr€¹j£§`®¡F£Õ´Ó›ÑÃiÑ™jn‘rpBCshdYCm‰K¸…Sšß‰ŽÒ¬yÏu¦ƒh‚¡g¢k¾Ådwç’plŸ’CvÆorƒWˆŽ=©ZH~^wT2a ?†DÄÕwšÒ‚„°Y‡¶Tޏ[¨¿_´Óm|àŒs¨Yu‡Xƒ’^X‰Hop6q‡;nN~„Ju£`v›Rr˜H{•BsœLo“Eo‰du¦SŒT_”Kt’A’ˆQÇÁdÑûÀŸöÂ’«|©¢f} {ζ[‡òº“·Yƒ™\‘[Ù½YÍÿ±¨t·€š³m´ºuy»”{™_zšRˆ^˜¬Weµr›‰Ho¶ƒ¢zK¢Ù•u†}`WNOšzVeÉbº‚A®Ü~ÿág–ùÌ ¢jpÕ„•Nt›s‘ªXYÊvZu3e‹Px†;q@]žC†„B‚ÇjY°Pn”+fšDzD‚¦_l¥RŽœO’¢\mŒVƒzN˜zA¡œq‰ŠAfr8}:¡ ^Â{–eóæ—Ûû²?™vH;!hu2Á UÕý©Â쟜ò¤‚°Bi¦MST5JG'T@!¢^0‹›odpHGW*Qa-MN-XT+td5}bCrÀghpEg{>|ŒH„ˆG¢Íjo¡\uyY’“l®Ïp—“€é¸Ïè“ïÿ¢ Öf°ßp¢×zŸ°vÐè’×û±àÓ|ŽÀoÜ…|䨻Ùã¯Ã榇¹yTm=€z¦²ÆÿË]¯:²§WŽ»zƒ›RÇžo¹ÿ¤qN“±o¥É¦žÅ¬Û“¼ÿµ©ÏuSm@e\9ad.‘KB‚_B}nFaC4iM:z€Y}–gW‚79Frj;p’M„¬ZÿÿáÃÿ²?t'(F;4"ÙÊ êÿ·èÿ³—Ôtw·MnŒ>‘¹` ¶q½cg½T]TNÂÌ¡׎»ex¾RwÇa‡¶cz©K¤T¯˜“®à“²Ô‘‰½cbz1p„=›w_‚†gy„e¤¨pŽÎT¥ŽbŸ–Y“wžÊqw|Cn~Q®ƒ‘ÿÀÎÿ;ÿØÎÿбÚÎZŽ}S£·z…·s}¢dNt3c‡B…´Ws¯P”zN`Žgž›•·æ—£Ê€Œ_y¬GQBW‚EKw1EgCZ{B`ŒEjŒ?t¬Jc˜<YkC˜±{ ãTXŠ=Qx0Tv7mœ`…²jƒ¯jlŒW€n›¬p‚²S\x@PqJ^}Lr‘Yr“Qj˜\~®^uœW}šVmšEZI^ˆU]}Wh‰^r‘btše†³f…¯Z^‹7WkELl><b,Ib3Y{=h€Ba‰J]y<OxBožh”ÇŸÇç†|CY‰?Z’Sz©az°[ƒ¶Z|±dt™oˆ¥u޵y“©u†j‰›f|¥[gS‚“Va…?\zqÉÓ§Ñyv A]v;ivTn”mˆ§y”±z”§jŠ J^~K`ˆQe‰Si’Yi—UiQfŠUkz_h’x˜Â„¡Énmz@Ue_•𑯴al‹\lˆWlŠS[uJ_|Z~‰OmJYw[h‚Z^w[a|Yj‘\n’PYrAQgEUjGHfXUuSm€gx¡ex£O\SXˆx„º—Èts§\r¡mq}TZzJ@u^L`BZ]2Hh,?a<2X7/L2O7$wM\ŽAR‘fswAn?QŠdOoPFY7Ib5gc9ŒŒC‹«QŸ e—°r•«€ƒµ…‹£‡‡r…šq„ˆmrŒ`‚z^‹ŠO†ƒcŠpsŠxj‚cqgWˆbDh9lzLdjPMQ7dA2OM(PE8cG%ZP5cP6pr4„p=q„Q“nU‡§Wm˜pY{d`tA v1À¸?nå†|Š~s Oÿ‰gÿ¿]ÿÿÒÿûøÿôÙÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿ†ðÈnt{es“Gp†Mƒ|PX€I¦^?–˜6m”ncyO„m8Q¦³`ÉÕsÃÿÿÿ·ÿÿËÿÿÑÿÿìÿÿÿÿÿÿÿÿÿýÿÿ‘ôþu³®p}eorbakQr|Fn\še¾îsÞÇœ Èf ºn˜«“›l¿ [‰¢Z˜žS•A¨«eˆÈÇšh ±`«‡Z½Å…¥ß“qѹGrqShUWx;jpACxMCM<´a+ÇÚq³æÛ…ܤ]‡‡šf5o£bu‚XeŒY_‚D u>|ºxkšQc‰ESzUUz4f„+Ss9ft4`‡Mu‰<©}MŽ¥t“·d“´yÅËp滑¯ñ®~Ù†kXjƒDUm:\f3[p5‘†:Œ¶U„£_}¤U‡’T‹¡Z‚¨W…^ˆ©gŒ—`›O†V·°PÂê‰ÁƤ£Ø×ªÖ†‘o®‚R¤Æ—¯° ˆÊs‡“fè¡TƒÔ¡žn€X’¨JžÌgˆŽdŠ›t¢£nŸ®n{£l‡¢cš¯iËÁd…â•f¤Sd‹L¦°GcÌ\r@N‚<3Z:XW"¿mI¼¹tâÕp«æÂ„â€m¯L³BÒð†¸ò¤Ãò{Ÿ¶–¢—²¯œ¯µ¥¡¿•„ ‹r—~k‘Nz§X‚…[‹„Wv—V’ŽFtœXs€Loˆ6’=…L¨‰ašy[‰zM‘G}»o—¯]¨l–s´¦gd˜bµ•DÎñ‘¢»—z–|1MGXQ«Ÿn”¼jÚŒbÕ«lÿÿ’íiu€`jlCp…CX],„p;Vq8ˆn:‹§{y|G™ioS×®z”õ›o¼R½¤Y£ï¢r·][;gŠG„’^Ÿ½|ÿ×£‘¹h€j?Ä¸Šµí«¸jŒ£I|˜iIg+eS+›ºc°•w}MovW£áh»Øhÿÿ»¹ï¡–¶yØÙ²ŒæŒzzZ£ÀŠ]ŽBs…M‡µ{œÁö·³Ø•žp?i4SO,~mGžƒK͹x Ùio¯FˆxEŒ‚iÅ^l¤BµÑn³Öt“ÃdïÿÒçÿÕÇÿÜ3R#29E#2?.44/~S\µÈv—Üa¨ÅpÆþ¥‘Æo¾ÎŸÓñ°Äõ‡´Ö•ËßȶݹÊá¼Ñü½oœ[OP>¨Àuºû”üÿ×ÿÿÒØÿ®¨êm„²X^}Ašªl™ák¯²‚”{I}rGvy<µ¹j£åm²^Ä•{œ‚oÌ®t®¼fÊ¢¸Ôw¹Öo…N’›c˜©a¸d¤Ø„¸ï•·üš¦á~ÁV}–eo^ao]žTGm=x•_…Ãx†±h–®i‹Ð_W’AC`%Gg(nxGi@kU§Õ©íˆ§çu~ÀP\z8nzTaxWx†Y`Fg†[‹Ÿc| X[t?_}2a{<e~D^kBYuVw¡XhŠAc{Lm’Yj‡RcCa€Fa‡D]yO}¨n€³ov«kmšEn—Of Pn“Has?`~G`„K]‡:Oj5`ŽNtªe¯ey§MU€2qZÆmÌ{–Òyнp~«tz±t·qtžo€ nŒ¦h Ôxµän~›N^zWm€Tm…o~›ƒ›»s~Ge|A]}FdMeXf„MZvWr‰[s–Faˆ:X„Bg‚Ql•_w§]|›Od}[iŒev˜ssˆGSi5dk^Ÿ¦Ñ¸i}˜UxƒJ_nD\rJ^~Np{\…BZwERxAVwD]yNeyI]n3@[/@]0A`7Ec7B\AFl`gŽow›`lŽMW‚hzž„ЬayYh_SpXToUUjIEk@Jb7NX*Ka7@Y;1Z4GG(cV vy9l•Vr’UMKSv[Eg>MS1Lb*`\-~k0}’E~’hy†YrWyS}…b|zd}~Vl}QovZ~uWvvLqcXd]JhkStx\mƒaysWÅsC´ªPu®s_{Tn];P\/^B.`P)U_5dP6vu4~‘W«†mϸ`²ýbÛ¦O`gwO1«.¬Ñar× … ” ˜QÿšpÿÇvœËµ§§ÿ¤pÿÿ ÿÿÿÿÿÿÿÿÿÿÿ×ÿÿÿÿÿÿÿÿÿÿÿÿçÿíŸâŸ™Ûy˜ªeœ£gš¤gª£h—±[°™p“Ì^±¶TÿÌWÿÿ”ÿÿÝÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùÿÿ½ßÛ™™¨¨[µ•H‹cDe9SZ+q/{œ6Ÿ–UÖ³]ªî´wƇpœq®OÇÈn´u «ly¹i”rX‚ªco©k|[˜J‡·aœŽ[›œtx´‚±§R¤ØŒ×¡c®}QŽSO^=›j Ô»j¨òÙbŸXXt}q0|ªRYªWndI}šDmPnˆLm‰Wo”I_}B^i9OcJmp8k•?L‹@@j8w] ©ŠGÇ©džõmaš†AuOg\9Š~H†œop¯Q`ŒEkp6n‚3v§DqŸVx—V`ŸTw‰JœLƒ¥f—‘Zy°Z[„^Šv>w±VªCvË‚›‹U¦Äƒ‡²‡i‹g`ˆAslM£Â[¶¢lö³z¿òªuˆ˜—>žñg¦¼n¤Äm•iƒƒR‡VÌ›YnÞƒ‚€Pʸh³Òª“ê}Z‘eÒ¢<ÿÿ©ßÿÓd¸‰g…>‘…4¶Ã^{§kÞµM£î´~†X|¡Op‚U†©]‹§f»ÅjšË‹µb˜É_Ò¡[‚¹‹‚–]¦Qn¾sv?XvF^V/cg5^_Bs‚2t—Mi\>Wô€MÛÇ “¦f”{G«Nn‚Ks‡Em§;†‚M`Qr„2S~8@m*(R:<‰‹(fÊZdy;›|VÑvRÿÕ’ÿÿ¾ÿÿã˜ÞœoOjvPbf)v–@€±Jd‰9Ž–Cp³c[_A^Y;ekNr…KŽV§·q¥ÒªÝvnXk™Fœ¯bžÓ}ƒ®b™™]©µo‹“fv€UlwPš\ßÿ¿ËÿÈlÔV3b ½GLæyŽVba5ÿ”šÿÌ¡ºà’u°Qe¢8º¯˜šèt Ôd‰±]£¼qÛô¡Îá¤؎Îx„Åt€›Yi=|…DŒ˜K¤šiÂЙäÞÝÌå°¢¸n§Ž{ðÿÜÉÿðÿÊâÿÕÕÿ°€ªeñîÈãÿµøÿ°ŠÿiZ“Cfš5l´=^‹@„Žqàé§¾ÿ„àÿ¹£ÿs‰^Òé´ÞÿÏÝÿËÔfÐÿÂÿ‰ÂzbŒ?´å„ÞÿÂÿÿóÿÿëáï¿™§¬²•Ïÿ²Úÿ±·ÿ~w¶Ilc.ZN+’JÝÙ—ÿÿ¦Þá”” ^·jÍpᤣÇn„aš¦z¥U“ž_„‘I{‘SŒœ†Êé ¯ù›»ô¦«Û…g†PZV>^hOg{Kk…Ls„NS{Ev–h‰²t~¹jw°m‹¸jƒÃ\y¥Ek‚4js>sGs—[w‘fxƒeo‡Ji‚?b|<Nc.\l@\tPfzZt{L€‡RtHl}Ge¢FdˆAv‘Px™Tk‰A_…EPsTxƒ]ax;iqE…•_™©\]oMƒš{—¶u…¥q–¯l•Â{œ¾qpšBUlIo„Qmˆb\†;QsHn¥hˆ³_p™9XŠ,Tƒ<V€Vv˜`{™fp–Yh‰_®¤Ýœ©Þ„„°a’±…’Á~•¿}ª^c€IW}Hd~M~ŠIpT„¤\jšD\|H^~Jk}TdŒZlSqP{–h‰ª^t™=_„Ap—Lh[m‡UaF`PtŠah‹R_|9[r;^}mÀ¸‡¸«cm™TnŽP]{D\‚V„Ÿa•‘a’Ov”m±gžWdŒMSz:Ei-Ca*?^2FiBW€N^†NUvX]xce„We}GWuX`Žhl…TZ\GTiC[aNKr>@b@EW3I_7Nb.Bi.Bb9U\=qi;a};k‰M{yRfŒRT^bpV?p<J\5Q]'Kg._c5Yn6dmHdmHhrKog:Š^8~kGteEnpDvbHpqE\iD\WCY_9R[9hg;VwBebNµgB£¥HЍak£mb`RkDT@<iK$`W0nU7…z<d‘b`fÖ‹N³ÿ˜\ãÃGpƒ}Z5¨’9ž¼nz³‰†•v˜ŽY½œds™w™ˆu¾¦Rÿ¼fÿÿƒÿÿÿÿÿÿÿÿÿÿÿºÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐÿÿ¨Ã¢Ÿ£zŽlŸ‰u¯ŽzÿÀvÿÿ•ÿÿÈÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝðÿ½¿«“£¼‚™ÿ–vÿ²yˆ¾—‰—`Z£z]pJp8lˆ?U8‘KÀ¬N¥ë‹ƒÐŠb¨y¨Ž=§ÂW™Ò–•Â|¥mSWnZ;u–K„_”–J„–d ›Qi¥oy|S—–J§Åv`ÔGrsQT=IzAsh-ʆG¸ê¥wÑ©r“[Ž˜Iq¢`c‚V…R“™C³¹˜ŒÔ{‚Âk_ºoIrJF_'SW c0c:[cLfT6p=Í [˜ÿ€”“pJE~3\i(rz-nœBz’;À›Ekº}}Jz†Ji¥]rŠXdŠK†™B©ÊfÜre”Wpw?M‡Min.} >Ž£DnntS¡‰Z_›vw“T¬sž¿L€Â‹‚ªcʬ{¥Ý…½Ÿ¢¬`åÒŒ|î¬c’jbsNt[:“GŠ®m}—]nƒPjdJ›¨T¤ápÃuµÞyjæ†Qc<cuAЍ4£¡\Œ¨hîÑp’ÿÅe«WgQ>•šIh~VyƒG›ªf§Ãl£ä¬ÆÒÃêÉ‹¬pš¯f‡ h~˜Wp™PyŒ=LhRla/r…5S‡5yŠ:d–L¢|N¡ÌgðãyÕÝ¥Êñ ¸Ñœ¸¯‡~ŠanDd‹HPq-x…Ds²V”¢L7—L.T3ëá”uÆ•PoIV`4°tNðجÿÿÍÝÿÈ—ÍŒ±›[…`ÍÕ|ÌÿÃøÿÈÛÿɧø{e¸vXd+w}Bv€Sg‚Nmˆ8‹¨Oq¥Mbl<Œ¥GvP¡¨_rsz—K~<•Ÿeƒæ]Nk9Ma)ž‘S½é¯ÐðÈ„¼~jŸWUv3¨¬uzžoIj@h]5Š7¦¦iy©OuŠM¤âcÈé³Åÿ”۞·y›âŽ¢æƒ©æŽžã€›æ}žÅ_¡Ï†›»n›©pt›Tw·_œz¹è½”¹†¢ վܶ®õåÑÍÿÞµ·ƒ|Ñe‘‹i«Æÿÿóÿÿñœ×sÓg»äšn±XMs6^UEΦÿÿ×Îî ²\ÄܬÅÿ¦±Å ÿÿÕÿÿÿßÿº‚¹c’¡tüÿå÷ÿÚëÿȉ–_8H 2.#šxˆ»À¬§žšÆÎµÍóÂÑÎsY7uh<§„ÒÛ}}¶K_‹9š—fÎÓ€Á›j§©p¶ÏsšÄ[cs:„¯p£×”Èks‡X‰³ŸÑˆ˜Õ‚|•n€ÃXv´aÀs¥â©å„¨ãsÄ[bœ?RŽL‚‘—½‡•Ë…‚®kˆµ_y®=e‰5dkAxCqCv<j}=t}J{Š^}›M|pEžWy‰UkyFlvOŒ`{…o™o‰Çx‹¶Wo’Dq{Ihº¦g¡Z_w9E^/NaDqxLz|QŽ…[bh?C\;_xRUsC9U<9J(I`@f„Na‡Vf…[z–`¢fvA`Š%P1Z<RpIz X^ŸN_Hs—f“Ä‘¥Ò†v›lh‰\Trez‡zpˆS[oIZuPVr@cvMpŽWm Uy¸\€±b„·]m”NjwOn~]–[‚žg¢gt˜S}…E`CvŽNpŒM\u9Pp;TkL`vVs‡S{…MpxDbpl½«€«¤[{¤Yƒ¦[x‹U†“m›©n‡ W‹ŽZ‹…© z˜ŒYu’VeˆJ`‡CIp(=Y6LjZt¡q{›XVtVZmOYoPUp?NuSo–]h…FG_GRZ0B]3_`65\2AQ?XL'Wg,Xh9Nk8Rb@jn=_|CLwVYiFSm7PcCdY?8n8EV@VV&Oq+dd:j[0rk>`k=Zn@ta:sW8fu?nmMx}DkH’u>…TexNge>\s=ZwD`y;Vk8l`3ƒn9 †Ec¸f]‹hHKUA7_M*gW.{h7oŒJ^rcˆHPÃ_1ÊÈj‘ô²¬°ŽÅ_tÉmYš\\j[rZ?yFu“\eŒi‡{=™—HÏfÿÔuÿê§ÿëÄÿí±ÿÿ´ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÚÒÿÆÏá²ÿïŽÿÿ·ÿÿîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛåÙ±²ÿ™”ÿ¶}ÿÑ€ÿÊ“ÿÀ¤ÿÓ¡eý·hrehtJ{‚OO§UMvPŠt;£«X—³€‰ÌˆeÅ„wm|šC¿ªex⾉¤€ºmb˜do^=hBc‚8VlJŠpCœªI‚¬ru…T˜™G”Å|aÄŠq‡a–¬>ƒÔnµ®p¤®Wª»n®ÚÄ}Èo…²j}ºa‘ŽZ£µ·ÑuÉȿ٦–í½]œ›fdLZh3sb0hu1{}LacC‚n5¸¦Q½ÿp{«©Â¨NŸ½y—¯]ŠŸPžÁoqÁ…Æ®U»À€°¬o°¼lyÚzqI£FR¶®N‘¼~g¥}q‰YV CKd?kl#u‘<\ PxdJ«¸U†Ðwj”{t§TZ§E†“@ˆsz˜ÿ“œeŒ‡O•«uq³|†X]‡kYt;k_-\‹Mn€.Å£E–ʼn§ÊiÂϺÿÀ‰º|¯¦a´ç’v–€„†W˜„]vÜ…g:òÉrŽÙ FoBuq-~Ëhtz=”‚M„Ãa—·c›¡|œ³uÀ¹|‡³W’²lš¡Vy¹V\J“o7UwTSV1Xc-z>ˆŽd©]ÏÐêü®ÿÿÓóÿÕÜÿÍ’èŠRu94S ^\%Ye3_u2g€>a‹DZƒ-Y}+}¬4”©Qæä£ÕÿÉÆÿeàh§=¡É\ÃçšÞúµ¬ß€’ÀƒŒ‡¸¨xÙðÄýÿ÷üÿô“Ï®R€G{qEŒTck=w{S}vF‰©Jh©T`v6“Lp™Vcu?bn7ds6vŒ8®•_¼æ¤µú|œJsŽ7±Ä|¥Áˆ–¨’¾Š†¬o’ |tªaušEx‡9gBVt1wl=²V|€[½ºÂîÉ£â—Ñ}‘n–Îw•ºt’ºg–¦^‘™T§´cš¾nm–EzP•ßuŽ˜r¼ä®Êyz’iLi/XG-‰…WÎæ¡j¬2_-`y;}‹[ʰ–—Ól–ÉeÿÿÅ¡ÿƒLU0KY+Wa0o‹B³ÐuÌÓ”Õô°Ïë¶Ðÿ¼¹ð¢ÿÿúÿÿÿÕÿ Ú_Üæ°ÿÿùÿÿä{¢e:F"2E25;A'S^5`p7Un<Ž«w²hŸÛ[”ÈM³µiÌÝ…´…†szD‡O”œh’˜X³«‚Á䊰¾s–Ñ]¡Ñ’¸Ú¡®á’Õ–œÒ…Åv‘¿s˜Ñ¯äŸ¬ÛŒžÐ’±ç™¶ô˜¤Ølƒœe ºvŽÉbTŠ>NuL‰›Ž ¿š¿e޼q—Êh}mAnm2lrG«–bœ„K}hSŸ‘sŠŸl™¿`”Àf§±j«ÄiŠÅ`©cˆ»_ršaŽŸmN\w=]iAnmN€_¢¥h…ŒGVr0?e+Ml2Sl8_k9Ja#@a,Zy8Nw7Lu.5N*Ji<[IQt;]xOt‹Wu¡Rm7Y‡/Tu<Gi4MmFk£e~³aq¢Ws i“º’»hk‹Uw’QWr/EQ-H`;LoI_€Pc…FliJp„\œªr®ÇtÒ“Âf}—I]mDXkL_w[†˜lª±v´¤Qmr<UnC_uGiyE^z>ZyEdŒCbuQŒƒz¶¦SfqDgri½¬rŠ˜Vnˆ\cw–^zœb|£k®m‚›[vuSc`JltbYwwMbA\o0?X1=`PsœdŒ£WqMWmCSpF^wBUyTvŽ`lŠLVqSd_=Vi3rb@Nh3MgNdQ:Fd+C\?BU5LW2Ub:Om=8k>BR>:M$8E.\E)AV"EW@O]&Y]+wa8€^6us<xxKowF{jJxh=p|>hrOsuA”w>‘Cˆ‡W\‹VfjWgzIamC_zKOwCMl?|]2¡w,[°UUwiEnDMW=QS*U^6nq5px?pr_ƒ`F W:€K›Ó„µ¶‘Ëoq¿˜K…UaQ8cc*mqDg†Nc‡]zx;€EÂpEÿ»]ÿÏ‹ÿ½ ÿ¼žÿ³ˆÿÿâÿÿÿÿÿÿÿÿøÿñÞõÙéÿ´êÿó»ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÕÿãÌÿý¦ÿø«ÿʹÿ½œÿä©ÿÿ³ÿÿÍÿÿݲÿóqÃÕsX/©‚DÕssž†zŽ^sŠh~—Yƒ°hh¯k f޶_ͯˆç’…«ymž\f‰WGx:Sb'S`/ge1x‰<uƒCZ‘Vn;yšD‰¨o§¯v{¥Œ²PŠ¢~•¨mq¥h¹—S‹Ü×»z~¿‰n·p·b¯’Lˆ…±±dŸÃ—¢«•a´ŒNh:ic.~ˆ0•™D¬²e®XïÈdÛò¨’ØÅ|e¨šL±—oz¨Ž•™W‰³~ƒ–Šb©ygyL†uFÁªeéÎ…˜ÿ³l¤m‘M}…Tœ¥V‚t}‘QQ‹Jqv2•”H’À_•¯pža¨³XÀ͆™ÙŸ‘Ô~i¨˜ŒN^›hi5xŸhcŒR®ƒH¾ç¨qаj”\t—We N^’4€€3œV›¿fyd›z¥x‚…€³pq˜Æ‹\Ærq˜6w|JÖ¸Vnã®¶¬Sè–Z¯X‘s*ÈæÏù®–ó›j²Zqm?–B‚™NjŒV›…F}²\•²S‘ÆcŸ³^Áºdˆ¸vhn:nn<z{6~vD²•MÁ¸m›Î…µ£U}×”—jV®Ô‰•mP”N¹ˆ;f¾–IW%“oDY¥sco-g >½GÞñ´ÚÿÂÜý©ëÿ½¸û´ivŽ”e™³–„€\Àǘ‹Íˆž¼pfŽJXp7Õ‹oõÿÿ›»¯w‚Mv|JŠbXwvNfs9]j?el<’~Mƒ«\©”cßø¡d¤fZo5{‹Elˆ@nZF•fÈÚwÃÿ¦uonc=©»X€ÒjIwAVZ'ƒŠ[ÀÁy¨eÊ‹°Â‡t£LOm%zWˆ–E¹Ç[™¾rªÊ˜†Ïwеk‰ºq¯Þ„½q¡—bŒ›U‰Lz•Q‹šaµluÌZ‘’y‹—n±ÕÆŠ¢y£·|šÅh¨Ìyƒ»X‘Á\›Ël²â¤rw\‚¹X„›UšÆ\²ò{Ûÿ¿ùÿÃwöJe‰>WhD›—vÔaŠ•Mš»]£ Ьߗ†Èmÿÿöÿÿÿ˜åq¡«oÅÝš¶Ö„SeE+,]W@ÒËX³/HI)h}7wŸB§Ámâÿ¢àÿ©Íÿ£Êÿ »ÿ‡«Ítƒ Oy¦>v8tp9qC…ŠT³o¯ÔŒ»ç’§ëŒÃ]™•qŽy³Ê•¨k¢»x™Ð}œÅƒŽ¶}”¾x ¿~£²Š©Àƒ¢jexXs†c’Ãn{ºSc–Sw£V™i˜ÈŽ£àœ†ªR{rE†T¿¸jv†=ZjGrrXv˜f™´{—´{®g†´t—Ï‹©ë¤¯÷¢¦ám¥PvŒQv•On’CqŸC_vYŒ’imzMWp@Nl.Nn+Qi2Xj/Ie(No2U‡9Iq?m€COs2Un<^z8^…?Xh=XiDj†G\x6bŽSl£bs¡e—ÂxªÒ’ŽÇˆ¶r„¸ai›Yv€V|›Wr¥Y~²FV‡7W~Ox¤d|¼m‚¯MQV1VS@ftRq›k¤½{¾Æm MdŠA\ˆ=Y€Qx„_’”y³“Llg?`Ž^xšLd|Eo~GWwRkKvkQŒç¹n—†Qx“oµj|…MXnRj‰f~Ÿgx¤[vžr—¯›«Rpr<ZaEuya‘‰N_i4BV7AV0@X:I_FPlRQpMPk:Gg>T~GUx?TkDVsO\xGx}O„~Pn†T{Š\]vNhwPphF9k:4TGKL)Wb*PwC_b;5n<9T@=>!K;ZGET"]T8^v1ak4jn9€m9w€EyxRzvMlnTb`Gin9_wEmF•o4~ˆF„{_mYJŠiLpUac@vo?l‘OT’`amHq_+Nd<8bFLV3Xm4nyAv‘Ps•Ug‘SQ”oMqc`PB©J5²ŠBŽÕ‘‚´mj¡mbyKwk=}ŒEy•R]F]xXdm6—a9ÿb8ÿ»`éËŸÿ¨‡ÿ«€ÿ~ÿà–ÿÿ×ÿÿûÿÿøÿÿóÿÿïÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâÿÿÏÿÿíÿÿÝÿÿÎÿÿÑÿÿÍÿÿäÿÿôÿÿÿÿÿÿÿÿÿ_ÿÿfpo‹4YÙwP‚z^Jq~T„‹>¯lt§gg‘h‰ogƒ n‡“][¤‹^oUKrCVp4_i1Se/r*¸RwWŽªW{»dp¡X[˜e}Trºr_DhTW‘T†rJÓ¶O—ôº¹É¬²ÙœžÌ‚º¨}ft—Uw†Vw–g—¡a’Ïvk¦ok8f‡G˜{;¡TÕžQñî¸óË…¾…¬žZ¡ªjš°ft°qsbY•nw†Q˜y€¬eã•F¼ÏŽ}µvZ•xR€Ipo8Ov~^Ÿ¦N]˜ny~8†¡Gy—T`«TcnBss:ˆŒ=zd©V^«˜¥’L¯ñŠŠ¿„k“JgKr‚PZNa\AEÝÀmßÿ•ÿÚVƒ^›f5T©Ž©g0¯«wyågHcHIB$}c/‚`’qgŸh¾¥U¯ÿ¤‡‚£³mž¶œÎ…¶½q·¿œÊᨒá^s^aS)^ƒ>xp8|@ˆ¢E…S·¥\¡•x–Âo‘¬PidKˆF¯²]£ª`ð¦~Éí¢áÿ™ºê¥âÜœÌûȆØo{Doh9Ò†>|zLXzT:e#.K2LPU³G¿íŽÐøˆ¿ä©·Õ’°æ¡v´~c|KŒ›WB‰PGc#|r/ŒÂsŒÁik¡OZ=ax.xŠ;Ü\‰ QŠ|Kt¨F~‹G{‡Aƒ¨Sk‹?‚vBz—D£“Q²ÊueN‰I‡¤jsYV„gc–›V Èlv®an¬Epp2žµ<Èù‹vÐl^^/ƒ…W”¬VÂh˜’b½Ú˜?e2LH!›_|¸Kgw<´“Z—©Y‘M~rBs–Hƒ‚i~yGwsG¯°…¥É‡{¸g•”l—½iŸÄƒ‘¦dy£i†³u]uE•‚pŽ—}–°‘j‹V‹ r©á¿ãž…¾ez£Hm¥GUj>}oR”¸s²¾‰¢Ùyˆ±\¢¶t½ý¢Äz–¬O™á`n«;¨X¶nÒ©®µÈ‹‰Hu£CŒ²[t²>9@D9#{[HkhC„T{ QqiHsu;Lb0pF`B”Œk³º«ÉÇŸ¨¶|¬ÁýÿÛÙÿ‘€º<}žQ±ÿ~“y©“²×•¼ö¡«é„£Õr†©XdpKsˆRŠ®Œ¦q„žfŸ»†¸ÿŠœ×ak…Am{B†cz@€ŒP`‰P\vCtO~”]•¦u¶‘—¡•ªl€ƒQ¤œk¯¼‚’®T^t@XrR}dlœS²sš¶t¬tª¶½È龾᱿脽bl…°p…¥\e‰D[~Qp‰[lP]rHVo2Oi)Y9`E]‚=]„J€·P`9Jm<Qe7Lc3Ka:tnM{t5Oc6WsFdŽSt¬† ÄŽ§|ÆŸ§à²Ðÿ«½÷Œ–É…‚½hv¦^ ¥w©½y¡ÀkxšWl”s‡¹|“¾~‹¸UPj1]i?x€Q‚‰e}fp‘ZuŽ[}žmµn²av”KlŠj§€@XUBp…c}œQqˆFj~I\‡RiInhHbi¡}e‹i¬ºÇ²iq…Dj€JoZxŒZ€‹a‹¡p–q—Rt|AbjCXkRm…KqˆBQq6>b5BdCOg5LY>YsEez?YyJfTdy@MR6CY?Pk?w…T„…c†•^u h_…fU{UmeAIh:L[Ggj8d|AYS`wNI^<:UGE<,KA!_L$Bi5aaJvc.g€Er|G~zCsOs†_f‚`GnSRI@VW+Vh4re4tf-lv>€eU‡‘Nf©xXŽkZsC[g=mmCK‹V:g[?J)ND!QG)~`4•‹9‘`Žœd‚“k–•i… b^šfjqM¡j6»›J¤ÐoŠÏ•w±p…Rq’F^†[HtRN^CF_8AO/j<,ø>÷€Cÿÿ«sÿº“ÿ ˆÿßÿÿÑÿÿãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùýÿÿûÿÿôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿr½õ¤•ÎÔm½åªÐ”Çuf£t]~M[yJeyD9|FC<+vS/•E]€dqH†‡=QŒBMjOV\,u,˜˜H³µo—ë€m»žx•dC‹k„f5UMOwIlu3r‚Vœ¡GЪt„ؤ–‘˜‡¼–˜²‰€Á¬£©lp¸_—‰U޳X«®c‡Á{J™vPt7c|&…6Ÿ†EÒ¿W³ê i¯ž®†`«šp—~y¥x””Tq¯m‚…`mbugt}Kq}D˜¢Qr®j\œqh‚X~KŽVq¢dk„[l’BžšIÍ€ŒUœ^k—_jG…¤C}±M\®N„‘D’fšð¦a©}Œ;i·yuœG`ŽK^=¹ƒ>¼ã•ïè«¶ÿÇI¹’’Q*v¶wÿ±LÿúÈ£•x°g‹ƒA®ÕWªÿŠpˆi{›[äR½µ¥Ú“Už·™³¸—“݈e“kdO:x›M¨§ZƒÌvq—Eb‡?\…3by:ip5|_Om‘X‰OͽQÅ¿Œ°S—“`˜£W—”\ŒZÑÄoÀÿ³¥ÕŒ¨èx¿}Iih]KD<R,fbc€?JZ,=\%<UB__y ™›FµãjÉÿŒŠóˆ“ªe–È~K‘ITn%trJ`xZR’Gg†7_‚E‡‡Brš]m€E•«Zˆ~T˜§ŠuˆU¯yQ·ÝˆtœœR‚±Y¥²Y“Ãs‚¬U’S‹¤k‡™Xv”Hp—LXl(w‘8}”7o N~AŠ`ÈÂhëûª¾õ£Üð’‰ÆjÃ¯Ž„Ùl™·fn¹]xY;Õ¦‚–¬ƒqÂCŒžW¡ÄtÉë¬Ðÿ˨Þdfh6o}F~cƒ¿W^œ4|uM¯bœWÀ‡¢ã~¼å‚œ½ˆr`[€k§£n¢÷hƒµ^n¶`z_t¡e”´„‰q}Wl?Ld'KX"u†M·ÍyÁïƒÙÿšñÿ¸¿ë•¾Â‡ pŸ½u™Sq—7t7wª@w…1{¤0t.e„-FT(UF2yp2rz7k€A£©ºÃª–³~ [T”sF‰ŒGgn>e\7aZ>r€A”’YnpB}wxÄÒÄæÿ³ ªT±¬ƒÆõœpEk‰[™¿‡¦Ý“œº¡³zŽ”b…‘M€g«w¨Á‡¶Æ¯Þ°Î³ÜŽ©è]`=_pCt„UŽŸd®Pp°E^G}˜Fat[fl¡d¢l ªb§·|›Á‚´¹›ŸÅpr¢VuŽ[rŒ@s˜]Š£q…‹OwcˆlfZ“¬~Ák“§r§µrvUiŽW‡œ]pˆUh—RPxA\iE{ŸI}¯^¼amšO¶ƒ¸ÿœÎ`i|7MX0L_';S,U]Aia7Mn4V{X{§u‚¸‡}£deg™¶ØúÐàÿº¶ð’Ão~»x—Çg˜vª¥ay–X_xUp„ht…^yn•©jˆ™W’œXi…CdzFIb>ThD`vKew_v‘k‡¢muŸZw™Rnn+HJ*HS>Xc:]sOr–nˆ¨cz‹Wor:uTA‰ob»°ÑÇ»«]}›Ge‡BTpCXeTjyj‡³y´a„Ÿ\„—KhwGqrFjrR_kMRkBQgJKlOYv?JkB]kYp†HcUr‘Qbp2<P(:Q5Ma?^cGsiO†oNt”Yuˆkm‰\€ŠX`OnzYU„TJmU]YC`ZH`Y?SaAfZ9n{8l‚MEtJL[EsL+j|5qqH~J€…Vt‚Xt€UV~WZZVc`/Tj;[^<_e-fg2‹jDŽ’Q«zR¦tJm]B[=WT1?d,?M@IQ*QN#qa%ws@MMN^RC_J9YIK;C^U>€aR¦|KªV›¼r“±y}·{z’lm…Sw€K€xEs;ly?It61C4&0#M'”5îkGÿŸbÿî ÿá¸ÿÿÍÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÿÿòÿÿâÿÿóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷üy¥ØNK•mCHÓŠ6˜å“™žy†¨†¨^…¥‡g±`b›_‘„HX’=Zl@t„0†K‚—]]^yn5W•H_tGm}8›‚4‰œN¤¥f{ºna¤…hLo†EœTƒžRˆg}«S‰Ÿ`o“_§–[¨¿Ž«°¬}³{Œ£„†¢›Áas³yŸŸM“Ïo‘Ýz‰ÎhN™s9a+IZ%~f$ÂŒDÓÙvË“h¼zV„V›–lldgˆ@hx?f_^|LbvJfc:ˆv>Z dWqUeP{‘W~Ÿd¢r²Ú‚å–o¦]¹‰Hb©¦[D_y9|y;€O« \Z©‰¶«M€ÿž‹S‰Å‚‚¶e™˜R|®~œ£W~œ{„±\|´\¸©U›Ó¡×ŽƒÌ{tœcä”WÊ´¥Ÿ£Š¤Íh–¦n²Žzž÷½£v¬ì™§Ë|c»|t†4`^1g€DƒJ|À`nŸUiš=|¤@™ª]ƒ¤x®›]¾ùq_ÈtSv)Y\#pq7€‘B±…^º¯—·]±¿R›½y L“šN´Ë_Ëi±¨iÅÀ‘½ì»[Áy(^$&@=@7MWQxŒ*‡ª3?ŽJ*3'K3;oJ6³Š~r¨“…žJBƒTBJae._‰.9‰'Td e}GozRjSb„K˜ƒ?{¬qPq0‚x1’¨T¹È{¯ƒˆ¡U€‹G‘¯[ƒœWNt‰6ŒF{F—’Q’¦T€”U“šH•Âm”±j›²kžÑdÅÊ|éÿ¤¥ý–†ŒQÇ䄸Øn°ªgϹš¨à£s¨R›¡U‹ˆM—šn›Ê‚´r¸ÑÔ®ÚÿõÍ븮ò—eÊQdt7^l=e`:Y^2`i6…Œjy¶WНkȽ•y¹f•ˆL–¨Z’aÿÈÞæÿ˒匃¿b¼z£É…”ÄyWi=X}7Os*Q†/KR*€zSz]ˆwuÿÿöˆñ\~žERs6\g3eŒ5_Œ-k}.—Êb…²?ª/k•5‡@Å›pÆhνhÑaÈœ–±]^;¡˜d»JÖ–e¹©cØÅƒØÜ}ŽKŒv[°¤g‹£Wx…c…™t›n¬¾…«åŽ”¿~´ü§ãœ‘Ê„®ËŸºäž–Îg”¥T|H€œT_‰M‚–p¦¾~ŒÀa~^¤lv‰XXv;ow[ˆ’u޲g¶×‘Î{w˜Xc‘Bn“@`Gp–\‰¦f–¤f¦ž~¬Ê‹‚¶g {‹¤nw”Re†1k{7es3Pc1Y_?Ro9Iv@bd ×ò‘ªó‚ƒº`šªVaƒA®`…Çcœ´i´¤UjvBWlH[h?hz^ÁíÄéÿ©“¦Pjd8fs9Ma(CP6rnHTg0[yHz¡gª}†‚¯jg Qn¡„¡Å¢©»ŒšÇƒ‘¸fÁ}ÎvšÍsŒ¹eƒ¢[pŒRy‚XgQf’b‡Ãt—Ñik”NfrC^e6R^=_‚NgqHS^E`pKYxJf|Qj€:Lh/K`5Sy9\€>\Sw‰exŽP_cCgdD‚\¯½u’™k›aŒKe~KTvFY„Mo¤]d“flŒvz•bd}PW{Fj{LjwCRk4>T2:X<KhAUwOe{I^qIcydx–Vr‘Qg‘S_6Re,=R5IiJKU2^Y+b`-fo@w|R—}O‰™[f¯uR‹o;qW2OC@>,hH(~T5jBžŽH‹µc]¤s=mf:FGb?"oV#g{EhpHdcH^dFYbJghCvkHwcFilFglIrs8f‚=”tH†™MyštnƒcGŒ_VdFEy1FaD`]3ca'ku7dz<~lGnsMYhW[_?U`Ii[Fkm1zC¨–Dw±h‰›xƒªkH§oBPSbR,\x9cb=“k<†LŽ{]TuTJZGrZ3̓:ÿÚoÿÿ®ÿÿúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿçÿÿùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôÿµ³âZc¥84kA%A<9#QG)—`)[œr…rI‰b•±ixºƒ„¨kl´wp›gTŠF©i>™Fa›t?zJCG2‚e-…šJ›]y”N{ªHgŽYg„GŽ’Hn¸RQ‘Psz3zŒ=f©g‰Š[£YU™k]eJzn0¥{xqžw‚Tsmž’d…ÓU|sl–V¸KnÍŽ„…bŽ\V}Ga^8™x'‡ÆZª x·²~ˆ¬€ƒ²rj„]j}H‚K‡šWVv¯`g‰Uc‰Cyv@[žRiR“•T–žjm˜na‘U„TXwbª‚c}¸’V‘e]nQtw?WUMn;On6]~3™rAêÇ}·ÿÀç‚^‰kOvDTd1Yk)ƒŒ6sšiƒ£Hˆ¤` `¨Ë‡ˆ°—®x§Ö—Ïu¬Ùz³“›±rw~l®†G½°†«¿ƒ¹šg’tšŒHÖ÷xÄÿ´šÞ„ÂkkZIJYéñ•¿ÿ¬ŠÊt¡V¡šNÙ¨aÈX}|2¬ŸF†«^‘”]‹b@šc>˜•B¯ŸS¨»`•§b ¬fÆÖ{¬À‚Œs’y_̽ˆÁ÷¨`£}Ix16h Hd CV1_3BBe!/7#Q76¦5~®Onªb5D=>) MJZ¢^5PŠ[,Q”jbu/=l-Ob,|5r–NƒQYŸK¯ U¼ÇˆÅÍ—»áx©Úzjˆ1xvDd‰>lw4s|;‘Tš”Y„½[‘‰P}’PŽM¹]‰Æ`žªZÄÅm’¼ewO´Ìƒû²cÿÿ¼×ÿ´Š¬l¨‰n¼±u‘\—¤ZÝË€ÔßxÓüŽÐì¥Øÿ· ººÓÃŽË”§ºnÑÿÍÂÿšãÿ·ÿ‘T…>bG*œ|cЧq‡³iŠœLUh+rt>~OÃÒ©Š¢pϱ‰²çœ´p|™TqL¦Ï|hÐJf}J7Y)wiPv K@l))>7DSk,œhÇn|yY‘•^vR`w9e€5˜¯ay¤@d}1[b9™Ž[°§kÿ¬•ø³¢ô䪽ÃpÀ†fÿ¾ÿÿéÿÿ©Â½v”ŸKr«@z©_ßТßî–ÿΚ¬Ã|ޤjm†Hi…@ŒŽ~½Û¦Èÿ¥Åô±Áæ«è¢™½’”Ç€}Œt’¶u²¡^}¡H]…@pz_‚•g{žMfˆ>Mb5ZX2^t:cT6PY5_]CfvCdufphg®‚^m¢ErŒQ‡£_аo—ÀjŒ™w°À®ÂÑ|†¯t‘·y޶ady3Rk$K`#E_-V€HhŸbt¡g‘¬ŒËõÇÞÿÂÚÿÂÎûކ³U¼c–×}žãu§åœÙctˆ5V^/^a9t“n¥¿Œw|PfsC\wDmŽP~Ž:]d7aa/OS>„¡}¦ßt„§s|®|ˆ²m¿w’ÇŠ®jq™e…¨ks’Mq’g¼iŽÐpv”WUuRs‚UŽ–Rz‘U‡¤oŸÁ{»es‰=MR6[Z2MZGiuPVh:JN/@N.BI1B[>gf7^p1QsM{ªjŒ¿joGRe8Ld<_l@ux_©¦sž“OYpH‚}Had;NlF]z[y¨v¥ÛvŽÎn€pw“Qe|;_|U˜Œdv’Weƒ?Cc*5V6=Y=HoVl^gƒ]qvšÊx”ÆxÄf‚¬IXs5Ka6QlNBF6WW)_j4YE]kT—]B`wA\~m`y]LvMRVCcP2y[5zvEŠƒZŽ“`‚§s]ˆ‚?`c3B@H8)l=!Uv3VbIUf?<XAEJ<]P6gS7VP:cP8cs=ŽzQƒ¦]v—fs’UfŽdiuPr{KŒ„Nh’Ki„[h~=~h=\pCZgIP_8]S1Pb=ELC^?6V9‹ŠB˜¢\‰¢m{Ÿxu¤qqžeAŽbD[IzY+uŸ7p“T¡s>Š~K£jbª‹YÿÃ|ÿó•ÿÿ¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿéÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÉÿ¾³ËJs±39o90A/,",)¡%ív&„̃f€c’„D¬Çl„Óz—¨z”—¬ˆy£{„£rfªY{=…¯UqÃq‘Vp GŠžT„Qq‡RƒšUxšW{‹D”ŒI—µT[´`b}SZ{5ž€G…´ns¦b|‘J\”d_tVi„/¦ieuÁga|sv=ÀœYeÿ{‘Y³¸[o¥o“xI~„^uŽQUh?yW,’š6¢¬pˆ±d—œ_¹›vœ¥{˜¦ji p{ŽEn—Zv F|›^[‡aboBl…TP~CKp=MQ7hU)Q‡9KG6CX'dg.‘˜P²lSSOh>Jm3Uq2^h4fy?hŠKhˆBÁzF·¿žv©]ŒYX„8jƒ,W†Gvw0fªUh‚E_ƒG]tSŒ„@`¯lª:¢Æ‹w¸•Ž—[Ÿ§{b§ ¨vH„¤u‡kD¶ÚgnÖLp>Žj)Èáx¾ç¥ˆÓŒg`RíÂMàÿ´Ôÿ™ÏÜŸ¯Ì‘f—_s_8°z\»²q|‹[вPŒ›\ª€Cs™S€‹A®¢E±¬]®´n—±Xw™MUz8Cs-–{3ÜôxíÿÂÄðÈqŠ^«ME|0DX,K(,T7&BI_rªš[޾nL¶Õd™÷xMåKBGSY(e‹_N`&Pt$uw2åc¨ÇxÁß}™½iœËhŸ¿mó÷š|Ùks•Jˆ€Aµ‰N³½muŽPw}9y6q‡2ˆA¤WŠ”ZŠ‚F†’Iw”V©˜`³Ä“ Öc´Qˆ™Z©›U£¿`ñôÿÿÔÿÿÿ¦ÿ±¬~T¯—y’„D «RÉ܉°¯d£·š¼u¥Ë–wz¦nˆ®vŠ‘SàÕ³÷ÿ½íÿߎ¢xUN.ˆS`‘x¢¹Š{¶Uk™C{ K{zPi]A‚ˆ^˜°ty¥U¨»XŸÖl¿Yˆ»[“Ëq£´ƒr°=Zz8Hv,YY7=J,4;GF.k€F_s7‹‰\j™EXg,xBwu=‘RxIxpAw}9‹p=ß‘kÍÓu®¬c¦›UÆ”güätù^ÿÁ ÿ᛾Êqٺ뿪¾`„«VÂfÃÏŸàðœÎÆ}±Ÿc…¤Nn˜>j†B§¹‘ÐìÇÕéÈÓø±ÆÛ”«rh…DrxKgdmyIr‚Gl‹JiNp•J_p9]n>_‘DT};krBZd1}u8£ ^b•5Db&Sy,Eq-Sb3ce<z„PyŒ^¤¹nˆ eµÃ—²É{°|¬À•’µSVj1Nq6Ok->R2|yx™¡wo|Peg‚ÊñÇßÿÃìÿ¶¸ä~fP\yX…£|¤Éx“v“ª_pAsd5tuR™¿dlˆ9Ka.QbCƒš\u®a‹¾`b.EG,YeR¬yŸ¸v~¬by¬ewŸgn”u„¨jp‘TlŒV}’Pdq9a}S…§o¸giˆAj“[¥´TWy<VsCyŽKyNuCHU+EG+TS2RU8qcAcc3O_2LT)@N(;P4MT4[\2U`J}ƒm–k~—Ibp8UtBcyVŠ•m”†CJY5ToFpj2U]:YwQe‹Zo‹m”»{¥Úo–Á]]„K[vD_rJqwXpœg}£Ql9E`+?\8OsYwšj¯¤ÆÇꕯ接à|MZq9Oj?OnGSW5gT3j^5Q{Ao`Kc:Nq=XOYUt<WpCOaAZJ:sY3x}L„`~‡Y~‰_cŽfOuhQSIVJ+bS([g-YhEJlA]J=UO7ZT5ZJ2_J4`3†ŽC–Sh§XgueasP[Jg_EXb=[aAe[BgqJ`oC†b@]m:VgK^Q6rm1‡u7wg:\Bj7——M„£fn‘p}ˆp}“ao‚]ru\r™P†–M„œVn‡e jOß‘Lÿ×–ÿÿ¯ÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÄÿÿçÿÿñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿìÿÿÿ»Æÿ±kµÿi}ÿÆ“ÿÿ™çÿÑqç¤?ƒf9D1>>*‚5ÏU& ¾‡u©•šlM‚±€k„›vFšROUdW:qŒC\ŒG~~Eˆ’Ikšr€…UŸA›°k|—m“ŽK|©Ix™[™šZ|L „7a¡nrpJ…™9t‘Nw‘Tb’[s>d“SˆTj®N‚|i¦C[µštw?ÅE€ë—‚žm€[†‚Hž~A`ƒ`p7k˜Sˆ…Bm‘UyzI‡ŽP|O™ŠM«¶q”¶ƒ~µƒfIo„KeŽMc€Mh„Sk>eP\{DC?Ed+iu)¥g1Z€Yt†=t”XgschhMC{G9=2ZT%?m7G_(c|'qyDš—Og½f“‘Ac‹mM€9ey4nƒ7Y‰AZ‚9`w;ZšEs8‹¡Wu‰xš‘ZŒÿ‰‹¯cj¬pjuBh…K[‡]ÏŽD€Ô’¯’V Õ—Ã…º³f—ÿ„‚©l¬ÌoH¹pl> иkÎÿÌàÿ±qè©6EAlb$|¶Sp>޶Oy’M’¡HšY¢ª_½®e®¶o·Ãz°Ý‰œí‚ŠœR‚§Dl¢9ŒºLËÂsØÛ˜ÿÿÈèÿÓþ¹k¬zI”F+U"C;)]$M>;CTxVt!Z‹'BY-pu, šcÒÇ’æÿÎ¶àˆºÿzß[¡Òkv×_u¡_¨š\r…Rª¤p¥Ù˜·ä’¯ã}¹Ï“–¿fœ·c…¾^“Dct1~/‹—E‡‘H…‡:¨–N™¦Z°¨\žŸMÒ˜aTMƒYB ¶d—±j‘©S¨¢Z˜·e£¶j¾à¥£¾tó¾²¥”oÿá‘ÀwŸŒIÈÅoÈÖ•®]œŸh³º‘Ž®f–´e½ÿ¸u¼S_ŠDvŸDƒ¥Oz R~fE¬¡Po¹OSU5‹zt”´†† h‚©_oMFV/pOGáã·ôÿܶç¢g‹F‘h¯}г˜žts·¤†v’R´½Ž‡ÍWkŠ;‚žV¥ÓqÛÐ}‚¹ab†E…yVª‘m™‹TˆN‰ˆR…ºU‰µ_š°gŸ¦b ›pœ‡]¨˜^“«TÄ¡q溃󹂩®a¾×|‹Ç^¤¹bѦ‚ô›ˆ˜QsƒP¦…Ãú¡ Õx–™c©¡r†³eg•A‰jµª€©s‘ËdZ—BjªP§àxšñzu©StŒM™ÒefŸ@n_ƒš[{NsSƒ™{šÏ‹”Ìt“ºpqŸPn•k}r¹u—Çvo±Vi¡Vq¨M`H^pAk‚Fo{C”³‹—¹…’«®q„¨Z_|GV\AmuF‘BNs8C]8bZgeÆÓÖîÿàíÿ«ªÇoQa28:2RP3Qv1>Z7QYIXcAymKœ–fšŒU|nBrm9^i@sqa —~ŸÃ‡±Tw|HsrNl†[uYq¤RhžPUQaz`‚™iw•M]:HpAT}Kk—e¾†–ÁnkR¢´…öksŸRi–JTD`sHsxCgV,ZP-L]5X\2HJ1SV8VaA\nKd|DYz@VhARa5SYC{{XhtJg{F_ˆ@YuMapNlzOmi;PZJ†yO}e.NeAp~Wƒ°awªlq¦t|®y~œJXuAQpGW~;QkDRn[uc¤T]„4Af9HhL^„l‹«‰ªÌ«Ì硺ߘ¶áˆ˜ÁHUkD\wKUzBLMF@J7985GE,dP/V].@M8L5CMS+Ie88_5LF/^Y*bd9ssIcfNmnR^O`‚`iq[^dClcBao3Z~AOqGXSDOV6hL8c_7lF‘|DsˆYzkc\|X`Y[oZ<`q7Qh9VJ/GI.ZI*dM(^g>li@zg=h?zgRŽw=¨‰J‡xEksPj_@wsAf€Rc~[u‚Le”H[‚^“gB«§C‡Ò„‹²{ÿ¬pÿö€ÿÿÔÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿÿóÿÿûÿÿâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼öÿq£x8N…@(PÄ-!ÿu,ÿÑÿÿ«ÿÿÿÿÿÿÿÿÿÿÿäÃíšg¨vjL‘H€œVbi@ksDއX‡¨`[©y@€LJL$_\+lq@p–LX’QmJ¦JŒ¦L€§jycvFr”Wx„QŽˆOr@«z?vÃo{ŒLw‘D…€_hŒLl’Nq~EmžQ•¦Up¿hx¬p¢§Q}»”sŒi»ŸSl½|fmY˜[;}ŠTªO|–b’E’«cr§bQŠOkn2–„6{“Všš_›£m‹¥rƒœnS•jbr5ReHff8i„Jr‘D¢›Rr¡ewcNƒvhXr[‚x4y™ZXVkh<vp?huK_‹B~‚AW¨dRn6`…:p‰?cŽMUWM™i5\…`]v:\‚.\7Zˆ8Gp5hm4všJ‹§eWk[kJN„7Ù_2±âÍ…sÚ}†•Q†¯_\¥dey=\aIš»X±Î‹[„‡l;¥¢`¯°†xÖ|`”IŽo2¶°{±àš¼«{oÚ¢x£:ɽNÄÈŠ¬Ö«½Š…¤_¤«\™ÇfšS¡ÀtŸÍ¼ŠÙ¸eõÿê†åbŠAri:|]l…e€BLrXvOnMÃÕ“›Ò“h¶f5W)gL)CV'<^Nr\{%t®;z¹C¢·[ƒÞ”bb0¢œˆœœeÂÆ’»ß®©Ô©„´{w»e~“E†©n–ÃtÆåžôÿ¼îÿàÈÿ®‹ó€k‡@|qY¯’U Í`êØœàÿ»±éz¹]°¹YÌÌ}ÞõÆë¼Áܤj»a“›C’–UŒ¨Fµšs¨£e ž`¬[ŠS©âš»ßÌäË^jFš›hÑ–¡ÕžyQ`n8|ƒC‡[ÿñçáÿóhâYS€.ˆ´[‰‰Kº˜i°×uÈb\±8Yy7~–[kX?uS?{\Bm?€‰W[W>fB9”l[‘¥\€ª\„œUHg5V—<^x9ÅtŸå‰ŒÝzŒ£Q”’jŽœwœÖ€†Á`dŽNe}C‡|L‚xM~\A˜‚Vƒž_wŠra€K”‡Zº™iÉ™rñÌ„îདྷmû‹˜ÿ³ŽÄ쀢Òl³lì‡ Äy’¹t ¾”¦¿|w…c¸¿£¶Ü‚Õʼnÿé°¢Gu”M£´gµæ•çÿ¿Þÿ¾ôÿâýÿâîÿÕíÿ®¤êˆ«Ì‡…¶O|´^t±^_žRpœ\Ÿ¾z‰¾Wh›Jn›[x»p“¶„³zde«·¬Îñ´ªÚŒy¤U`ˆ;fy@nŠH¥euŠ\‘™o¥¾|ºÛ…¦éÁú|™Ñr•Ì…†¸_‚‹UbcT‹Žgf{k±™ÂØÑžÂܹ?=H#GH,Qg)Pk=nŠQm‹V¦e¦°^c`0^a?fh=phK‚m]}l³š©åzz7O[>rˆX{™ZwŸWp‚BI[1HS9OfGcCe˜Oµo“¼‘Ä•È󲟾Zw”oº§~žl”Õzˆµ\|ŽMgƒLi}Gnr4Ye>gvAwo<[^2V\0FW=MdZo~RbpLlnHij9NaKuS––Uz²^v¬\v—\mQ^rDkZCaL…j?h`2Q]?_qTnšrÈl‰¸ct‹VgsGShBUnM[m8EX;PnQe‹bwœhˆžM]„CUqL^ucu™y“½’®ÑŠ©Î™½ð‹µÆScK_NmŠOIPT5:4,/.=,'DJ6C*>9)S9#KM)PM0Kj6[e4`k8Sv?TgOVaCv`B…v9R‰œgfŽfeydfhCiHxUnyVwRBa;m=‘–Q‡~[–}X~zM~pTurEZjORV>GT4NI+W='`H6XJ,fU7d]5~`Aqd?€_XžjE¯L„]JlVRZDq\,b‚Mp|LzD‚ˆNx j²šbÿÌeÿÿ©ÿÿÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúõÿÿÝÿÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíÿÿ²±õ|.Vg%&7)&B¨)ÿg.ÿ΃ÿã£ÿÑÊÿÿ£ÿÿÿÿÿÿÿÿÿÿÿÿÿúÌ¿ |”Z“†Bo‚GfaJlfCUoUhM@fN2Zn8nm=No·sŠXˆ“e€’^vŽce|XRqAciHmy;`~6dx;ºt6¢Çt€”V‡uEbvApl;ކDo—_‹ŠQ¢«ZœÄŠ™ÀŠ£¯s~Âj{¢lj]pŒW“i7™z5{X…`޶X•…Yj®sjiHR}Fck7„<ìáW¬þ¸y—~—‹]i sq’Q^•Qh~;^r6\}=^o7Ÿ~@€—eK˜^L\-bo4{|?¥fhzVn9—‚T__i\^Prt5UzXv’;Û¹]ÿ¨~˜Nˆ\€™T¤“NizkY}:B{<Ja,Cg%V^[{<ej5U„RPV*lj/d€O¨m8»½~w±Š‰˜Va‘cHuGai+ª¼D¶·‰WÔr`BzK‰zCÌô”ŽÒ‰l _y£HioBq†O‹x;zÍy|¦Nxš[xˆLt’H¸©Z²·|—[[{YŒ6›°€’°–Ž™†‰“o¡ro•Mz¸[oH˜°agºsq•<uÈeeƒIo¿XN’<@^3F<F3:T##BBFMx$g[)Ř‘…Ó¨”™ST®)8MH!{Iœjl”vpQL“º}oœdm“LiCš©nØÓ¤äÿÎóÿâÆöºªä™WUX|.ˆkIŠ…z„~7Ûª“éé´¼ò¬Êši§¨t±ŸŽ¯ŠŽ‘h„“Z·ªÀ†¦Ì‡¢T‚…D|ŒC¯kÒ齸ݵ¯ŠÃ©…‡¬g³cP…6€†HZˆ“cy“Rxž[¢¶]‚·LÿÞéÿÿÿüÿúºÿ¦ˆºb²´|²¼}³ÉЏmªÀu´Øœ’tqdÆ…Š¶ñ…—Égx‡Gng5e¨:„}LÃè—¬ç~‹²m–«R¢ÃwЏWºÂšÈò»Úˆ”ÂcqœBІ`ÞÔ¶y©hh…G½p…šL©l_·«^Œ}Oy‰_hŽO]•KoŒbˆ±xž±|ˆ¦V‘_›VܲxÒÛƒÿÿÇËÀĘnÍ´~ÈêœÅ੼謜ÅÌÇ‘€·a[p\ÄÑ®ÓÉyª}K~’C›\ÄÕ£ÿïÉØð¹ßÚÁÇ骻ÍÎÜë¼Íã«Ù鎴i¡½†¼æŸ½ö‘Ãe|»\y¬c½í ÿÿ¾Øÿ“äÿÎÿÿ÷ýÿÅ—ùsg“V‚´®ÖŸ•уƒŽq´×ˆ¤é†·ã•°ðyo•U —h¼¹„¢Ê{¡Ê™¹ÜŸªÞ§æ¹ê—Ðî‡q;j^Hop4D^Hn™\}¥Š¸Ã‚¢Ìi²Nmˆ7c€Guœ\yc”s†NzƒJp„=kpNˆvO–‘d³~´Ù›²Ýaj'?L0f‚SoKpu1IP*@L,Ta7Li?jEf•U|£s˜¶„˜¶ ·Ì˜€š>\‚Rtˆ]‚©t’³o„ªa}‹S£‰^¡ža£PZ…HrvErk;rm@hg7hd1_g7MU0NJ3hbDo}HXsHo‡_z–_¢oŒºu‰µz€¦b`qAcbKxtJ‚‚Hkl4ViGoxMntXp€OTj6GM4JZ:AT4AU8AY3E^EhŠRmŽRe]t“PfŒMi‡M_~R|“k–·iˆoŽ´‚¨Ð†¥Çgy¨VqžYk‹NFQOE6:61-</)>/A<'B>'XJ&OY/P]7Ll9Y_<od5l?[ƒaKtTY[@‚U=ˆ“E˜™e~žu\~vuhTj‘Iu]bVjUNa]8U<‚z=’sL‚oKxrI•}K}«KkkZcNdc5Vs<_E8jU2{K,Pi9mD>wg1†V9gG~]Cy^=w`MlfD|bC~=fZ…xT•›HÖ¥kÿ×}ÿÿ·ÿÿíÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿfæÿ`?}-C>03%"& 9&ïn*ÞÄp«ÍŸü¤’ÿ¤]ÿÿÐÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿä¬þõ pÓ–As\B@-A=$AP$I`*U.¢‘?€³deoHjKgJ9‘o4sˆYqsY`lFdxL|:q–=d‚?¯t2“°^‘[¤O™•L XpœZ~ˆI²—UçÀZŸ»Šk——rn©alwxhŠC{~Fr@ˆnHs8~”[z¡g“ŸU™l¹~Pp|g˜y9úçf¢çÊŠ‹³bJ¡ime2}–K²cÂj‘χiŒ‚g^C‰„UfV‚zKf¨mNVJ–V/r½‹’Xž€^FIfkM3]e2Vi2q0œI›£}ƒ€yv¢fR†R^s=qx@L`DGv-Hj(2S,TT"ey.RvE[^2hhGV˜Jcm4–—FŸžp™Íp]—_\k8aw7Yt<µˆ8®ó|“é›N—~pŠ>quCè«E”ÝÈ|¦k…ËOq»`ªD†¯J}±Rƒ«f{V^´\…z<r|[ª OÎÕsdšrXa6Ry8P`*ns:_œJ[a)o’3}¾[‡„S‡£d‡¤xr£b„±l}WÒØp¾Í h߇gBT 9;W"–¯FEÁGF_#Jd&Bh1RSd]•˜]g§q6Mbi2v˜NO}R $;(tt7‚šP[}Xot:ˆ»gÀ¶vÛÿÙâÿÉ´ñ«œÑ‰e‘aCF+GY"MW%Uj.iv+„“C±q€£\н[eµI`’4jy0~“Qk^=zC¬{ ¬‚¤Àym±V`r9““q×…°ã…u¬S£štŸÏ“бb‹²yv•pswEnz@’‰PåÍ¢·î®¾È’ÿùäÿÿÿ®ðºŠ”\‡¦[€‹Si¢F€±H³Ó˜aqIsuPjlC³´vwpO‚sL·€]”¤RȆf£ãoj_Bíì¿ÖÿĤËp³ÎŽƒÚbip@©’ƒ¢£v³Ûš©á…Æp“¨z‹˜Yƒ®eƒÀa—ªwÒ诤Ύ€¯eU‡E`vJ…vœ¶ƒ‘Ú„šyœ£|¶öž¦¸„ÿÓ¹ÿä½ØÛšª™o»×‰·ëžÇâ«ã嚢Âv‚›t‘°…yeŒSp{uÓõµTaƒ6uŸFgWUYM„„~¶×¡ÒîÀ´Û‹„¯v•¬‚ºÁœªÞ…šÔ¶è–¹ÿ º÷–®ô‘ŸÐ|½Ö—êì©Ïè¦Î¼¤æÍ»ÿÿÔæÿB{4\[k‘²“½Ð¯Êâ«ÌòºÓþ½×ÿÑÍþž§^¦S{Qx‘_mšVu†y”²ƒ À—•Ö‡q¡Zƒ‹L{„Jpj5KrLk„\ާe}®j•²ššºfcw4]s1Z.c{D‘‹[…w\”šk‚¥Tt„M}_ ¥s”™w”ÀlrŒF`o0IT2buF`oLmO]{A`r<gzGVuFqxKqvPavO\pISwlˆ©v§Si—Yk†YeYb†J_xUxtV‡vµv•¼u‘ª\x‘Iap:hwFr‡7Tj*Gn.Rg2ZV;lfLw~\{‚dx™co›dt‘f„¢ew˜j~«y„´i{·k‰Åo޽dˆ˜V}NylAcc?cg9]i+CK)Oa1La.7Q2FlNWŒ^f[a€J_|YmŒQe}KgˆHcqIe„mŽ·ry¨Zsš^s“hs”f}šVgŠFZp;AjVFE8JA1M</J</ZJ*Y[6ah>‘q?x“ALILcGfP6nl0`|`IxdTZNl^:zzBpƒOeƒVbkRnlOj‰O‚]nŽ`hj\eb:ok8{d=…iE„tG‘hJ¸ŸL‡Ükyž‘ŽyW•©Wj”^hZSh[;r`9Sr9wG>qa-~ZFxb>raH‡qC‰›Jž…Y¡“N– a¤hÿ´fÿðvÿÿ½ÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼Ãÿ8rØ$0‹^ !7?!23(#:#K<QD$sK$¨wL¯Ÿm¢ƒÿaUÿ¶_ÿÿÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿî™ÿÆ}¹Ž«[‚ÌfÈÇtÕÿ…ÿÿ¤áÿ°€ÿ’c±qÅŽJ€¾\^†g©\3§‚I‹ŒW‰‰M‡¡P½šAÿàVÿÿ´ïÿ¶ÿþ¥ÍÿœÑšÿÇrÚÿÄ¿†~¯~‹“G‚©iœ‘PsŒZŽKsg:—¡:lŒ^c…=z–H]“¾f”»uh¶…wƒC“¦Ešœ„Z“zŽn?f‘YClQKh/tr0eˆVƒ‹Ttb_^bg;’h<g¯cSZSxtL†Œ[Ù”T{ùÈl}_l_GpzMH™e„–hRUQ0Srfx]0aKfqB|CUxM?P`No2;i4Wd#[z8A}6X"Š¡Lj®VP@‘|?©‘h\ÔŠ|_8ZzPSw<_|@”Œ<‘°y…¼|v›€L‹efy9„Ju“_…ÆtZ´zU\1’{Mœ¦zV¡z€l<j©b°šS¢ÝŠz¶vv’[ª„Eu¬q”RKv¯Xk=zŸO€L—ÍQŽ·j„ˆZq†Uy„S‹sÇZavyB®¢k𬂏Ø×~µÌV¤ÚY˼uaÒ}|*l™Cª–OkÁiZ«<\l7hXB>zPXP+dŠ<E‹@7Œ)R>Š©W›v__€D¹‹NÏó«Åÿ°ÙûÇÞÿʯî³Âz€”ry[QŠ{_‘—e’Úd¡ë‡}ÁrlŸX{•Jµ¼yŽÔwf¹ZLo&g~KB\#Ve*c…1’›B¶ë Å÷w¡ï‹´^¾Ñ—±æžrÙd–”s‡¢[}¾r^ŽXIo=nN4•–_å°‰Âÿ¯¬Ûxÿß±ÿÿüÿž‡´f«ÂxºÓ¡Éó»Îü»œëŸe†B‰ƒM§¿‰GÂÄ|ƒ¡Fš¶M†¥O²…VǾ|•ápšÆ†ž¥´¹‚¡Õ…§}£»x}ªad…<“€kÊé³–Ê€lx>œ§l’°y‡½m†¸xÃX‘‚U¢‰lŒ¥o©ä†©Éx·â}ge>vQ^´“ˆ§¬‚¯ÒŒ±ç”½Ý²à÷ÄÚÿ®¸÷•¯ñ ±é—£Èyu®d‚¯s…`”ZoŒV’†·Ìx‘žP„¬Yx¨_mŸ^£Å„—«‡ÄÚ“”¿y“¹q‘zƒ—l–§y¨ Ž²Íš¶Ô’¨Ë‡…§]Bc%Li,N7PŠ=yGS”:Qq[vfsg…E7X;vškÒ–·‘¥» ºË¹ÙÀ¾Ñ“¬Õ}Ÿ»k¡šgž·lŠÂgc›RTWq˜€·ÜµŸÓq’¶w³Ò‰…®ZluP‰•f”¾vÀi~«„„¢_]k5Ug3Xi4[e6mn?~j:khL‹sV†§a}ÀWq¤Xh•Ju†[q˜Z‹T`’Ms‡MˆvWp{^bWp†Ym–KazCZd=^o@`g:Pf8axc›«~›¤d€³iŒ¯jн^v–DyŒZ‡©fw¨i„g¥hv‰i{š_t‡XqžSZ9Cj0TlK“‹cޝišªZ€ŠDUiOiq[i|Ma„?W}8KxXtŸ‹–º}À„Ðy‘ªj‰[ƒR}uLsƒR}‡Mx‚Bkk4Td8Vb5B[CLyoy¦o„¢bl—@Hb@JaBSk4Ib3M_6Olh‡«‹»UqŽOjtQZtHVu=Jb8?Y+]p@cl?X]7sRCri:`i>fkCgtEtvNk|PNvOK\VZJ?Wg+\[2Bg?T^M^k;[e;\d;lz@ˆJm…T|tTy–Vu`nnXulDˆ„C‰‰X|K}ƒN¢uK³œHŽØ˜«“¬¬l‚Ót~’trpQ‡rEŒƒA„uK‘fA‘n>‡mL‰mM‡iP}K´®\Ϥoþátÿÿœÿÿ¶ÿÿÔÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÙúÿuµÿX‡¦Bzd#HD#&B 6.,4*<-j?6f,6J3LM«f$£´Sm¢š~d\ÿ?ÿÆqÿÿàÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú¸ÿˬ̂ïÅuÿÿŽÿÿºÿÿÄÿÿµÿÿîÿÿÿÿÿÿÿÿÿÿÿÿÿÿöÿÿÿÿÿÿÿÚǦÿ¤‰£nvœm©‡Qc·lo~N“‡Dºª\n͈¡V¸O¦ªv’¹˜¥ƒ{»}eRikR†GxŸ†’ŸWMpehb4o‚7[p^x‚?q‰W“–Yr˜†T~LZoAZe?œ“K‰˜—™Tä•iíß»š_sÔ~^nmÅc?\Ÿ VX<Xr3oX0t£JfTy|HUŽWIR;dY.Qx>F\4J_,Me0R^*Yb0Qy>tv%ª—PÇ…y¤b±¼MÀöŸ™µ›§ÿ’z®uR‰D‹{:…Ÿjw¢mKhXl†K^ŽB5tÂfv³_GpOas1[~;‰Œ;н\ZœET8yl;r˜\´`”›k•j–²qŸ¢w_œS©;¸ÀpÅêwŠ«”‰•VV‡aUZ;jq6¹Y€à|r–f•Íl†Ãx’éz‡Ìe¢Àb¬ÉxßÉ‹Àÿ±¢—[a§j,A(O"ÿƒW‡ï¬]bGu£Nkž@ƒ°KwÊT“ S‘³|~¨j”»U¤Êc˜×Z•ÃS“JÿäìÿÎÚÿ̼÷®¥è¥Å|ŸšYª®qÉã¬ÃÞ·Õ羱ߤœÞ’ˆ¼r¦´kÝäÏж¥¯À›r®yj{D?‚8HY%Zy/Œ€Dðèªÿÿçÿÿÿ¹ÿª—¤WÌëΩù´¡Ó†»q‹’L‹§az¼^UŸEjk<osAë•‚ÝÿÁâÿ¶²íˆ»ÌzÓþ¬§á‹Àê²÷•̳—ÐýËq¤paƒ1¦ŒV×·‹¥b¥zO‘iDy_8‡bF±™bŠW¦Åx…¸Ts¼L…ŸN’š_Wg9€Tk›E_};i†6‹”^†¦Xl‘I…a|™[ŠŸl{^É™†™’U¡eJ›”Xj‹H˜¾{¦„t½Ø‡ˆV™Çd€ÁT~ŒP¥x³ÍŒ³É”ëýȿי¿Ó¡ŸË„{’e¸×¥Îñ˜°vMo?k€Qf‡O‰Še¦j¬ÓrâΘÂÞ•šÁr`ŠP‹}¤ßy–³c‡šYuMUw6;K/ˆ–ix¢KUy25H@_-ežUÃw‰·{‰«krIbšOf«U‚Êz—Ø~¤ìöŒ¦èƒ‚¤qš¶” ÕŒ©uеv“½x”´l”½p’Ðr‡Ïƒ…½|ޝ•»Òº¯Ü‰¤Í Æø»–ÌoXŒGa„Yе{›Êt‡½juŸN`{Gdj8ezGpmBsd„µgãw ºh®Ë¤í~“Îs‹¶l¢^‚ªf’Ê„—Õo†¬XˆMn€Vh~Vs£^Œ±Sk}9iŠA^ˆB`y0:W*>Y[~’gwiqœbi„]c„Qf€Mk„c’«ršÀer—Vm†\•ev’`o™qŠÁu¼dŽ™O€ƒX}n‹ºw–Âr‡µWev9M[5Rg1Rz+J{/Is:S~Ulˆm†¯„š´v‘ŠXŽpQƒsGrHp‚KgMdqEgl>^pIbŠKe•WcŽ_f‚[^t[dxDK`-BU/EX&AY(@T0H^Pf—…¸Yr‚Gbj=[d4Oq?^Mb‚@hcB`t;€dAt€IEXC[Ts@?mU2Me=@O=<=49B:@E9:@,KF)u[.t‡HfJblE…sD†I„¥Yi¡qsbi`„Ltib^i;nn<‡s?‘M‰‹VN—˜V¦¢S‡Ð~©‚™œi‘°o«£z¬Z°d”\™zaœyP®”N³¼c«ªr¹‹bþ´cÿåˆÿÿ¬ÿÿáÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãñÿhŒðP¥{Žr~˜rƒ™iSžr+Um"%)$$/)@<^F Ej07cYBV1cW*‰‚=‘k{zh~Wåw?ÿ·Vÿæ¸ÿòÇÿÿúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôÿÿÿÿÿÿÿÿÿÿÿèØÿ² ¬ž“¦l{•h~”S‰ŽHˆ™Nƒžb}¯f™az‰J‰ŽXgž_r‰Tb™PžŽK‰˜O¡‹J¹’ofœjGiNP\'Q^;KL1Y]2bxF¢l>dhZƒDEp:LY*YN2b^FËuKбqÙÔ’‡\^lfmQ vKY¤q]f>tq7wtL†Œ^c—ppeE_yJY—L\`0UKJm‹7O‡>fr2¢Fx`h‘[b|7`ŒAqpJ‰‘U¦œd¢ÿš¥”z‡•‚j}O^‹Ol…?T~MQI6VvAâ…HþÛn©T‚¡a|Çr]‹ICz>TN&qh5½J‡yQJVk.ƒ:¶m¡®f¼Í„‚·wv©IužV§§J›Îm„[o’HŒ„G—äšT§áp Õzt¬qq’Xw¤Vš‚L»Æ‹Ë㵺㾎ی¸o£µƒl—\IE6DW(Y]&˜–BtžfŠšWÃÚ{ËІ®™}šXs’?¶ÅdÃÿ¬¯ÿ“Ëê‘Þÿ¶Úÿ¹’ÁwÏ×máÿÃÓÿ©Æÿ½¤è®¥Ån–]œµ\‘»{“®{›¶¤¹†¬Ë‰´Í‰¿ß±¸Ì¸mž•rh«a`£JgˆTFl9Zi'‘Žm¾·Øú©ÿÿÿ¨ÿªŸ¦EÂÝ€„´7G0x4(Êà‘‡{Xº½¯x¯‰r•J¸µsß¹~ÙÈÑ몹ۋŒäo§T‹¦aµ|®¹‰s™;…¤\aŽE}ŽC ¨i·¼pÿ›¨ÿïæpÛ«q϶sب‰‡³lŽxV„–NwvL”`®Œq{šSœ§c¶²u|«Lf8[†5Tr.\w1Um0¬p±¶tvl=Ë™…áÿª†¤O †bl…?“¦` ÆhÖü›Åÿ•Ïà©úÿÊëÿ·¬ÿ|´õuž¤dçÿ±Ž·sb‡IUvEžÆ§ØŸ“´‹›ÁÖ쬓¿^R€/RcEƒ}S§½j·¼ˆ˜Ôh½µŒûéˆj¯SfLŠk™›fy¢PO{38R$/MZ=Pq+Kn,Kr8u¨a¥ÐŽ§æ›§Í‘’½q—°¬ì˜ªØ›°Ü¨°Ö˜‘°|…¤y—»v‘²y£x¢ms‡Zu‚Wiz[…wžÊ…¡Ãr›Â{¤ÀˆÐ·™¹‰Á÷™’Ü{z¶`VJpzX•ªs¡Óy“Ín€µWqIe|<bˆNwšu¢ËŸÇü¿Ûú«¿øŽ Þ”¸å™¢Û†¦Ï†É~¡ÊŒÊœÃЗÖqÍh†½br¡gм†˜Ðjw«m¬í‰¥âd°FM6CbWqŒj}•l‚´qƒ¿mz¸nƒÀhv¨P[S\tF_wJ^ˆez˜{“±krŸu‘ȇ”»vt”Yƒg…£kp•oˆ–~k€ŽK„yMe3Tx0U}BOFNy@B`Tm‹o€«_tœZq|R€ˆMpDd‚P^}IdtAm{Rw‘b›guVb{?HW:H]GYnCTk+E]1EY+CY'3D6FjWh—{ª\sy2K\/Fi<_Yr”Xg…U\d+dq;yn=w|AW‰TJnW6`6*M1)74,&*B1 NL"[a9bp>wD€¨Iiˆ[bZxaI|B“ˆ^y«b\•zRZ\XW8d`F\h;WqGsY8‚d8„yJ“ƒR‹¢a—¬r‘¾q€º…‚n’]¿‹RÈ V®¯u»–oä‘_àÈnðåƒÿÿŸÿþ³ÿÿ³ÿÿÎÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿž”ªY‚¿)Rj9(0M<"`G.Ž{Lz³m+ˆƒ!-L &(&>0Q=…k=‚ ^ZŸ†]h^bjLEaKZ:GaE,cuK”m9Ý‘Oÿ€rÿàÃÿÿïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÍéÑ—Ÿ¢ž©Sƒ³t€Zl“g_‹M}{EiŠRc‘[y˜O‰‡\rŠWg‡P‰uO©|QÀoŒd{UWhHRk8X[0UR1RX7el6qŒC‰E€‘jN¢YIhAHb-SR*]|<žLµßptËq©gbC††C»Y¸§^~»c‹X{x?syVbvOs|A´Mu¸Œf”`azH_|Bl£IxQu¨Z|ŽTk˜Yv†CiGq5”´âŸg|ÿÄe‰]`¢C™‡5arsyGg˜YjƒKem@ÿªYªÛ¹z~n|“Z†»^_Êkm•JYQ_[5€™?s’Rh•P“‰DÐÑpµçŽ·Öš“Ó”ÄÌzű¢›¹‘o„_oˆ<·–R™ÁnæøÞÿÈÿÿljþ±ušW”´K“Ò‡ƒÃh—¸ižÂ…‚¡}ˆb‚P–´‰a«mKc;n=£©G¥Âf¯áx‘t¨ºtiŸ_†˜Jr“L‹£X™ÇnÄÛŠ½úÚ¢ý±¥Îÿî•Ë‚±Ìyðÿ µö°¼«€ñ¶¨¶‡ÿÿ§¹ÿ¬r®hŒ•j{šk–°i¾ìkÊ{Yƒ,[\*\I.XQ%s„B„xOFe<AZ2dX;n†N”š\ÎöšôÿИ刎Ëhu³qUnL0C µY>åÖÀg`Ez€M}SȾ~âÿ°§·{š±ss–gŠ˜PŒÈSk£;q‘Bh‘=xxAd°Ox|HºÀu×è’²ß†Ðæ—îÿ›ùÿª õ‹ŒÅ`¿¼bÉÏw€•Euw8gw6bh8v}E„•Yy’I©žq˜•s‹ƒUŒ’No=b‹7]|6`2‚‰LŒ€^WB3ÿ—¬¹Š¯Š}“š^nx5ŸšPÞ·‰ôÿ½ìÿºÎÿ ½ÚŽøîÑðÿÊÀç‘”¶T‹œS\p>gnB„¡`{—[“¡n©ÂŒ®ß™Ëܧš¹ee¤@Vw/wyG•“`¤Ák²À‘½â£«×–ØÚ£ŠÀi~‹Yƒ–Oi—VIv($>%9:J+Ru;>k*-I'_Pf±±š²½“ŒŸ{œ¦r_ƒ^·²•œÌ‘›ÈvžÒfN[yHu†LHm4avJlŠ@`E`¢@U‰/VqG„«kk;`‚>dlL†ž~‘Ð}žÜ¡®ç£ºæŽÈbfžER‡?RwAJfD[{h½É~ÒaqŸH‡š_}¦‡—Ñ›·íŸ¿ÿ‰ ëŸÇ…£ÉˆŽ·z¨xš»ˆ¦½Œ’±w–¶›±…µÑˆÆn†½z™Õ™ªÝ•–Õ‹™°}•žbxYp©L`’Zršf|hƒ—ršÄˆ›Ò™Ì€¦ZnVmŠKp–X²n|©xµ‡”—ƈ·z¶|ޱxŠ cy˜Vc€_m‹Wy’J„ˆFop5LuA\‘bu^o™GTˆ?OpMk”^x©hsŸa†—XrˆMe~Oe†K_x?atNdvXd‚^kŒQ`{>Tf9Sh>YlDTp:Lb1Na6Pb2AYHWybh‚loŠ^[n3I^3Eh<XnLalOYmO^€<QuLVdCbmDnvFz~OtSNŽP.lR>26Y9eZ"yw?·…Mÿž`ƒÝo{Š{b‹c_h[j\AtWJXnMRxWXXSho5j‰@c‘]_tXxp>˜…CžUˆ´g‘—g¥œnšªq‹´€€–~†WšjL€S˜‡oφkÿÜoÿÿ°ÿÿàÿÿùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ³°ÿ}nÏVg•ESC<@?)408,%&6 h* Œe'Rˆc(Pj.,+04/=!-6 d3x`(p|aiqt`oc3XC"27)c"gn3k1®†Lÿbÿý—ÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜâô—Œ…•\¨Vl b“oI€¡MiŒ[‹˜NŸfš®ƒ`–wq{DeŽUeŠH€p?‡’I•bv‘_XiSLj8Cb-RL&>T/BF'b^.]€;NdMSe3Tq:Vh=Cq7k\*˜˜B“ªom¥w{{^|˜[}®n{²b•¨S¥ÃssÂ{neS—\<t–f L”²`™®¢—nl’‚b€RŠ•CZŸjX}Dhq<ny>Z{Ddq8gp<„r@ކMèÆ‹ôÍ„ nw…eˆKN~Sad.pˆDptK‡‡Hÿ—f‘ÿ蘇]‚§r‚–b™±šÊœ…Ài–d‘‘<Œ×m ©cªºg¯®oÉœqÕ˜h¶e©ŸA‡¿‚‹¤rJ‘SnX.|–Z½ßn˜½“‚ªk‹˜Z•分®hl¬Y‚‘H–«[z°aš¤Qp£`P~:\h+‹¢K¨µhšÍžuа„‚©S¢°\‚ªc};ϧmï늪ÜwËk…§Z§½r¥×ƒƒ»|R‚@Kf8žqF‰¶{¶}‘°eˆ“JÃc°kØËiÿÿÀšÞ’da7n›S^u8£Réÿ·¯ÿÅL›MOJ$ZH(IE!‚b;|Oi`OhBF1ll3f@¨¤t½¿ˆ¢Ñ|~Ñ|D7p]H†Aÿ™f¢õ¾„gœ…¼b”Êeí飱éšcˆWas>w|H‹’\y±MkŒ5†®C¯ï{íw|›^‡ŸW§Ûjžåˆ¢{̽ ºÃ—©–j“¨_ïÌŒ×Ãi£®n…Fy~L}y=‘Vé¾”¸£¢¤i‡ƒIq‚9ln3vu<Z¼¾{ØÜ‰ÊÀǧ‰ìÍ™[X3ŽfVunJT^)yj<²—cÈЉa‹Lܱ¥Ýå¥ÕüžøØ¨Ââƒz¢Kž¹_g¨:_>fg8CE'OW,uŒYµÇ𥯄¯m}¸ltŸQp‰A€xK¥¿lx‰J•—‰»âŸÇ¶ŠÎß‘¬Îd¥©o–µul¤G9i)X‹Ci±Sp£dSv9\n<ge7jgZl¤cz f~Éb^¡Mq‹^ŒŒjrŽIzj„ši^?kŒXˆµkx›P€¥e‹Ó„¢Ñ„ˆ¿\x´Uq¡Qd’?[t4Ju/U€f’´|’·w”¯}ŸÜœØ|“ÙvˆÀig¥MVˆEi¡hŸÇŽÖŠÃr‚¨p“¬‚·»ÝŽÇÿ…²ö|‘Çm€¨nˆ±^ƒ¬h’§x„£x—±†•³uФp ¿s‚´lš¨„µ¼’¤Ú »ê‰¯L_…ošÙ‰Áhy°k€´hf‹<KlGZl“²‹™É}‹Ån{·b‚¸Y„»m‰Æ{ŠÀ™Äz{ž__€bjŽo‚§z€ lm•hœe¦«g–™Ndz<Rv6P}Cg§dy·xŠÅnp›Y`„=A\<Ryfs¨zzª^w˜`o›\iQ]€T]{FRmFNpEPsL^FZo/LU*IL4DYMc…TeFYm@`oGlyQfuOXhFSiVl„Jk€;]_-EI/?H9ETLRƒPUjT^aBgnBg}G“TŒ‘WsŒ_E}bP>YO<)NX)_X5€l4´vAl[dwkZmOSaP[S7[S4l_9m‚D¢mP›ž?Àt_Ÿ‡iabvHˆ•Zƒ†mw•fp™m‹pN„rLj‹\ut[„~S‹‰QÀaÿ±zÿÿÿÿÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÞÿÿN·ÿB@B04r;%Oi3AB61L@50!,;-4 01<2!!00/'=(N9YX,5\8;B0CC4O-U9(B;+=C-?M/'I'k!ej¨u5ÿÃ]ÿÿ¾ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒÿÿxŠt{ŠO};g¬uaw?r9‹©U„jk®pŸzaœ©nqÃmc“TQu>KkBwY/{”Px€^q…NMyWHy>6R,UL*Re4Xa<—Œ8X|U[i;]o9[e6Tt6Dj5oj*›NŠ¡v¾xŒ—a«ÇqÊŽgÁsh’IWkJ¥{?ËÇyz•Wta~nAyžUmyPRwLjo8‰ˆRŒhr›j~—Kt©kt|[~S¯‘R†›g|UËid¿°c…UƒŒKfyLNmCOh3t‰AyQgŒOÿ•FiŶò‹Mšÿ߃²w—žuœ¼£]Œˆ…B¬¹k³¢}˜‘_yªm›[ɵr¡—„u˜bÄŸS˜À|†ºtw’RqWtBc…PTk>dX$ e?l‘w€žTsSlš<wœJTšIg5ržJvuFoW™žf¹sŒ¦Yš°T†Ésy J|ŒJw|;ŒŠAµ¥]£’kšjBfŒNan<xl;†zej–KRƒ8P[†®Q†ÏlV’Ig’Aa|0_”-•‹HÔáh¤á‰š¤bŒP“°bd§[ˆB±åŸ…¼qhVIp;BK_T'iV&[c5PNŽGzªc‰µRŽÙpxÂR£ÎbÒû™}Àeü–³àÿϺՑÿž©ž×ºƒP˜–i‹€T™°eàÌ›¶ÆŽ…šD…JxµVc;e€8Qs$cu$Ë›£¸ÿÑ•›[À餽⨽ث†àp“äx¤ÄWZŽfOæ—}™oå°‰¤´i˜—Q„¡Ay·DÒœƒÚ«…è·ŠÊ—s¤¶f†‹O‘‰M~~J˜ySß²ˆøÐ¢æÿ¦ÿÿÑè×¢—|\¬¡dxd<^Qe_8\c9…{aTv†Owh9ll7ji2}‘=}¢5yšJ‚Ögd®Fic6EX"ZT1u™HdƒP‰¢nÀ{›Â¹z„¢Wƒ[œ½nk¦O™œˆïÖ¡—±m•œ‹ÈÚ›•·l€wTœŒN„ªE˜²v¶Ñ£…»pT;AB/JM0E`3NnK•ªtÓâ—¥ævl–Q_‚;X‚7\ƒ=WrQy§eŽÃƒ–Éoj’Gd‚SoŽXo…UŒŸ|Åà”‘×pÍUe„Cˆ]u•`m•_^zSauKq]™pŒ¯„•͘Ç}˜Ãu§Ëky½b{›`o†V`kPcoNKJ7GMS‚Ÿm¾{~¬MgŽY}Ÿa²o~§uˆ²}˜½Ž¶nk„PevZ„‰dŽ[g‰¥…’¶’“i“·š³Üª²Ü‘Ј¡Èry¥ZhD`‚V“¼wŸÊx“Á‰¿ä‘¯êqˆÇzÄ~Æ„‰¶g‰ž]h¡g{€•ƉŸË‹¢Äš¼„Ž¦j„—Op€EYx>RnMe‰f|§{”¾w¨Ua:Gs8Lrgx¡zФjƒ¥a¯o…³kz¥^k„M`‹YfœYY‚RNo?D].A`,AY4Kc\iŽj~“V_{HXpMfkMxfEa[=CUP\wThzAXb5KS8^[@edKRkGZpFfd7w}HŒŠ_Š›cežmaw^eXDZNBKR03Q.N=.]L Pj4X`7J^0MU0dR4fk5xm<yyGs}U—n_~—OV•uDfo\EFrV(qoIˆ\U€aEztOˆR~Fu}S”„VÿžSÿâmÿÿ§ÿÿÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÑÿÿ¬Ûñ¸²†Ç§¨º–´¥š;Ö«,Hƒ4&t,=i5]421q89128C6J*4C%1"(#C.KV(S\6Sk;Zb:Uk-?d;<7&K.#jB O|G¦j4ÿÅAÿÿ¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØÿÿªÕ±e¡c͉Ag¯v¦ŽGvºn]‡o„}O›—X{”d}ŽhiŠV†zG…“YjTyzD_‘DYiOpjD~‚Ztzc_cqH`r8eJQ€MPf4C]-Za,W:dw?K¢O^c8q|LkcjsKŒ†E²ÍrŠß x²o]¤N{ŒAu}\e…OPkEgo/‰zEœed©xty=U|IQZDŽˆEp›u^ˆcy|CO‡d\U:YTAhXGpa=·Ý`s¤”™ƒUvé~SrEbo>`~Hu|B—›X‘žiÄ¢VqŒv—wGêizÿÎLr@EJ/^p5’}D„ºp|ª^oygwgOÔi=–à› b}o^†Žbª§Xt¨tdŠBSwAg;Zz@Qp4CX&Hf*iI)vhIz›ZjGr•AbšUurBªwe¤Fvv3¬ÓvŸÀq‹½mu¨MrœCUª=tx:j{:œN™ºqŒ d~˜g”žK\…9Nq5Yl4p4eŠ;z„>£¶†q¡s“Y„¯]}pTbD‰r)¨°X©Â]¿kq–UlxE˜Éd‰ÇhŒ¬NžÇ‘K¦E?c'YO&g?…ˆS«\uÌp…‡U»‹ÄÚ ¶èµ~›k«“VôÿƒÁÿœ€«M·“móÅÕ…ê‡ë§¢Â•j~Lª`¬˜jQ|;„iDs—M¦¤m¬Ð‡§Æ…[Ÿ:Sw S{-Te'™ŽX¦ÊˆÐÙ³矤á«å‹‹ã…~wQ•¾zp|5®‰cÐÛ‚Ëޤ׀|{Gr‚E‰ƒQ·•qÁ™ƒÛŒƒº¤p³—qЇVŽ„StŽIˆwVÆÆˆÿç·ÿÿÂÿÿÂÈÇŽÿгÍȆ{ªV`a.Mb2Qq4rKvµT[h9mƒS^j<=Lcb+y¤C~Í\œÉ‡Ÿ®wjžFR}1Jd2pNf„H²Ë“Îÿ§¢åƒŸ }²nž°‘»á¢ ¿|šáƒ¬Ö†˜S^yCxkS¼“‘xŸZŽƒ\¨¡r¢º{®É‰âñ¥Íÿ˜fÍVyym‘·~¡à‰§÷†Ÿâ~“Ôl©X{‘V_‘??l,=Y?–¯„¨Äq{£Na‡4W‚/R‚6[yAu“c‘¾“ÈàŸ»Çtx£_¡Ç…·Ð…žÂdi‹Lr¤LY—K[ƒi ·™ÓÛ¥²Ö{y‹Tq—Xn]i›kŒËka¥?>p0*S!4R.RwRn‹Wb†Oi§q~»pv¢\b‡bncz’h…•_sŽXz¬^o§d}“MpzMqŽ]s‹Mag[‡©Ž Ï› Î®à—¯Ô™·a‡¢[‚¦d“Àv‹«]mƒh†¨ˆ¦ÆˆŒ¾™ØŽŽÅyu¨aY›mz·†‡À¸x޶yœ‚¢›|šžr”¥iŠ¡Nk…8La/Cc>Mp\kŽb|by¨Zd–OQ„ahiebq™i€¬oru…ž]^t]\‚q{šjiƒZ^wMWxC]wCTt>Moaq—dt\rŠGbeBhX>h[=b[:WW>[iXu„NpsFdiJeoOsyOvR2h”9†ˆHŒ”Y•kƒ›|Y—vdxigfFarJTeB@e;CH9QJ%H]'YQ8]c,ee.en@fuFcrDhxMp_Ew`DDjGHMSNM>X_-\X5lX5†X<…o<—jL²…WΤjâšhø¢rÿŒtÿÇzÿùÔÿÿñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmxÔi^P‡lPˆ–Y¨Šdi®l-†166h,1i3\25Dj(xMR~j$Z6/}AE31(B?SO+pN+q†BDvECNMdH+B~HAMFAB%\O'ÿ~2ÿÿ‡ÿÿîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛÿÿÒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíÿÿ¸®´¡hj™gŒƒVw™Y_^©wMW–XŒnAt‰BmˆWZ‹YMh>ŠZ1¦]h^\Lh9MT>hN;rCŽƒP‰n_v©…z˜OjœnP“^Rf:Je)CZ0]X*W€F_l@Q]@hf6W€Xdp>ª|>ŒÀ{“›djaeFBcA`X'mqFx•P}wJ“„J–‹W^uDzu1]~EMbAfp5Q|QX‚K`€BQ~CL„FYg,tF2ªeI¦ûœm°‚¯žMY ww9…yHo†b~p:¬¥TÝÒ‚o£€kzP`oGˆX?¼â™UˆpƒD›¥N®Ãqšã]whds2r=æ§ta}fZi2hu0–y<z®l€™L‡¤e€ _KiNRl/b~7]”OCm=V]*k]AjUržSj¬H`‹9z¤L™W¡Éwó•Tµä¶›m«ÿ›h£U„”Mc~RYv;Zh;fr:w‹X|œXoœB¢‚A·|pšNP?\k+lw7±Pw«fOX=cS7ŒSÁÜ‘œÿŸ{©U¬„ZɃaŽª€L=¤Ô^³å®Æ„Ÿá‹ƒ¤i|¬Yž°>•’ly’I¦†I¸Ö’7;L=»€è‡K•<‚|9á§hä×Ûö”‘¶h¡wHÅʬ£ø˜|ƒM‚•Y·È~€³ado5†pD‚¬]™¬bÔÞ{×\ži…ÇgwJTo+Dd#WT+kpSysXcfEj{BIm"Xu)‚šYœšcË㌵ր¯Áx¦§gxtE“Sž“W¨yaŸ‰[žmĪzž“Z¸Ã}·‡h›jO¥rY»‹ÿÿÇÿÿáÿÿÑåÿ±ÍÈ‹Ÿ´f¬Åxo§Jb…C_„>~‹T³^y¬\h”RF@(“oS[v0jxH“¦~´yciZu[UzkMxuL~OjlJŸ´ƒÞþ¸¸äcxBxN˜m“—t¹ÊÄÿªš¼ilyF^Cmf=eZ8€{^„›SXy-Hr-Lj6¢›ùÿÐÐÿ±¿å„°Ë‘°â•‰¼wƒ…jž˜ŒŸÕ{„²~±ûƒÃl›×uÕuµVl¢W_ @V‡9oAg€Fp›Zƒ£n}¥^h™It©c§ú“Ãÿ“¢ÿunÓa ÍŒËÿŒ¢æ†Û—¡Ô‹ Ô}‡ÏlŒ±jq–j›·¢¾Ôœ¼lt“Le‹L`…DhˆAS‚=a…_½ŽšÊ‚‡¿ry¸bxPbz?Ca>aje“u¤Î¤ÒckžRx‘Ur…CPnFj‚Z‚‘]Š›k˜§av‹K]w@VrNrŠez™di†Gb€Qm—lƒ¬…žÇŠ¥Öˆ§×ˆ˜Ê‡–Ê‹‹ºsmŒMUyKg‹Sb€Ed‚br—]h|QopBYr4Gk7LuBSzSo†a|•[| k¥ešg|—go jw©v®lnžei‘O^…RZ{_^fc]ewWa€ShŒZy•NXtNj‰Xn`|ŠVsn;`V=_^E[hRatW]Kf~I]f>liLwtXˆ‚U•g5š;³Ÿg’©mq yjloy`vƒNs‰Ku‰Vf…XQ|LTc?ma3Hu3HZ;cZ4cd3^j=^pPTdGDk=MR4dU$Rn4\M?iL0hh:cwO‰nYÌuPÿ‘Yÿªxÿ{ÿ«„Ý«p‹‡´d…ÿ_LÿÇÿÿØÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×䨟Ñ;e·%/p"!+B }GgŒFvŒ_¡„KM¢k;`]fF*Aj3{\;W–>MjmDL,i?+’\3K«^LkbJa1\e;npFvtOd‡OJ‚GsR>‰f$€pH’vPò›Fÿô~ÿÿÍÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™ÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^|¸ºrQr®cŽfg¢Qq„N`Rfb>_lH¦q>n¤]|Š\{VM‘sŽwHoZQZzF5X4HJ*`U0R‚?RbEe])€”Fr™nl–rV’]Yq?lt2My<dˆ3GBSX-Jw4[f/waCY†Bƒ{>«TÒmX¢Q@b5BN$”]$b‰`~jC\„_o]8š‡;ÈósaºTa>zApTv‹W_‹aZ{=ˆj/p¬bOmUTV,Äe8¡ÿ³…‰xf˜mRr>l1yrE`~O[f2Ó‰AÄ¿dŒkV_6r^1‡_?Á†DtÖ£~{L´£a£Ö‘solb_Hco:…‚N|–YcžJny;k‹F—}<‚®okˆMmR1L;K)d;h‰M^oBx]M{A$L(=/z<y¦ku›JxŒK‰Y¯Á|xÖ– œVÁ¢g£ÿ³vAg¢Wrp3^›U`r3ez=ŠMŠÀqrœH˜Fª_‚¦c’¡No6v–H²—s‚ÙšK˜CZz3f_7‚‰Z¹±~Éý½“òl™Ž>¨ e®eìõyÞû…ÿö“¸ó™¢½lr¨ir‘]pBuvCsu<vwG‡„^buLys8xzG‰{hi8²cšÍlš“Nq“gm?$°†Uƒµ€³”a‰²dɧg°½u´¡eÉm¶Š€XŸk•uŠg€i;Ѭ”–ÈezmAFT,=a'X[Dy”s;‡/FE%Ii/a^/˜ r¢È€ŠØgx“>”oN¶{c‚„P´{UÕ¥}·±w«€f‡T¼Œk¨sd¢ŽhkH’T¿¸¿™ÍÒ© À†ÿÎãæÿ ÁÞÁóš¶Ýˆºó¢µà’Ên†²j¬Ä{ÊÖ’‘¨\am5[S0}‘=b’3]q;u¦O[v:SZ1kVAp}Ko~Cbw;žƒéÿ¶¬ñ~f’By{B^v-Gc6³´¦Äûª˜ÐsqµS¹Á|‚ Q•“Q‡¦Qo†Xt¶NUŽ1Bm2R]_Öγ·æ’«á•ªÍ ²s…ªb{ŒT˜Z‘¨}޼–®ÏŸ¼ö¡¼ï‰´u‡¶pµo—Äpm¼Ld§Nj—Pt’b‰ºy„¸gw¸n½ó®ÿÿîÿÿäÿÿÚýÿÈöÿµÐÿœÂýžÙÿ±Íó¨Íð¨Ïá¢Ïzƒ¦_tˆJgEgTy•i’»r‰±QcŠHk–Rp Zu”nŒ´“ÓŠ”¢gp‡HMp;>p5GdFwuU|‡r˜µ|–»mÊuœÙdr©Ld|9Y{3[‡B`–D`‰Hm—Rf¢Yk“`¡cWožjv¥pl˜dt–ix•w~˜nhv[k}vs”cfHN‚Lr´]m¢h‡¨y¹m†«W_t;Pv;Su>JjF^tSnyUjIJR;9@;OjUY€ev•†µ‰²q{–bk„T`…[`ˆfq™hmŽ`f‚]q”gmšdv†IU\:C\?Ma?OcFff>fnBivYl—l{©g€¤U`yCOX6TJ<]\R†wNˆc?‘ŒH¨‹^•Šk|›xk~tusV|†O€ƒ[‰fzYerTaiHjk;[o<K`GUX:oW,p8e›M?T:RDb>%¢m'„š;bšixcR´^<ù{SÿŒlÿ±rÿ³‹ÿ¯˜ÿÿ¨™Ë–”®‡uvÿbbÿŸgÿÿËÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ Ëð>d³%,U,OxPw|K`„^‚xQ{y=[hmlRwqE¨ŠH[Âp5sƒ?:-UTrq2³Y8wÎ{i”frTXhDlcP‡jEPŸSsPUq„8•Gÿµ[ÿÿªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ«ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿs·ïML|€{7Ñ£U„²yqºdrWSšL[V?~e4‡™RRbUMBjj7qzH¶¡SW~oOW@NH*J]:j‹?]™VgnP—§EŒ¡YhŒYvoUe¤MPjT^i=†p8˜”\_¥mQ{Ewh/„”OzkM@’1r¼_u‚ZjRZ‡F@m=HR!|_3q™R…ŽQC¸|n^5§“DÝàŒÆÿÉ¢ú¦mׂSŠLVi7^l>ny5s¡Q¦°W•¹”£wç·‹ôÆzgmˆX}xG[sDdY0V}Alb/h‘Hˆ?k”chƒDx[9t{Ue‘Q„‰N|‰]³ˆG§êš¥b\U|u7‚‰Hd¯g€¡Mn—W_uK¸q7tÇy~‡D@S9a†9f”Gn€P]~IETIt5spI\a?~™MaƒKfk7|2Ì•\¸¬r£˜vŒd¹ÀcµpS|Api*bƒLxƒIh†@z}DwŽMz•I‰’H”¢q€Å£ŸR鱆ˆ†lq¢UŸ³PÊØŸ¯èŎΚxQwª[ž¤bÓߦÐêºú×¶Ãÿ˜ÃáŽßÿ»ÈÿÇÊîÜÿƤè‹Íú£vÚt‚’\x¢U¦½i«ßŒ›Že”uSl”M\c2Ž‚X˜YC±ƒ`µlîÿ³ÇÿÊwžP™Y›ºo®°g¦í¬UŠCªW‘^†G”qLŒ{W“sU[ŠJmSAaWž–v¤qZ{h?Wc;Ro@Wd=S};CO)ZV2a^1Wi,—ƒl©È—©¼s‚¢V…ŒJŠVŸÃkõÿÌÜÿÂÃæ‘Àñ“˜ZŽeš²`—¯U’‚Yla:qzC~S«‰xΓwÿÿð¤Û„ÕÏ—È鞣²w‹ygž¯‡›É‹«Üž¹xHS3kGHk^Fmj:s‘Nˆžb¢¨u£±vˆ”Q’Šaœ`€h®ÃšÖÿÂéÿÍ®ÿž}gb…fYŽMxL¢·†·`˜¸] ¶^”Zv•JpŽP¶nžÍŽ‹Óƒw¼f•Ð핉Ï}‹–u¨Ê޵_u³Sv YŒœch–Fržu Á‘Š«r…‹¬[X~F†g†¤q®¹‰¼ÑªÜð¦Âù‚Ÿâ{„¼oŽÆƒ´ô ÷ÿËÿÿÐÿÿêÿÿîÿÿÔÿÿºÔÿ™µß—¹Ñ”¦p~vˆ˜m§u‚±[w¦B\˜8O~>eˆbŽ©qs“Wm¡e{¢fz¦]b‹Zl’^|_sŠ^{˜w‚µheŽYQwCktWv–Zs•duˆ[…—u£ÎšÔmo°ECj/ZqKj”b~³o˜Åw¡¸j{š]n†Xg‡SyŽd|¤wr¤eoUX}KIh7FS3H^HiŠ`z´k{µmu¡svŸ‡«ÛšžÄz”µil~BXr@Tn6Fb9G_?Yf=Za<:Q"):)McKh{Zbƒy‚””Àob‰MHuV[”Vc†b|ŽYj‘P`”d}²p»`xƒ;Db(-P&*Q'/M9YrOa‚SX‹lq¥‰Žµ…“©ck’F_|9LY;WTOppQpeFq‡C…yUs“e]˜ƒjyps|Z…}N‡‡X‹t]nmSplNhb;om@ef8YbDbc;‡f;¡‡Enš[9ŠiBHDhI#Žr0¨†Dµ§jÓ¨‚þš‚ÿ™xÿŸ€ã¦ˆõ˜“ÿ„ÿ¡’ÿ©†ÿ̸̱™Ž¤Üt‚ÿ£‰ÿÌÂÿÿôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿæÿs“Î4U}!.H"! HMPQX:P];M_Hb8ˆw7x¢cމ\˜œMZ°‡CypmU2‚p.wzDv†T¡yK_·ƒW~rh1ƒ¨B“—Xa«b¢sTÿØ\ÿÿ¥ÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÉÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄ™Úÿ±…¢Ò†[³škDzWɆ›–]•¹yRš^yv@iRX€Yin?ˆgEž‘^V“{cZPHe:GH0S3€W‡šk”ÈoŽÑ}v¯mp¦To‰[d…TLcIVi4\‚B[=nzHG‚TQk/ZQ*_j6dfAÕŸ6cשhˆL„Kk±rRyRK^5lg4‰o6·‹k{Ý–k|j´‹KÚß•ØìÆàç¹§ûÅl¿‡{—KweI™rTu–q‰I t€“fâºqi¹´£z5ˆ~^rqGYvDaa/_i8s6`{N_v;jr9`ƒFaY4€ƒGT‚L‡[1s©to•KƒI¨‘Sµy|R”¦^¬p~‘Q[cIsxIü©IrÓž_‡@kn7{‘Sr”jgzGFzDBM)gA*Š…YSyLŽ<'–o”†V|vJ„“Hv„E‚q<¨žN‹ÎgÄÂh€¶wd|=dw2Y{<qm7Vq>Šu;–ŸRw—JšCyvF®W°}gOHv‰?°Žx³Ç°¿×¼Ú«™ižÐ‰…¹iØÎ“𿤦f“¯z¤¹}Âô–¶ó¯õÿ£÷ÿߨɛâà§½þ£s¥_Ƽ{Ùþ§Èÿ·¨¬pŸ™[ÞïŸÃûÇåƒÇºmŸ²dŸŒS³žnÓ¼}–Æ„ˆ…P³®i®½~‹”\Ž˜_—ˆH¡ˆL”¥\ƒPdxE_~BQW0™“ek¬[[]<~bJsjCxbGpJ=eH4Wd:Ww9>S-@E'BA)ZJ,jT:gsHUç俽ÿ±ªÈ|äÕªåÿÇÇÚœ Ê€õõ°Ðÿ¢ª©`¨Ãm–ŒeˆN{ŒLŸ«{ŸÜ„n”M}POÿ”¡Áü™¨¹Ñç’ÿÐŒË҂¨ß“†¡b’Xji2cU3\[=SS-x‡Iƒ•Ujx?`wGdxB~Ow‘S\©¦ŒÿíÓñÿÐßÿÛÍÿj¨FŽƒ\—·S’ªTw‘;j‹0[i1‚Z‰•[|Z†£r»ŽžÃƒ|ªr“»Œ Ïp«TaŠJ‰¯yµojŠXhqDmIz™i–Ô‹ºufI[yJc{AXs;RlAt€U[…PЬk•ÃxŸÓ~ŸÃn†®y Ñ¡ÿÿÉúÿ¡Ûÿžìÿºÿÿ×ÿÿàÿÿ·¼Ï_dh[€qlxtUhcMTb7KaDvWi‹Nz [f¦O[—P_‰PpŽQnŸp‹À~~‹Up~HbŒ;X‚NqVzŒr¥oc€NUY9RW]©ª|¤Ér|¬M_[mƒ]l~^rGH]+9_Ge—jŽ´†·Ëˆ¦Åo—Xi|OirRb~N[{Yg{Qj‹VbŒFU~8Bo5Fc@ThUb|Zkx[pˆfuª‘©Ó”‘®l}Y`r5DZ1>L(:I/Kb;Sa2KZ5K_,;N-<S;B^FRahx–¶É‡šºlƒ¾yšÉit W\HWxGj•Ph“b€[€Ol—TY”O]‹MIi;TjP{ x~½‡»‘š°“”·~„ž\~ŒVo}Jq}[uƒ`{pK•ŽJ–a~¤rfœzs•r|TƒqM’wLjS‚jPylLifHrfHrlB|q@{†VˆuYr˜WK…i2_`JEAV`*ctB~kL²ŽWÛ°{ÿ¥›ÿ£‹ÿ¹‡ÿ»–ÿ·›ÿ±Œÿ®Žÿ«‘ÿÆ˜íº¥¡—¤Ýrqó|ÿ¶·ÿ¯ÆÿðØÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿw´ç*H-!T!%%') #!6&?@LG-]M,Sd;XiD“Z9„‚GŒ”j‘“Zx®}Q…_KjYTQ)iJ.\[1hXHyX=ež`“vI ¢F–»zÿ¯cÿÿ’ÿÿÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖÿÿ™ÿÿÜÿÿÔÿ¾tÿÿñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ»áÿÿ´¹ÿí —ÏÌPr{oh3Å?³Þi”ª“‘`–Îy…Âvr¡dmTvnQjwDq^I¡ƒN‡£mn–_ggEYsFos:Œ|D\cŒ`O‰Ásd¤udmFr‚[R‡Ue^=´‚8\—†my?n•My’DVœ[€“;o¯\pÁiz¯WƒžZ_`†^Td=RW;e[.[€4qj6yCŒKT“—‹9Ò¬l¾èµÌÖ°©Çc¹”Hu>IG$@n7T=+vb2EawO-Ê·\OŠ–‡K(~m@€†ZorHq?k|@šX4t‘a¤M†¨XS£Zcs6ØvFƒ›zF‘±d¨Ûnˆ½v”YabV}uEźnÈñÁ´å±Õ‰ŽÄeþºkq£‰qˆE`k@ƒyH‰Ul|E„’J\yXDb0^D%mj7®µ_oªn‚€Ip„EcN[‘@‚>}²_~Ÿ7–¢f`L‡x=¦}^qŠVWl.b|5–yB–™Wªž?±¥k³±{x o‹…WÑ«r½lf|=Ua6†KA±ªrÊèÁÁʪõÿõ©ÿã¶Êx´ß²m¯pgžNƒ«VÇ쓯ú¨Èó‹Òß°±ÓŽÔÔ‹ìÿ¼ ²]§ÅoªsI˜¯¢L–•fæ}Zèí¥¸ÊqÚ૪¥}| @±¸lˆ’^FŸ„dž¯mnJWg1h[5”O“}MÕ¬rx¬^{WÄ®€”°h—_yySetGRN5u<=oC>a`GL?)_k9Of2<P%N@-dsFpKEeW>ž½†¬Ì•´Ê‹™ºr‰©oš¯u‘²maq;ŠUÐæ ¤¶i—zV§xT‘ž^ª¤x´Ü§¨æ™«Â‰ÿ”ˆÍ³hªªvØ·•Š¿c©»ÝîŸûÿñᢡŘ³l‘Ÿh¶Öˆºä}}ÅX„¤Q|™FlDj‰>sNx¡KWt6kqBs‚E‘—W•©n˜¸t™ÈvÆÒ¢¥×vo‰@d„1]y3Hf+{ŠTi‡5_[Bq“N]ˆQo’aŒ¹ŠŸÏ‰„Àu€¤~š¿‹—Ë‹…Á€°Š¸Ä¢”Îui›DgŒRœ½²Ú–ie™KOƒGR‚DXt>FT-O\:}…g}«]“a©aqŽVkwV‹tˆäð¢Ñ÷‚ÅìÐÿªÿÿÎÿÿ¾³²cRn0cŠT\™=OqHx—R^„<Tx5hšQqœYy¡kt‹S€¨c€¿]\ˆNŒ²|™Ä`^j+Ke7guGuœT•\m|=NW7DO(1C(FZc¹Âš½Õ“»i}¤Tm‰IZ•NjGU>`ƒMp_{ c| q ]m‚R~’g‹³Š»ur§MR‚Ma‘RUxAPi<bGU?>k9:n:3X:@WKr–y™Â†™ÅœÏƒ}®ME_$3C$8N2TiCcr6K_6TQ7[e9UAGkCTfEZdWeoZer^u“‚žÈ†”¾i~¢Yl¦Ql¥MIp:CR;NYVkwŠÇ“—Çt}Š=D_Xt§Š¸×‹ÃÉ´‚‘ªm{sS^o\u‡^…m|ŸhŸ~I« Ov§qs…xƒl\²daw^uh<roFugNrpBm?lm7yh< f<šŸWi›crylt|Zo‡Uw…Y†ˆP“›Qt¯g{–h§~Yдnò¥‡ÿ•‰ÿª„ÿ¿–ÿ¼™ÿÅŸÿѧÿÍ¥ÿÓ£ÿÕ¥©¥¾ynÐqYÈ”šÿ|›ÿœÿûäÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿn©ï&B¢U+%9%+8(*2.-628;;RG#_V/L^BJaRva6‘sB‡ Vi“mmiYS}MyU?gQ.dW4csC€h?„‚D¬¥]ÝÀbÿò›ÿÿ¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÑÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×ÿÿÿÿÿíÿÿ–ÿÿÀÃÿßÿÁÿÿ¢ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¹úÿÿ²ÿÔÒh{¹Cda[a'¡†4©¼^Çs£‡–ŠYo®}jo[S|_h[2qƒPi¥Zl~St‡X‹rU”‡ZŠ‹Tfx]VxKz[>…Blª]U`oCi„=sˆG{˜NlŠOhpM^qQe9Vp=`i8CwHBM*Š\+ß`ÚšœÅ¼¹€åÀr¹pJ{DK\2Uk1Vp5Ij4xW1§uCz¦}lF¸¬_Ρt˜o‡_y‰SSˆdhx9ai9\v;oMXš\P<¯Ñqy…xsL8}X@{Ÿar~G™|FPˆd_g/ß§D¬ãž˜‘m‡·io¤\…{DƒLx³d~KšŒV{’hh¾g¤´K…¨t»»ºð³Ùÿ¸»ÿÒ½ã⼓©f|ŒYNoAKb#:V'ZF^a/`E1idKT‚GjZ1£‘Zrªqq‡AŒ–V¡ai“j€VcsI†™*‹½]}¡\š€LΑ]t›t]†7v€C„“W—z5Ñ¥sŒ¡h–d™r¤¦™“©‡·º†…¨ldŒICs4`C*¤thžvÿÿòñÿþµÿ¸Ão}±jlGŒ®NÅ·’¶ÙÆÀÒ«ˆÆpÐÈx°â—ññ‹€ÿt“F‰Oƒ‡O¤žb‡LŒ|L®zOŒ˜R‚FŒ8„A–Jžªihw6ŠT@¨°rjˆNhk8vm>uƒL– ]Ù~³„T˜ŽOÒ’jØá¼rr4„ K“£b‡mH…·R@n2Q6+Bi,>>"Yy9jz?¡VE`'bZ2†wD ˆtµva£RHu7tvJŒ•[]‚=_r0ˆ°Cv‘7Zm*[W0À“{üåÃÇÌšÚº’ÄꌪÝq¥ãq°ó}µáƒçОüÿ¬ ¼r¾´²À§¹Š†¸h›cQzlJÈ®v楂áȃ†‘K–|Qt|K–«vžÖ~ˆ®j¤ä‰ÅY}šSf—Aaˆ=r“Uâ¦Îÿ·™Ýqg†I|ŽId‡3u‹JpŽJMk3^}Ae†Mp‘Zh”Hq‰^ª‹„™m^dOˆ‰žÏƒ»y€¬yyªoj WVq@cyNyz\†‚k„Œfy–mv›kv›krŠMLh1Yq<U[9ilB]rEŒŠ[k’ZmŸem¡o£¿€¥Ík‘¯q¹ÇšØá¯Úå¡Ï呵X“q¤Æ‹¦Ý‹ªÛŸ°Ý„Ö{~Àop˜bj—aw’c‹¬n†´fišOr˜kÓd^•;Tv9NyCfq^Œ•ovC>h06[-=X8FYZ‹¤~•®{Š¥q³wœÃ†Àå•¶îjh:K€/L6T„H^zDZd;SbJnw•Â—Ä‘Ž¼~€®hy¦Xk¡OK{6HmKk—pxµcxWV=<_;Z}\y€¤Ã §ÙŸ©Ñwj–:D^.Oe=VpK`uAQg9TdBeŒWyšau•^cˆZjŽPUr9I^7B`UrŠt…¤l¬o„½mw£PQr1F]4JjLSˆlˆ¾£Ä{ˆ’DKnUp–uœsš—m‚—fo{@MN,CM=Xi`z•}™Á}•vSmX_|qgug†}SV¤T^t[x\BqfCr^L\iDZ[FoZ7†_>„~JŠŽXq}`fwV^lMmYMgA…DªYy³tp–}ˆ‘iÊ€XíRä™ÿ–ÿ¡xÿ³ÿ²šÿÆœÿÅ¡ÿʧÿå²ÿϧ¿¹—È„xˆk`~ðYPÿ‡xÿ§´ÿùÔÿÿÿÿÿÿÿÿÿÿÿÿÎÕñYu¾5M‚HS%,"!)!M1,O 50)+<"-)"24/729 _: ‹x8r¥W‡~_g‘JV|wGtLNS*`N(xH.›i6¥œS£¤dµ¡aÿÎwÿÿžÿÿñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóÿÿìÞÚûÿïÿÿôÿÿÿÿÉ`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕÜÿÿ¯¾Í³¥qY§gMjMSKa\5™}.¡O¯˜i]±xnsUeuWm_@lm?s~KŽ‘I§´]¡¹“v•x{dZŒe@‚tKumW]~UG^CL[-«‡2–®d^{t€Bu”GVˆLQpAQi6W5\ŒMMi3Ig5}o+BfPSh+rq5ƒ°NežFWsEjx:xƒJgƒZQyKPe2br/Jt<Fg0‹f-IŸoƒ^/³«`|Ë©ZuXGVv;_q=lzF‰ƒGt‹N|RQ§t‹t9š¶tw¨vp?~€Hªh†O|…U†xPqtUªs9ªÃ…¯ˆku¦}sHͨZv¤vIqCNb)œs0€]¸Ãˆ™Â“¸«„ßê±éÿÃÏûÇÖÛ¹ŸÑ©Š s²¡_•—p†ëŒÛg}ëppähjÈXUŽ>XT0xbF{‹Pf–c{m8”¬p}°i”‘N“¦gÁlq£\„N…ŽX”„F…fnvKjuBŽˆCÆaŽZl‡A„‹I‚¨T}ŒcªYP˜†^w?wsA‡£`Àº{´ò«÷—Z‘SOM¾nÚÿ¶îÿ¯ê’„»f[“T‹wQ™½i¯Ð}ª°Ì…³Ë~Ù÷¬êÿ±ÜÿĬ®v²¶~¸¡i±¤n÷Ó‹ÄÖ‘‹ŒU`€<pn,šÆRo²EjvEŽVHr@1…V8®Yi•DVf0st?g…@¨oÐàŸ¼fª¤fˆ—Rˆ£]œ—\¯™uzU`c2my;Mb8DB+xpF–©I—¬Q¯”as‚D¹•înz”D¯xD‘†c•´ƒs®[o Gl:tMšµWÔ³vjk0‚X3xr<^U4`AvX<’y]ÐéÝÿ¸Ïÿª¹õ†ÄÔˆ~³Yò…¨Én~‘N”„S˜¦nµïˆK¬<Mh0£“hã÷¢†ËZs‰Bi‘E” o¤Â} ¬t…ž]½Ò–—Èt‚ŒK`‹7Vˆ/hžR¼²¦ÿÿØœè|_ He‰Ds•B—¸u·ä€zÂh×ukVQ|6J`,IG*R`>e^;gƒ@h]ƒ¯rƒ±gf‡\bxNWg@{¤ly¦ZKw4Bb;MVC[fB\qFlt^tŽKJ^2d‚Ci~>chH„‹[lQ¨œv¡Ò«™Á””¯s…ªd’µs´Çƒ¿Õ¦Çß©Äæxk¤`„¦qŽ»lˆ¯o˜«€®jp€VfzUh…LuzK‚†S{x@l„[y¡u¨Úœåk€§o–Ól‚¶RpˆJhnHw‰e¿s Óki¯i„«…•Ä‚‰¯nЍp¥½†·ÍŽ·Ä…©¶d„¸`~µcs½fx»Y]Ib–Qj d€¬hqŽYl|[qŠ`xš^tni–NQoLWqZn‰l{¢dY•akŒR]wLd„g~˜šªË¨«Ü–›Ðdq”KkƒDm‚bž[q‡KtƒPl‡RtŒZ†¡}’»ŽŸÄu‚˜Q\‡DLzCJhGYgGb~Z‚ h{¦d`•UcˆQkƒVlˆcy˜js–Z{˜c…´hn£ll—c{“dtŽSgz<H_+AM:[l]}”€™Ã|s„NUz]MgTbeGqx;b‰QghTt`?qcEf_JkcC…aD‹sC“jH‚{Pq…X_qPD]G:N@I=3o<(zQ2‡lRzzIy†Wa‰ZdSÉqAà“aü|þ †ÿ¡‡ÿž‡ÿ¦ÿ¬ƒÿÍ•ÿç³ÿÕ°ÿݲÿˬôÕ£š£“rf’TGÿSJÿxdÿÛ¸ÿÿÿ–©ð>`£?7dYJ7ii5D„K#qZ)99$($"2&i19R)KF66b+%D155&H!*+E:€OŒ¤7ªhn•jwNdžkOwVZX?bS)‰Q/o<¬~Lÿ¡Vÿï‹ÿÿ¿ÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÕê͹ÿÉÎÈšÿê{ÿÿ¼ùÿÿÿ÷Õÿÿÿÿÿæÿÿÿÿÿÿáÿÿx‚çµqZE€uM;DXI3626PR)\Q/ig8~[N¢•T–Átz¦uayfuH™Y”P‹¦[ƒrt‘iSk[|b.foK~bJ]”QmfMmT4[qKsw0£ƒOvšmwV‚I’^jwW<^FGM$OP"Jq5cj,t†MŠ¡HXzYnvCDoFK[)ba)enA\€IQo9\Š6b|Bm{Fl˜Rq¡Uœ™WjÈ|zž]ƒIš°{VŒXt9OI>^6ŠO*Œ©IƒSŽn/k©vuŽEMŽVKe7Xi+my1ˆ¨]W¯kQ†Az†@†žM³¼bw±oy›GssLèqJ—àªwXEi?He$wg,°‹d¹æ¨…Òž¸uÁÖ¾Íû´µÙ¡ƒ×}go‡Si…H}”QŠvKxjTg54†6Fäj~ÿØæ¥ÿôzÓnƒªTd¡]bx=Q™‚®r‹“Vq¬gVm6yu6|hFm…Cqu=Šs7|oVn€Nod6]K/‰h>™¯f¯ƒ^at^«Q;µ‰j«‘vš«iнyž½nÈÐ~Óªt¶il›RŠr_®œr·ó—‚¾t`;‘R¢~\°¸Ÿl˜lŒjF¨›rÇÖáÿ·µú’„´`¦•eÿ¿xìõ°”žjÁŽ]§mÿÿƒÿÿèÿÿÿÿÿçØð‰¦ðxvŒ@cq7cb,ŽmVtœZk…>wˆBT⹕т¢¦b˜™h‰žcŽ}ËÄ|º®p¼sœ»d¢•feHÁ´i¦ô€ªÁ€ŸË{Š–WŠbO—|RªÌ{„Î`ˆ«ao»Rh€:nBHr^MnqA“‚f§¨†¦‹XYZ(YA,a?0B5%J>'kt@ÁÊ‹÷ÿËÿÿßßÿ¸Âÿ¤•ÇkÜšµãˆ ¬g ²jŠ—g©Ü‰¥ß‡¹÷‹·ÝìÏ’»y©§r¤ª|º½|‹‚XŸªw ლÆgŠšp–µosžA\„0[†0gBz“X³Äœ¿ñœŸÞvr¡=O{(Ht)q†X›Ãw“Ívr²LRk?M]?8O)HS'B]1dˆ[cTy‰a–bk–Yc‹PnŒqª¸†yšMb‹J\y9Lw2Ha/Ok3Uf>\m>ahC‰^•“NsvVx W|›U¤k Ö”š½~ §e‰[™ ‰³Ô°ÄŠ—–k•ž…³±y~—L^w?Qr;Vq>P{Dh¢[h¸`u¾lq»[[’AeAXŠQz¬u”ѯߤÐÿŠ»q¡³p—¼SIz27Q*EUN˜Œ·Ù™¸ÌŠšÅ“ŸÑ˜–ÁxxšTr•Vw—UvžUt£h„¬m‘ŸÅôÄÍûºï†„Ãrˆ¶o’™O[['@V7LzIXcn—ƒ£cUr59\6F^G]za}škwQMZ4HgNY’‡‰¿žË¦¯ÊŠœÄk{žOy‹`}›kr—Vq{Rs‡Wc‹_z—~š«ˆ¨»xЬgm•Mc„Uf†Lc‰Pf€RjZršw®x˜˜]rƒD;H<>ICP`W_k…¨t‘«m¦q‰šZs~Qj…R`€?Yi>izWj›m„°obŒU]xjUeTUpBWv;\tEfbI]8lhNbrLƒoK‰pCwwJgp\ZfNRn?Uo;^c>UzBd_@gX7{]=_>‡gG}sK‚nN£xRª˜QÁ¨jΦ†ÿŒ~û•nî¥}ÿ›~ÿ¥}ÿ´†ÿÖ¤ÿÝÿü»ÿÿÏÿàÁÿûù³è“‰œkpelMLaK^‡JP€Y>yc@Š€CŒ˜b‹´mq®v? x0RN&/! 0#.B*P2AS3^Z4Ow9SmBKb1%]41.%O:œW®D{¦ve˜nssUa‚JVkWi`N[lAmf9µCÿËhÿÿªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéÿÿÿËÿÿáÿÿõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿõ¤ÿäŽÿÿâÿÿÿÿÿÿ{ÞÿæyUÿþjÿÿÿÚÿñÿáœÿÿÁÿÿÿÿÿÿÿÿ¥ÿÿÿÿÿÿ\€½gYscY7I8UƒX3k`56=A{D,Ž¡ClzVUeA…[1ƒCXƒdRH8ic:Ç\?”Ú–t£ks‹FaŽQXzH`rHxr7oTf‡QQzUMK2rW1bz@YqJ`[9ii4azO~= ˜Rz€fDs?H]1s^&Z“IzB_›cKtOqf3„ˆHAqPYP-xf+c‡NPpE^;Cj=Vj)‰v8\‰XG_Ffk4’cGŒ¡i}¢|“‘^V—y[sDƒx=0pfQGak;„~Nƒ—ck¡k¨½_oÈ…N«PIp4Il(Ÿv+O¬wVc,iv4mžH~zBǬT•å‹uÉx…qJ¥iRh³uM‰ABg*Na"l.~h•–qŠžyЫx~¶ˆ¯ÄdÁÈ—ù³l”fM‚C^V2Œ^<i¦Y\N|g9–¶³~~›qoWt‡BN§Y_m(ut<ŠxA‹”u¹k†¢lt”Toj5ww:d„Ch_1‘‚A_€C¥†L‡ã”^}7„g1™™a¡·q ™eÀ†QçrmÊž£šzœsxtuhdQ@ …c¤»…®…{‰pii>“Q{`ÏwdÅq´Ärcµ[br:Lo4p:ײ~Çÿ¨Í÷‚Å鈟·m«¤K¸ªSÍ¡e—PŸ“aÿ·ÿÿòÿÿßÿÿب–|ƒœVvŠQ¼^W›‘Zv€HˆwIŒša¤°s†“d’j•£]…ŽM×®}ׯ›²÷®Å†Uò••}Zâ‹Ã´p·¨ofv8lf?”–n´³sJd{;x†@Š—\¹Ù Àà—¤ãŒQ…A9<ZO*uŽM‘yMe‚QoR3V^-TK+mW8qz;„~M·Îuåã§ÿÿÝÿÿíÖÿ´åÿ¼¾ãœŒ·j¯’m°´jµ¹‚ÊÄŸÓð¥Ãû¤¨É€–ªo£Ñ‰Ó`{’Eq]D¨”v¨Ï‰›Æ†“¾ƒ‡‘Um}Iƒ™e„›[ef;Ue1`Š9gœN•Š]œ°r¢ºkj¦@n§@Ly/b’Cƒ·Y†·X†d_š;9I+CN)MP.Se=\Gt•R^¦R€œgr°[i‹_•ª{¦h€ªb²_mŽE`r7CT)Ec4X‡J`“LQ|JeˆUv„OUv;g|Zu€Ux¤g…¹’Èz¦Xv|V|nw±}®Ù‘•Ù~‰u¯åz‘Æ_o®NQ“Oa—P`WŒ©’ºèªÓ™¢Î„‡Â]o–U†¯s¤ØŠÌ„°‹Ïé³ÿoo“[„¢^¨]³UR~7D\_••„®½„¬Ï¢ºá¬ªÅˆw [e‹R]ŽO^‚Qr“i•àšº÷¼ÑôµÑ雿Ѕ‘°q†¥`f99U0<b9h„UƒÁs}´~µus¬dd GFp6KiDXnQg‚FDn@Y†]Žº‘§Æ’›±Ÿzˆ—^bvAdWy˜[u“UwRs‹Up†Rj’_z®}‡°~£«pª¢UbzR^rUjzXl…Rd|DUyZq€[nrRqu<U_*+E9:`Sb}bvš`z—hŒ—iˆ“[s“h‡¡bx”LhzOq‘Uw”[rbdQ`o]PfPccCOr9NxSaW;rk5gEe€[g‡WoV_“XNnPYhBi{7”V}žbk ov„jt}Nz{QunJgqHl`Aj8†ŠJ¦£^®tw–‚§eqé_Dû]ÿœxÿ|ÿŸ„ÿ¹‹ÿÂÿû¥ÿÿÛÿÿÝÿÊÅÿÁšÿ»’ÿ¸’⶞嚌ú‘mÿ”gÿ–hï•r±pŤtÒȈ©á›sЪ9—”:SKDM*R[,`N.YO)ob;t‹CaŸWV‚F6rF2I31D&F2€L#yr2…‡c]¦e`tbqu=gwT}uRº“YÿºgÿÿÿÿñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿæŽÿÅŠÿ‡ÿÿ¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù×ÿÿÿüïÐÿËuÿÿÀÿÿ«ÿÿÿ¬ÿÿ…”§ÿªMÿßoÿÿÿÎá¸ÂÑ ÿ’^ÿÿ®ÿÿÿÿÿíäÿXsaMg@|l2hIYmPkm:¥R2¯ˆR±¯dw¶ms‰oZkH^a8km2No;gb.MhBÿV6Ìÿ”gž±z|<‹¥bP‘]ƒQ=m†Jo‹Nl}Mzy?Hs:j]0f`5A}@SL+bk-ap@Ž„9†šWxuFMeDF[.qa,k‡>`Ob\6kkMy†F[nKTn@^j4”z;žˆUq‰`LxDGb/En)gX'j‹Rn~URŽ[\o:yUD‚fMO5Ud-im7TH\s@XrDb|C]ŠDr„Aˆ˜VÄ·s|ÚfŠXCE?e%…c¸nbovŠ=p¬Q`o=œ™SÀÒ~«á«vÏœw›_‡LPžfCh,Xh&O{8œ~=Z³ŒTc.Q['vg.‰~L½¿q€¸˜•º_a®ccŽ<i»VršG[ˆE„|O¥fh’jZpNT{.Y0pr@k…Hh`.kW3sw3Ž¡TŸ´gO|G@K#ŽU3Œ‹Wv•IŠNpÆm{c2®tT¨Î›˜°bŵn±êŽí¿jòÿжáŠkNžw}¤vkÂt—yq^Hj˜gY³[ŒŒJn†I|V€˜ZÀ¶sŽçˆv¦QV…Kbn<Zj8£¤Q¶î€¸Öv˜b•Š[u|<‹‘Oˆ”Q°ªhÌ‘^ºfˆ¢O‹¤lN†ŒMª®{ƒ_…ho§N]xDˆ`Mʃ†£\nŽL†@¢½a”gµº†À…rµš¾Ì ›yRÇ…cò×’³x“ˆS¿Á~›¸vPƒ5kf=®¥l£‰\Řo„¢gmˆA©±‹jI’–eWnD‹~H¡ž]ÆŸp«“c°Çh«™_š¢[Ž“V“‡VÒÆ°Ü„´¨yîǰÏÑ©Çè¢ÝÜ›¯Ä±³d›Yž e’‘_µªs¶²‚¬Æ‹r™R°´„ÕÖšì›–áÕ¤¨¬j\LŽd‡¤s§Æ_¥MTu:Wp8pzOt•FJƒ5a‰J¨l¢^kR|˜NtDi‡<l˜K Æs«êin¸Eƒ¯p®ç”Z¯?<E+H[2WXS—{›°h¤[ŽšqÀx™Å…ˆ«|vªh†¶{’ǃ|®g]sIRz6crP}«kˆ»tz—ex˜UŒ¤d†“Pw‘Rz³s¿u‘´Ÿ´x„OejF’¤ƒ¢Ò|”Ù˜±äž{¾n”¶k“½{·îÜÿ¥êÿ”¹ZnŒkšÄ–ŠÓ€p±eŽ¥ZjHc|Y—sºyr¨s¦Ò·ñÿ³Ùfs–CWjGsVuK\–j•ŎΛ¢w†Œq„ˆ]q”[y£k‹¼}Åkt³€¢Ü¥½ñª¼èÁ|{’er”cužgj _[™gqœMJlIm‰q…¡v‚Š˜Ã‰‹°[k‚>[p=PeVmŒ^tžbn˜Zzšd‚Yc~KZjBTd19Y0IeCarRrŽdˆ¨V`w;MeF^†u}ƒƒ¬ou”^u~Nfq?\n>RU]‚O`|BXqHo€SgGX~E]xJcM_y_^v`o‹\z‡KfvMr‚Mi\|’eŒ›Ll‡KdˆLd‚Ul~`fwHMpTVTJ]U5Nt6GrKZR5rj.f‚Gj‚`‰‚\‹¯e]©rU~k€e@‡—Dˆ´xx¢Œh’}cƒ`r€X~{P|zNptUzePy‚D„žd·‹cµ‡[n™pitÄS<ËyEå€hënÿ™yÿ¢wÿ»‡ÿÙ¢ÿó¾ÿÐÃÿ¹®ÿÁ›ÿ»¥ÿ¦ÿÛÀÿÉÂÿΩÿÄ®ÿ¢•ÿ–|ÿŒqÿ•„ÿÄÞ䙚äÅg«—Z{q_fGga;b9^zJwbLp‰;`uYJfHEbGqc;Uš<?zLFF.g<'‡Z4`šOwr\zŽBš‘_ÿÅwÿÿžÿÿÒÿÿÿÿÿÿÿÿÿÿÿÿÿÿòÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿûÿÿêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×âÊÿ⡹ٖÿÉ¡ÿÔlÿÚ¹ÿÅ‹ëÿÌÿ¬ÿðsóÿèô¯›õµq”ãœÿ¥eÿÑcúÿÿåÎìfß“n„GQ€IijC„pB~bQsvM¿ˆM´ŸZ°Šq’·vc†xIz[\m/Zr6XQ-ka3rAÀkRÇ¢Sl»Ñ«‰0–Ôul‘ƒŸFeb`‘P\k<cˆEXƒPWr6{n4`{I[k3`b.e|Ge‹?X\Ekb-NZ:UW,d|,‰G“´Ytn“”Ma”hVYFVS+žb4¢¸ed|`OS9OL.[T/Y\8Ni;hY;[‡M…sDkŽifŠJSƒHFw;Ji2nf7˜†OÍ„~Ík˜Se}Dpw7†•[ª·cšž~kÒ}—TG“Id` w˜@_™Vƒ‰9’³_ŸÏsЬo™‰o¦¿q†ÆŒ·§pq¹’nJD„ETc'€Ag¦tMj?:Y*-9QMŠˆHÀrxžSmœKyLš£^‚ºkŸ£R™û—l–a\Qel9Md?hg0gŠNQk9>X,JV!jx-x|=£¤Yˆbq‡GYw7j…2n|AUÚ¦bs‘V…e;¬—l\±Ð„ÿí™ÿÿÓÿÿæþ÷À¿Èª’]^}eXOH𻆯°{·èŸ±œÓžœÀ‡a¤f¹¹k”õ–¡W¯‰…¬qw«T~ŽHÅÃi̾‰¶Ò’¾WSj5nm7™sS‹S„…E~šH“ O³ÀršÀa¦„IˆˆR¨|L¥wS„W††]ZŽ¿tŒ~?®žl‚žWvL¢nx„Jª€j²›u›ž}ŽrMŽª‚~>…kLØ{kŸ½x‰}J¯Žc»áœ©ÜˆµÞ‡‰Ñxo‰T©›€¦ºo¢d›¬o«Ô‰§â˜³¿w‹‹H¢¢WÆ©i¿°q–ªfŒŒK¯ÔÍσ¯¾sž´^Ûø·äŒ‡¹n›x¹À›Ýñ¶·u¦¶±Ä“¢]žnT¨ˆX½±{¦fš…cŸbÊqeëƒnÑnÙ’rÊiŸ|R›uQhy>‚†Y”§t|¾c€¤[Çlªå€¤Ë‚±Ó|”Ãu¤É„”Êz¼rÈl„Åa}·Zp•Zl“GiM¬ÆµÔª¶†–Âqa•HTyBYmGeu?Rk:f„X’¥wĆÃs¸mƒ¥r’¹v¤Yf|Q…†fožYi…`³¡l†¬bu®\u¨\|§_´o‘Ê|¦`˜©s‡Vu‡DnDXqHxqm¤£{Ÿ¸†¡Û„x·Qu“h·Ï‹àyÐanž[{ªl—ËžÏò¾Êï‹”Â\rœGa’Aa‚LŽ¿¼€½žéÿÛãÿ•‹¿\¥I_†E]{[ˆž{“±v²pX£UP†St°oˆÆt‚Ã~–ΡÅí¤·ã˜¦äš¸í˜À爳LJ©³s‰¹yŽÆ„†·†‡Á†ƒ·i]…GWtXr–mŠºŠ¡s‚–fwŽTx•J]vF[whv–e~©Kb};Jg>N|IW‰Q]Yb¬[c“Ha‚HU{Qqu7Q`/HlDOˆmu¥‹¨r}›_p•a”\l†[`ˆ[c‚M_vCOrLi„hŠm{°\nUu„RgVb{O_x?Ra8PkGZz<QgDZmKuIayKbxQlY‰{Wcw=SkT\YMZa9Eu:GmGP\5Zh5_d9miF‚Oh”aI…e`\T€d0Ks—|r„{hq\mŽdq‡bz„U€zBƒiC|}N”˜j™€dš{^{z]ymc—[C¬qCÅ‚f·dñ”iÿ”sÿ¦~ÿË™ÿѦÿ¸ÿÿÀ–ÿǬÿ°¤ÿÀ±ÿ¹ÿЪÿèÌýÔ¼×·¦â—ÿÿ™~ÿ½ŽŽÐ¤^•–chVHk?>\<V-Y~?b`Lad._XApc7}—C‰¢R†Ÿa]¦nFpZEV7nK-ao7 rMÿÌXÿÿ¬ÿÿêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÇÿÿ¸ÿÿ÷ÐïÏšû˜½¶‹ÿ’Jÿÿ ªÿ¾ÿªÿÑ€Þј”¹ÿ˜aÿÿ{›Ø¯¨µnxm…ehmLsuGFšd^R>km9wnPqdBiˆ[j@ŠŒLkPTlaf^8VEs€?t’M_‹KggG„ƒDÏwD¾–³ªB’Ë{™³w~§fvœiN{SneLŒ‘L\Šcgw?se9owKs}IcŽJe~Uv…C~wKn{MO_>Hj8_j.n‹@yŸRy½i‘¤]–¤u޲ij•b®¦S“Ÿx||SImS/V2+A>AVb%kk9bUS‡VUsKWr>Rh?Oc=Œ‹;‰Ts™^i†^·†M{¼¤x¦e{ŽPw•R‡›[¤šY¨žz»ÔŠl¹“L€J„z%Q¤e‹†<|°e¡ªS«Áq»Ü §ã·¡Ûž»ÉŽ‰Ù¬y’hGxDcr,èÏW‘ÑžWvQ,U56CGN~x9eX°Lt¦dy¯T©ÆY”ëʯm´é¬U™nRm72P.V_*p€DcqMH\,]n,V7gw-ssOŽ‹L™œdoŸZt‚Cˆœd„L”ªZl“Jcu2tw@¢£j˜»nܨkÿÿ±ÿÿ¿ÿÿ´×ÿ¾‘Ú€ª¶^Ÿ½‹†•d«„h§„j¹t¹oTÈèÅ×ñ½n™ƒœ¦U´Î“ÄvBk2¤O?ªó¡¤ê‚¼l…yQ§¬m_ŽDLR"`Z4h]Ds‹F’ioI¤{N¨m³¨tÏè—ºÿº‹¿n¡†Qˆ‘S‚’L˜™M«ÊvÆ™k˜±ls‘F“KŒS£f“r`ˆg]ƒk—}Tžˆc¹Ìˆœ¾`°¯p§œ`_tJyiBïó®§ôƒˆƒIœ…i¡›h¦ˆa•¨eз|‡Æj˜µo°§p i¥˜Z¼£r˜—_wR³Ë‚•é‚”Äq…®`Fr/__2wJÕ›r´Øˆ}Ðo¢¾}¬Ô‰x™Na…>”«cÍ|¦_Æt½Ó‡þÚªêê úȘ§Àr—[ÒŽuÿΓù×…»ŸcvGUz6V\1tnP«Å‚®Ù‹¬Í{ÆÓ’ªÍtË\†Ãi¸Ø™£Ìq¢Â€¤Õ€“Àl…±`všMbH…‰g”¾vy´U‡u§×ƒ®©hžœgsXp~Mk\‹¨co”Z‹¯ttžlsˆWz{T|ˆ[¨¨t‚¢ShkL{’^uŸOu\Ä©~~À_tªVy¥cƒ¨q‰«h{¥Tk†V†§l—½p€ªTa‰Fn‘d…ʃ•ß„Ã埱÷„vÁfv¨q‡¶o—Ÿm†¶gxŒ`ˆ¥Š¨×¢¦¸mw˜JlžJuŸIh˜R‰Á~ŸUxŽk¥ÌÂõÿ¢Ð]„©Yv¢YjŸOg‘iˆ¦¶Ü®Á䛪͎ŸÔˆÌ‰”ʈŽÄšµÖ¤±Ô–ª¿ž¦y®¢|±³Š²¿‚”°„²‘…¸‘ÍŽ½vxŸcsšn}±sÉk²V_zAZtZl“Ya†Ec…vΚŸÖ_Vx3IjIbŽbiˆh}Š€©»ŠªÁyˆµfvš@IP"6P3QmVo™{„¢|~›eolt t‡¢g†”cn‰SlŠM\}JUyVdŽe†bYetNgoMZlMTjCK`3=^=Q|Wo‘Uh}BRoEZgIQm]tŠ^ˆW”€Yqr;YoL\gN[_EDrFIaBFV4@^/OY6[`-RsFUeM;jAKK2hQ'nyA]~ajziŠ}Xx¦TfŠvJ}hFcQfM0q["ˆZ;—}E°|V“~_w{fŠk]«gDºˆM¶Œhºˆr†oè~aÿiÿ¤}þ¾šó½¥ÿªŽÿ¥‰ÿË¡ÿȵÿôÿ½´ÿÀ¢ÿâµÿéÌÿàÇÿß¾ÿɦÿœšÿ‹vå¡|ƒ“Uzf_L>om?eŽTHsLGG4EJ+XO-…V5€>xZ”WuTi‹Nbm^q`AÚ’Gÿçuÿÿ´ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿõÿÿöÿÿÿïкºâ°€º„ÿŸq†°Z¨t¾Š@•£Ò‰]ž€cÿe“”OsŽX‚Rmf<JbG2^?T>oc1h£bftNPk`vY6t…O…‰ZbžbˆjKRŠ[esAt=Wu;sqGƒ†Kz‡Vw|HvhG›}H¼½d¡±qs¥hj„VzxIaŒ\qfPV_GYgIpq.y‰EvlO…“Ycƒ^_…\C€En^8Tf:T\3Pc7Wt(•a.ÜÑk€£’f}hlmP±lCÝÃ…¤û¦Ýá–ÌÖžt¼£ZŸfT‰Ed˜:FxIWc2Hb9{^-m«lQ|^Lh6cb1nd3‚€A«ŠW£ì¥kÁ†hˆ\›Prˆ[|r:‚˜_fšX†ŠH¸±dZÉŸI_7ji'\ŠL^ˆ;lŒ?r‘>œFžQŒlŒ‘b§šS¬u…\ck¡§V‘¿lZ´`Ih11T*>Q#g2c Nrˆ1yšP€ªTŒ³\·¸g‹ò—‘ÍoÞ~R’PJU,Y{<v„MRwBS]/Ue8Oq8_k0|¬]]FEr4de)‹Š<”½o~´wŒ†Jå«sc’Zb,’žX©Ïz®ý‘´Ô‚ëÇ{ÿ¸‡ÿÒÂÁã¶’¥v¼Ãƒ¦ƒ’šS´·eÆŒ?j@OA&„k>Nf7˜€JxÙq]ˆ5QA^X,ªmLŸ¦zp‹FŒƒ4w§Y^k:hg4[W<wB(™fWr{GRh4qz<\wGªj>áϰÝéÌØ¥—¯p‘’V”¥R¡“]¢˜a{Lv8¢’a¦¨x{M³yn„n[²{š˜aÄŸw]Ù‚oÕ´¡óÚ¤áÿ¦¥¨c}”OʸŒºÌ‹¤ÄqÜûœ¢Ý‚£áu•¼hÖÔ›¡ßxŒ¶_“¨k–W¢‰\°±l‘ÆqžÜƒ”Ò…¢ñ……¼fˆ¯a’Èiv§Ny¡S’•^ó«|¨×x±x‡ Z„§SŸœu·¾Œ«´v°ÖŠÇá§àõºÎÿºÐÿ©Îÿ¯¤áv¦¦fÛå’ÆçÍô“´Ò|Ä|y·Vaa8™So²R‹«XzÉGŒ‘V¸Ä—ÈÞ›©Ïz¥À‰’´cœo²³m“Gv @k§b¡½šv{ a•Éu‘Àe¥³ˆÈÎŒj€Ms`MlrW’l´aj˜DkFenBŠZ†Š\¼«†äÜŸþÔ‹¾·gŒQŽNfŠMo„]³¨u}®]{›i‡¦w€¬g‘Çp„¸s˜´…«Î¤ºlw˜V—t½Å’¹éŸÊö«Çñ›§Í{y¤^j|BZrC}žY€»c»€¦Ä‚¹W{ªX}·^s[«g•¹†´BZt@}šyÓåª ÑcŒ§oš³iŠcˆŒo¡³©Ç„©Ìxƒfƒ¦uŒ´†¤·Œ£Ãz¢b~Vs’Ov•TŽ[ž\‚˜cy—dv¥|оŒ“ÁroŠXe{_bŒjlžt‹²rz£MZ|A[Š_v²hw¯n~º›±Ú¯²Ôre~3B\F\pIMd6CYF_ux£¸¾éŸÆgj‚??a?UhM]kX^iYvˆbv–ou¡wƒ°o† bmƒW^…UeŠi|§pm¢fcŒ[Z…XhˆUqƒRmŠQ^—TQ“R_ŽUqŒi„“i…‹Y|‘_~‹atŒf‹^¤zT”qMdx.ugLTdLRjJ=iD?[?LL0Fd3W];]c.@n=A\B@G/IE)UY(S\5WoFnmE‡‡Kk k]|wDcV5PAOI5VLvT.¦_0µoKª‚a‡”c‹}b»hLÙŠJØ’g¹žs±{¸ˆn܆hïŒlñtñ£ˆÿ±–ÿ®–ÿ¬‹ÿÛ²ÿí»ÿÊÈÿ¾²ÿ¼°ÿȵÿÁ·ÿʳÿÌÅõµ°ÿ‘‘ÿ‡{ÿ”rÆžz“ŠrŽˆTM fMXZNj.Oj4]l.gƒFcmCqc>tw@ž†O—>ÀÈ’ÿÄÿÿÿÿöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿòÿÿÿÿÿÿÿÿúÿØÉÖÿ½™é¤‡¹{a^“‰Vgƒ:xk9Mo7RX3mkDO‰@]h>RzCWU0\w0Na33R:8@pBt~Eožoct[fh8lf8^wMq~I—¡Rq±eY™rOqEdX*G`D6F7YC&Qw/]y9›6_š_VLeG2pY=„m<^…agpLKnTXg.zp-‡ŽM•¬CŽ `¤¡jÕ{ò¦b³”]‘URj1Qz6D|.²l'dß{olWozG¤ŠOÿï~ÿÿÂÿÿÿáë×ÂÁ¸—¢“xŠjiyP[|DMd>?Z+OR&Zv6”u;g“OYF[;c\-\b<sŽBkzEt|KŠzSSZep5[}:Žt?q‹f^ˆM…zC†§Uh®eeGnƒ9Lw>gi3j’@~Cv¶Z`ŠKfˆDXu;jt)uEy±nÞžX{»|Kt;7S3BT#\j,ŒŸJ`§[k§5s–Fˆ¬N]ˆP™;ªÈs¾ÁpŒã‰¢Pc WiƒAg›QE€<Pm)R~-d‰3¹»W‚Ç‚^…ABg.^u1xN£¿i Û’ÅÔzŽô•ŒÝbn‡>´‚DÆÿ™ºÜš»íŸÎp±¨iž¹ª¶†™À’¨µmµÅ~„Ÿg·€`ƾ”³·af\O{4h}8D‰Ai@NT,gf5lw4Ov<ZE,g;`u=rt/µ„cÌÔ›¦¸rw{EƒqDi?ƒ~JzrB„b4€…@ª^åÛ±ÕûÍÌò´‘⛩`‚šE–Cœ¦S†—[pz?wAÇ©˜‹ƒNdCvMÜlÿ娴£p‰vE¦mZÿÚŽʉ¦_¤x`ŒBhp8¦dV¾¾˜Ãw¹ÁŠÎÏ’ƒ¾`¢Ÿq˜µr¢Ð|³cª«_œ£Z½¢gÅpn‹CªŠmŸÐwp˜>„…L‚¥\p¤F„«Px>k…6î{¾Ë’Zq›Pu}L†L|•]¶¼‚²×‰ÓëÀâÿÛÈÿÁ¿õ´¬ÛˆÇó—É⋯Ö|ͽqÁ¬p§žj¼Ä‹„Ó\i„E{xH“›q™Þld”;mgQ£qŒ´b’[‰¨a’®mž¨]}¤F‡ª`›ºŠª¸„›’av—Pwg˜Èwo¦_•œefx=[U9peKo‰Y‚ª^x–R‹—WŽ¡W”•^©›d•]™¥x¾Ä„©h„œU~¡X°š_¯‘cŒ£Xz Z^ˆ¤h}¸o™Ì‡žÒˆ¾}‰°kˆ´it›MVx:TzGŽ‘yÉÕ®Íÿ“ŠÀarœUL4/D!<E:weGab8jzT”·hˆÂe—³u¬Ãf{›V†§‚Ýe\…1P}@ƒ™y˜Ç`tšRn•Ll‚Q·³w¬ßou§_z©]´^j§Tg“We’QXz[SG|<T}J¡b‹¸bx³d†Âh´gzŸqz¤ckˆOZKb˜YkXe‚X^…WeObˆNj•d†¯oвƒ¯‰‘¤zu•_^Š=Me9Kb9G_-;T5LfW€š˜²Êµ¶Ï‰´dl”IYxOaGOl=OdQr•t~¬ƒº™Ë‡ºbsŠTk„f‰°ŒšÇ”ʇ ÍŒ¶afcd¤|‰Á‡˜¿o|§Th}VeuR^x_‚†j¦–s’ˆ`xhOlLoiImb-meCfhCVnHBhG?W>YM(Mk,=a9Qa2AX19S8:B(LF#DT'IX7T_2sa0p{8Rƒ[ZdfbSD_f@IxGX\;T[1‚V5†t=‘oYŽƒP–z^¶dZåVñ’gí£{ڣɩ‹µªºŽuÒgÿ™bÿ„ÿáÿ²–ÿ¼›ÿÁ ÿ°³ÿ°žÿÀ¬ÿ¼±ÿ³«ÿ©žÿ®œÿ§¢Ô£•üЉÿƒuÿœ{ÿ£}º£…`–~‡~S¯Ie¨_nwHršer^y‡Ufq=IÿÄ[ÿÿ™ÿÿîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕÆÿä¨ÿÿÌÿÿÿÿÿÿÿÿÿÿÿÿÿå´ÿø¬éÿäÒËÈ«l¤pkƒGRŽNSo3Zn0hu7uŠEgŸRW‡J7|JDL2_d*ZANˆBF=Qw7€e<i—MP”wYt1g_0{W/ƒe=±‰V³cl¼ª|€Xˆ9UwOYp>Tl2u‚9ŒžT’µ[rŠ`ƒLwŒ_`|DZƒ=ksAZuIJoIZ\)wc+tqBw‚T‹rVŒQeƒQjˆ=s L†U€–VЇOš¡dÃ×xŒè¡_“m¤ˆBÔÞ…©¢rq‚i”ƒTOyVrS0qA[š[8YBDOCg`x+Ec=da3¤FFÅž`d8k{<ŠCecHFpA@U)Vf/Gl7Mk3]{1eo=jd=]‡Ua‘DuI¡´~[µ†dm<S4]|<c„FfŸ=w’Aƒ°axÁm[‹NB…0z_!k”\u}?L›`Ub(d>gžMg˜Io—=b™Bw‘F·n] k}_+ÿ®l©Ñ“u¡XX:eY/€Rq\W”M5^1RW!`7tŒH˜®i¸wzwDR†9]f0–N±²qÜ×…Øÿ•ÿÿÊÿÿëöÿ߯çžÞù ¤ßçâ„ÔØ•ºùŸ±æÉñ¡É÷™ž¬j€‹Ngz@wƒG§“h¶¨s¥»pŸiyhGxOnC^f6Sp1X_4—oK†›Ymi<‡¼Xj{0jf4¼zÄÍŒ£Ó|¬¼|–œ[¼“oŒtSð¶wÿ{ÄÀÇÕ›ä÷ÉåþÌÀû¶Ôߦ¡ïªoOrƒ@€NtƒD™ˆU¡}P¯i††`~t[ÿœˆÿðDzŊ¡ÜqÉ»‰ë³³¦zrUjs@]v>ƒqT¢ªr—ZµkTÀo²Êr–Æj†³dœÐ{’Âr~™[¤°j×¶z‰¬VŒ›WtnNg|JfrExeDk•Kb‚?Zm2}|H`~:o|>½´Ó»q¤Ì|€•bx®YeL‹»k¹Æ…Äj¬»ÒåºÀ±¥ÁÁ™¨¨oŸnÄ\’NŸ¡`¿£l‰Lw`œƒ_v—Kan5xtQ Æmž˜]å—t»»^£©`ůwˆ·\zŠTy•Ew™LoZ>cbA}wU…ŠfrZV‚@œnœ—_¢‘[…‘OƒwE~eK‡U´¤mˆ‘Z’’eƒšZ›l–£g|vNuxR“g‘¢Wf„H‚’Z‰˜S~’O‡¨^x¥QsU}±fª¯~´ËˆªÆ‡¨Ãx‘Ào{©UŽ›V{³Rf¥T|¬[hªqǾŒ—´[`Ya—@/d+/^2)U)5Z5QƒY®v¸r~š\n„Uužg‹Ð”«ç€yŸCgJm•fœ»y…£Qk—R„¡cާe«eˆ¦g“¿n€¹fyª`s²e~¶h~£^‚¥{•Êux²Y«hŸÝ„£á{•Òu†¼htVj†NPtG`ŽZe£W^—DNyDZ~O`ŠYu“Pp„O^vG]€\o’`jej¢kzžUNs3=W/<\*=U5IfKn‡s’·§·Ú›”Äq~šYj…SeUeF]Zgžjv£kmjšuФMZj7TnZ~¢šÀ‰«É†±¾r…—\o˜sƒ}ƒ¤q{”grhn‰RVpMlrU’ŒrœŸe€F^SIg|at™cXX7dX8]X7@qH6ND=O3PE%Qh)Um=?qM4P87<*8F%IH$SS)L]5:_8GR.H<\@2bK;rU8fdCSxHU^FUnB„lJsŒC\{[y]DŒ}:ÆfLð™Nÿ©wþ¸„ï´Žù¦¿´’±œ¾zoÂŽf÷}pýŽrþ£ó¥ˆé¡Žÿ‚ÿ›{ÿ°—ÿÇÀÿ²ºÿ³¬ÿ¶£î±¨Ûž›Í—‘ôŽÿŽ~ÿ¦ƒÿ³ÿ«†Æ°…ºt–tœ{[•_Š«w³®uÿ¾oÿÿ’ÿÿÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÎÿþô¸‘ÎÆšåÄ~À€_¨„BoCYN1Vr,Oz;Kg+YT+el<^†IhdFTƒRbw7ZpGQs=BZAY@*pR/eˆ]ˆWiª^x™uqv9hwEeg@¸e4Ó™X†Å¢´•Qe¢D¡‘iŸn€³qŸf™¨fĺ[§—zwq—UJppA`tNLj?:h.YDqh+xsCÊ•WƒŽltPŠŒOë~DßÎt·¹‘¤£o«s¸—Z|€œ{a¶·wÊÞ•Ú¯ užrR±Œ^z{Rze9„ŠL†£[S†hªw=„áyVuCQ‚2>V,75$W!®¿|Vœ‹}^=`MW~DK{<Mu:Rn-K^5jh6]’NVv:sq6eƒCioHsN¬œTÏ—…]g`Xu/Ov=bx+mŠ6}D€Z‡YNŸTNd#`g$O‡J-Q*N%a6/QQ3g€0kGV3ZI5j74C9;Q=,…‡<á¦aš›yŠÅ€“ÁwT†RP`.Œ–OO²e\ƒ5[f3f•Q©›P“ÑukÔj<w3Eh#c{?`\5Ê“QÜä™Þä¥×âšûÿ ›æ{¦¬V‚’Eœ½`ÒܸõµÄá²ÓÜ¥Ô覡ñ ©^¸»x󊻿fÁÞ|ŸŸgŠtZ–—_~£S…E¸Ÿ]l‡K|†<»\s„G¢§IȽu‰»pm[<}€S„—`¨§~Ù¾“þÿÞÍø¹Ð–iŠ[´§eØóªèÿÁèÿ×ïÿ¹ô·Ä½©Ç…·sÆÅ–tL“S€†M¬x[Ÿ›jˆnLÜ„u´¸£à¡œØ’¹Í”£â›³nyL‘{L†ºpŒ€[«¶u±¼vܲlÿ»ŒÃ²u¿qœÓ‡¢«s„§Z—[ tŸÓ¤’h‰¤Rq{ByzI€Vp~Jc}@ea8d“AK\4‰VO…]¼ºzt˜F÷|s‰Ôm”ªl‘ºi‰œY{’Dš³iÑ¶o\\2Š}WŠªm—½e—Àb‚¸WƒQ¾År©·f—”S™ˆN|jEWh-rk@cp9{‡A‡›P«]šŸa®¥`¤NkŽ?^t=am=ltJs–L[o6†ˆQ¨¶c}‚F¸ztÝÒÑí¦ËuˆN\T:fo<ˆ£f±Óv–°]œ²k†¥ež]ŽZŸ—Z¢\Œ’Lq‚ApŒK‰™Bg‹F‰žb›¬X™Ÿa”£Pc•R ¿~¸Ï„¾±áÑ—ÀÑuŸX¬±v“Â~˜Æ‰ŸÈÝ… ÈŒµÆ˜¾qœ»ŒÆÐ¦Éמšá•܃ˆÒ|”Ñ}}ªZg€X‰¢€¯Òž´â~~Gk‰NrŸ\y¡_wŽBd…Tz¤f†¢[l›X{¥h€¨_‰”_‹Âv•Óx¸v‡¹uz°w—Æ|„¹Rl‰I{«ƒ¥Ó‡“¿z…[aw;]rTm–fz¹ŽÅƒ‡ÀlsœXgM]vA^h<]jH]vMbŠ]qšjlœp¨n~ Xg{?Fm<Lt4@d8HaDkr\““°Ö¦°Õ’°\i|JYmI[iNl†c¦jzŸXZHKoS]r:NQ,IQXy’r”³n®o‡›X`‹_arv¡ki‚EPmUt~g…ƒV|€X{[…˜u•·i†›WqXq„v‚°|G\:fL2Z_17^F2A:8B,UD#vl$N{>1_M9D?A;'UG"ga(Hn99[B9Q6.K&44C.6E!E),G7)PS2wN3oq7€vZcŽPohM~}Go€L•jK¹{Bÿnÿ»ÿ¯“ö³’Ϋ…®¶“ª‘‡›ŠkªxiÌs]ãza݆j÷Š|ÿ›ÿ§ˆÿ¹˜ÿª¢ÿ§ ÿ°«ÿ³¥ÿÛÿëÌüÚºð¸µê ÿ£˜ÿ¥›ÿ¹™ÿÔâч¡x}PÄVÿÙ{ÿÿ§ÿÿÔÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿ×Ӕ̪pž}—’at¯gfiPC|`?O9KU#Th-Rh$Qx9Qi+w2?šIU\G^r1\p3Dm=RY05]4@;&H?oF%w}JŒ¥\h»ggŠaRm3v]1£sLìƒLz²Ka–hÄ8 £`n|wˆj7sš\“zL¿žSã¡”¾~akd}V,ts=I‡OQ]:cV.ul7©[º¦s£Šn…ŒRl˜fqY<±dGfÔ~ƒ†TgŸRcnMd“Fp„R}–I²Q°“w\Ú»}~M›TK^MbC)xw9YˆUYcA–‡>f¼cA{M]O?pH:C*µ FMžžqŠM„š\zmOZ”Tl;u²`Vœ]eŠEP‰MgwB[>gx?JuHV>*E];†X$i”fqkG[YY{.Ni'^m/\„3Jo3V„2U„!<bAQuGkŸS)Z6*BHQx+PJ(Z”E?Z)RZ+J\@BX-Zd3w]3dlBe{=wªZ‡fž°w¥¸˜¬Ž¸´„‚Û²m]ž¯g¬Ñ‰}¼vNuBJk2@D*e\/e\H\U<d?1”cDÃŽn¬amAp«Kf“Fx›S„ƒQ´u½ÅŠ¹ÔšäôµÛÿÐŽÒ‹Á¢e°ë›ºÖƒÃê•´ð•¥Ö{Éœa¸ÐxŸ”Y’ªL£Æc¹Ãe””J¢˜D·®SºT¥®mŽƒMŒwN‘y©¹v±È™ÄÔŸ¦Ú•–ªp·w¨˜m¸¨lÿÞ³ÿÿúüÿÝáÿ»¦ú c€IšN8܆W¿«t~J¾…[s;‚šPgG}}Kˆš`¿¾šºÔ»¼Þ»®Öœ©™b·§z¡Ázž›V€¤d€ˆM˜¹sŒ•Y¯ƒkÿÿ¼ªâ”ˆºg޵j…©Tp“F{˜ItCЛ|šªk«“Y~‘HlEh•PoFe9Wr9aq>qNki=zuW¥h]x4`j?Ùpt›Æw{ŒWHE”Ÿ^—šZª^‰¯_qªa~ªg„ªd‡³XžÃmˆ¹]°°k¦¶p©½Z„žLuF\ˆ>|šIy¢Ua¡>uŒG›ªh¸Äo§¿sÏ~†Ç`t¬_…Šdm‘RvzAqžQ}˜S€]V‹gªÓ}±Ù‰øí’ÙÙšºáur¡Q§j“¯W†{P¡¥w Ǩ̇¡ÂnµÎ{¶À]‹‚HŒ‹T”[|ŸUv£U|«i”Ÿj}¯VmŠAx–PuŸY‹\”—\}›Xi…Ss‘_•²uŠ™d]dILUJxx`d’MV|Ac‡Ml¡NR{9QWNnˆp›®Œ»Õ¢ÀçšÅlgšPa‰V{™~¨Ô|tIZ…W{²y~½ga—Ia‰R²~‹Æx‡·j•Àjy¢Le‡R{žv™²s޳f}¬€•ÅŽ±j‚©Pa8[ˆZ‰bnqTedFWd?g‡m‘¡±äªÁﱨÏvyŒU]qD\a6O\AavLp‰RdŒeo£s~luŸ[eLdx^€›onZ\‚G[w;GS9KW^y‘«¿~œ¾dc„;S^8R^8NTBPcM[pDTfAWkGV=N`=Pl[f”•h‡¤t˜´pŒ¾uχ¾}ŒžZd…Vo|W{‡\wˆ\‘ˆ[x‘i~¦’´“±n~žs«@L-WF+I]17Q;4G9?B'ZQ"Ve';m=9LF8F+EH-v^/j‡:EŒS?gD8[00L"?6WJ;u+:N;A5*FO(V?!bE#fk?PzJ^A›€/“›RƒyX–{NÈVß—fó…zÿšzﰃᶗ㦎Ѫ€Å›ƒŸ‹wpi¯c_ÒpTò†fÿ˜|ÿ †ÿ”—ÿšˆÿ ÿ¦˜ÿÄ¡ÿøÅÿ÷ÜÿçÃÿ̶ÿ¼®ÿ½ŸÿÁ¨ÿ³¤ÿÒ¤ÿæÿ÷ÿÿ¾ÿÿãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÏÿÿðÿÿÿÿÿøÿìâßàÇý¼¡i–ˆxpq…F<ŠXUI>Na7>uPF^&:S"HKU["qt6}’?jª`lKW—`Di<QV5O\6Xr78g/_B$|l.gzK–v@ˆµci»rZRtn4Š|F…‚[w¶cŠ•Hw³o£A}ŸpilUvq8SwR_e6›a*åœiÊ—…_–ƒieEUt8†c3VlBltG™ R½—f¥°z‹“jŸ‹LY®{_‚<yD¹t8’””Ä€Ð~qŸ[eyY™ƒ3…Í\Ñ|Næ³p•îÎm§‡HmIV\.Tf8WnE‹_=K‡]xZ0I£T@d;FJ%¹ MLŠš_E=Œ{H\¥yœ‹O`½{RSˆ[9›—fwÍ{cYqp@G‹Ja\39wHBO RV.cf8\FSm?›j8e…^<c1A5Pc*|b+_ŠQMv%7I$=GYJ!a@8e<Wo*K‰3Dq1h–F^‘A2a9`J S]=Le9JV6Vc:m‰O«iƒÈƒi¬^vs9Ii9ly5n–N†£[jžmj“Om„FK„HQz*6]'BE!z“Vm΀q¡[i“Az¢Rw†Q³Öl£Ás¾‡dŒQ††MG˜\eb.”‘X«½zíݦäúÓ–Õ«´µjÐü°Íå íÿ¶ãÿĦü þ«rª¥mñ¤^ÄøŒ•Ímj“Kgc4wk?œmQzy]ê|Lž±tƒWÆ¥vÕð¾¾á±°É•Ð䨱úÆ¡Ô|“ hf«YWv4ŽO<å™âÿ¿¦ûpyD¬‡PÀËl‚ŸZ¡†V¦j^i6}¢^Qv=tqF–¥q®²q¼´“–uš˜l—˜gχ€¯«†¡²p‹¸n‚œWiKo[9œ|K¬åœz°i’•Q†HzŠJ—V´®~¾ÿÅøŸªávŸÕq—Ëv¢â‹‹¶jšÈx‚¾n‡«c®³€¡ºjžÁi…WlFk®Y_–A ‡R˜¶]k‰CmŒQ‚®b˜©l|Xza—‘~²v}”Y€Kš¿fŠ»`ÊÇ™ãdŠ}KŸd°ÙŽ‹Én{¿o„Á†™Ï‹sŒGªvW‰Vp~FkX©§mº±†ÅÕ”¶ëŽ‚¯r¶|Í‚©®{úÌ›îô—²Ä~¾¥x²e––b ¦ot¥Ox‘W˜¡c§”V ˜k–¬l”µ_Œ³^¸µwÄÉpsSŒœg“Às’¼br¤Mp‚[^‰˜Y{”@uŠP†”Xs‚L|‚_„¨}Á‹œÒ€¦ètƒ¤\†²uu¬Vi§RiŸLRi@d{Qz…Y_Ž>6\1]oOw–\„³uÓ’”ÇyxžZn‘Or•h¦Ë†¢Qt~X¤¥¦ÌÞ˜–Ä`kŽOhŒW|˜d…ž]~‘`†¥i{±dmž^}ªpÀt„ªeƒŸSo‹@dŠIdŒ>Rt9Be-6R&:T*I^Ed„r˜®Ó·¶Ñ™ª\f~Hq”Sn“KjŒYg‡JUpRg•p‰¯}ƒ´qy¤V`yJur™Äš±Õz¡KWa/3J;J}XtŸt˜·„œÂn€ªY^ƒBLi;@d1=c:C^<Da@N_DZkA[kTvw‹ž]s}W€‘i›ªuÅ}—Ï„Ž¯u‡•tŠ£°†¼Í{˜°fŒƒU†k¥‰¢¶€Ÿo€”ksš~QP)<T,;W3<F)AX.JO1KZ1F\0N^6Za.fk5xvEz–EWeBxo<aE?^*9CJ2kL Y…:<dE9;<8;(AE$kLiw9hŽMmOmtQ\qI[cIqY>|bBœgRµwYõ{Uø•bÿ¹þ¸ÿ³Ç³ˆŽ‰šxr™t^ªkUËr]Ú~bÙŒuÚ“€Þ‰€ÿsÿ‘{ÿ³ÿȲÿïÌÿëÉÿïÆÿóÒÿѾüлÿ§¯ÿ»–ÿÿÁÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿõ–ÿçÏÿúĽ°\_mlTBŽuDL˜giqC:zJHL-mZ-FƒH@mJ8Z.DQ&Kg(]j*Ž|2^¢]}…UY•OUzFNr6Wo4[i5Dv2‘R1Šƒ>n{e ;†g}^h¼jŸ–HÉW{Ÿƒ£ŠV~¬j‚‹fŒv=t©ginLh‹HkyJIoG^f0•x:º”h—›u–š^h—^m…C†„K§‹Iœfö‹dy®‹ˆ^“¾eyƒ|hd6D:8kO)Æ›J»Ú ˆßª“Ÿgx½ey™beœM²dMŸ¥o¾q}¯ƒoŠtkhE‡m>m®ke[KJpJ+`5x7R£\¤˜JKy{<Z3D]!jZ/¤‘T¹¼ˆ…ë¦S®i]Bo‰I±Vm׆]XKy?ey7NnCKa<>P1`O/sˆGa‚Hk`4J\1_\&_O0F[,AU$UW$\v2RT8fvDcŒBeœQ^k5Z†C^}Lx…Rk›MU…@Cd6Rg.ttEvPxr °i“Æx—¼m}£mg¡jUIf€9z³\kœW„}F‹—clˆNg‰;]Fu‹@€€E‘¢L«¸o¥Æ’w´g” c…£q¹¢gyiR¤W_X*dpBx…8A `!.R&vXÁËÝï¼ÿº§Æˆ«¾†Íã™æÿµÑÿ³®nž…J™£JÉ×{ØxoŠ?Yk3_d4~b=xqH›oR‡†^¡aŠ©n„Kµ’ÊÔ¬©Ô”ßÕ±ôÿÙáÿêΉƒÔqj™ZFi.º”k—à}€¶^“[骅‘ºs·•bÍ}do>fžODb/gw:u}ItƒX{XŽ•h™Ê¬»u¢¤f•›^–˜NŽ·d›Çi³cŸ±pš†N³¯nžÏyv•J\‚1c…/~šIzµT“ bɽ±ç™¹Ê}´Ä˜ºm¡Äv”¢_Žªa’£k˜m³¨|›¬c˜ŸQ~šE…iEÜÍ—’Uz“H”Dœ¶[§³Š“Å‹£nq—Y{‹Q—‚H~tDjh:l`>‰ªN±Vq©Knp=q™Hj¢?}˜MœÉz¦ìŠ“ÒŽ±ã²èƒ\r:v…Uv£V[j:|cSt–NsŠGŒQªÇ‰¦Ö„¡º«àžáÿ¶Óݺ…¼Õt¶ÂˆÓÿœ•Ýi|Pu‰=o;z|NkwJot8o†A ´l³¾eŒ¢Y„ŸV„¸oÇv—ÎwšØev£Hj–RnŠO|•S•W•UzšU¤X}®x–´˜²l¦ºi›Èsޤk€¦V{¯`ƒ¯XW~2..'giQp¤`wŸPx—S_KdxQ‘²˜¿p•Rn‰EetU¡¹€ŽNvŠP‚¦kuƒPei=Vh4Zx;_Hp†U†¡fˆÀxÁs…·Zp™Xl]}¥]‡±Tl—9Vu4Xj@\}AW|K[Gc|IT~^v«q„ÂŽ¸v‰œWbfBUbDn‡S¦_~¨ho›XZƒMc‘izšn¤`mOi™R{–s¢¹°Ñtp„;B`?bžu‰ÌНp…ªy‰´x¯dt€[x“ow±^_˜O_”Wkš_nKJzGSs_v—ˆ’©a€}JtiDajMws–¯tžj€¤…¼£¿Ì¢³Ãˆ¡²k•\v„rœ€–¥pt•hk¡po¦nKN*FV08]4KL1PX)NW:>^7BU;YT,yc+}z<Š]o”`\Šu:Š~>?S5Q/69"V=qP*Us9>~VF?FW<&Tb)lh3…{C±ŒImÄbS—{jcL{n3es@xUCmj<vzH³kQÖ|Iÿ`ÿ¢z鮑㤉¼¥ƒ¶”¯l¬„kŸ}k¶s^ÑtTцiâvî…tÿ‰iÿ {ÿÍ™ÿî¼ÿ÷ÙÿÁ½ÿÌ´ÿÐÇÿÅ»ÿγÿÿ¹ÿÿÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÔÿÿïÿÿÿÿÿÚÿÏÏÿÄtüɘW‰3OeEU2S[+_P#bT@NŠH-MFD8$cX(gp:SˆKWa.Cl:Vi/R{.…r-jœSj?STn†;KŠFR`7fj/\u:Œl3†|Ez[ÈsF¨wlÏ—pr—{ˆ™gÏžMužŠ_`¢Xi£S‡„Gt¯YŒ¤h«¯Y¶¢m޾r|Éz–žSðxŸ°›©tŸ¶r’½uƒ´„„ f…‹UŠ~^€qR¡‚HƒÁwavd\c/SnH~<Áh†®o““Y–°r˜Âpu¹„Š–T‰»mÎuS±xv[¹ƒbj°‘‘VZ“jS[7C^;S[+„^0£pT´…Ai9LQ"J`4l\1}Kµ¿}¸ÿ¥K—‰AO,iSYŒW\eGXc=zt8Q–R:O2;A#LY)]|>ŽsGF’nVQ#;I-„V wƒD8]4KGGq!&FIC[X#”n5}®q‰…VyË…Sžcf|7k”ANx9W}8h‰Fz \¬e“pxŠdo‚P_YFP^9u~H}™cw«[jžLYŠ<x£Qz Pj¤a`›BXo3[y.o…B€‹T‡‚Qœ¯‰g¸|—™O’±s£qOÇÁˆå¤å–RƒLht.J‘J,O6,e],Ùv¨íâ—O¡g©‹Hòÿ³¸ÿÇZmD|e1¤´XÊk©Âu—ÑnS¤LX],Dc7K3!gJ.{e6qC—zSxqJfr;pAÓŠ‰¨¿•Ú²ÞлïÁ²ÿØýËÿÿ¯ë ž¯vVjC“^AÅ×ÿÿÄÒÿ·n£Vo~<‘uM‹mVcn6`“?\…:XBEp-UY9}pW•¾‹ÂǦڸ¦¼Ì˜«]¢«b™ž`¼ÏŽÊô¸ÔƒŽÊw“¤j¹¯~h»\^w.o…;‹•R›[ ¶z†Éqˆž]¨ŠV‘‘Z§ÊŽÈxŽ¢_Ÿd’¢]š…d±£w•šlf€:tv9s‰KÓ¥€yžFcˆ9h‚A”–NÕËz¡©p…‚FvˆV€¥wƒŸe|MuŸW{œW€¥KŽW§Îrw±Cc@f‹Cf–Eˆµ\¡Èt–¸vŒ²n”|_wŒE”¦^ž¡j£¯zw™`qsMpŒY`Ž@¢¥}”¬uâÑÿÿÍÑ÷–¨^Š`ª°r¶Ù©Áƒ—Êdl¯Kw¥Z‰³e‚ŽO|‡;o‘7qMŸŒ^Ͻj¦I~‡O~R‚’QouLŠŠUt‹D~“b–¾€¡É€Œ§rލ‚˃›Î¦Ñ|„¥\t‰CkE€µY‚´j…Á~—ÂwŸÊtj{9;5!88=y_vŸUt¡hpÅoj²n‡·x„¬[jƒP`ƒ<E\A}m„²Zv¦o¢µd~‰@fƒ>Z‹I^š]mRt’`€¬oƒÅw”Çnz³Wc–L_‹OsŽ\‹º[kŒ<W|DVz?]vNr‚T†Ji€^¦~žÁ‰ ÄptžUecDhjNZ…N_‰N\…Qh„gwœez¥bu™`«m‚ªat dx½j¸gµn”´b|‹Jkg–ͨÔ{³jz¦iv¦ew‘UVjTpz·Â§Ò‰ŽÉ‘·•v~ [o†kyš‰¤³v€„B`Z;aeIat]†‡hŒ–„¬±¨Ìß¾ÕÛ³ÉÙ‹“®z—¡g‘jr•{t•unž€|‡„¸wOJ.WU-?m9VI7LY+Z[2GY2FZ2MR+PW+cT6eg=puNkƒ`BŠ|OajLU=^d1X}9txM–xKX `FsoHG9VF-W`.ob=„G³xNf³}vbmsf=OuEOLIqL0cz:}o[³}A̪[Ùjÿeÿ£}ç£~·ŸŠ×ƒ¼—lš˜…v«w]†ZÓ‚fÿ†pÿ‘zÿ£‚ÿŽÿÓ¤ÿöÍÿ³¿ÿŠ–ÿ“ÿœ¡ÿΨÿøÐÿÿñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷îÿÿæÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖµÿÿÂÿÿÿÿÿÓÿÿËÿÿÿÿÿëŸãÙ’¹žÇ³ƒb‘nMif;f>UC+;m5'E,4*]=Gs/2cG<E&GO'Tf23h40C+L2T[1[b5v{?QUhk?qr@_¦TWgCYb8ekF^{4gj>[}6§pF¡j?¯bRƒ‘Xk[lxPr’H€‚V™†G´ÖniⓆV¢¨glÀdˆV|}<ŽˆIdœ^rfJhdAWvCaxAŠ‘Hšš[t§xmVlzPLkNbo7Šy>|’b{Y§bC|¤l„«`rµdm¡]k˜C’{M™[mvb‹o7Œªbs€cl^8˜[7•’l¢i…Ù¨Tne/T0;0MS¥‰>·˜xr wG•YO^)Bg@uk2§Êk§wv‚È‹>eY@G!?L'x_,I¡lFX9jM)N{DJ^,Zg2L]<YC5{x@W˜en}53I@HR€a*5ZDIn(Wl,œe9Ìðzìžž¡W”òœ¦¤}‡{q]s„a«WË„VÉyK=AY4LL#B~4.A!G/B`)XP1Ž—JtµhjœMk–KŽ¢T~Ñre£Og}9Š~Bˆ¼r~£S`McdBpxGu…Z°ž]§÷Œ·ÿU¹bŒQ3ᙀÀûÓX•pV](k†F|ªer²c…C¦£u‰’fÚxtÚŽÙÃaÿÿ¶óÿÁiž^Ëæ”½¦c™W„‚KboFRtPM:(Z>(pQ5_8‘v@qn@fP,wnN‘zTSZ9vŠG¥Ãvsà€qY7}gF•kPÿƒxÿðÿ¡ÿÇ… [¶·aá±yie<bd,”eE§¾…W¹odo@hyE¥Â„ÃಬÿºQ³`iU2~NI~oMš†^®qž—`“–]²¯Ž¯µ‘ÍéŸÎàŠÄГo¤Wo‹Lf:Yp/d†>t…C}–R{ŸS˜™g‰‰[q€Pc˜e‘ž¬°y¤šh€vN§fV¶„d§|asrJZg3jf8žxW‹€K’Ob„H•€¯Þ”áöÇÀÿ½æƒ—«Y‹Y€œY̽š®Ñ¬Óˆ±`˜^€¦Ir¢I~¬So©F‡·W‰«Z„qZ²ü‚‰ß[ƒab«\l…|©àŸ}¯\a•Gr¦Vm“Qy mŸÑ˜ Ëŵ‚§Mmh5x}C‡œ[“«v¹`s¢I\‘M‰¦‰¨Ò£Ì{ÃXŠYÒÔ¡¨änŠœf¯µu·f Ltw8Om4YŠGi‚@tiA…}X£¤‚§ˆª½·Îúû뢪֓†gs”G„¤e™Ç{¸Œ¯¾Œ©®€¢¨zŠOp_=Pf4L^?drN€™yѶœÂΓ˜Ðˆ—ºm„¢\{Ol’]ޱ€–Ênq’[u[lzNwa¯{¯¸‚™’Zt‚_••u™¦o‡£d…X~™\|Ÿ\v¦a†®Ns“Cd–]{¢OX‚ASv>IcCkŽpžÂy‹©lŒ¥pu‘EBW7KeZw—lv™]e€MayRq˜rˆ®ex”c‚’d…“^uŸn…´m‚¦^|•S‚—Hm}Iu¥[‚¡Uz†NmM_zTg…Yh†IMk46>Vvw‡Ê»–Öˇ¥°zj˜h}ht†at‚²}›“MhgIptW€{[|‡d“‘‹¶»¸÷åÑÿîÅðÝœÅË’¾º‚Ÿ£~…¨‚~™ƒš…¡z|›hIH:AG-=H0JG0LB$CL)3C-C@1PK';R'QQ5\b-lpMwwa[k[‡z‰m]—HŽ™q™¬u¿‚vž~TshJQ>YV0…m4Ž€Fb¢_skdk^Ayj_©eBg–Le\[]XAb@€“O|¢^m˜_n[Ë]KÔjMÙ‡n°Œpç†ò›dª˜‰¥ƒz²Ž_œ«{´z÷wbÿ‡jÿ›„ÿ¤‹ÿʽÆÅ¹ˆš°{ÿ‚ˆÿˆ{ÿ¿§ÿñ¸ÿÿÿÿÿÿÿÿÿÿÿÿÿþ÷ÿÑðÿÖÖÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÉÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷¶ÿÑÿ«Âÿ߃ÿÿÀÿÿäÿÖªöÙ¸¥¹µ¸e–|Li_ZX4Pa-GwED`6,b/!F*.3WB:s4@K:6]9?L*SR,hs03ˆG>>2DT(<=+nJ&MŽEOsDhs9>zC=V8GX!V\0bn9Md?jb5g†=om<“s>–M¡†\zŸ_n¦Ms]¸u/¥Ækk±‚a†W¢yKp˜NY‹bdq6lm2\jC\rAOW>_a+’z3Ž¡^Í£n¦‚^vzg]iOWj9V_'Yj-SsA”…?}™Qoªfj—V|ŸUa¯eU‚I]{8Lu>Wu9c~H±yE[ÕŒCN<‘G*®“S®Ê“¾K€f/H-=:Še-µtžtzihg@]‰OŽ›O¦ï‹^…xq^Dx°jR’pLL3<>"K<“a6T´‘\n6Fh7]o-@]977&I?uO(“¡a}”]I[Bi,Œz.SsXDO+OL…„7ʽlÃ{©~HnLvS&y†UWvI\l3jx7SwObL/o@<f„U>s?‘T,#S9(6B<zz3n©d‚ŽH¶ËzÿœW•G_m0P]-Rl+Gl7~[&ƒ£kw¡Sp…HLT;\T+ΉQÛö¶òä©kú«2k1F.¢T8s¾Vt9|ŒF™Å|q¥]V‰CQN-Ho+Àu>“¬z²†C¥É€‚·G§µL–¤qeM5nc;¯½f—ÿRÄa_x@`ÂZdc2rb<’T®Ï€¢ d˜x_«}VÌ¥wÅÐ×Û¤ÖóºÖÛ¨ÈûÇèÿÕ«ÿ½¨¾}¢›YÒŒZ›€f£·f³aZ‚IYR(tB˜¸j†¹_c”NGg6‘rUÃϲ¾åÀY‹UBF%Y_4XKšvT —tš‡eÝ lª†¦¡^±»u©Û€”¯^`Š<{‚?g›C\}8ŒUq²Vtz>Ó™q¥›nƒµn†½|…´{f•U–¤q§len=dX7lQ3|[6n7´nH׉_œfI©mFxŒI‹QtV˜§yÅÔ¨ËாΦµq¥W€…Vu”Tˆ—i™ª~ˆµk‚§U±¬dž›T{ T¼¹ƒÂá’”Íl_„>JE+†yY² i±Ç‚†Ãq‰Å„—³u€ZÊeg˜E~Lw‹Y¡ q‡§VRm(BI"S[/p…@•“UrŒKo†Kˆ¤aФc†¦d†¦UqoM¢Šoмl’ÁtªÅ|…±\ƒi—˜xŽ cp†E^ƒAu¤Vf™FqtAnjGm’fާ}¦È¥©Ý›¶Ô¦·Ý“•Â€Ž¹mtµnŒ©Šœ«š·‹›°ˆ£§|¤£fš’Xu@Wr5Gk2Oi3?^+__[Š•p’¦n¥ºry˜^‰bœª€©Ìlz L…xG|sKu†a§k‡ŽVuy=duBv‡S€’[˜Of‚Mo‹^|£c|£[{›Pm”KtšZƒ§Tm‰Ca‹Jožm¡¶‚š§_f`‚¬j‚¡Z|²Zo M\xO]uFZh<^x`ƒ°s–¬f€‡[…‹Zn‹[hŽbthv¢TdžKY…F]\¤T`‚9Mj/Pk6TrBTzSk’Wjy/;A1JePfi…–~Ÿ™qÇŽoŸŒ^‚Q\lfŽŸxŸTasVgxYktYl{dyŽ|¥¥œÂ¹©Í¶›Äµ“¬Äž¥¸œªÅ”¨¶y|Ÿy}“‚—Œ•hPO@@E*A?'KJ&FD&;H08D5B8&LN%XS,wg7xˆBrˆ_mzbru^e‡e„mar{Lžo_œ–][º„6‹”ENLZJ!sf6~€G§uNbœ[`loYd>t^Dœs<q‚GwbUrTCšlHœ†E‰´euŽpZlT]I@‰P?›qG©xTç]÷˜h韎±£„²’´‹a¶‘pš©}™pØhTÿv]ÿsÿ›zÿ£’ÿ¸ï¥žÒ¡Œÿ”•ÿ˜€ÿ»ŽÿêÀÿÿäÿÿíׯáÿŠŠÿÇÿÿ±ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÊÿÿñÑîû¯Ö‘ÿ¿‘ÿÒkÿý®…åŃ¡v’Œk„€_p•tE˜u,]_#0IT^#FnDNF0\a6Wq;ac9YxBekCX|MHoA[^9rw9S}8Mlc[[5Kr>fK0@{,KWEQ\(5q54Q*SJ$F_)Je2Ki6de4e]6‚‹Pª¸T‰ªbz—\kZ}‡AVžeŠ~AV•?Vx<jy:jhF††F^†GOj9`g1v~FX›aIz[Yd3z|1ŽB[¦‚UvCKp)CR&@hXr$m…+gQW _f‘Tj˜N|›Uz¸bl¬a[—UWs4v|6l„OoO»‹N³áŠfÍ©gxE¢sJbªwxCФ`›]†qNT„aKj;Uj/@`8†u/¢“[Àø‹_¡‘Qj>Îs7‹ÊZ~V6cI>G `d*ŠˆEz¦rWœnek9KqAEH0VN'Nf?p4±°k~ †dšPIu6‚a(V…Ohm/„¯Tw‹^[=]ŽUoo.Gl<|\%MkHKp)Qw.Pi+E~=c[6MwAOh8ƒ_<¹´pV‡^PP(tk4«ÏkzÅo‘³g“ÀkyÃeQ}DDv*:a"Bb#4OERsH"‰¬nBœO:N$AF%§]7‹¶t¦š`Z•jEP-)X&T7 xO|©i{–@§\QˆE\w3˜•LhÖxEl1g€4w“H}=–@™Ñ_]k;Q]*h‹3ŸªE²Àr¸Òyÿ×~ÿÿÿúÿÿÿŒ¬ÜvºêŸ|°fŠ›Oq¡Quv5¯P@¡lX©|s¬”s»˜}äÀ‡ÚÉ¡Ÿf~vFwu?ªvI¥¢iq°__F,[?)|ƒFÇ‘|™Ò‹‰áqMZ0^N;ޤq…œfwsQpudXl<€R:{fQ‹WŸ‘j’´yŒ _¸£h˜¿n¨Éx‡±acŠDn}?{PeZxV [¨¦d¯²aŒ¤d£Å‰Æ“¸{ƒ‘U’Ž^{™Sk<“‹T¯]¡ŠRtdDplAfŒFZd<YF’ŽS©‘]Ñ£sœ [ ‹jŽudviFwV?‘—Pb›;^i?e?s„Fˆ¤TtžFŒŽS”–Fz‹U¹ºŒèÿ¿ÎvZ˜BKu2Rz2:U"--`K=¤‘q‰Ùqg’Jz~S~’Py©Vv£W€›\m¢PpFt|@s~Ds:xMœºv—Ê‚ŸÝ¤Êì“ÿï¬óÿ¢¬Ò}žÏ„ÁΑ¥¯j›] ¬u]¢QOv<TY5XR*bzO‘Ó‹¿ÿ¥¯ÿ‚•¤Q€’^ª§|œ·†«ÉŒœÁ‚±s„šqš¸ˆ·ov£oˆ¡{‹˜tššƒºÂ’ªÆ†¾¿}̪n…’]vžZbBawAhg@qaK€˜t¨ÉšÀhcˆWt}`—µtœ¶eu’Qv^”c§d”Oqn1J_2WqGs‘Ux™Z‡h€žau¤Vf“JpJgƒ?`xSz•TdŠHjˆP‡®nªÁmršYm‘o‰±`uˆW„‘V{‹Lo€FmzJs}Tƒ r—¶p†™cvŠZ€…PsxSx…YsŽ[v‰Mw’W{ ]t¡dw¢^h›DS|9Bl@K|OY^l˜VmŒ<Mr?Y…IV€J]qETbCSNZ„n`ŒŒMb‚U~x–u„šwƒ›rs‰x‚”m•¢x¨–ÛÀ™Ì¸{ž ÷¦ÎÒ¶ØÓ™´®k„š}|†šœy““z2;>H/ ^<#FH(HF/[K,RL0gM/‚e7«b;ŒƒBkdL€k>WUPF@IX0>cDQP9om=“Fr™cAª„XUZ„S$h’CexZ|tI_tAieOpfD€Ox}DwuKxxD€]>ŒiE†{KjŠTmtYdoKkiE~tB|ŒXžuZÑ}OÐ{OË‘xÐp»‘xÖ–p¾¡zª—‡˜§~}e¨aRägRïx]ÿynÿ…gÿ¨Žÿ®Œö¼¡ÿ±šÿˆÿ¤|ÿ„ÿâ™ÿÿºÿÿºÿÿ×ÿÿÿÿÿÿÿÿÿÿÿÿÿÿôÿÿÿÿÿÿÿÿÿÿÿÿ¢Ê¨™¤ªÿ“|ÿ»pÿè¦ÿ׬úÿ¸ÿï«ÿÔ…—¬§r–V€d9[P‡C7}¢ORª}%vk/0>!a\GH\zCU<1[9YD$Na9JE;I>4FP9SO4Kk5nW(rŒXSuM7V@]F,<o&5NLRCEh";h/pN$H„3jd/^…5brC{n?€£Rt¦j|¤o{µqkœop‹T…¦\i•WqƒCg™NaxGcŽDIzFa_6[|?Hf:jL3Œe@TŽfivHdJu@\•OX|XA†@Lc2k‰/V†?„yCžÉq‰Êz´zh—^~¬_vÈmg»k[˜WhH_£QlrF~i?}œ]ï–RŽÿ¯‚ˆj†¡]^~Mx”A}¯W~‹QM™b<_>6M(dk.t‘Jm“TÓ×uˆË¯IŒe?\5Š_,©joŽbpžUjšYEOIg/'ªF-†‡bnŠ`ko<q]=]OAha6Öb0ÙÅ„rˆQ‘>?n.y^+jw@}Ž?WœaYK0`]36e-AX"HL xd1Ji>Lq)Rf)~g-Íu¤³jšq}šc}´m~•Zpœhz™`Ÿ¶d³·ok©rbv7´°SX¿w[z@N|/Iu*Xw&OŒ9\9cz8œ‡Hh·d]g7gY:sZ;^kHdv=fKk…Fd‡E\“K†—Eš¬gf‡AjŽAg8v}=Y‚ŽSt–E{±Xƒ·[hŸXƒk=Õ‹–Âo~ª]’V¬¾vÁÿžÇà‡‘»qʯTÿ¹³÷ÿþÉú£¡ß•°¸qËø¢ÿ³X‚P8; 8)6/46ƒ\1åŸx±°q‡¿lg{>wjHU[9Q9#hd6Tm?ƒ¡Wœ¹p^BwY7°Ætqù}MB+”œkpwOdRGKtBmbU‡Œa¸iw|VŸtX¢£uœ´i‹”bš®vÀir©Rˆ~LpƒFu”IvœSo…I~X‹ˆN˜œ\½ã¦Ö÷ʞ锑¼i‹[q†JŠT„F§·Êõ¬íÿŹÿ¥ŸÏŒàà´Ñ‡©¸n”¾Z«K²yX¡³fŒmPs_Q„ENn=É™wªÓ€™Èt…Èm_Š9q‘Ce‰4p…<k‚6dt7vqAÁ¥‰”Âp„³dŒ¾ly´j|µd}¨W•|MކQˆ®a²¹†b°Lco=bs@u„Gq“KŽšbq¡HvŒ?u“7jw9|`½‘µxŽ®z‹Ÿ`…©|™Âš¦Ò±Öÿ׾ІwJwQ„®y¬Ö}X–>K\6My\Ô”Îÿ·Ùÿ³Âþy’LSZ0Z[DsyS€ˆZŠWŽVy]ޏ«fu†^ƒ‚Y‰`†´h‹Ÿh–µ‚˜Í„–ˇ›Âƒ„£m¥tˆºmm•ON_;kyr´Å£Î蚀¶bz›p£¹w‘¥mz‹MjgQ…~Zz”e‰˜RZ_/E\Dr†\‡œdŠ®t¾v‰Ân·dt¦Ov”Orr?XhCl„?`ŠHt“Tz’^™°sžÑx ÑŠºVg~Hs{Qs„OcvHclDpˆ]’®q›¬g€”d†¤h€\xˆPhxBZa9aZ?eeRpƒ_z¤by¥Sv§\oœ[d‘]nœpx±lr£[n’Oj–Hl˜Q\ALi=GW5GOBkjdš”`t“Vn‘{ÄÁœÉÀu˜–n€š•§¶¦«„™§’«œ´˜pŸ•t¬ž˜Ö¾£â¼£¦t‹Ÿ…«¨€»§tˆ‘e3::D7#NG"=P-4L;DE2`K(lc@u}S±t`|__wf;tT2XIA>:S>!b[.†nE˜Q‰¯l† pD°[iwur1RoBSx^cpK‰q?‘|Gu{XysZ`„JzmRŒlB°P`—P^zd^fBxi?hz:nhLpdJpeNuSI‘hDÇ^@»yOÆ‚i£‚fð†hî“a´©˜•“žvuƒf‹YY[D±VMÿ_Lÿ…Wÿ¨‚ÿº•õº¬Öªÿª‹ÿ²pÿÑŽÿôÅÿÿäÿÿÿÿÿÿÿÿ÷ÿÿâÿÿÿÿÿæÿÓÎÿзÿ澜ëä®…{¡‚ã”_ÿÊgÿù¨ÿاÿ×±‘º©ba}bfK;fD89/)j,ml:]yY8gT8FMZH$8|¦ZKƒd1IE9'UG6o=$6/=$4>H8/Ea&uD&G}B3T`5>'L>%UZ"-nYC8 J` Sj+Ug5ZV.Qw;ap8Z†?t…Qg¦_x«d±hiªuU‡i‡w@“°Yd†nƒ‡6PZghAM“IT^;…h-hf>JlWhj6’ŽH‡´n{›xv’]l’\kyGj„Xl™Ph‚FS`=ib4Ž„<ŒÆyœË}ÕŽ–¾~©ºo£Ôƒ ÙŠ†ËŒ¤¯le¦~RƒURo9ct9„D¾à…mÍ¿Kq@UP$‚a0ižW{†Lr–VvwYa[Gm]8cGÙ“W›ÿ¼^™~t~KL‹d”f1˜µmZmS€E/y‹_N†RXK0IJ2‹`,¢YÕ†NŒ‘h|~Bab7s8˜¹t€Ša||KJM~z4}µf`„PEe@sd.`‘UP}>7]%UI"Mh;Yh.V€7cx3§‚Mª¸„{³‚p´i{ `b}ViW5pb@ž¤e͆z^q XvQ¿k~Èi¢XSŠ>Ir.SO)h†9Gg1MA oW2–L|s@‘cB©qIŒUtzJevDozEiŽWv˜N‚Hr¡\~Œ>axFN^-KKF> \l+‡Œ?’®wœ¶w‹²v•º{µ¾‚—Íy‚±c‚¥\qxFéoY|y^‘E‘åkéÜ}íñ±¦Þ‘‚LŠO®°fµÈ†dnLP‡HS‰C~§T¾Ê{åᛯ¿}´Ìƒž¼xq–Wˆr?[D265SJ&jc6Þ¥€ØüÊU£S]W4ŒJœÉpNi1•|gVlAhfHbv;{wHÉuzšµœ~¬h…W«†g†uRˆ®rv¦V}•Qo“J{u>~€L£U—Mt¥JKu3neG™¢nãöÂÛöµó²q§\m†VoMtšFnMy…P´ž|櫦Ûï´—\€nIŸm`™ŠM’N¤¬hÆÃ…Ãé‹~}T»‰Œœ±oeGYGŽ©Y‚|H‡™UjŒ<y¡Ei™9˜˜FyŠ<Qw1X~=x‘]бrš³{Š£g¾¼¦ÿþ±Ä¶s˜’U¤ˆSœœ_®Ö„˜àqu‘NTk4bv9iL]nI„X”¢`‚®G`In—b˜¿‹d NLP+X_<f€M‘Ÿ€¶Û¥ÒéºæŸ‘ßwt¯b—Åu§Úwv¯H[yF— ŽÎÿ°Áþ–¿÷Ÿ¬Ë|y†R[|NT„@U}1i„D`q7Ws?lˆWªÊ‰ˆ«OWn6wxJoƒNtuIg{H}ˆk£´‹¯p‘cˆŠVvc§©p„¤UnŸcwŒŸË©Þ䣞ŸU†qc–¬‡–¿~‡«`Yb;kXR’k’”VxuE{…Y‚ˆX„—n»§p«¡eƒlv¢^sUw„Jie;^j;b‡;f€Dp„FtŽH~˜l¢É“µÙ‡¬Ìe€_€Tx…V„R]sDg…\ŠžtŒœ]l‰e…¦ˆ¥¾†´qm‰EPfGYlHuT‹ˆZ…§c¶fv¬hq©pw¬q~°lq¡_o—[t”On’VjŠPj‰QgxEcr=Tb?]m\‚˜frŽPn‡o«ž‡®“Ye|`†“’Ó±Œºœu¤~ žt•˜f¥Ÿ}̱’Ö´‚µ‘m‹“|—°µ±v¡“^v…[RDDZU*]]8Sa:Pr?cfDjq5{Rw•xj‘}^Š‚\mgSbI>lE7YCK>7YQ/joBwQ€¦b™lWdm{fq€9cwKeyOw~TŒ|B¯hP|‹buuge‹K‡sNˆ}D|\{wVVqNUgCY\3O^1]X<[XAga?qY6riBžjFa8©ZR£aFÌ{RʇYÔw¾˜~–„‘°zz}€^TŽ]E²oTø†Sÿ›aÿ¥zÿµ“ÿ¶…ÿª“ÿÙ¢ÿö¼ÿ¾Ÿÿ’‹ÿ«’ÿÚ«ÿñ¶ÿÿ¦ÚÿÿŒßÜ‹¤ÈªtÿÁƒË¢{¥‚þ—lÿËjÿî“ôÑ—É ›Wcq62JaJ',s805!"#,0%2*"<)TG&nt8vlFS_C-UF*#;"QK[P5Aa5;=&%C"F-!3[#g8WS(,[X04!;4gL 5sCLI,€r-ou/_N`~Akp>€qF†™B¢¬d~΃}¬jr°k£Žj`šj€‰CaªXVxKƒq8O®Z~nHbˆUS„SLg;Ha<a`<ÀƒDÿ®n¯»žo‰…ŠcN’ Oy£rj‘Gqc=`m5Kj7DS+eU+lw>ƒ{K¢aX‰Yuf3p–BcNa^HfdKO[MPI-P_3Ib0kj,ßu2K÷®.RA?JQq(ib/T†JCR/2O0>9yg)µ|TâçtÚÄCeXpW*mkC·‘KË—:\MM<%t`4x›g˜°qpیŋRá¹pq¦|œ\5zRz‡Gs˜M¬vG‡·gƒIy‡Vk“ZT}FTe2m‡>[hKyn7n¡QJ‰^cQ!Ig:X}-et0grDUS4¥ŠH‹§{–”^e`Za<Ug>owD|nE~“YM{O\^3}ˆF‹·d‰T¬i[MI|2X^0n~7XƒDg€BkNz°^i–CwŒLurGpi:p9vŠKQ:tQ-w“co¦_iŠGV;S~@U‰GFd'GV#\l'U…>iP(„†P¢§ii„T†r@†ža¥i’ÀicÉp_n5o}Dµ˜\¯‰e²Æj¥¾kŠSvŽJ‡“Eœï„Š‘OËËƒãæ»¹ô¥Á«på†Á„ºƒuz†b—†h‘ªymnLM–;‰Q/œÈ~šº”¶oj‘Rz[XyD„d7wO³[spH|cG…{N‰|]“‹i¶|k…ªz™ŒcºžuŸÇrˆ£fh“BrŒ@j–Qkv@œ—k™í…´X„¶Vg‚FlrC±œ„ÛôÇÌéÇËà®}½b{‘XoŽPpG„µ]‚ž[®Ä‹·ØˆªßeD`v:CU*_\2hZ9Œj[nu@¢†^„©\gg?xgLf|Tu„Yª›fft?}ŠLs‹AH‹ŸI±šM{…;[s8Qp7jsFr…O€£]|—ZǹçÇyÅ™Vž“J‡T’”bδ‹ÿø°ÉÖsœ‰Wiˆ<Sz7aZ9j{@_‡8aq2x‡R•³€¾ˆx˜STi2\p4ey;ši¹»š¥¹Š™·€«Ä¾Ë•´Ú{¡Ñn•ßacŽBŒŠg¹Þ™µå©¨Ù˜j†Lta`™¬™¤nl}7[k,GT%M_8w€k°Ê‘€¢JUl:dpJh}CkpEˆ‹Qs‘^£s}žTmŸOrž`‡§\iŒ=ReLޤ’µÑª¸È¦þ˽ñ¶f]YP‰{”·ƒ’´nnyAocS¥¢t”™T……]—eƒ€P„Ža’‹JevKp‡Y{]”VuxH_c8Za5^wAf}Lo’LcŒ@t›d”Ãx¤¬euS„œg†¬l~´l…±^oœRePh|UjƒI[Yrœ‡»ŸÐ¤£Ì€‰ªo‚œ_‡Ÿ`”dŒ ~½‰†¾y‚ºw€«o}•\f„Ob‡VlŠYw’UpŽLdzIc€QjŽTh–Umgzžf~”KmŒ^kŸbŠhu¨…b‹~g–}¬¡t‹”m¥£‚¿³ŠÆ¦s ˆpœ‘À¶†¦˜i}w\l|i_Y6bo4UnCebEhdBnwE}‚O~›g¢q£‹^£Aˆ€FTW{M._~<^„U~LožQs„]gGbyPE{UoWPƒg<eQ`z^kyOzpBœtKkpDmfYt{C†TˆqFmNQŠo]eNYg3Mf:Xc2[0‡r<„{Q…vSc„Po|Y]nGXU?kL)ºd)àpBï•dûŸwÝ„ª¤š¨Œ“xk›iV¤uYÅ`ãmú˜vÿœ|ÿ¸xͯ”ÿtpÿ§~¡€…’“V¬šNÿ¤eÿ°a¾Ç©¼±¶yˆ›sè›{«®y½²˜ÿ fÿ¾iè¼¢h•w'Bc$EHc 'I?01$3 +$.,"0 (?+b\&[rD^tB9j52?);:K<$:Q(L>2LQ-D[59Z3JP,Ce+OS.bN17s3,>:&6D/;f"_L$[{8w_1_r9cNZ{?q}8„²Q{®t€«p|¼j{»o‘³oo¹z‚›v^¯[S}a€o?k¤T…‹WngfwK“xObz`ZUN`a.EU7RC(g[-ƒ|Fz|HJjQYm:Pg.9U5:@²P"Œ°Tq†`x¢eR˜NLk:V…@eY=~yBX¿X5„H?J+5V-?\&Nd+@]+qg$˜†:`¬‰Z|@?g+CM%Qj-Wt6=u=_/–~Cݧ_Œê¦EukP^4Qp3\l<˜†FÚœp_€thAwJ€fšmJ·}Zï¥m¬´ƒÖz`§bŸ‘Z‡„K£h\€P‚2V‚’bN‹OUs.ŒZ6nƒOˆf?ª—G„¨tIcBTq.Q{/Wl/v8‹£m¢žY[[¡keoB[›Nqx?y‰G^nEa`.a<§LŒè‹¢ñ‚„ú–t¿c`’Pa€7Lx9P_2Š€F VŒŒM“‘I‡—[“C¬U‹›lyK•’H‚‰]m„R;:'up.™Ç]^²eo‘8Á¸}{Í£P–YEr*W_2x‹KMvFQR,]q<WŽBb›McœLËw‹Ín”¹a]²fQb+nI1}‹GdŠ<Gf)Wf%_z;¬Nލ]—¢c£º…ˆpKÁYJ»‡u˜È†}Ür€‚Cšh>¬rJ¼~P³Ÿu”w`ˆbFŽkO¸kW omŠ`OŽ‹PÁz¾^‘ŒK¦€G”{Nk_:uW:ƒƒR•—h„`ŒzM¯tg¡o|©dœ‘`œb†¦fk’Ab€<tvP‚›_˜dv™I}ªVaˆDTf/‹ˆaÀÒ¥´Á™w“Z˜¢onWb“@Xv8`tAnQx«e•³j¼¹›¤§zu‘NjGs‰J§V’oNvb:ž~`œe®©y§«{¼™x²…h lX{{F‘lD|A•„G®šMœ{Fƒƒ=d‡@WƒAa}F˜Âo¡ù~|»VÌ´y¼É|»i‰«U›‘[«w«^ŸŸpı„ ¤eg•Qs®M‘U‚•Se‡9g}A‰K™‰L~…Qªg}µQq§M~¨a˜Ã‹™UOA+I71kVJ~˜M†TžÍi²Ùp}¥X’¶x£Ö‰™a{wV|…Pt„TZkI`I6TZ.A`"7F%>M3~~w§Ç|p™DBe/Nc4XcBsƒn©Â‰ŸËw‹¦j¥¡s´»ˆ£ªq‹›wŸgmœh€¬ƒ«¿™©¹‹˜š–䲂|V‹‡d¢u£•t‰YoYµŸn ¡Tx‚\ž€[~gž“c‚ŽNsˆGhƒAl€Mq]nM_sE`yM•g™°›ÆvzJu‡Z”¥dJjIm‘^‹¬zšÁz™³^oƒJUrCRtGQsEVuWg€‘µ¢¤½ª¾Ü¦ºÉ‚¯·t‹ZsŽY‚qº›y¤™fy”g|§^nVo‹\w j~¦bwš]uˆM^m=XpVmœh·jw«k¨i„—Sr‰Tw‡[t€W|ˆ`„kŒ†X€xdŒ†l¥–h™Ž_hƒƒt¥pšŠ|¯˜Øq—m]…ih“„jl`5_o>PQVdSo_@ƒ}D‡œS«n…‰€ž†c¢€M‚yIlYrbCy~5›Q‡—_P§oBxprJHF};CXM_K9UX1hc=awHXpOqhBh~=`|M_zHXw?gkEm`7hiAKsXXhKf`-Tg3Rf<bc5tj9gvKjqM‚mEŒ‹Wl”cOy\[jHwh0²dAÿrAÓ›jÞŠ¬Ÿ|~ˆ¥tn„U•f•¢až¥m©Šnɇ^Õ‡^Š–kz‡`·‚Yÿ‚F—Ò‰£¥…’¶^“·e•VŸp[o”Wq‹XÿxTÿÆb©Ó·ÿ™l¼˜l^œ~]^,(`4/…<05F(<$'! :&8_j^&Uw9mzMD†EMJ9bR.jp;]_BhnA«cE¾tG™‰[˜Žd†‹XËQ¯·k“t]†ZKk_6Y<DR&Dd*\h6P€5r>^Qe[FGcAwk.k¦S‹©e‰ºs•£n†¼uw¹…wªoŽgb—dKnXw`3‘¥Kž•e?skKR,WJ0Pn>TkERb3\S4_X1uz?d…Mb\F[D6]}7PmGBa-]S*lO-ŠŽEÁmˆ{vK–©mN‡gCX=R[(s?—ØwzÞ€gšh:lGMI'`y;eu6‹t4a§cFnE@b+JX&a^,X‡FhO2p‰OÏzD¿ä“e·ŸsŒM^PQj7f{@WpH¥T6ˆ‚XÊ}QšŒj~z_ykSü|O²Ö p‰e‡_;¢V½S˜_t‘jp~9s„B–ŒK¯¦VIlFa0p[,Œ|Hºn}¢h¢•[Æ^lSUo>Tb1tn6œxLd…fzo;z hc’Q¤šS»·}…®lRqFtˆ:¡½oÕ¥‚Ÿƒ}ŽwQYM^R*`r8b˜L_{5R|B]u3yy>p§W{–PuŸab™IyŽG}›YŸ¨gw³j¡›Vhæ†Q}2_Š6Ni0tm.q•E§žU€¿Š`‡JXMZe5nœVY…N[hLcn>›ˆZˆxfs`JªjP€Œg{PB“dWe¢ic{?mKWn9BV`K%‰‘YŽ«]•„_‡™_†ž]jÇdƒÀe·ÔˆÈû¯ÂÙ…ÉǨžU†WsrDÊŽ[ÊÉ…µrÂ|°§‹z‡ao]K…x]§·uW„UN¡fOz`N®lP§¸}³Õ—¨å›…›a›–jˆ—_“›yy©Yr•Lo‚D‹‹Lb”Ct…Fˆ“On„O}‹Xr‰DsTƒ XœÄe»“k·€~žrfvCqˆKfKfNRq6gr5f„:k|Ao›ToKkcH~MбXµ¹màÌ‹´Èt|‡Q¯—dçºsì–kÜueä€i¥yR†tKž†M†H¡•P—˜RŒDŽ‚>uu=†~L°bŒ¦]˜«qÌÎŒÁæºË¨«_º’c|“J‚˜T´Âd¦I…£a™Åƒ©Ý””Ôˆ™¯m|žTTƒ4Vk/^u4os.`W,‰b>O‡žZ€ª[¤¾w’¬gœvIib5<@)64'f[>€°P«¹\¢ºWzS†–b Z}Œ\‚–Y_cLsqD]X07;$A6*lV2Na1U`<{}]”›Vec:Xd<f{EhqKn{Kt„W’°…°ÑŒ®à‹´r˜”w®„‰Â}ˆÒ‚ˆ¿z”²y¡{˜‹zΨ³¥b”ˆV{ƒc¢¥ƒ¦£gˆ}R—‘[‰¤M}—Sy~Pz€T‰Ox–Zy†OŒX†žg¦žl“\}ˆ]–h‹¢uŸž“ÐÅ‘² \rŒMtˆFo„Hd‚OnƒOx|Sp‚RmHPm:Oo=Y†OV~LTxVb•xˆ³Œ¢«z¨©vŽžv£m„ŸPu€NhwSzwSsiL]|Pi¤h~©gy¢m‡²w‰³h¢_‚‡DamBZpXm„_w–`x›m¢Œ\zxV…ƒ_Œ|[‰hš¥z³˜m“ˆh‘j Ž[~~Nh{Maz\†u§˜f¡…b{Hmp<esQ|{Z[€MduUkwTjsRmuHR‰bx§mb“tYfFdXV\Gaf?p…@VxG^^Qr]6yhA\”ee{XG‡GSbWP];TM6an<TuBNsIXkCc`2W^4foCV;ZrEZdCSn;QV=DjBJY6ZZ-Xq9qhFtg6ixOhoGcA‚xB€_q†hgwUYvHvlTÐk7À‘K¸‡mµ’hŒ‰u’i©…J—ºq¥ªs˜ºy€§kf§sJ²‡P®§g‹¦ibS‰˜eŒ±‚Ù¬`ȵ[¢”|Z‹hWnLXx9lwBÿq@Ô‡7—‰azmXRzM{X!"M(_`":hCCI5E05-BH*fR k”>[‘L‹rPo»[`‹ogkFv~Jv†@wtQe‰b‡aCic>qI7œL,•uPÞ•y]ƒ^pZZ{]4qqV^YC`bAfT0x‰H|¨Q]ˆSR“MX‚Y[Q*hW5|<kŽi^sXum9z‹IwŸaS’hfgN8sD27<€;a¡HTˆT4XPR<%[U/hX+\sIX{Qw}Nz“YmxbJR@K_4\E+`}.VlEsn6RiH”…D€‚s€‡QeoR§~<KŒ`;F3BS0ˆ{5©Ì}“ª…a³Ö}ÿ¤k¢oLwQ“‡DZªjj‚?9…JRAEZ8[_/az?a_7mCÕׇôÃtˆvaœ\NpOju=„ƒMœ¦^‰’`â“[¢á”Žz`lO¨mL·mXSTƒZ®‹[•˜e¾ª`~±ww}_hzI€y@Š=åY‹¶wbQR…F¥k<¢´tt‹UpfBKkPXf,eŒA~>p˜\\‚TQP1qj5^ŽXV[5yT2œA¡¡\ »}Œc]jCLg5gW+l`:^u?Dt;_],_l=i„:v±iyqKglH”V•_~`…P©˜j¯®‚¡ƒÈÈuËÄ~¹¦|}•lg¥g^Sd•;†HX}E_v8xw-£°x_”Vfn<e“_KwAaT7H]B.O&GU(@t4WV.mKDjE9•n=ttEn‰UKp/HS$P[!pv1}]@‡N6ž–kt‚9¥eW®ŸwÉÁ˜ßꤘ摩`Ü”qíˆk´ˆWÕ²pÞУ²„jÈx¼©‹®ydvTPF+F+?6#{<+¸\G´`OzZJJJ®‡€ÂŸŸ°j«uHŒ~T_|Yw‹V\x@l€X•›h|H{wI}]q¥Sh‡D™Ÿow¸aˆ›Uo«dX_8bg?YY5U~1ET.EV/_b8fn/^q0hH”¬x¥ÈŠ©^œ¡^›¿hƒªV~rF|iG§¥€âÐŰ_Šj>bT6YJ0XF4j\B†tEŠ}E´•W–SD…{Bw|F”|W‰[foA—j¡È…¢¥c’ `¯ÉwŸ·c”’K‚C‰H|I}R‡”^‹ŽZŒœYužF€N†±Tl“Mb–Cf‡@a‚=s…Ht˜JqšKŠ‹WФ]s~@]l1txD‹ŠV¥UdwL—™_‰Q– ^‚¾c{–Y–µa‚¨^{©kq·nyµ_]?B\5M]7Hh8`u8lŠ<fŠ>`m8U\7_jN gw™VPb:cUC„rd¯¹™Öó¯Ðÿ’—»rÃÃß‹ºë‹šÅy—c§i…`ª˜x£‘WflB[nFq{m—©ns‘b’Å‚›ÖzŸµq¤¯q´¨l“›`v rœ²xŸª{Ôªv¢–`y|R…Œc›£p¡¥v³†Ä»{•›[y“Ju•Rr–Rn‘Mmw>`b/Nd6Ux@Vz;M€Wr¬s‚шxÅkxtŽ·~}©nzŸg~¤u€±e}£_zZ}†TlMuqKu…Ntb„‡d}^rži|¨r}›crƒPt‚Nt„\lŒ\zˆau‡ezšy“˜d…yU†€cˆ„XŽ‹q¢€Á›s§•m«‡lš„ZІGjxR`€_qnŒ¤l„™`uŽM\~GUtJevQa…`\…j\{SliUnƒH`Œbx~fK‡bR_XLbJD\7RU3u[)c„9K[WRJK\1lO6oh9…rMz•Yj£hVŒV^yMYyFZuIPrANoGk]3ai,^vMsl?k‰Fk|K`~GYwFLx@]rIt{:frB—mN{u9f€\kfWeDi8}tDosJwdMyrD‚xV£tI‰ŒOkSŸcEºoHo€W¡s[¡£D¤¦n›«zw¨wzsowSC~`<hL_~X‰tD†r=‹Œ_œ¼kŒÁrz¹uj|[b…Jk¦PO§RmiG^S"bY5b5AgKkD<0—@&49W9=j/EaG-b0 =.<$HTRcD—k7v™Klœw¢£Vhʉn‚wrx\xpT¤G€¤cL“ac`IMZ8DT0iI*àT$r™[qs{TX1fD4[j5_eC:^5sH+w§GO›c€„DË’>-†:?0X[+j|/D›idi7>Y=SN!=P,D\.Rf-6g:5D3nC!„›D}§YbjK{ETc8jW<Qd>‚pAk‚]OkWcP9WnGXh@\M+Z|4~B{ Y’œ\N•icD}§Q› ge¸l9FK7.#~T)‡–Vn‰oSs_wS/½jEÐåzÿÍ¡¸Žâöxÿ¯t·vZ’Q]t:Nq8…n5Uy\PtA¬•B¼ÇŽnÖ¨rtSHl?iv8hŽMÒ¦N¼Ì¡zÿfH¶³¯¥³€‰¥r‚vTPJ7‚^3²\ogµƒWÿo[sÉ©u[‰ŠNs~Kœ‚HÑ¢nu¬yyH~¨^Ô³^Œ{f‹T~pU—_£XޝwjŒUHUE[P-^c<qhBt¢dWDiy3”Mˆ„D’t?†©evœURvBcw6\l8Šƒ;†Yo†Njq/‹¥Km©j]j:iw>ЍeoœoV|I_hDnv:jwC˜Ãbª¾r“„[ŸŠVŒ°u‹ÈiyÃXo¦VažM[|9R>kt:š´jg®ie„CezDJg>9]6`pF~‘ln{RfL3.B 6F&ZX5cŒX_q>[nAPo0NN(PJ)¥pH—†Xl…Jq«VY•>=R%G:€a;Î¥wÉÚ ¬†d¤SŽ|O•’TßÖ䬆µõ™Í’rɼ‚“˜Tv…PJg9??&[N2pM8¨XNˆrRlP8N>/Z<.s\=‡tIgN¦‚_m€Rdi>qt=\y<[v3uŒMsˆDx†G“šX‰”^dKn€FstDc\/b{4[I6‰yLvn8Uo3Eq/Ie4jY;Ja.O`.nxDyŽUˆ¨hŒŸc–¦a¤hºœ^³·U¤ŽS¹–a¯¥¯¿s‘J‡F6dc=‹gNykEhF5s[?±td’ž[Ê\Š›Hml>v^Lt†U~vK{“]—±y—’kžŸ^© gñÊ€µ×qˆ»Ys”I…¡Zƒ^w˜N VnIšT¥f‰«d‡žPŠ‘Vx’Pˆ ^wŒ?jy7nrHŽTj‚Dhr7vvL€~S‹c¥ sƒ¥X‚’g˜±i¾y¥Ís}³XmN}|R‘²›ÓÿȽÿ‰“¾~‘±fˆvLˆxL‚?o†<`|;Pc6hhG}bŸ¹•¬ß¡´à¢˜×€iµapve®º¢ÆòœŸÀ}¿Á†µçˆ¬È“¿aw„^‹•h‰œl x—T‚uKirIxrbŒ“t¨Á¨ÿû¸þÔ„ÇÑžóÏÄ _Š›oºÃ¢Ü¯|¡›i–£m—_uŒ[y[Œ“c—¤x¡Çu‹½Vv£Mm—Kw|SŠˆ]‡ŸcŽ£Yk“Hc~D`{Kh‹Ts²€«ì·ßÿ£¶Òt{Ÿo†²ƒ¶uˆŸb€™j}ªfy f›e“‡\˜}M~CnzEalHWpZg|[m‰WjŠ]x~Xu‡Ut‹]p†UizLjtMqx[~‹s“•]ŠuO~uZxŒ_~™m§™p¢•ožj“œg’…KyGezWoruœ˜´‡ž¯~“ªit—Tc„P`‚?Ur\rbLhrCdvKfsO`pKTsUYiYPdI`c;Rf>TnAlZ=i4t†Hm„cXiJXh@Pt;fh@†q<z–Qr™tfŽh_ˆZOwOPdHMk9tf3hh3b|OkoGWu;efIY`:ajIagByuCruGooR‹uR‘yT€|IUrMabMu^4g[1TQ6hR4fs<q~N—mODˆMHSLbJ(‹V,m[=r`J…b4€†Lz–ZzˆZ]hTwE:eL+\bASl>Xb0We/¢s7½ÛaÇôŽžþ¨Ì’©Ñd†ÌyR›gNlGEd,Vi.Dv;0QEoA-Jž=CeRfb4b‰=Y‚SGvH5]:WZ0k|<Š‹ZxŒOu–g˜ˆc“Ílb¥–BckK>AZV-{\2q†NcˆTbnIeZ:]Z6\S7`7‰g7I{gHC6^>+VZ0Cm<XQ)€”>jPl‘JV”JbDMšR|{<^¡_‘{VWÇaAoM8K-D:7CTH!Ko6Oh0V_;o_>xŽDbYWiPFm2DL+XL,d~AJhVWH2Pd7XoI€wCh–^pž\vžNbnRŠyJqªffomÊQ¢®sw¯n}…aBŠokV8\‹WBJAqG1fvRˆlT«×dÔä‡Üð•àÿÎðÿ²žÿ»y°l^–jW‡Bdw;]v0wo<¶ezST·šPZ¸•ClD\k4ŽL¢Ô|Èé~ŸbgB«e=›jWxx?Œ–Rj‚^•ŠKŽxVÅZ“€h™tR§Žn[“iž{DhU±n7É…T¦²syœ`†‰[³{J¥×‹ˆ›k·¤oºœƒˆ–yœ©\´nj™ckrJsMqnE|Ps]h}F€=€€Rs˜YŸ€G‚˜bb|Hg:RˆE\q4t8¶‡Q’ŽVj‰M›·j²Á|Äÿ´¿ôœŸki…XWe0_[3fv8Ÿ‚H²‹sZ\L\e'‡Y‡±zXƒ;]g/…Y_|Dks;Pˆ¹up£vEn;GT,BU+6F!I[2Ur@DL%=\#Wk0yœV‡šY|¤]UžT]v5tŽM”®wIfI]5„`>çpOÁ]ĵb¬™`Õµv»o^‡8mr;‹mQxI¶‰e’^ʆ`ðڦŹ~ô|ÝŒ´©tÉ™kˆ”Y‚tE…‚I‚OŒ‰StGœdV’xJ‚TmpC‹xTÞ¥€£œbžŽ^z…ValE`i:h~EevDcwB_f8~No’PUh6[q6ez=pVdšSQˆ<fl<˜„OS}8\‡CdDat?FQ*dZ3Y{AeŽD^ˆBt˜Px•`•s›l‰˜bÈšnµ^²\Ó lž¦r£¾¡²[´³dάi”—Vy‰T‰•O–vJž–Xvy@¦uCy†I~”a‹šd~¯X–W›¿¨Ðz¤©f}›T€¾X±ã˜ÌõŽ”¸V¹«n¶»oy¤Xt—Nl—R¤Pm“Az—Lo—Jx“Cg‚?†’U–Rh;s{LoŠFr€AƒrJš‚]œ“^Åb׎f¼œo¬²}Ϻq‰¤^ÝÁŽÈÕ}kAXk=“’Žãü½Õÿ–—Ü€©À‚–¬^ŠJ„™Mk>\{0[}4r~8‡M¼Û«°Ëœ¡±…ª·…“±eƒ‡}Ë⤠Ät‰¤i”»l‘´\~JdhCjpQƒ™mŸ¿‘²\€“b¨¤q¡œrŸ~ Ä“¾µvžqæÂ©ÿÝ•¥´g…«x±´v®c¢r”£p˜ q–”Yx‡Mi‰Lv¦c±Ì}¬Ûp”Ã[z£IlrAf€WtˆX…‹eœ“\‡‹KhpBj‹r Û¡Æÿ ¸ãx~¥d|˜v¥¹ycy•^uŠ^w”]wapWhz>hxDf~NkzXi{UuUqŸYiœVcOasKpyWv‘^v‘HauF\yHjvSkg„\‡Tz~VuŽ[q[yy]„jW…‘kŸk”†Kmƒ^z’u’®ª†¥²‡¼µº»|™ Z‚’[}”I0bTD=4a?!eW.F`BlJ@Mp6:eVR?;hI,^`7R~Ga_Pg`?wrCa…PnsTpzFWˆPhgF{nAm€L\z\^w^`vIIˆW\_H_n2`v7`o7ZoDVa9Tb4Vg5Qg1XF;Q\3Wl=`V+pW,sa;‡eF‡nAv`BI^EXS>HN%MC(YR*kg4on;`€SEhPEYCYZ2Nc4LV6S@.^M(gS,cg;ToBIO5\;+iC)WS7?l?N3.eL'›g8ºN±â…¯ä‡œË€f±r9|Y=>/JR ob&o’AZ^eQ{‹CS”OLSGff4QvGTkADq@_sE|€ISŒd_TPouDs—a¹•lÆ{EØGjsVJ3is5cJ[`Gkb9WD^cCz\4rq?€tEd?TwQcTLOP4ZO2\t:“œKY¨^b|Hj8o¦[vºX^¥[dkO[`:\>[±C5db6R&6R'<G!bT#P}:Sh8~gIb|HzHl [HqNVg4`l;[s<TrNBoFz\/yw=xiLƒNˆªxg•uXvEpY6€H« l‰•oŠRŸ‚Q[ŠY|V@ˆ™Z|Äf|ia}Xp”Tz]¡b¹Ïk¿ç€äõ‘Òÿ«Îÿ´ŠîŽ´pk›‡ƒ—EKWCpvBŠ—F\rU€e:“£WKo^Z1”ˆO¦¨‡ÅÝ€ªÿ£TˆzfO3ˆy?fUSDÒk@ÄÕ‰€«„›~U»ƒZa„a`@w`q“fŠ•brOrq>“Kœ{N•“U[–cn`/qDËœZ‰dŸÃ†{™b§¥a™«t’g¢Tµ{V‡Ÿmo’IQ‡Qep.Rs5fe,vx:lwBge7x‚Hi‹@p}?v›OywDcxB^s>ˆ„;Õ™ÿÓ•ÿéײ—vouM[[7^a4Xk@^l1[„H`{LcO„‹W wqzTRn7w5w¤\oYfP‚P{¥fqyDd’YRu>Uj8Pf9Vp:`ƒAoŽNx©_±asœ_Z„A|h=¡±uˆµd‡ž\re@bT9ƒ]5Ÿ„\Ê€Wÿ„hÿÿÆ®ø³šË‰ƒ·U[S5qg@oi>øeO½z]©‡[â›fÿ¸£ïÒáÌ~ïº‰ÑØ„¸–t·”Ω„ÀÊ„‹—L¶œaºq¥©nœyYëz\þ¢¨¨wƒN¢‚R¨€V×¼‘’«sl“Ms|Dkj9isAVq8foBd„JZAhˆNeu?iyIze}“c…Vi¡HR\*PE(VB4Gk,JA&KL-Ÿ„RÈÿ–®ÿ{žWƒ„X™‰h¶j›²_‘˜\›~Z³‡]ИlÌ©tØÿ§Æÿ“½í‹ÙÅ}¼ j¤›[š¬O¤²Z’“[“Y{}F³¯y—°mxwLއXw‡U¯•uÙ»ÃÛ„“ºe¥×sÃχ¢Ì`€Fy™HmˆF“§iƒ«Ra„6c@z‡Mx?yH‡ cz’K•œ\™N‹—N|«Sƒ›Qp“LcX¿h˜‚]œˆb—²o‰µ`…—]xTu}Lk‚P…tC`m;au<|yh¾Í¾æ„©Ùp‘¯k©Ãk™©X¥VxŠ=`~4Y6\|@sŠNw•dž¨zš¨p„¦ƒ¼Ã‰ ¾y‘Åwy¡Y’°[“Æ^“³Sd’@W}@]W¢½ŒÞÿ·ÿÿµÌÿ¯›öŒÅŽ—µ‹ª¿„º¯rµp̱…çÇŽßÚžÁó²é|½h¡Ä|§Ësž»m°£[Š–Jj—KgŒMx›a£Àv¬Ôh‡¿Se†ForZ†”QmŠBs™W–NjyBq•‚¾õ¢Éóz†¨\nŠUx”e“¡c‡‹My„JhoFeqUnˆ[{ˆTm‹S|Ša•h–Ÿc‰šc‰™j†¦j…¥fvžaw’Vq[yœ_xœQlŽGc†Fc€Kf_~“_s†W€}W‡‹Nk€QlxMwwR~{^špg y[Љq¡©}°£v¡Œs”l£šx§¢mˆŒOkoLpuV(\:=56TP&Dn1CV9hD+[d2AnMFQHJX5YS-gW6]xCnzV‰lF{~EwˆVW‹ZPwRec?kj8j~LV{YgpYrrO_“TSmX\^>af-Th<Sa<gc7h1}|>Zq8uVDiu:InE[N0XO*YO3`I1o^3rR?CO6FY2OS)GN(VP-M]3kX2wm-eXOpWSjESf??hC9M.@T+VH(PDY[1JX3P='}?%g\.=yN(03X)„M—¿MšÚvˆÃYŠa5KG#P*/6"H:]aHc2WH9dr<Um==xGYfAP‰AN{Oxj6™Ÿ^n§yRnj8^L]=,ks5j…XŒz^ȉ[‘À{`Ï©ofolv:hkVdkLff<qcC{ŠM|•NjJmxM€j=pfE]gU_^Ha~K—‘J]·g_ZjŸO€¦P~´f{µ_Y¬cH’S5JFdI%wŠ0;‚oJB1@S,PR2OI1ge2^‡O_bBjR>x†GZfJbOXZ7`qGnšPZ…X„FtdDjaGayR…•L\‘fSZNzc5_`Ip‡O†„Uw‹R^šRlK:¨R/Ѝ|¬ºsŒ ‘o´Šxnm‡U”‘]¬·dçÛsÙÿ¹ÉÿÃßø–¥ÿ¤—´w¸±oi²‹N‰D´šEU¹„`iA]Co^:PjAK_5ªs=“…[Œ›uÓ¼jŠÿ¹uj[zC{pQWnLh=ž‹GÉ•^ ¨‚…ª}Á›i¥¡zŒty—m[[|‹F”F¼¤_x{o’bBvŽO_n”V|˜Ut’XŠNгk—Ža”²h¬wn—fqoHjxAjˆE`€?[yIv|BzŸUf?uu9R^2w[-‡{Gr†Skj<‚i4yŸ[uvC³†R¾ÿ¦¯×±›žv¥°ƒv‹cvaI^yIgp5e‡Mfv=x|Jy|RŠ©fdƒPXo;G\-`g(„šRl™[u€Nl…P|Mr‚J—X‡\nªXŽ|I®±wγnËÅuk›`ƒq;`hBJW+BX#>R%ªjNv¤sUX4TB)†f:Í¢lɦw¤ã€• Xÿ•qíפÿ¾¬¬Òµ‚«nˆœj£e®dη‚ݲtç¯uî¶~ÿ´™ñ¢ŒòDzÔÕžÛ¸ŒÍÆ{ˆ‡SoAŸdgr8ŽkGgU·ˆjVÅcS–j²˜`¦X±|`ÿßµÆÃ˜n˜ZW[,nhC|ƒUk‹M^~Bvh8zŒQW}<ts> tKoh9jP9dQ*wsCDd.-740MU,c‰Mz›SŽŽTÇØ†¸±—c‰ŒT|^IÆtoÙë¢Íò—›¦e¶®iÉ¢uÜÃŽÖô•¯î€·Õu©£h¤¢i¨”T¸ÇdÀÃjž™d©šY£•aÖ¹‘ÉÆ‡¬¨u“ÉfŽ´[›šh´¨bž¦]}žSŸ`‚¡XiŽCf‚Ce‹Fk—Gw”VwœK_‚@e€I†”Sl•HaŒEv”Nq’L†˜Vž¨V‡œ]Ÿºwž²i——c†ˆRopFŽ[N¡yW“tdœŸs‹£c–Vj”O‹¤k‘Yc‡=j‚:wvL£™o§ºk¿aƒ¤l¥´lœa¥£WuŒ=_†?h{NuŒZ~ˆc~™c{“Vv‚UŽ}k‘Šj}^€ g{ j§`jGj–;gIe˜\}§f~ª`ƒžv©Ïˆ±ÔžêÿÏÿÿÚëÿÆÖÿ¥²Ý”»Ô…¬µd˜±ƒ¨Þ•¸ß½Õ}¦Àu›Û„Þ|²Ôn¡®X•¦X•¬`Qt§Sr¬]ŽÆi›Õm•Óh‚²UgƒQrKs~Cj†HsOuH„¦sÂᇲÑmu™Ed„Ku†ZŽP|‹FntEhmGj}WˆX‚‡Uvfzm˜–b‰¤_r¢Xe†F_tB[iNo{[ƒ’e…Ÿm¨lz¥afI`‹K]‰G^…\n•_}ŒU{zQw~CbnJcuKjyPryU|Z…ƒV‰—j‘šiœ‡_…tU|b„m‰—evCafMewdDVAeH5sv59}O^SKrU*[c4qbEh[@XgBReL~]E_„:D‰^RaNyf1xp:bSdpSshEskAuTq„[„†Yz‘VVŽVGl[U\>YR%dL'lQ(•f4xv=woG„o?›‚GU§ZLcYYT,YU/UJ-_M3h]8]T4RR3Ad2O]4KR-SW0GY4gb6‡t2h‘Ia_ltJe^=ZkKblF7}J6JJO1F_!U^.ST*xH*vY/9sM"F7X%Œ\ ’›E^s/^`5@6+H$96-Q%;B&4T!'C%O1Cm.ao=‚„5‹½[n·p€¨xŸŸb^žsRbkRh5TTAwK1U€?MYK]L7ec<½d@•¦Su°ŸZlTlL>hb?mnO}a=ojGŽaJŠ¢VOŠehT>LCWcBad4†K‡¦f‚¸‡~Á~Œ¼q‘·m…»s~ g^‰\+\O@/0PE#~e-Mœt:_9EM-VV#ko6£ CHÄz9R=HM1z`0_”SDRHgC-‘‰=h¦xq‘iWšgZqEhwHewMFzL<L>OH+tb/“<`_lYFx‹HYlMElFs@¡ŸZa‡unW}]Fb‡gŠhD°Ò\°áŠãë€åèš·çìé“ä™—Ùz„¨~gÀy«™T|¬oGs[e\4`‚>Gj=MW-¥n:¥²|¾…c¶‡oÿÇÿþX~rwzA„ŠQ™£c…cÖ„J“uˆiJ“vP‚™auzH†uOe{cuzEˆM~aEt|E_j=‡‹Hz”VYgP\F3ˆ{Dj|Y³–OvƉ£†Rz³|e|IvU1\lBXj2[f/Sy2uzCyy_t–q[¢rWzL^–X`Ÿ_ »eÍ„iºpSx>uB~W°±e’²mgJ‡Tp«xZEŒW;pnC’^vN]p=f@Ç“k¯z…t;ª§|^~L\…BƒMˆ’grGiT{›ZŠ„mX^7mBŒt|‘V•ƒGÖ©|ÕΓ¯_Œ†T˜ggyIRj5Gn2PV+GK(g_?”oS¡Y©‘YЛhÝïԥ§v¤œj˜wMµlÿÀ—ÿ»¬ã¬ÙŒz͆gⱇ׳̞jÀŒ\¢„c¸›n¡”fªqÍ…c½¯v ¤dˆSx™[¦ƒFÑÎuÍ«f‰„Mž{Fš‘_Ï…f·“f¤“jÿÁ³½³ˆr†M^z8•jJռޫÌmjƒJdn9x|Lh{Cqz>}x;me=iU9dP7`\5EI%;:48>:#™|^ÁÿœqŠI€”Uig4•M‹SŒaˆa¹µ†Â΄®n«§_¸¥dذeº×wÌÖÆÛ‚¨œe¸©d¸b²Ógľc»ªZÎÂa»NŸX‹OІU¦Áy—Ïa‡T†–[mˆGcm3n…<u‡Ho†An€J~^‡ž`o’@n‰Bp‡<mˆK…ŽPo¥M]‡A^q6ƒ}@œœU¦bŸ¤e¢¹¾³o¿›h²Ÿe¢žbšªZ§«]¥Re‰UvŽPnwH’\º¼|ÞÒ{—´[sœEŠŠN˜›ZœÅfÍa¤³e ¸j¬¼wÆmp—GtŽGdŒM‹c› `Vx‹R|–Wl˜R‰Š^žj~©v‚¤dl–RbƒEe@c‚OƒŒ]p†LatMiƒPp„N…kªÍ©ÐÿÎíÿÜìÿ³Á܉ °e…ša°{¢ÂqŒœKwNŸ}¾ç–®×u°[–°^˜Ám”ÅlŒµo“Æg’Ïj¦Õt¯âu¦Ô{—Äw‰¸uŒµp‹¿aƒ°T~²[|CtœQƒc cˆFmIl€ImA_t9ZoA^oMi|Wo…XvƒWuˆ^}‚\{‚Sl„\s[o˜Q[8Mq;]vDo~Ns“^y©rzŸgyŽ[jPdU]ˆYiŽap‰Ql‚Of„BTs:Ri?YfDc~Wn„[{†VƒU|‡\†PslZŠ|f˜—cŒVqJthdq‰}g_CkjAMvM6_MJWD8H':?'WA!~[({c=dnIzt^_NYwmWrKiw@x{Ao…EhˆIg‚KYjJjeBruGp{NevO[uMMwN@pM9M(>CFJ#_N"gT%ŒW+§d3ЇHKd@bWGU/KV*DS1XI.^d0hm5dq:P{GDjDUV2_Z%g`1vyEb€DaeB_oANvNg]@‡j.tˆCC‘_-aO/A%B(GP]S){Y*jb0Sf>9[4T`<Qw9PiH7cA1B,@@!=I#6W+;A;Z&:U.Hd(V~5[ˆBc~PŠIнf‹©uƒ¢n?{lEAR[M)Sg/T_>P4UO[XI\h6MY?_G0¶Y-žžSb¥’b^[}m>kO|Is²^ŒjžS˜±lÍpmªaZTv‚KrœYr”p„Y€Ž`ƒcx¨kO™jF\UGN1<Q6FI)Yz7†‡Ga¯jSjLNr3]c7‡]%Ér>gšcO_[pMdyGE‚E2<2f7Š„?r”v°qYd͉T…cl{HS•^WwIPe5ee4Nx/L]9Pc1uc5NoOdn?zpH‚YJ’sHžo”`hmUz}B»šC°ð†áÿ–ëÿ¯Æÿ´¼ï™‹ñ‰Æ²d´à§À¤žÂ}g¡‰kfJS~BFZ>N^$BT/xz2§‡JškX‚zN™_>ÿ³w½ÿ΅вH™]©’hw‰gœs;dwHsZF^P@sg;•sF€wYX„f{‚BsqEhE`p@fu6|M0‘H‘\B΄^œ¬^|T™„Av™s†K^pD;[)F]%GW,Nj'cn)k–NKwLrf5eoQjQ+|^(‡oB ‡N«„Z€œ[¸cl¯vmtF¤¢e‚—nN™er“l€z]_xSmd6f|?‹L1taIop@”~T‹µƒuŠRžaЉG—lEŸ—q°¥d—•lz›g{{KpƒX]sG^uG¡†W~¯z€ŽUt‚WÛŠQÄÅŽ~˜pxž]xRZw?‰tCh~PftBMl9rh9pTº„Y³£r ©n°—WÛ‘r¿Œg£Ša‡—`Þ¨k䨊ÿ¤¢ä؟ٸŠÈ£gÀšb›™c³_¹¨j”U¿b®²q¾‘[«šj‰yOˆ•QTÿ©qÂê§Â~[Æ¢k¹‹fqs@wrLŽ|NŽvRžkê·ŠŸª†…‡Y{zQ¯¦fÿ´ÅÏžeBkV1dm?\o<yx@o~?Qe1xR3ŒlDPR*L?*GB/]ƒO[‰A‰LÅÁ{i‘IpœQržV¡¸sÈÖ˜®º¨»¥ž`°ÃwœÐ…°Âo¬¥]¼¿cŒÉU µS¹Ât¥ž^§¦Y Âm«Úp°Âa«¬hºÒ|¾É{ÀÃ|¬¸j”£T¢«]¥°cŽLt€K|FfŒ;c~B‚“T_=a~7jƒ=‚?au7av9j‹H{§cn“b¬¿•½í“t´S\’;ƒ¤W¢Z§¸xÂÁˆ´hŸs˾p×¥nÊ´j±¡hª`‡Z›•e‘³_‡ Xž¥oǦg„•L}šHg‘?š•f°Ât©Ø|œ¸mžµqººsÏÒ‰–ÁXqSuVs‹Y‹œl‘Wr‡Q¥œx»wžža‘¡l•¶t©e‹ `t¨UrQd›Xz˜ZmJixOh‰NgŠIN}Wˆž‘ÆÝØñ³å´fvšQt–a¬g‚œGYk<irQ{Ÿ~·Ô¢µó¡ßvÕv¹Ý}ªæ{¥ÛxÏtšÍdÁhŸÉhÒu¤Ö—¸ñ¬µÿ¤±ñŒ«ÌpŠ¥Y{JnzR…„Vy~Qmq;dv?btGg{HdˆNdxRivXlŠ\p£ku£l‚`{Š\w…Rp‚Wu‡Z|ŠKx–Ec“CdŠG]„Lh”^|«b† UeNW‰Uc‚cs…ZgRnˆ[v˜c¡To”Gd‡JZuLg~Zv‰`z…LnuFfqFkiJ]hWsw_|\y‡\j†Tm…p—‚b^=[b:@[D9KB,K/%C$P/ZFYc)jW:uL4thDX…\W]_[hH~`Ev{D…sNƒ€Kq•U]{Ydl>[q=dpAafGuhAh¢X<~c>X=HA%ES(5I6HB%\Lre)os8ikLVkIdd<hq3[{DbaAmn8“ŒFsŒKb‚gEfTNV:hV)ja3Ji;KU8KT-i`.Xb1JpNd[7d_*OvJ/kC$H;:.I>FW)iO#T^%Qp>io4p7zˆCN~P?dK5S*F8&LG!6c%;O*FWjl'‚?…±fw¼sv m„›`u³jjk]—c9kRKN>M`/\g6ob2€=Z™WgZCaq7Y\OUV1h\9À[5‡©RŽ…„¹•P¥i¥žc§ÅtÁ€…¾x˜£a_–eY~Wj@k‰ILPMrG]r=Qj:\bE~i>Ž•Ga¯jf˜ah•Rc„J^dApbFG“UPnKI_4,V8A- UB ’a1uƒWdWhrX\“T_‰L~‰Gv™\e–if‹_€[<X®`n|hd•[L‚\JHA^e.a’;AfD]u:_Cm‰AhwIm}SjS†“O§¨Td{{d[<W”Dv5ͶUÐÜâÿ•¹ÿ¢ÀÚ†‚¼€†V–¡o¨×b·ƒOuAfp*nI9†JDU![f%iyCWwIdR;j‡@—J¡[ÿÿŸoÿÿ£—_®’jrrg^TEqz=hwNwQ6ZxIpY7e^<”pCrŠl‡N{uGgk=ZU2QN-v2‚‘T}gMžH;Žeh‡Wsk@`yAOv:Zi@rs?€•^epRRw4W[,Nm:Gc9`d7HT:J@#`K$_d4gb4uUstE¥TfŸick=Nd:Q^%iwAtO}ˆWˆ}R`—jhˆA]mCVS3\N+n2™e¶«˜x†”rŒƒT…W˜m?Ï·}Õšž²”dqCgnBOa8{fE‡®kv›a‡wM}mNšuI¶™oqxR—u?uuLetJzBjˆLLnL™’b¶“eƦs´¯p¥‘`“[ª…NÚ·x»¾zÂÔ–ÀÍ•ÏÃ…Á¼ˆÿ¨â§Æ‹lÑžlÏmŸNÉl³¨f§ªW¶\Ï›\º¨s¨¢c¸Œ[³˜\¸‚Q̧p’§j·›]Ÿ›\i†H{pAЇXrkE‹oRŸa°¬z¤f«‹^̺¸˜`ÿ‘…”ºˆkpN|jIvpDv]=rh:€fAm†FxZAu“Nk…Gp†H¥–`ªÅ…žÉuœ£Xv„Cÿõϥ꒖…]…zDf;¢j:‘’M£¬pØÐ¤ª×† ÝqÕÃ`“¤Qxªf¸¿–¹÷›”Êj›k±Ç‡Ÿ¼jžX™h¸Çƒ¼Õ„¥Âz–°j‡žW†ƒE¦{[ ]p…OzP€›M†{Ne€E_Ge@q˜B~O|¹fb¤Qq~T†˜m¨g—¥dɶoxœKn”EœªeÁû¸~ŸÊz‹ªnÛâ»Ìkº¤Tѧm÷±~á¨oŸ¦o©¿²É•±c€{N|“Mh“Oe§Iƒ¢]›À¨½†°¾|©Év¨½xÒ±~–›Wu|Bw|EyxU›žlŽ¡Xw‘Ušd²£s±h˜ž^|‡Uai=R]7fwDƒˆr¸‘y¼gn–Uh‹^q’aužh‚špy¦nŽt†—t›´uƒ´\s›[‰³iŒ±hlƒFezWнÄý«æÿ·êÿ•¹¿n¢—d gœÉušÅj”¶f•¼\~ªU~¡`‘ªuŸÃÚÿ×êÿ¬°Ädv|Aar>WnBagAm{OtGaj6R_9`oQ€Žc‘žh…k„Ÿfƒ§n”®}š²x¨dnšb{™gt`t‚PluAan;as?gsBfyJo…_|—XvŸ`p¢`sž[tš^f‹PhŠWp‡[…—e¢e}žWm‘QbTcQx…VzJf~F_qKnmNruQ}†[wŠl„–e‰•Zx‡fusKZ=BU62N2&>1-=%+:A1LAF\4IL7eI.bg2X}OWcXd\DvE\qJfoOh>Y‚LbaSh[7gl:otAqs=‘@S·bLnzJa:QR-OR/CD0HA/V[3Yo0jj7qp@WrCjpQtn9az@k}U‚KžLt„UQt]=fLMR9VO,EL/5F+HF'ZC^S)Yq=Ca6<[<GO+ZO @o57eEBP:@J#FT3Zg/iu>Y†@PyQUe0Po8;a76J./B E;DU%N_-Db2ZM#tn.z£Vƒ¨aw¸t j{co²syžmZ†fRmPZhJTFPr>b]1~h-YH~tMW®]Q^SIW6[Z4h1¤—H¡Ì†Ê|“–yŸ§]‘»}w³vb‰fN|OVx@au@WxKXyVc…NJ|MJ[3<Y</^h7ck4bpDvE`–R>TVSAcc1H‚HBQC?Q-,7%.4:,‹= †ƒHJnVuh7m—LxmPy‚Wi hOahvBd{b›_0g³}I‡k4fE;8,b"k•Cƒ|O°•NVŽ|CZ>X;,zj6gnWŠ]:‘žPa†mm_;x…B¿Ë\²ÿ¾Ñ‹ÇÊ{Џ‚n’b†žC—µ]µÃqº‹Nv?Rn0kz2Ol2JW.?]+hW!x|@q|Ho…MvpHMS>£Y5ÿëŒÿÿ‹y_}sWrUAgtIp€Im`JQiHGH9kT(sR0|MyVW}IRJ*\J-dK/€O8Z…~ONLBi@'yOR|PLm3Sl5Rc1];+oG+wgAb…CKl8YsHTuI^tC^šPVlAr}Ne~Q]j<fw8YuFXZ;od3JQaT/\r5Lq7bg.‹dA\§qpf:[‹OXqAYf>`i9bEkFº™\ž¥uÄ£ow›jvpJ€oFšwJᆲ~k§iŒzQx‡\‹`®¬€Á·|±¥w•o‹mBuP{€D•k>ŒwDvyGƒyCjxEiyJŒyC¹„T¯¢eœT¯’[‹©[{‹N’O£}g¬Œc›ƒRª«~¶~ǦyÅ™r¿”kè’„¸©…¬ŽlƯv©rœI®¢Z›¦^£[²ŠJ¹h¿˜lĤiá]¬á‘¶à„´ÏxŒ|S„sSwjBh‡B°˜g~˜Tƒ‚K©rZ•™t©_Þ´”ëÉŸº—k¡‹c‹g¢ePˆi›wPˆ§hªÒšÔ…‚JqZ9©}g¾¶´Þ ®ÍŸ¬½‘ adw5nv2ÿÈ¿âÿÅbt<am6iyGƒ}M¥V§žVw{DˆzHž‹S£gƒ£Pš©nßï¼Àá—•¯]^t4eV2tp<mtBš‹n¨Õw•Èj‰ºl§®f–›\Œ•X’²d—¬k¤µgl‰KopLŽ«f¨ÙޝòˆˆÀX”½g„Þw•Ö«¬õ›©br…It™Xz˜Vœœ`Œ¬Xv›I~¦j¹¯‡©—n¶”q›´d¼³~ÌÍv£®`°µuäćϲoðÖÐÈÄ¢u»¡d˜…N’Y£xîÕ–u¤H‚P’”e¡©n¶Àr£®bwŒR‹zA€‰I‚V‚I˜‡W•¡Y…¨c“©a“™[ §n¢¬g‘S†€Fp†In’Zu†^Žb”‡Yj‰V}•p{˜\ovMqvY‚žf†Y… i¤ËÖô‹œÊk†£n›¨hŽŸg¦Ê“Äü¸åÿ¨Æ×u‹‹HS\8:H0FM=q„W‰¯U¦T€£V‚©QwG[¢¼‡Áä Ð䇞¹Rh‹=Z?[o7ck>oaAn[:UZ9UgLj‡\ˆ‘p››qŽ“`‡Š[Rs…_†—oŽ«vƒ½ŽšÎ‰‘Ë‚‚¯Xq‰Jdv=Zr@]pAdv@jƒIv¡]†®f|¤_l˜ZdƒNf‚QpStU|†ZWŒ[rŒMzƒNnKn‡No~OwŠVr…RiqLpuSs„\Œx —|Š˜cyˆYhyZWN<VP0=R1(Q00:&;B?A>CAU,aJ*‡N#cq;wsUofMhJŸŽRyvWtc€MWŽ^]QWVL8TW,Zb2^2Ÿ~5SÌ}NzšL\B[S+M[*fM8uY/lj8`dB`a:Vn:Vo8YmAqh5|…@†Š]_wUVhLQU?P_/Wp0fl7RO96D62?$ZC gUg[3fW5Vn:Sd4=p>ZM+bi&QnAQcE\j4yKœ§axÒyJ¬p5jSND*Do/?e54X):BD<=< 9@,0R+I5bUnl7u{LgQsˆ[†ŽO{®g[¦zPh`TW9cT/btBVsEPe8a^(‡f3‰GxÆqwz}orA‰€D¡¯[½Ìs¥´|f¦‚ukd‚šRj•iI{]Wa;cr.X„EXjK_w?[‹Y[V>ˆ`ON.I_9U_6Rv<jn3fm6kA^—GZu>OMX^66zA6B6.L1/,2/:"O4!—P'sFdoMgw<duC‰‡Qtj_Tr^“N4RºkWcD€e.Q´w<vPLU*o$CŠZn\=¾‚;V–pDm7_h:WS8UG1yU1z8[“nWtD{l=ð¬T·ÿ’€¼…€Ž_{ [†šKœ½Z¸×rÌLxI>YWIW~:pY9cpE=^4W_$j>rQ@Oh@ag+ph9’jEÿÈsqÿï~~ceƒTtc?`}Cvf@asK~aCksFRxBŠm8Ž‹`ƒ’gc[Rr?ce?zT;ÕV„œ{…ŒQiŠXZT@uo7´tTŒN…l7–ƒdUlKlg)aNTo7YoCZm@j†Mr~<gvOVR;YN/‚c5haCczQrBb”e`v;Js;Ie6Rw=ga*jxKpwG—™f{¢vp“`9mGRF.OR2_n0oG-›rQ‡WQ·wV€cU‹`U~—g‹™b« z¾¿´±‹šZ–„]ëuaÞ’z¶—y–‚[x}`nj<¥Asœbi~FzyHŽŠRjŒLlˆB|‹RR‰†NswF˜sMzXl†<m~4¨~?Æ…PÚzW̬ìË—É®{Ò•qÄ—zƱÀ²…¹¯uਇûØ™»ÔŒ„›[“‚G£©a‰²a’U€~C–ƒI»‹[”ÂmÐÅt»ÛЏ•f²…\«vR‹ŠIæ‘k•°oŠšjŠ]œ’h¢uU¥xSÈ®‰ØÞÉŠí¼_Ÿhƒˆb“¾Å؊٫„Âäþשÿ׫¥ž_¨›e’®~†±†—½œ É©Á{¬qtJps=ÿ£•ÿÿÿƒ–^™\Œ—X££_¯£`’§Rl˜GvzG–uN½X¿ªaЦZª¼uȉ¡S{Hbn=gvIŽT‹•Y‘ªS—Æe‰Èf¬jp›Opl8“ƒWÍŸs‹W‹KqJ“‰g¼€¹Ö™ìsƒ·iÊçÈêÿöòÿÜ›Ò|h}U|o‡±j‹›V¸¥b~¢U¡¸t—§YšŽY¡˜a¤•]„™L¯˜b¾²s¶°jÒ§r¾´Úö§ÍÍs‹’Mp‰BiƒC|£Z‡¤ev–Yg~=eq?m„X®t¢¼t±¶x·¬oˆ‚H||I›[•”U}–Z˜U‹UŒZŒ”_‘‘gª c‘›Q‚“Jt›b®Ç…§½bmŽQVD^†Vn›kŸ¾€{¸cz¤i¤`€hŒ¸q¦v©f’©e†¨e}¤\Åê±Üþ¡Åꃖµ]uUs‰bw bl¨by·p~Ío¼l…½o–Ìs‡º[r¡Ow©aŠ´i±^yšQc‚Ba}C_{:YT2GG,AL7OYBapJvNg~EimBrpGzxM‘ŽS…‹Uoƒ[v•~–˜¯Ü›¢Ì™·nm‘HayLcvIerBe}AdOq Wj–Zošj¤^nŒRf†Ul‘[rPhd}Uv…Mv„MoQyŠTp‚RiPfyV{…Zx~QctSs~d…|l“‰¥¢w™škŠN>D;LL';U-'P3/<(<=EOE^ DW2VH'yO%Ok3YaTgTC†b>žƒIƒb‡kQr‡UO‚^Za]hH;~`0lr<w> Œ=XËZu£R_>i_5g^.fe9fp8__2VJ0SJ3eK6x\9‚€E–~O‚—VL€fKQMBF3KA'WQ%if.hp9@v@I5>8>YO&|N_r)PlD\X5^[1Jt;faDl{0h‚BeeOŒa<¨«N Û•yË\œ6uNHE/KT,Ej1/Q)#7#0.9?;C$/G$J7GDB[6R_3Wj(auBay>lpEI—PG^WM_2NJ0Uf3L}AOtBXr/uv?¢‰Gˆ®d{Ÿ~˜‰J¡²]´n¢rvjK~|=¨kq¤_P‰SRjASg/dY)Go9Y[?hw4g”]lŒ]M˜^YdHNU5lS6cm6B_AUW4or1IŒ>Lg=Gn<Xj@>sCFM?0\%*:2(2+]8!f_3S|OON(ug7›HB’lWA?U>!jR=dQ+B€Jbg6ql6E}KPd'}t0V;Qr?†9V™X`SB`{:O¡QMŒLHh=…X*n¡f‚š^}^xZ›I™œ_ŸÔcmg†A¨‹W|¿xDjS9V@Y!aW/V^=]~AŒh;U‘RN]6V|2U[B9Q%pRŠ@‡¤WÚž^€ÿ±ntmmšZgxKop;grB_jC_jDbZEQP<[N0jf8keIcJYmL[Q1‘oD¿”e‰À[–^B_C=3qW-‚HZtLoC¦Y9gkTZ}<[w6[~8p—Rm_]ˆQo†>p ]R^3‰a2hµqOŒV]h?ˆ¨i±[šib‚K{ƒNŒpc·„vtG‹|U‡¯jišaŽXP¬{<J1NU-p‡4Yq<XuD_m=qq7Ha6se:{zL–˜aÿÕ£ÿ®¨³cmr~RtaDÄhLœt™w_…cŒlyyJoˆG—”E޳lŸ£iššbžŸa™\³YŸ¤|k¯g‡I”ƒd˜œy}•luªdœ˜SŒ}Q‚fI½¶Á¤b’hÀ~X½‘iËhWØwvð—̨ƒ£Žj¢vS—o^|mJ‹˜Ut£T{ŒH•‹W¿¯qÎü¬ó¢€Éw–œV·™_Ÿˆn‚œh©U“´c„†PuP¢‹Y³Ÿk˜’dz~OŠƒs««§ÁÌÆ®Ôº§Ê¸ŽÅ¦mËÂþÚÿ׮ܶ}‚P|}cŸ»–‘¹“’±‡sNre;fA‚T:|_4׈{ÿÿÿ´Ø†¾¦¡«b¥¯b£‰[™ŽY…Y‹[ˆ„PŒIw‘Gx‡Fv~IŒrVW–žXxŽOz†Q’d²ŸfŸ¶h™Êf¯îŒŒÝl‰’U}B’€Uœ“cz„Big?‚hFšOyB–˜hòþ¿ÿ¸ÒÿØßÿ¿Øc~•d†‹du„Y~vG¬‚S’O¦—pã·‹»Äz©ždR}’S‘–\œ¥`·®a¾p–½r§¾£Îwu—Sw‘NwL‡·mŒ¦f‹™h•°`i•O„‡Q’›e¥¹p¹®}É¥s£”`ƒ¢^ªc›«nž¥lšn‰›Yx…Q}[¡£T|’Px Xr¦m‚±qŒ¯i–«[|‹OgPcŒLWrLvr_Œ™`Žœi•²z¦ÍŒ›Ð‘Âww¬ho“p‘¦z£i„|ÁË’¶±j––q›x§j”…f˜Ÿ®Ö—µæ©®Ü¤×‹¤ÅŠ˜Å«Ô‡™Åbˆª^ŽŸ\tWcP_|Gg{CivGTk;HX5@N1EM7WhFguOsrOql:b]8bcD„zYŽ‚V‰Su™k„ª…¢Æ“¥Äˆ•¼mtˆHbqCfvNv’Ry˜OmWqUi˜Xw™e‘”Xz†KhˆOt‰[pe}¡y•¬cNx…Su‹\„Y€„\…Zi}Rz„X„€HhoSirNmuL]sVxj—Šc†R=M;LO-Dh72WB>@58>[?Gj,8Q>>.(RA Wb)[cA`hHs`Fqi<\cGnZ>wqAa‡RdbPoX?€a5giBŠd?˜‚=E¸…\o•WO2iW,o[,[`:^Z?[k=`]:]_:ZQ<P6}tDz{`jaPFTH8F:4;(K7&vL wr5UwMNmJ;a6D5.7FHL$u<"WV-U]@Z\8dh3c{JU€EPŠCImN€V1´Š?ˆÓƒ[±ŒPw`9hG7G+:C+AJ)?a+'G#>6#JS(8R094'@@L9GR1Hc7T_"ek4F{<hX8\[,KsQRd?dg<a†BYwTfvTS€MyxR€“F—šiy¯`~“`fˆ_[jPSm@tl5˜Qy ia‚^V~LUg@LT5_W0^f1al8j…Caš`d”dS]NtTGmOOP/JV*Bi@Fh4Nu5Cn6?b2\e5Z‰KVˆG5cJ:O$A>!6F 2=(Z/D]*IR5bS(€|>`£i+^U)0!:0:9Y6$Sd+Fo7Jf3Ze/`’7KtE_w0zr;›£Q}ywkv>wx@sE—ZSʃ|‚Tk•RJlIZg5Q^?T]*•q+w¸Y\oLrj6|¦U9n[:AD<MC(VU>knGtdŠOLaKDN,gm*NvJ9c.:ONLnc#ÆM˜ÿ–xzk‚]zkAkU™“^† r„¥peqT^XsHc€Ra’^x‚[s£pu“_xY`rOQX<‰g8‹˜e…±lluWMZFeX&ol+Jq;Vn3Vm2{†=u—Tr{S|€Xn“Pu~=v}NYgAN`?tn<Æ™Z°ÿ¹†Å‡uNW‚EGl2CH/Y5#¼tJ€Ú¶Œ¢ky¼|ƒ”`˜›oq·TtByt>h‹BygAo_BieCmu8kjCpeC´yDÚ…t¾PN¥…s¡i\†¨zji7±`:Ì ‚ƒ„aÆW—žj}ž[jœUVd?|g1|ƒKsŽX‰Oa“T]d9uk@wŠXvmIx‡C‚˜X“‘` wO§˜l‘‚`z–_~“Ptd@’oKœ˜k f™ŠY“…Q±„L¨m¬Êx§”c€˜l~yNn‰Ch{=cu*~‚6º¥bÐ覙Å{“TsŒS “`±ŠR¯—Z¯•dÖË…žÌiЉ^®œZµ{`µŠgu^jX‹¢p´Ä¡»Ýµ®Ë¨tf–Ez‰Q¤¾dÊ·g¢ŸP™•d¬¼{x}QwG>yscP]:jYEX`?TD2‚mP³Õ„ÿëӳ剚^‰Q ›U°˜^ˆ˜P‡ƒN\€~H„ŠV‹¤Nf˜Cdx9oqD—{Y¥©`š·c“œ^±“e¶¨q¦¢\«š[³·k¥Ío™U‚ŒYq–Zw†Onx@vzH|‰Gvu:_q@fxG²ª†ãø¸ëÿáÇÿ´žÝ…¾o|ˆWzoJ€wd{¢_H†¦\¤»f¥Œ`ÔŠxÌ®rª ]†‹OoG~}R||R‘ž}§Ò‚›É~š²r†¥YŠ¡_–Q£”n¬`„ŠPš~cžž^~—P…™_¡½v¯¨sÅ®{£Â†ªÕ§×‰µ¼ƒ¥¬~¶®…‰‘m—Ž\€ƒKt’Tˆšg“¥t–¦d{‰\jvKv_u¡ZyždpSd„Ng‹Pq”X|še·—¹ñÇÇÿ·¦Ý“²xŒ¨u’¦z¤n†¬t›ZiyCIoPy‰qªu™œgµˆÆÚ¤¼ÎŸÇÕ‘©»ir}Uz€r’¢kžUtœO{ždqŸgv¢am¥Rx’QŠXzŒP`rAC`9HX=\[DkiNn~Iq~H[l8]f>lvMuxKp…Ke†Tp“f¦}‰·vŒ¡]x•Gd}=_{Prœ[yTvœRn‡Rs‰R€„OyvEep;]qDb~VjŠd„¥k’£f…—Ww“]yŒd‰ŒTwwXŠ‚[v…_ƒ…c‰‡SxƒX„}PvmEhmFhsQw~P|{L\S1_b5KuK4Z[0<895 _88n038HH;+`K"br7ƒmEg›NP}UQ]EhO7im3}hBcyJV]TSQ<SR1MN.{S0—p3Z»yQ{–GW<][3jd-in6ub:yv@hoF^^Nd\<f:”Lf€bPUS;:3=5%I8 RO,e],|n1Q{EL\REV1MU8@Q)EW+IO"UA-ZZ/ftBa€Ca™G~“FW¨La|b}9—¬Qp³su¡v^«f?‘l8R=C:*KI"Af7YT8dZ+Ih@8Q8?F,@P"LB A\4AN3Ue.[s2B{9B_1eB#YjEFX;c^;Ng3?jGMN>^]1wB‡CŸfž«[ƒ°y]ŠgW{Oo{?‰ŠF|…Vp€[n‰HulG_sHgnG]xKRrGpk@r|Dh‹UcˆVU„kU|c=sCIQ7Oc3UrJc‚EYKV†Wf…Dk¦Y^aYX=iSBM)CG$WC!2U)Q8&[I-VWA‘†? ƒMH’Z;PG=U1>L'6D%FG$Pb%Ge1Xp4Ts7\_.Fi4Zr1„z8€³dWhdKv3so9ZvFr{J†tI‚§^»xa°oM|O>Z5?H$tm'N:;B#|n.@}P4C)AD B@0<E%TN*Tm+ia6JMLk8HR1[p9Dn);Z$:GRSmj(æ“OÆÿ¤m¤H{QO_/L]9t]*znCr\Bk`FoVFsd=‚~DsXDZR:pR/q¦UO¡VxD2}a;•oH›ºtWzhxX6c[Dh_7HU4Hb,EY'<]$PN$Rq3Hy7U~Ea…JkŠF]š[mj<^O5‰X<¦¾sšn¦”Q~¤dT¥kdw=g‡PbvHi–`¤”U“´~ƒ´sx•c•’kµí²`™|–‹Rº_ŒsX’pYuqHi~J{[8r^7xl;yaM~eQuWIÿˆg§‘’yGÖŒe¶‡pxP|=\v:~ˆH€‚VŠnM‚X¦²t¸|Z‚Ek|>f|Aaq>tk;[~G˜‰A‡‚P„gI‚{I¯¬q”–[…’VŽVm€Ltr@²{L¤‚^¾€Y½¡eµ–hƱ…¸Ä‰•¬l•©_Ÿ›[zQZ?\o.|œ4Š¡Lž¼olŒP}„N}Z‡yO†„IˆN…zM‚rRkY@ŒdA‚\B”Oœƒ[~xNqŽm¡¡‰ªÐ´¦™ˆ˜x|oQncN~\BËšbÐ~Ķl–¯d†ªcD~;K…Kg«jM€?Zh7gpLu¦iwzR¨ŽdáËÅʆ´«dª¦e——Q ¢U‚K”¥gÅÆšÛ‰jq3ƒ‰M¡ÃsŸÖmžÞf•¤P—Rœd¾˜k¾¤s©y°i—»d—´g¡Ñu·¾u¬¦v»Î˜™Ìpn‡El?‘’Lv†Dˆv>{|E€ a»âŸüÿÝÅÿ›‘®f€”Pqk?wgM•bWÀ‚a‰¡K…P‡¢XrqEƒ^Ib[>r^OŒvY–c‡‚Zo‹G–j΋°ÌŠ¿br˜XŒ“U‚S†§m•Äpn•Cet7{ƒPˆªW‰§Xšœm©oÃÞäÿ°ÉòšÀë—¶È„¼“r¹¡{œ“s–‘k•›T€¢o˜¢m•–VhŒLe”O]Pl•h{®qw°gm™_p›fm]zZƒ`– ‘ÇñÔîÿ˺쒉¸s‡ªw–À‚¯dŒ§mºtˆ¿t‰¿kx«h„—g¢ j™¡q¦ª|¡£w–¦tw›`]Œ\fQWw>M_2Na>n_…—aqœWƒ¨YsžHs‰T}‘[n€N`zHTg6KJ0DI9QnNc–YZM\€@ZvHZyNSqOhš_m±Wi—eƒ¨ls‘Iv‡BjNu¤ao¡]e€Lb|?Ri?QsM]‡Lc{CZs7Od@ZzHd…FgyQtˆgªqš¶v¨ršŒXqsFh|^Ššsœ§n”œV…[ZŒsFmmHflMp{Eql@RN-TU52\B/DG18*C, g>#Pk8EYGYN9Qk0Kf>pZAXm8PfKW_E_V2eo8ekHUsKMQGM`<Ck>XD,wU%¤{4XÈzfœdqP`oEtn@u„;z{NosMjcVhRA«W9Ë‘Nu›lVjoCLF,;-<*"D+SA!]r0qs=PmFGZMhZ5[r<O\?Ih3ZZ0|^'‚Œ;µh…³`…³a€´_fcuwQ‰”>«g–ªo¨¿ˆŽÀ€VÀ“*…i2/0K3dN&ˆxAxxNE}J?L;CO,@J+K;$>T*EP?]]'\~4T6Pr@rg3=iHDD?JW'^P,@l8R]A^]5iqFYE²oA¬¡Aƒ¿‰ulkO^ŽT\fNhrAuˆEh~OfZ=kp=oaAanI`gCr^;Y]8]V;aZ8fqRK}VPoTO_9Pb1N_9RK9YY3Yf>}o;w¦Y`¢fC}R;_EH\)KW(IY9Vd2N[5E]?]Z7ˆu>S›g@K4BE4GG(GJ6TH%ec*fc3wv9P‰JW{EcˆIi—]k£UdL¦sE]=oR(ylC_‹Q^€I}xFtxE”t<p®iBX7F.LU%Vv-Na3d|5\‡F,f?//<8:A&@D"7S!UH'Šm6f€Sr¡VfrDT‹?Fy3?]&7OdRei6‘?µ°Yž´s‘iknPV`ERX6l]3jp3yaHDhN]L#„yB^rbK:”sK…NQ€—UEtHs@+›‰KÕ…†wS•pFŽ“f_ŒYFlBP],]e2po;nŒO}£W”·_œ¥g®l¤Ç{®ýŸ~ÿ°e`•š\c—m[uDDq1DS%MW"ap9šŒJ¦·z áŸpÊ…z¦O…’Q€f€€Xÿ™€äŧ¤W—³koQ{tHlM†€a}uCy—EvE®{]°‚º¸|ƒŸmƒM·{‚¦wzˆRŠN`l?ŸrGw£ltQ¬{ÉÇšÈÖ¨¨…w³‚j‡VogCzMcaB^5i‘YYN7dC:ÍxbËઉ‘f‰{U”‹WwzA€„S¤{L½vOÿ”{–inpDhNxYž¦q°t‰’eaf?]i3|£>¡”Xm—Udn:^b?rT<‚fLpƒMjv@qFnafU<]V@nZ:ª›dŒ¶hsxLφUk9phBD‚;31/->?'gk7ge9qt?~`8£pc…e]t>‘¦n¥Ü”‘Ƚÿ¤Úÿ£Úÿ¯ÆÏ‡Ä„÷Ùµ¢Ív³k¬–f¢¦h¢•f”Z¶¡É~xDj€@‚¢e´æ”åÿ¥àûŽ’½[ˆ¦]¥^¤cÁ·f²´_¦—V—X‘“W ±g©Às¨©]‹™O’“Ts~:ƒI„‡Tv€PVfBcyNŽk¾ü´Öÿ±¸ó–m¸hh’Qzm?ªjU£‹c”£Uˆ¹Nv¢M‡zR©‰ož¡nµžv°¨€ŽwWž„ºƒ‘š`|•`œÂ{Æsˆ°\k”BUu@t‹b¥Í’°ë†} PquDxŠR[„?pzF…`œ—sÄÆÂß‹ªØsž«k§£oš¨n©¬{ž¾yž³h‘Ÿb†`€ŒYr•\z¬w‚Âˆâ ˜Ý —Û”–È}‡»v¶m…¢e\{’[~š~½ÜÁâÿ¹Äà’Àu~¤tˆ¨}“yظõ¨±õŠ‘Ív¬·z³§i’[~Wœ¦b¤¬n›¸“ÎæššÑzn¢e[“NK†M@…IC‚O[ƒNk{GfŽOp˜@cŒGmŒSjŠXr’gt›K[t>\Z~Š˜ã ˜çˆ†»qišXl”bg“{˜Â‘²Þq{ª`t–T^s8GS4XnM|›c… UhŽC^ˆAStAUqIYwI[n<Qg=NjCNlLZG^€JeŠ[€šf‡œa}—gŠYz|QkW…c’™`“—[‰…Y‘—_•c„TusR‰nOos?.K1'9'$3!9%"2<#BA)ZD*[m6L}@_VBO^8<f<@F:H>)FM,YQ+b[,gq9m{CMqMdQGX=>hHUO@[,«Œ<YÑ…Qt³RaLYg?fw=qw=mQhtNdkLˆg@ÞwDŒ¢Tjˆ~d^YC\H(P6-#$:,XL!]w8]‰JZqI}`E¡;t†Ye{TTyDJpB|K*žn)}Äe‡¯v³^lÊl[šxupQ€™L–[È•V«Óy¡Ð£tÄ”8¥€:^O]L$te0kƒC\‡X?€R5Q<<Q1:S4GJ+QN+5a<^C,Z„,e{BbxA|aASV=K_G@^<:P/JH/Q`:NZ4Nh=Wo9r|5‹|?e–`brg^…JStV~IžUamVXwDJZ;IZ.KQ,NF/E_=7N3E9$\Y)L|>T`:Oa6RoA6d7NB@,O'.3!I?CR*YJ.\W3Oa?P]9Ee=Q^:He5HM5PK3HU+FA4OS7…e8M°[nTAQsIScN[h@ZoDKmDU[.Xj,†DŒŸ`‰ZJycYF/‡}:]uk]kFYg:QX@b[0nLbvFLE[g=vw2:\J\5T{9Ju3]f)lŒ;7oA)6%22X=Ga)7S%EO%Hi=FG.hJ+gvETšSPGHY5C_&=T#GQ(Xy5[u5›‡BÏ€^o¾eB„sYarWhxB†„JŒ{SAL;ˆA%ôVWcq²\9XhQI6G8·[€sC¢©\z¸~±”a‘œ`lžX²zE·‡mcteŒ_3icjk?UZ:b\/jsEZuC‹|@×Çtÿ¨…Ùÿÿ—ÿæir_‚PP›_Wy?VQWy4p{>„˜ZngIt‰P}ŒKdšWQ˜T‚N;®œdíÏ”þÿтʙŒŠ^z„_štaµ€]Œc°°`³Á‡·œvÇ~Ò™~ÌÅ¡œÑœ»rÖ£ƒ¯Ád{mFjX1{sSzŒQfŒMf9¬kN»]KmwN¦SC}aUezKepCN\5aT7‹‹]kmPelT¦háÁ˜˜‘[xvUº}Q…‚Tsm?{oB®‰Dè²h«¯~e‰Ob†>x•7©°fŸ¼“p—en†L‰TŒ•Kjv:]u:s~?pzMÊŒe×Ș–ÕŽp‘UeR‚wFšZ{…Qƒ–WŒ]‰ŽT”µdé뺙þ©‰¾_h³SCZ5hY<ÿËqÞÕge\8]uEdŽZo…T…{Nk€D¬ŸsŸ¯{œ›hÛÿ€Ú €ÿ îÆ£ýÞ³’ŠV¢–^¸•cÿëÀñÿµ®ó”…®ešWy E¤ÅuÇðÈÃ|×ÇuÅÔ€€¢Q¨£qÓ䱷㎜®h£¥Z†•OŠ”P¦R‘S…P†oEu@kˆHOn2Yn1^q8DN(TC/eVC“^Q´«{Þì¢õ¥¯Ò—°´|}ƒKyr7r†Ax‚SwrEO™Z¨–^¹¬}½¬ƒºuÊŽs™uׯ‡±“\‰|W©v޽ci”IcƒF^‹WŒª€²Ò›¹áƒ•Zz—V”cІTq†Km‘e³Ì†«ç}¥Ït¤Ò‚£Ã‰ÑÃŒÃʣϗÔÓ–¸Û…–·vx°t†³w›Î“ÁúÈÜÿÛàÿÓÄå¡±Ç†Ž¬l{›b‚¨p‡²t—´l„\†g¡¨…¹½‰œ¹u«h§n‡£rˆ«{ž·Éâ—¸Ópޱ[uT“^Í”X§œY‰›b–›c˜©‡¶ã§Àâ–«Ñ” Ð¦šæ¢ ë žê€ÅbWl5[s>n‹K`‘Blœ\¶n–·r™«ZsŠLo€Zƒ‹®Ã¢¾ã¨è“ŒÅhr†`yŒo–¬¬Å–´`h‰OSb.DV5SiF`‚FqKq—Po™M]‚>Ml:Rt=Uh<Ji?Qs=QpG\Wb†R_Ok‚Yu‰XtR{JzG|}Hc€IgŽO|KrŠRz›oœÊ|¤Ák‘WipUŠzZ%J<'.)*58?DM#G^4JS4KY3FU,WG/EQ%3T0.D59D,NL)LY+WO3jg1mm8cu<pkBSyFHWCQX3„a2·v0U×yTo²OXEdV6hn4{Kc”N^tN~qLuG°pO‡zO„l\i\L`KJ@\:IM-]K(oi1z‘BY’PigO”cBs—7e“tfiUa†NE‹SM^BvY,ƒ‰4ŒX¯»a‰àxu¶“f¡bP|_\O=¤].«R¨q€¦ƒVŽhKfJFW2[Z5yEl¨hH—ljiRaw>e}PXrM=qK5R=`?&ep'b~SUh?L[6bP-LP2@`BGO,AW08C,KI$Lj0Tl5do8n{9u†Ka”^]}PqBhŽSgbW[Z:OrA>R19B*G<&YN#Vg2AZ?LO3Vd2g`Apd:PŽDJwKBh;3P=H? NU*Hh9AU3LB+;b-?P-=E)AU'Z[-^Y<_`;RT8Sm1PX3V\3ug;_•H¥w\“tTpcFkgDYtSbk7c—;†FYsQZ\=B>;c5wd)Z™XTN<O[;Jc9M\9fj2TŽNGt8_k8L…FJV.hZ0h˜TLrKWl,Vs4Dn;*R('<03PZAZ)UN&Ša5S~JfXDOY:aS8r–NK’OEQ5D`#VU%vZ8‚Z=j¦Y¢¶kxÅaoKa;RL8`O-˜Q5¥ ftƒ^WN>³qFgu_£J:±™l€œi‚MŒeE³˜d´Ú…¦Ë‘“‹cu\œjDÔcc•:UP-XE"cb8NI9QW8SjEQN.`d0`rF‘~=›±l|zPéVÙÑ“™çŒwuD€U5p^2kj>Nq?w=‚§hCu;qd.hwEY}P¢—Svšbž¨oô·…öÿ®œµy©ªW¡¥r´g¢ƒj‹œX«–`ƒyUŒZBƒfL¼¥räï°±œ…¹€_Àí¤®Ü£y–rn`:vTB‰Q>f€H’p<e[EtK4pX9ƒT<[U?O>1X]?Pk;YM2ehB~g>ŒcOvnX–x]‚`‰R;nQ?ª{U‚nSrgIziC´wQ®®ƒÉ§lw¥iƒ„E†ªK¾°r¡Ï—q•d{†V¥±t¾hl~>i”D€µh©ÁsëÒŠÑ«}¿–k Uu±_Rd;…iJ‘œXŠ¡Zu‰Ehm<¬†Z¿ÅˆÁï ¢Ûy†¶X„‹[䜂ÿ²~ØdDmU:RS/~eP޼¢ƒËІËq†«pfo=Š‹ZÝ씿ÿ–èà¡åʦÿÿùÿå¶‹Q¥¸uÈü¢Êù¦Ü‹¥¯l§j£±gªQ¬Æt«¸\¨¡\–¬O„¡M ^¦¤]°¨c©^¢·et•E€„E“ž\€†@„{;ˆ…D_n/r…?o‹F[}IY~:š•e„´fgoGbnKY|G‹¦që–Íï§“¡e¶XIŠtDdq7‚{Už~e«‡e‡‚`‘¬x¯tᮂÿ›†â x§Žo»«v¶‘sÇ¡vŠI}Ÿ]ªch•OmU}¼|£¿|Ÿžd¹{Ÿ¸g~_˜ƒdaŒ™cŒ¡oª¢u·¹o£Òr‘±n¯f‘‹tª¯–¬ã«Æú®Éç™ÅÙ—¸Í‚‡“Sw{Rž‘–ÝèÆÙó°¥È}{˜iw’Xnˆ[rrˆ©~ˆ¯st£_rƒPyqLx„U}a€©j„®y€½‚´q€«kˆ·g¨OtŸPvšMf‘U†“e•¯s•ºk™¬b‹”j®}˜´t‹©‰¨ÄŸ²è¶·í¯¸ñ§µÒ~|¯HLw2XvMp£Wh¢Zƒ·p‰¼b|Ndfy¬et•_”u‡¸“¯å«¬Óy€•YwŽj}v”¶živ˜Xn‰BFr;[m9Wv<W{AZ~@d‹JbE_…Le„Gm€G^{EXx?QhTf‰is‘HRq@PlKn~KnqJxuQ~†Rt…NqXuœUq†L`{Rm›oˆº‚š¿sjz”a}‰[/F?>5+PQ*lr7\{GHvM0WH+E7-:,D9CR#NX0Nd6Gp7Hj?Cf=LW7Yd0kl0zx5U‚=BrADJ+SO)o6·BRÛsNu¨LJ:PR*_Q0vh3z“Lsž]„†R}…PsmarZHcZ:V^@eF9|N2Tq9^XC]V;nm=BŒMha]{m<mF]«}^bgnfC[›HU`_‰Ls@~0¢“KwXz€tSšY4m\`@.‹XY‚Fd`H?`;;J::H)QU+“h:’L€°€k tijŒZgjDagPBJALEZU,Xg0YoCOh<KT1LQ/FF1;L1=D#/J&9G.GL!ZZ1Iz<@Y<fc'p5a™Ns”]n¢UUi^@R>UM,P_(FN+HT,EY+Q`;aa3owHh^GBkFSVAXB#\x=[p=<ŸT3O>BF €d,W†]UbGLc:QS/dX+HjC@XA4I,;8(:J(;I6eM&W{1If:`F8sx>|†\€eQhW@ÛYAm«q•£[[’[3^H0<"Y9g€;IQ{l3ArT•J,bp;k~IYlPRqCNcPSd2F\.CC+Hp4„z@_ÑodŒJRˆ?In>HV0Ai.4g1H`&^[(IRBII/TN5_t7Q]3W;‡kJpc^‡QSzAtj4‚aG]=8K.*ˆ_,îŸ]‚ÿÐI…j`D.LhEVQ0“P4”¤_¶ÌuÕ¤t‰³„QMQˆV3†iG‘‡]ž¡h¼¤w¯˜t šjX¤qsR3jƒKÛz?ºÿÁZµqWl,o\.PS@EB+^D#F\@QF,kaCb{D‚sDlˆT^lG@`6wR²‚Dj½y?y<KQ1Pg:@G){?\‰[d…@Z”YbˆDu–My€Nh„OxxAʦg{©[†‹J˜džwU›…[ˆ›^†ŸV’¡k‡mw‰n¥mUÿÕŸ¼³ˆveItqA¦†V¦ÚfÁ€[tJA<.cH4f<^`=n`@K`CjH4®R;xwR`B;cVVc;JY=\R8^k=zV3f]6jX5fsG`]Ed_=¥oFjmXtIm[5„O1§aF{i:€y8‰ªJ]šJ‰sD¨®…oŸk~…]·Ö•ñ™Rz7>®§i‘§z¸Ò¦sí«„¦a…’[˜njNa†=‹Qºlb¤Q]:Ž€Rô†«å‡˜¼b‹²aœ‘iÒÆ’ØòUÀlUjJPh?Ah3²†pæÿ½ÎóÐï—íz›H΢måñ§Õÿ¹ÿÿÌÿٷߟz§™hŨƒ¸´w’„Q«‰d£²n‘Çp‰±Y’µc¼lm‰Irm>ˆ[μ‘Ìß¡ÀgxŠD‡{HwDpe9gw8q†>np7q†@y¥SiD\x9i~>Z}=bq=x‚L¦£d‘ŠK~gL‘ˆf¡Í½ö§¯àŽ…šWpi@lg5lo:ŒbPy]ªqP„nH¦}cº‰nÅ’xÄ—sœƒd´eºœjœ–^‘}d›–^«sš¶lxšIjPŽ—j˜e’xW˜‰n©·tqNŒ}Rx|Qz€_—‘`Ÿ[…ªY†–Xq…TŽŒuººžêùÊòõ¾ßá›”a{]‚‰Ym~KOk8H`>zl_“q“st’Ql‚PxŽk”—x•œu¢•ƒ»Ä“–Õil”HfƒLqžWržYq–e‡nŠªmŠlƒ¦Ul’JiŽO«o›°hiŽVt˜^‹¯c‹ª^„‘[ˆVp‡Vt‰duy•®š¶Ò¶¨â—”¿tz™J_7IiCg}Us’^¶™Äly±e†Ç¦»ï «Ûw‹¿{ƒÄŠÔ²¸æ¡Ÿ³_qƒR{Œ{³¹§™Xs|Xk‚K^|EUw<\wCWs;UtE_€L]xE\‰RfG^nARk@OrEPzdœˆ„°^YzCSoJaoFXlKc†ezªl|«cn™qƒ±q~œQj}R]–g}³zнg€n¡cj„PfSDƒj?ŠJ˜’i`z`Twb;v`<^M?L<QM.D\'T\?cf:ZtDOrQJcIKh=Kh>R]8Jd'Ha0F]4]^.‹q*}±R«‘gHÉm<|¡@NB<D%ND(mM&^n8dsS¥jE•€BTŸk`q_O]AiL6_Z1eT?\Z:U^AX^<„p9v³Zn·ˆk”m‡ŽcT™ce^cŠy>аY€°oc©g?‡\NTBDW,\P.pt;hŽMEgQGC2RH:X3JX3Gp1Tc3sk.†H{„m…bqXІQ“TO‚eSJFXM-;q;?]EKV/Hh2Z],5_6F=0BK";T36U38A(E<>[2<Z.UP+8r>=A/^A&X7{nE‰žOt jXwbH]=@C1GY%ES)_N+sU+`x>urLn{E_hQNlC5[IHO&Hg/QP5UQ6;“RTT3rr7UXFkNL^4F]1TE0TS+\Z9q\:v`C^_KDfE_G2Zs<DVCHG*mp0zŽJvŒjooX¢…K—¸jJ™oJM6<i?4P0dB%\:CwGO]'@`5[m/qIfˆMctN\yJ2\O?N CS%@c-vE¬¡Zb¤pG|AW`0Pk;RwBCu;T\.Vs1Od3?L1eJ3hV:lQ?dJGQBaM6QBfMBJ†ByY,qvFVkGDW@fb1œ¡XÑ‘cqÕ¨Qƒ‚oP+gqGŒqE¶´[°žoŨv}™W‡d‡¥z`רdÿfÿ”l°Ö¶“Ϩmy¦n”ªfÿ¹~úÿésÏžeƒA^‘JW[U‰OPr@Fl8C[0VQ*dh>|a6cb=J]=89$AG%jV.¶}KWÃvRsI8J2QI#y‚Ey“[v£_hŒX}•F†[gˆWc€;°s-’¬aZ…=jd=ƒ†LžwRŠ„^Ÿ•XȰŒÀƒy£iY©{`½Œg–Ê“jjMeK7afC†ƒW‘‰i“„id‰S^4*hP2j[2li=]B/aBbZ?h]>µf@vcG{œnRyQXfBX`?k}KokBQY8\]8€a>¨eYbuD€g;£†]†‹]PP9LM1`Z5fd5\c1r^3xŽRl‡N¬gV¿Œ‰œlÑÔ§´ÿ¶L}DWR0\N2¡‘sÎܬ»Ø¤š§|£fprNV|@ig<…žaap…LVƒ;p‰;§„Y¢š_”®c¡¹s‡´k˜ÔÃ׉°ä—Öƒg™Ra|Fb|CËtn®¦pŸ°l¯Ñˆ—Ó|“œXÒ»©¡a½ylÍ~l®½ÃÑŠz±Wo{Fs…ExvCU™Ÿf…W›¦néÔšÃç”ÅÍ”ÿɹÿü¾Å͉»˜”—d~„IoNfx>x„G}‘Jz€<ŸT¢œV•“E_|7^z8\s:Hk.jfB¡†`—T{…O“–yËá±Áð© »k‹X}tDxv?fc=bL3qI5uU=€bK¤pP‚m›œm…yVÝÿàŸ®Ó|Áº|»Ùš´SyƒS…ŠQm‰Ih’Hk‹Zw†OgkBnfR°¥y{ŽQˆ€_i‚TskP{wP‡¢Y—Ác‰šW™vªÐ¥ÂÖ°Œk‘vY‹|XgjCegDanAY^2@J$??#AH)EY8goaƒUmz\zŽh{„Vok8ea5w}U Ÿl€¢Ua‹IpšUr¡PjŸRp™]tšb„§jv£NfŒDgR“›kưy«¤bhUv†S‰ŽRiqBal?Tp;QiOj†gvžy~¬† ½ƒŒ·_a>Uq<Qx<Qi@kŒmÖŠ¤à~‰¸sžÍ—»à‰œ¹z—¹‹Á¢Ñ¯ºë¥¶Ðn•’Qz‚z¾¹©—ZnxOj~Di†HfTc“Za…G`xOg‹Pa„Ip‹TsˆM[gEPnMYwSb‡s§ˆ™¨ajƒIbwCdrF`{av©…’ˉ—ƾ„•Ó‰ŸÊo‰¢iˆ¡u´}±o„i‰£az”[boHy{GbO]sZkqSlŠTj‹bPŽi;a]=I;AT+bY3~~-T—LCt]ZQDXkDFwGE^8JS,FX)AP2xZ/—-kª_¤uk[¦d@zŸ2PQ4A,F?QF!RE(KV4h^5vi4–o>W§Y@ˆyYB=aS.YM9YX=bd?i€A¨PËgqâ´†¦Ÿªlm˜o|rm“M„¢or¯vm«`c€dLfE]f>uu3c‚CLlM%J818%WIAt7TV6Kq1Xl4¤n8¤±HWÚŸ?FGJJA'8R(3C.9>%FO!NW%CjC?M6DL'NR*0[24@*HE$FN&<P4.E*>3?E AK(X_05p><F-eR$[:„…R]‹L^\HIc;Jb3<V(SW+E[#IN+QJ*Nd7ho@a‚I\wQdTTSMu=:_26L,lA&Xt/asUbu?XdJIM9gX5~e4StQKO7UZ2cp7fŠKX›]L‚QihFpˆHa£MZvEawB‹…@•V~–xYuºeF…iNa9CkD<Z6Y^0Bg:5X/JO&Nx5Wm>eo<=…¢ZP«w0eE<F%bR)EtCVJ*se-Y•Sa€DYDcu@V†WGhHU\&`g;NsALg1HC57<0l. ]P@[HSA,NW7K@8ca-T~>Œh.siOT\oi@_’TK{@°F'˜–[h³•e;œ›Zpºj¼ƒ>¡¿j—ºh—Ài ƒN¦œSš‘_‘«a›°ƒÚµ~À¼’ÄÆÁàŸ¡®‹ó¬z³ü´¾€a†d\8rSB`<2]>3YI1dN8u~Qb‡QUi8RX3TT49Z7OL/RgGZ]?C4r›\FŸPKf3{–Fl‚aaŠMVr?’ŠFzžbuŒL\‘N{=u†>ªpCŒ”uŒ“ft–c…T¡~VzQAZT<\D4^B7°…T¨ÑŽp–h^a7iO0GR1<K$kl0lGX]Aju9ch4q^5R3%GP:aiMuRweEml9’”g}u_tzWqpJuyZRlCMU0[`1‡mGŠƒWUm>Ya6vW]rIbe=Tl?^f4nhBgx8b~AxpGYuEPF(¥XN„lÓÍ™ÓHk7I[/\a=š£~·»¹Â‘ˆŸl‚WŽªw€²oŒ«l˜°n€Um“Gj„KsŠPˆK”Q‹ buŽD‘ƒWååÀ¶åÕá˜ãÿª°Øy°°l¸l¡˜d¢–c£Ât¬ë„—¯iœŒS´©{‰mŠrB‘wH¯‚\±•eØ×›¯Ö€†£a{œ[‹UwŠLqF`™©€Ä»‹Þ²ˆ¾˜kº‰hê¿£®ò–ÖÏ–k P{}HqB‘Ž[°Ãyƒ®Wt~=‡=ŽIa•FKs/Og+Bm,Yt?v”O†„I“ŽW»¨‰Îóµ²ë‹ŠŒU‚T†‚C`[6eP?^J8sM9cC5ŠQC”gK„jM¤}pÌ—‡ž¯ŠåϘ´Å¬¯t®©m€šLcz>†Px—JtIg‘M‚ˆPrz9`f>‰—gƒ”SbRÄ~p’‡bˆ‘n »|—¿r¡s¯ªˆÉ¯…ŸŠYriFdhN‡{Wt}L[pG]g;BP#/6#-6F!?U+BVCcsMkuO€“cj„9CW'D[/Gf9f…`Ÿµj{¢Fbƒ@c~Lq¢Xub}¥hƒm‰²btŸOj•M|“b–bŒyO€qMj‹ZƒŽX‹‘Vk’[c–W_‰jw—m…¥vˆ¢eyhŒ¤[dAGh3Ng:YbAjŒeŒ¶}¡ÏÖ‚ˆË…‘ÚŒÐ~q·ƒ‡´›Éš±Þ’ž»ci€MræÆ‹Æ¢Wnƒ^}šWišar j›Ñw—Ëj|¥cƒ•Okm:\qMo‚WkƒOb€OcTl_}’u‰Oa|?Rr=WdFd€h|¥zx•ªuµ—¥å¥¬ßˆ›Éu| €ƒ¬yŒ«ppft—cu‹b^}MjƒOc‘Uyq`n‡W_ddhbXlWQ]TZM:>^5€T;†„2{WmcY{[KvOJeH9X;OI*UY'CU.iK5^k-RrSšeFm¬K?…”1F[24/3:#=<AHUF&bg*\Ž@ÅeJƒ8S°T‚kYr>Vc@f_=†Ctd¨“sžÎryÖµª–|±n~i›“^Œ©g~”{v‰\bžXZT`NBZlJR{IAl>6S.,J&>J(aT%?9OaBZe<Kw8rR;Ào0Í´bUÿÑ4¢×<?CWGF4=`FPQ.Rk38h=@=4=U*LY89^6?P1:C+?I-A>-A&2*98NU$Xs8MxHJk=d~7s@V—Y9cL;9&=<"9N)9K%@P >B%<I%ME%YZ3avAZ€M]xS\€JSƒRH{APc(5t3LX<vk8f…Tl‰LPšdSg:Z`?wc?Jf@FY4Zb-ky?bŽTg’W~–Yw§hV‚bYDe@`‰Bv‚V”˜JK‘g†RcÍqOznjfBE‰NLlHH~F8bE8R"US&FZ.M\/^d5¦zA„·ebeSˆWFtAtn>Cc9FU-qv5o‹ISyMF`<—w6V]RgAQs.9U9F>+JO.];&+C7X)[u8EUK]<3UK9;Q:XG!Mr4ct6yrDUlO†|=[›eIi9BV-K©q@qÖ–¦LR›Klw$—w+Œ…]ƒYfTAxR;{dC‡Nˆ™i€¦i…’_å~Mdz{šf½°f¢°s¬¹lZsXk6ZR0ZU5SL(dK1h@*jR1je7X‘\Mw=T\3Ff?7U,1&@,?6[N)n8R€:}‚:lUZ“\Sh8v‡Eqc6]…HX‹AXAas6tp3™g@‚[’µ„|qRƒ—gb§iZ{Up{T¢ƒ^´º~¥º|n¤n\QaŒHMl:qzHzLt\=ÄWƒ„Vƒ„OJm=w{M•µ˜Ã›{¶Šzº{{š_ªƒZošqwsWahBtiDg}KFR=uhBˆ|bc„VOd8_w>bwGaeAbh?SWa€Mt§g—°{¹ç²|Õ–S¦k[eCVY:a[8§¯tz—Y]ŠRgz>}U£’k‚{Š•c|…T~›_‘džœÐ}˜Â|ePf|:`ŠC{ŠHzŸWjŠQz‹A”VlIŸžlâÆ‘¬É‚®²jÀÓtà²_ÿ±uÜ®s¹•b¨”p®¬d¾Ð|šX†’O€Yau<vq<¦Ž_ß•rÊ’yÕ”`ÿ¢oÒ¥hÿ°Žµ£o‚”ZrG¦¡jÛ²„á›sLjiŸŸk¯‘l‘§r®§yº½‹†™_pzE{n@zdIÁ‹pȬp¥¬W˜LrWfŽKbƒ>Ay0F7]ŠB_u¢Lj‚Mˆ˜sÊÙžºÝ~zHzjHkwFegGwqF”gK~iLpnGr[E–mTjG—c[Õ~СŽÀ¹™Ì¾„¡`—•hr¥[gˆAqHy”]„žXo…IqtDpqIfyRšlŸÁl‚‹e¸•~ã¿„±Â}§¬p“–]Š‹aˆƒXmnEutV‹‡c— m•¯n…dyTtyWel9476<$?P-KP5I_>]vRT{@Sj>Zi7A_5L_=^jGbzDl†?Wi6Vr>Y€Kx’\t›Tu¡[} gs¢Wp™Uz¬bЦl¥ŸfƒŽU}|Y_lŸ®Š©×´šñ˜Æƒt±dfN[pI_Eh‰\v”RW‚;Eb4R_Mvªv’Ô—°ö¾ÑÿÉÎÿ¼¾ûÁ½è—³qŸr«y¢¸o¥M`Jk˜p¸¹w±ªX€Ÿk…¦e{SnsY…ŸsžÏwްl|ŽMUa;NiVh†bŠ‹W„HhvD_qKmxPd|@\h6Rc6LX;`{b|£_u˜ToŠZx“…¤Ë›¸Ù›¿s‚§t |‹žqˆ”lq˜ds“h€zUoœVO‰oGgavGMRt>@pL@HCO?0OX+;Y:vS8mx0‡xKYRŽjVwkJcJ;R6CK,HN*Bd3_O/I]+[SCZ3y¶ON—§3Ja33/(9&.1':>QMy[c…/m}]œgF‚~>ret~Wˆƒ`ˆmSŒœXp±z Žv‰¾cq³ˆz”rb“]sb[’wHk‘cmxgw™FjL‰™\{}ZpŠ`U…W7fJ=R4FQ!H\$fU.TŽ4MiWK\EUG4Hn0_S7½^.ÅŠGKíµ.‹³X87WW"C}QK]>Lj9Go<YaCjo@WVAyfKR85T2;[=JS1;\6IZ>Tn8s…Ch¡VdŸaj¥ivc¬^Fªc9zC9_4:Q#8Y&:G)6V/FC"4[14?(@3WK3Zl9XtMg€UcŽY@†Q_Z4k_.Yn?nlD‹‹J––[f•qtuEetHapHMoFKXCO[8df>n•N{e“Ápr®sqžjOƒ\]]?ls4f€MjuCwtT¶˜cXÍŽPmXuvGp–ZmhKŽ]AhI:O+Fa)?b87Y8aW,€k>diMpbF\‡Lj‹Ul~@`©cf¡bLŠR=S0GA$lP%Ye0\p8T~CSnB=a:NL&@d5NS @=*U4+`k3fnMgM?OL>HE9bE&aG\‰J}i8Z„UŠ‘JS~\SP(F[)k? }`)©}=st[†`mp*wwO€cPhG|iFbFsqE™a@t{PmŒSyeM—uO}€j‘lB“ ]ŠW²sT½¼tWx’Pyl:g[CP…CRR7\V<JY6pC%‹ˆ^Xµk™jERb?G-P\;Lk:_xAQ›[Ig)n3„¦[P‰[RY1uŒAgpE‘t3¢^iŽUV}Bcm9v~KnP4‰Ž\KeO‰;4À‘qeŽoZJ:vT=¢_‰bM‰—d§o¡¡gwÃtv–T`d:‰`3ë‡^º™w»s[fnF——n¦Êœ¤Ê˜¡¶} טª|gŠe_…QcY7MmHd_A^„OSt>zd6•€^ovIZyOk|JegBnpAg~Pz•gwŽg¯…—±ËÀš–½’rj‡—k²||¦p‹¼pUK^BYˆBkyEm‰Ys˜Y^’Us„UŸ¾…Á~€©^{…GfIZx;rO|‘Q}‡Kj…Cj„FtGƒJ™—h‘ŒV—ˆMzE©‡`®Äy£²ož’Y‘J€™P}˜K½‹Oœ«På©ḭmƽÍÚ€´ÚwÕ¬zÿÄ•ž¬lv–FŽJµY’ƒUŒX›…]ª”cÃw_œtT¤‚]…_ŸhR‘pW©—|«¦ƒˆ–[އTrHg@™aL”‹[{Á[q”Ez£`q TL}3^j;[‡Bv…Wh‚Jde4amB ©€¹Þ’¡ÀhŒ{VhuFc_A}_DŠ{TŸ`˜ c…‘N}nGžcVZ“‚Y³‰`žsQ—[_¦£|£¿ls¢V‹¬t|ª\f…<qHƒž\_y—J€ˆUè´Íù˜¦å‰ÊʼnäŇ¼Ï{͵p¬¢g‚ƒI_e;[WH~Œpˉ™Èt‘©h‚‚X‡‡až¥}¥¬s{QLkBYeJnrMww^wYemL^_5\`0QsDYˆJ[‡GZ…K\|Bc~>WBW~Q\ŠP]€;eˆJo¢Sx¦^| \xœjœ¶r— YyVŽ~a™‘\ž„_›ž}ŽÊ¥¼äÀÊí©¥ÀvˆIRi9Pd=L_3LQ0TJ?g_HjU\“nˆÀ¢¹ö¾ÜÿÍéÿÖåÿÇË裤ºmh„EPjDb‚MiˆJ_t9avEp’dŒ¦_€“Vv‘X‹¡d€€KclGc‹Y„«s…¡w—œfyXlƒQm}OcmBPa?mi@jlEdqDYj6Pd:IZ9H_=ZkIo‚Rp‹BZv8VrMq‘l“{•ºdz¢Qr‘Zš[’“c••_vhˆz>]‚RXp`9bP>I?`0*Me-Gj;aA8Ff4B`9VV4oc.pyOk`Z‰`Ny\JfCIU9;R.EM.I^+UZ1A]4ZH;³E'w³GI¡©@IaC<+5R-,D654%<W#JQ#tUW0ZzV‹d=€€1„Š\}tXi`HvOBh‡UކTxµ]drktXShBvWF|ƒ:i˜au‹Y‰I¬ŠK†¤VŠŽrc‰dVkQ:W47O.8K"<LXI%^f&7xT3@:@7%QB$Aq7P]5„R)†x=E¬Colk^;iŽGb”lRb_vNnn>{J~[IzcXgQ[p<n{@bo<WZ@VZCu[AL‚Œhœ†Vœªk˜¦x»Šk¬‘h—pS\JŽPPj@HDCT8FQ,@P0AR2ML'Gh9Qb>XlDd{O`zNN|M@b=AR.FM$mT)pr5ƒrJfŸT[sIKZ0JM,RC*Xk:Z‰T]ˆV~‡Uµa~›f’±jtǃ[žcSzTSyI`Y:„s:r‰a™‚dW¹wtxNqŽOtVziUƒO@jT@Y2oX(NƒQ0`D?H#MS%=S-CH%_R&Ru6ctB‚~9–§ooÐ’G·†8rUJ[1P~6Pn5Ki.kŠIUx<Yy5[ˆ8V…KNh8WoJ§ˆJg|e^RHXB2V^8™\=ê¹vOž¤sg3p}RvœTCmLOR0D^+S>'X[:PtBL]7Kh0iU+avE[oJtf?‚Y8„N1{ŒPzKb:wyNpI9~G3jU?gI;}iAntM}|D{—[‰Dͪm¶‹b…«sЇYxœakmJNU1}m9sW<ybC –^Zµ‰a_B^]>v\<®‰X^‡^Le4“y5u³_HcE[].{‰Fªb?YvOaT,jp<Re@^h-ŠmIYžds{JGnCYA)·v<šæ¡~¸Œ¸€u½oOC1l2'ˆuQ–©k–°h‡“\quAžtIÇwQP7hW9‘k‘¦p–€™Â‰Ž«·º‰czQgaIbtUhh8nˆ\^†Yu…Vn‹XT~?QvCOs8p‰Nw†Wki?Yr>]e4•\=¾¨~ëÉž˜Ç„¿¬z¦Ã‰ŸÃŠ|›j§€€’e”²l]‘UqˆPV‰J`l<k€Kb…Rcg<gjCzƒSf…MTr6Jh,Jc-Mq2\h0Qu:`sIV€=ch1…–[z¦_›•Zºnl‰N|yG„‹N¤µ„¥Ñ„{³[‹HŠ™R œR³Ëu×ù”÷ÿºæÿ®õå‡ÏÌz°¤fÛ™zÿº‚õ©y‚•KŠ•\’—Qœ«_‰²T}xDŠ•Z^‡E„iG Žd¬’fœ_©ša«¢d‰“F~ŒB|w?fDif9omO½¤}¸Ùo¼_dx=r†Igu=Z~6yŽWzŸZvmEZs3Sv=Š`²Ø|º]}qA‡gH‚jKrfFŽ~VŒ\¬©n Ås¬¤c¦Œk¶’nŸ¥qªe§w]’ˆQinG¶Œ^€–KqŠY‡±caŠAgƒK‰¡`”§kž_•¬t²ÇŒÿË™ÿÿ¶ÿõªÌÀw¥§t„ XŽ‚Mu}H_m@^bUŒ›ÁÉŽž¡_w¥Ê‡¦ƒ¹ˆ¶´~¹qµ‘^„mV~hX|„aƒUltNaŠMZ—[d¨gu®hm¢Vc“X_†C^ƒIq—`q¤kƒŸ`qžL\Gn™Pu¥[r¤`„n—¸r„PŽyV§‡hªˆg‹j›¤ÂÛ®¦á¥¼Õ‰˜®ejQcƒFNb5AE-<?4>$<?=hyl‡µŽªØ¥½ð®»óµÃúÆÏÿƸ𓋳ls¥fn§ng°h_’FZxE[„W„Œc™^{ˆHlˆO}‰O„wQ|qJj‚HiˆVr„]‡ƒ_…†Oj}EatJm€J_r<W\?teAkr@Vk:Rm;`jFelAgq:Yr;]yFZx=Uq?Mu[q p‹³_w“Ej…Dh|=ZoAiuSt‡]_X7doBX^K.TL%<;/+ e8Iq.DoHDZBMX;d_.nu5cR_uZMoWI\MAf;6TE6B4G?&SB(X`.DkBS==¦B'}¨@C£šDKiLC,9G05C2;7)@F$8],MS"W]Sv:‡q?Žk3V‚S[TN\_7Y@5[S5j9aŒBPj_sWoCx„>‚wLg Y^”]_pC©i@vKlŒxH~P@RG7G..D,;4FT Sf,l_,NˆHHXCNP+NW1;\5@Z7Lc8`p;g†K`bj‚Tq†Xb”ePzdIdQO^5_w@W„GO_DLg<?g:6V0GQ%ONiW)ªuB‰•Mk^Š—MqŸ[p{N|yF~†GnqYx‡[u’cYkfxUF•I>eCCP*AX,AT*Hb2Fd1IX8O`5\o@HzB=cN/`54D,WH(WX:y†FT;EN;HO*9N*N3'€y0ƒ±qr±sq¢pl^„Ÿa¡¸o|Ó‚n—yGjJfS;\o5_zTL\?”p?O¦mfrFl{Ey…Pe“aKl@Lc+.`24C'<:'0I*8@?S#;P$eF#bP+Nd6Wc/gu2ˆm7¨¤h¶~•׳‰Ü¹L°‡JdD‰h=U‡NRg<br.hšFkŒ?Œ7†p‹žql€ªn…ªr{¥gÀ—e¾´mh¸•e‡[qzKg‘Vdo9^‰DKq@TU0uŽDK€QQ^/KZ2Xp8i~>XpFa\?E€VjD,£X9hFvGUiB…`9hoOwcD‹kLŠ~\uZprPh{F{qE£tG‚¢jtjGc[<kX1_r>a[7dSW]>`2#}c:¤uyÀkwÐ{”YghAGi@EV-mj'…“JXmHdn8””Ui~eK5ueFrfAcvMULsS/kZ{R?dŒ[m‚LR¸»‚±Ë¡ß©‡À‡J`.</M8$€X1¡‰`«°t¤Ž^¯V‰kNk…RˆŠPwXdjH†T@˜~do•i‚ˆUU„UcB6Z^<puEm„OkŒPx~Kh‹Lk„E\‚Kr‹VpŸbd~H_P]{AfMh–\wJ’P‰•^Ž¢c‡—\}‰TjŠ]‚uPŽ”eª¿ƒjlm€FJ=_s?j|XV}CT€O`ŒVl‰_W‡KUm7PsBQu6Pt4Pp=W‚>]s4Ps5E\'•jA¶}§Ý€ƒâxŒ S’“_Õ²…ëèšžÆwq“P{~E•RŒ›VކK·°oéæ”éÿž¾ï| Ål¼›mÌÏ™Úÿ¦Óôˆ“¼c©©e˜·Y˜ÃZ¬Ö¾í¦Ùï¨äþʸڛ¶¯–p¯žt«Ã|‘Ëml²CQŒ4jk?…wH~qJ›§p¿Ü¿Î˜Ék`‘>Xa7d|?Wv7h‚CoIT_7Z\0d€Bo’V¡¹k…U~iU€…cŠ“^yPqY³™yË¸âæ¯Ìù®ÆçžÌçšÊÖ„žŸh™ˆd©©y‹©fs™Mr‡J‘^±qs¡L„FƒŒG‘†X›‘gˆ‰X£¯~œÂ€ÉÌ Å푪´wŸÌ}‘Æouµe}¬f¢±lš¹™¿Ëš¨¿ab}A{†l¿Ó‘çà–çÆ…ÆÌ—Ô†ƒ¿k~ŸjŽžly™djŒU`…]‚¢qŽ¿x´¸z©Å}“µv‹´ƒŽ±qe‡QuŽo‰©nš[€“LjFj‚FxŸ[}¥f–Ä”¿ë¨´Ô…˜¯v¼£q»›m±•sµÄ•¸Ü¤ºÖˆ‹·qˆšbw—\~–hm†R_xCOm5=Z6DX@j‚t—ÅŒ¤Ô–©Ü˜¯ç¦ÉÿÔâÿ¿Õ페Âtd‰n˜˜d…”Kk‡X}¨o“ jŒTy†Kx…Kq}PpvIvsCk‚AW‚Nh…RvLuGi{JksQ€‡W~7JT,FT6\d;Yi?ZuJ~uBmb3Z`6Pe9agB\o=XqAY~Xw—eŒŽKhu?`ƒM`‡GLm>LfJgy`nCO€OGdMFY>2R=JM1SX.{X7P•ILkdObCa\<cx;N~FHj[;PFa87Vg39sP@<G=B/T?1Pg3@sJU=7žH-{ŸAAŸŽDOo;;5CK9>N38H-<K*;L+:b+O`'Nh$Pf@[vEMs=c_?lh2VcBPaAi`9›}B‹ºhw´|€¡cqšaq}ZlyJm‡Qj†Vs…RrVRkHfHDQ;-R417.6B#H8Pa,^k?<ƒ;7J?7@8=KI#Ul/UkJXaJd\EVfIezGf‚GZsXI{YNrKqu<‰GOƒOYTFYx9ItFOf8?r5Gh2Aa.M^/Mn9kn<\n8GdCQh3^m7<|7GVAOW&a\0qr@]˜Tp{IG¥MIaHA`4>a5Cc5?\+QS0Vd3[mU^|;YtOTuV]~YpŠZc„V\“S8ŽSFeLPc?B^5VI2Œf-~°xp¢oPsVhdAy}Gd˜²pDµ—PF/Wa<TrBAZ;W^3”n9LnJ`Fnc;ŠŠ;QÅ…LgQj@4Q3<:%39(.78H+S%4>!;M#@IX`"Nf8Oa+cn,ŒS/Ÿ‰F¦¬‰È±ŽÙ³|ÕÃ^Ž\U?rB\=#SF6^V9\q,`U2zg8®sJÅkUµp]žmTŽŽcubL¦yP}¯{h²ZV‹Y`M+wC+U[3xo>y¢\HqQLU2SC/mI)kpN[‹H]n9kD1aŽUSQ7}Q0ˆ‡N‰oX‡Q;„M7i^<zhCfZhRZ}R^qKZb5]D2‚cAj¨l^P‰qGbrIo|>peG–kEO/^I)¹‰V¯ý¨®ÑypšZWnHM`D9X/`L!’•DeˆSaE{{A?<.V1#}N3ˆoD–iHa£lv„IŽŽU{®j„§gœ”_ƒ±u«›g½›j¨¿œ¼…’¿‘V”Z…f6sx<°x6ä·ríÅkÇÏ}Ê꘮ãœ{¯tkŠCP`8H@,gK3>P7jc6{{U\†MXd-gAªW†§au˜Py†Pf{Dj{J‘¦ypŒWf‚GpˆPg’`vH|…WMqEcr>V‹=dBb…M`L\‚MHw<“ZˆÄvXy@TzJg|IpˆPuƒYl‰X}”pW•[\c<UxLSg7Vw?vvBXCnxGcIYz6Kr5Si4‚N¨Ê‘ª½m›À~{Às¢]°¥b¤^ޝu’Ö˜Ž×†‰³l¢¡V‚zA…l<¸§j¹ÂsŸÁk§Àj™—Wã‚oÿò°øÿ½ÕïãyŽÐZ€¤Q«€Uß©o¼±ZèŠeÚ®„ĺ…ïÆÿÙ¯íÿÅÃö¦Þi}ÄZw–J‹‡J€wD£‘_‹²p¢¨a…ŽUX‚3C\&‡€UmŠ@]„9q|<p}@]o2k}=´¼mµËs…G†fA–`B¢nR‘‘[tG{Cx|NЉa䷃˾xŸ‹ÁØŒµ¸z§m¦£l¥¸ok‹DmxRt€J~e€±Ubƒ?gy7\n>wwN…‚^˜¥{›Ã‰Â½”øÒ“¤Æ€®´~¨ªp«Ð‹·ä–Å׈¾Èsªªiœ²bx U«V“¯T†”F‰…MƒƒRŠ]¡™o¡¶n‡•kŸ¤p™Î}ŠÖp|°nË‹ŸßˆÆoˆ§i™¸u‹¤bbg@sle ˜hw‡PivDZv<Vl=o„Nt©\šÀŽÔù½ÝúÀ垯Ã}›“aŠ“zªÃš¤Ò€š·oˆ¤c|ZœY‘UzHrpIewNiIc}N_ˆfƒ«›Æˆ¡Ðˆ¥ÓŠ²Ú›ÊΪ¼l“¥Zj†E`wEsƒIh{AZyNx‹f“•a–X’Vn…InƒUq‚Oi…Dl‰IhMrƒK‡Dp‡Gg‚Jd€Rq„UtHQy49Y/=Y6Sg9WqFewKTsIRwLP‚HX…=Tn>RsBZ€I^x<VZ/KN?\v_v—c`‰NLnDSl:MmG_WKq^?Ln@W^?pdB`nKwsWeŠV\ˆm[dW^^@fvC_uA,ƒO92BQ6"‡\)g€FmhgaaG‹fEc‹OM‚wOYLH-€‹:2 „FDojF/df0CjM@J>CE5FU7Kc3Wr3Yq=sqAqƒEa„UhqM[\<La<L`7pc5•†?€®`q¤vf‘\XlN[bB[j5`oEZj>vnR_‰J?uXB`@MX7=\3CG1B`/W`9]nGi{I>~I'OL./$6.e,WT(F]B]Q5Yd2[n=^rBTn6\pE^pHe‚MdˆE_|@XqAdw=pDN‘HUuEQx7Hh>Pe1zx9x®SOškIoHH‰GOzOXi3U|7N€KTƒ;PFSpBVi?XxK[r7B}GFR5Ja2;\:4=*=B$YF$Xw=VB_fHcnKlqJjzWbzTkR•“V޽~‚Ç‘w¿”i°{p”u`“]GlgK[AL[3_X6wO:¹oTCÌ}RKQO^;KcAM\5Rk/rd0CW7X7`R*©€9§eƒã¬Vϱ;^DQ4*\29='NM<V):D,7M&L]'Zg+L^0Tj/Zm,Cb<e_,l`7‰^9›‚^Ä™¶Ë¦†ìÝHͯUg=qG1Id6FV.pL$dZ=dkN…K3Æ|CžoIWZApV9ÔpE³Ø•œ»‡a¥pGoDXY8bY=”–X_–keN<`^2dF7©O7g`Eb_<\ˆC’z<k‡Z\cI\8h~Vg]0€N3›zW›“j}™vƒ‘aÇ’a‘¬†W¥rH\1Ne=yU0srI}dKЍfY¬foe1ˆEt’btTBZaN˱f¹ï©Œ«fqyIwtLizN?g7RH•…Am±_bCN‚BDO1`P2pjC¹yWÑjˆšmyS´|>ÿmIýeTï„Wµu¡’j„¤{“šW”€Tœ]DŽR6‡Of ;ri3™G(ÈrBÝà…µ{}¡dm—ft¡ch¡^‚„OZ|HˆyFzZµƒ_y˜npzYŠ„X™‰iz”Wvh>†‡Kl™_ž^k‹TUg<Un9o~EiŠOxvESƒUNU5@R)PS&\W/WY3aS*^`8HL'‰~B’À~dTVg6IJ)Oa6q}\‰¦€l˜crRiŽ[aŽOVyGjwIi~Ecn:[}Ei?p‹DSx7hy>ޤgš½qˆ|O¹Î™žÊƒ}“U†x?¢”h¿á°ÍÿÖ¹ú·•å ¡ÊwwžLfwIš”j¦›sµÀ…ªÃz¡½nš„RÓÕ™ïý©Ÿÿ‘˜»e¹p“ŸYŸy¹ÅŽ}µT§O°³x¤r¼šqëŠÌ昩àw¢×p ®gsQuLuqHci8h^<vlLvv>g8Gp-l`7dvA_€Dr‰O…ŽPf8Yu.šœNÈÅk€ˆM‰n?xi<NS:imI–xUfƒBŠzTʽŒŸßp{¬Zp{Y›¶u±¼r…k–°nw²YwMw•Hr‘M}™c¹jo¤Nx–T{’Rk~CgoF‚Y¤…fvP«lľl‹ŒHdy6o~K¨ d–¢S‚¨T…¼m¬Á„´Ão‰˜Z†ŠU|ˆLl{NsqH_j9YW?g`CjoF|‘d¤ÜžÍÿ¬·û¬õ°é†¡Ìu°lš»„—Ú€_¥URd2DO7TTMh„bŽPeu8\fE{X„ªm³ÎƒÅ×—¼Ç°®l›”f¨…«Ä†¥ÅpŽ a…©Xt£O}™Y‡¬WužOnIuRˆ…^ˆœ`}«o‹¿|¡ÙŒ£ß~’Èk†¥b~†Wq€UuRk‡?Yt@_tCo{Kf€Jn}Rl‡To„RjƒFd~BawGpvBbl4\sAcvFfpHmxC`wLp€Vov@SkATzP_‹MW>Nm;Om?Uxb~¡„‰¸ƒ—Å¢Û•Íef¡U\PYŠI]‚NUzFM{RU†ji™sv¢ej‡FTf8Fk;5jGFQ=TH.^[2ZiAimP‚v\Yx_d~jL†Ha_DV_>amA<{EdB=LB1wO8pb5NxQubOqEpšhJ€Ld\ƒP4Œ|0OwOc~eTCT_6IoKScEQfESpM^vCg=Tq?MqIK^:Z[5PX5SV.R^0I_5he;}‚Fh—W]_S^LVK8[X5Tf9OR3yQ7vRN‚QStPK‚CVkA<;Z]9ŠOz¥ecŽjVjDQ_B0r>074*@&>,K<1[2=>)>Q#>O(KT&[a'Y|:ZxEQw=[j4mw9e~MKjEWS8Fe5Rg6@p6N`1gf1uv8^IWkAg<‡FQ¸€OŒuOi8bX-sp7o„FnOe©NR XM˜f>iBHL/RM&4W34@*EE']_1a‚I`O`^A_cG`[JJUCEG3YQ1ff4g8›ˆPȬj¹ð—ž¹ˆž³†ƒÑ©`µ›ToX•gRpa_J@[d4?iBUF9]u:_wAPkDkh6I”Y?kMba3^y?ƒwMÃs?©ªyvϨbÉ£L•€GeO<i?GJ0B[3?L-PR(F\-Ky1Y[3g‡99kERY*Kx9Uo:RVEsM(—rLº’mw³’i—‹Y^>‚X=R8HQ'~a0y£_ejOJ=1eD2e€SweWˆTŸœfcft~7cuGe`8}‡Y§bYŸnWU2`V(iW.‰M4‡F3jY>`e>aDlŒIƒƒAqyOSfDh[=tJ¾•kÿ§ˆºŒ…wfP|^?K6‡¦ga´hjq<^yQyjB^‹XlrK`€H^w8pwCœ}Nmf_ŸMÑ쇖ën‘RSM0NF*W\+9d-LG‡Hk¸qeX’Ÿa£ª‰z}\tX<ueEœO™ŽR^uJp@rc9nZ=da1cc3uW7“l@j‰S>X7GP0wa>{rZ`K9S@1PuEG©•Uš‚\·Ôˆ¥î«žä²«éžÜš¯s¢Á}“¿~¹“Z‘†c”zRˆuK~iEfuFZA+‚V7—¬nŠŠZkn@L[2km<ƒ~Pr¬my~USlC;O(6G"=W.=Y+@V/A\9X\.>b1‰„J¾jczLD]243HW-jlAƒfƒ‘i³©± zz‡[g|J~{OeŽQWj2f|G[}>gq<\=mJ¢¤s¤¶u}ŸW¹½€—äŠpTonL†lRÊÂ¥Çì·Àï¾°÷¹šÑ„¡£j·«‹±Ã‚Ϧb² e¬še’“`\~>«j©¸lË˺ÿ®£à’}¯V”uP¿™j¡ jl£K€£N˜ª\¨†iñ°–Öû W¡yT{f®j¤k‡†UŒzZƒX†qKTZ?kRf Lj@iyAx‚I„Um‚N[v6]}7t”=–“J¥pR‘„`t…Yƒ„c›¶~¢ÞŽÕyj™Y†P€–Yx¡Zrªb{©X‡¬M‹£N†™Ww©Vl©^x¤a~¢]‹ƒaŠ™bg~<`^<yg@qfFv‚]n…Tjk?eW6usFŠL_ƒ?V„F`Kn‚@n…Aƒ˜S•³k›mœ”h¤†V‡[‹ŠZ‡ˆ^ŠŽ_z–ev¤nz k•¥xŸå¤ÉÿÍñÿÃÚÿ¦¾õ¡¼íŒ Òp|–`‰—{µÊ¥Åàžz¼lI~fbŸ’Ð’†ª``f2N]5g{Jy›WyQ‡ŒY‘žb¡l©¯vµ¶z¦Äk–£ZŸ†\”•Z|¢I\†7\yBt‹Ai‹DWb<hhNp‡Vt¨k”Ç~ Ћ°ê‰–ÂdnŒBVi=^nLd‡Vm†Kb|DguFi~Y{ˆXƒ‰Uo€LauK^yOi~C^>Y{7\|;YFrwJvJewS^{Zk|Pjn=OU=PfXxŠRnKZtERpIZyZ‰{³³Œ¦Ï¡Áð¡Äí›Æt„·pmœZiŒ[p˜atœgu˜ivžxz©mlRJf/\N7Mo@<_JCI6SF+]]3_X<V[ELP>xaB†ƒ;L‰ZYTSbm?csDyaEBU:OI=TW0ap@{{Py‚Q„qobaSmXbL¦o/z§nn{†Zx`SgNmmC{ŠIgš^ZŒ`ZVJp@G\<D`?[f9Ub1@]8ZV2Xd+Pa1ke;cuBeqJclEU]C\I8Oh7@g?rW6•z7T“`^aXkkEMˆMovY‚—H›¶{€¶‡[—‚PdKZ?)cZ9?y3D@TC:)7Q1LG.-c-5H>DT"C]*@V&RW&Ug-Vu?RgDmr;_ŒQ@`H=P0IM#Lb'Rj0Gi;DV1;Q3UQ-Zp1E€LKc9ˆ[0ƒšBG¾¥5jgAW-@j)KQ4YT,e3ŒJ^»h9’Ž7Y<IB!RF%J@->K1XG.jq0<QDS:Sf*8O<:/(>A%IN*EW+UP/]q:åvBuùs{y…RD„_N„aN¹ˆ^ž¿‰qͶj¹…^ |SŸ`S‚N[uEryATi5„<a²j^Šd[xB^|EboFF„XSJ0~>#–RE˜s`ƒ§k¾“YÁ„s¤lQxWPn@ey5Xn:qvKL…P?A0HNkh8oo6Gp@]Z2k…;vpMtxOv‘o‹„@kžpo˜uÈ™Y¸¦yeRC56c=&]D5vb<p“m¡lr¼Ix]gk5fƒD‡vXŠ›Yzm\guM]yGVt6ZZ,dT8kvJ|pH‰Sh‰]lq>zƒHfŽLhf?eyQlgR‚\=pgN[C9dN7_`KqgB¡²gfÏ‹buJf];”pLy”lyˆ\i˜`fŽMƒp>q}O~pIÚˆFâó›‹÷·‰WOtXX~MW€MEf/]^7ÅOgŸf‚~Jû½m½¸s‚ÈšhhO©~X®s¸xpjL_‰Qn{>bj=frA`yGŒŠTv¡je„HXaBn‘M´{M…qN^i5£Œ[ºÿÒ¡²‡Ÿ¸urŸk£™aÿ¯†ßÞ°³Å‰½Å’ÆÐ“Òט›»~v…Tƒ‘^À‰douRyq>hyL`‡QœU¡¦m]IlqFMk<gg8ˆmCš`{¨od’SXsDlm=VwNEd:gb9g‡STyBSX,ŽˆZj eNX1IR+3Y.EU+Ji5jk?ˆc=xL‰ƒU’•fh‰Ob„QuwBb{GbsHU‚A_y;`‘ErŠK‰‹X‰Ž\‚¢[’›Y¤bdFŒlX¥‹e¢Ÿp‡€Jºc«¼€Š§s¸§mÔ»ˆ½Ÿaœ~MŸ¼zÞ|i CuˆJs‘Fe|2pl>±i’a„§Ns”MŒL„›Ry¥Lvž=©®Nø°‚èÌ‚·²cŸZŠUyyJµ{iá¡âŸ‹Ïµ‰ºžw›‹e’Šl³»|³Âu‰†W~„Py—MfwDorCh~FŒMŽŠN{Ivs@€h@“pJš‡Wš]¹´‹íÿÊÏÿ¥u[–¹Œ©÷£›Þˆ™ÖˆËsŠÈj{Èk¯u£¢s›”i‘†b‡šj”¢iu”FZ`@luHk†bƒ²”’ÓŒh§XLl7YM:laFy†fz^}€Ul QRˆB^vH‘žp™Às…¬l™^}‘iž¶–´â§´ï¶îÿÛÿÿýûÿè¼ÿÒëÿÛôÿ¿äÿ˜Ãã}ÃÆz½Ñ~ž¾ai…Ib|R€šr•x¬ª‰½À’½Å‡¹ªs¨—Yj|9Xj;_Ln•Hp†;cpA{…[”»u•Áv˜·`‡’RvKyO”|U‡ŽWu>Hm&B_(`q5Vw6IkOiˆ]|¯c‰¬m™´„´»nŽ…A_l5Qg=czPq‡M`u?^r:c~Tw’b‹–g’•]‹ŠOuwPw†[v‰M\rIj†Pe‰L[IbzMi€ct’meX^tK\d7@Q07L9HZ=UcCUiRX{OXwFS~\q‰uŸ¯‰»Ü–½Ò‡¢¿|”·c|ŽRbsCd{IbuJbhYv{h€n…¡Y[{8aC/f\2LbC?C<QD-2O1574M9.QB*€W2xw9dŽTnUk†U_†XbkGFW>TT7ˆe0ŽŠ=…˜ea‹lXrh_KKIC1„=0“p(w£_”cubwZah[dkKlƒJd„Sh„OWzKkX;ck9WwIfpEGy=H`=H\)HX)U[-g^)NiA`dKVk2UQ<_Q3Xo;SgE€jBd”NZoVXYF`XDqu=Œ›`¬£k‹¸‡d¥…5oV?71\<^Z.Q_46uQ=7?J@)SR4Ms6EcO>U/AL+\H J],VY'Mp2ubC‹~=FŸgKZSR^)Ib.Tf:Is;C^?Ra<Th;^zEtv>]ƒBVŠWwfB¥z3Z¸qC…’IZ@Kf66gA1?/CBS])†S+BžP7SVAI%?K8M+<B%QT/Sg49\8NI)Hd/:_=@=5P:&K]1U[4`b4dfA„i=f‘CTjK\Q4P`<_R8a[4wY6”pJœŸe™“q‡£vh¸‰c©z[›Xe};‘ˆMv°a[ˆeV}A^g9jP>Q`4=sB9X,6O+HD(ZW)~g5b@´¤\Ózì©r½Žw}>p¡iBq[9OGH%Qb%qt=Z‰;m†Lf›VQ‰HsŠF[©U‘?½nm˜gotKP|KGj;W]/\R&IM2€K.Š p¸€gn[tMhf7¥E§¶tgŒjZYD…Gk†[€˜Ip›lB/uR;º_=‡W_L8wi<\l3st>ŽMƒTbxYV\D^L7psSŒ~I}m—t¢½ˆŽ×‰e˜sSoC†T9}ƒ_q—dvSa˜Tc–Mš`›ä›½õ¨çñ©¯ÿÍŽÍ¥ŠÌ–¹‹e»…Zy<v–U‡Zi¤anƒHšz>¬Qÿ—a®¢…°c¦–az›d€K\ƒKnu6ˆqB“’fh|cï—ZÑ•}—W®«r˜¹vx|N]_2k^5ý£u¿É¥…Š_ £f›©qwŸq]T„^?¢£k©ê—”Ôzœ i~fm•a›˜\œŽV‰wT©—]³£e·œn´£rŽŸft€LxxCp€Hdƒ\€›_‡«l¤£t´Ê¬»‹¬ª„³¥|t‡V]‘U`{LTm@Qp?˜˜^T\?E#Ig5BZ-NO(]r>C].gU3de8~K/suBk‹Pu†J^t@I_*Z{A…™U’®lŽ£Y|“Y©¸qŠÄ~ŽX¥h§Î”™tª›p›fˆUj^9Qf8…|O—ºy¥·w¬_‚~M’ˆ^ÕÕ’ÏÞ‰˜Êkq¼Vd¤FQt2EQ+seLi“HzžS¤c¨Z‰™Y{ŠHk|Eƒ›i˜À|ŒÐrt<•kJª€^ªš{¾ä–¾¸wäŽuÿ—s÷ƒnÑ_Ÿk@lU8eGŒ‚Nw€N|JwƒMpzBeh:ii7…w>mªRgfMrfGd|Tt•g¡ÎŠ›ÜƒÑÃÖºq ªv¹Ý°àÿ¹Æú¥ªïŽ®ášºôŸªç‰“·gš§l‰aŽ~Q|dO–‰c”Sr~U€™_ˆ¥ošº‹¦Ì†z®eh˜TP|?LO3`P=vxNjM§Ws©`]Sg†c˜°ƒŽ²t†¡k“£x˜«Ë¸ÍÈ¢ÕàµçÿÌíÿåïÿÕìø£ÇÏœ¨Zv|:KV/bfGv~Md~HhQpŸ[rŸOV~9Oa2_U4^V6WX5SZ9hrC|ŒLwŽGg‰=\t5UeKŠŠ~£»u‰¨T„…UuwSkhLeRŒ„SˆPwz:Gi,Ol7e†Ow§gŒ´cxžNfQvYŠ„JWS.JZ7KeE\tMj{?Wl0Ij?Xc‘°~ˆ»eqŠPlzGnoIˆy\ƒ‡Wp~Q~‡^ƒ–Z–dpiq¢‚’ÅŸ“Еr¼…f©|X–iJ€\GxTHjMOlQcoQ\hD]w`p¥qhžix‡a’•`ˆ–b…’UiETp@Vz?Rp@C`1@C5?GES\P]aA;S9FF4KR5CN3EG+\F/dE1[O8LGAYH>Yb=…o<œGeƒfCvc@dH[F7LH.b^2|\4fJnuZVUY-GA/+-Z1²Q f‘9ImS_BOU7XT4Zn=\i>F\AFG4pF-€\-]fEhxQVk=IwEMh6In/Rb7Xh:DnRV]@Q^0aU2e_6^rI~€Q…ŒLWš[SdRA^;fI1„x1„jtŒugo[AiK*J74H.K8EN'vQ.F‰9PssLf@OX?]Y.8~K/V@J@)VN@a*Q\/Ys<loHy>W¦\Xu[Mk-Oe4^x<Z{K\`A^X?JJ;GN2NS+oU*Pp-=„Us?-‚p)L®jKrWMd49e2;K.HU%3^6^E1Rh(<|[-O,/=<>Š<On;AZ97Y6MH$Ib*Lc@NW?KI6Yb6Zv@^X9AiFZS2do2Tb9TeDYxLe~PVNkeMt~?`‰bUˆZlG€Hx}GQ•Tjo?s‡DQ…GIaD\k-/U1.0$O+Pb$Yj5NxKc‡OMyBKi5VY/}v=Œ¢_¾©noÄŠŠ™~i¬pL–lQ…>Xz@f€GeˆFz‰C}Q’™X·ÓošÏ€r§iå‚Nø™YXmrL`FEa6B_$@O&IU%M_2rt:«i_»|TWFTk4gtB¶ˆH¡¾q{‡gXRE½L2Àuÿ“Vƒÿ¾Z‚rDS6e0 L1#S4%aC*_uBtl5_eF{^>¤?ŸUD|€c’“cr»o¬Oº}\ƒt³¬tà’dµjx±bt§kp•[ƒžQ™Èv¤¦i®„X—ˆYI³ŠR§×”Š¡|¥¤h›½€pÀx’†H©v‘|aa†WdvCHzAnj5•rA·¢t|Œmz_D†Tmc;_‡L]x=‚sI˜‡X€vM°qƒ²w|˜C¨ ]’»‡„}Wi{Uq}MÒf=…^Fu]”b‚}_d]Ai¢_l‰NÄ슺üœ‰Ëc›šS¢—h¥‹`—‰Oš“U†ŠN¥›k|‘qˆy[¤‰fžgŠ–jwWnsHƒM¨t}®w‹¼t³ÈuÅw¤«u‹¥qygpsFn}MtVUT™Ÿmi¶?G*<>!8P,+>SP,Xx7W[6ra:erKfƒJks<\t<xKi’UqŒTv…I|‡EgˆGx’S–‰Xµ¢k§¥{ªÌ‘¹×™…vT°šq¦×‡«×—h‹m]‚BŒ]ž¹k»ŸVq}F{T¶_Æ{O®´i¬»q¹oo _kZmHy…J†“Q‚‘J€’NtD[i-O`.gp;•cŠ]ˆ[a‹WvŠj˜É¡Íæ°øð¾±ë¨•Z†nE‘D›šS©¬j‰¼e±Z^Š@km>uL—‰JoŠD^q8q}A¦dšb©y±ŠÂ©n¥•Z‡HziIkZ¿‹„ÉÜ¡À⛺ӊ©È{¡ªr«x«šq—ˆ`k¥œm€}TxsL…}aŠ _‡¢\ˆ¸mv¦Wi}Nˆ]wœQq”V€©e‡X[sSdYt¥L„Æ^ˆÒf‚«ZmŽZ‹§r‡›kzs_œ…u̬’Ÿx£‡wÅ£˜ØÕ®äê¬Â΋™ eŽ¢hlyIMN/CL4LdF_|K`†QgVy•Xq•MssThˆRLi>Y`@Z^@j\:`bB|†On”Ik‘Hi‚>_\>rqTˆ‹Sv{CaaL~mU§|V‚sP€qUš‰c–Se5guFvšaЍk”˜UvyBd…RtƒYue;hX3QY1K_@dtCar6^l8fLz‰`¢®zÌÃi†œIhwFrpE€uJxGjcBcaEnnPhs[r€csb‹ŒŽ¸§œÆ·¦ÔÕ·Ñ󱁾¤®Þ~À~g¬tZšaQ…PQ‹nŽº|ŸÄ``>MvBPxMc~Rl‚Qa†Kg…Ib€CRr8?T2?[@IhALh<?R>3M5>H5HB*KR.TC0OC-XM;UQ>PM@H\7tU8K{6P\rVJofB:iN;SCDa=]Z7dh6@kQ;4G&=,0.,E=$\I!b_/Z]:R]:EV6\Y3Th6IT6>A,F=*_[*Tq1S]B^^;[U4OQ;^k@S4XiBWe=Hr^JcJH_1YW4ge6~„GvS^nYGwP=X=@L1gM*u€?X—e>z]=S.5O.<L48J/JJ0@T5dQ2vc&I–b8JaC@6^P*Q…@MjUJ_2M_+fs8r>a|RShJ£nAdVa€ht}7lHp}SD‚_>K>BL)FQ);O':K$>N"`T N`*?MxK3t…<Xœ|JQ4p=>N2KU(Eg?ER8XY9Fu97k94Y+7FR<$;I(TK/?p2IZ.GP*PU6QVLZT6lyA_zVZg7EnNNV4[f/\N-cf:j’al“em`b”eo{Vu–V†¡YpŸ]KtJm]6R‰>KmC`](Fc-Of9Cc,EN)8_@BI/P]/…t<¨K]§‡nHb‘Qf–Xo›Zj—cnŠLoˆUih€w@s‘Lf¤fSt_J]AJ_5di0~‹C™ºdÅ¢]{ŠWV_EpS+gX&HD;]=Gn7SQ1CƒD<l2O`-{G”®vq o]Cu~:C¦Òr’©r^rRDGCyH)…‚E¨ˆT ’VP“l;_=O:%@X?G@*\@%WT3wr<}h9dgOw‚_}NŠ’d•“aÅj‰QsŒW†‰<§vA¯¬nÑ×™÷½ˆÚ›mž¯f¢·gt–Wav<ul1Xw6f}9‰o9¼}’Û©•»ƒ¡c}”R–z?ÿ‚W£²–ˤk€¯oPWnHVB1ÿV8j¼£spLytTq™V|–e`—_x}B‚{U†h—šr_IPɨˆÀ‹håÁ„ÛËŸ‡šv^P]s:JN/K5B? KB&œc8´¸lîÿ°ÝvwFw–;€~5ˆ†]fuI‚f9|…R}Wh]@hX8oc= RªX”‰[•’[ɶ†«Ç•®¡|š™h‰‘UmxH‚ƒW|{JjkC]uAQrEAQ*ZK0…‰_‰˜\PW9]4@G'IwF[X2mV1dƒA~f;ƒs@lpAmpD]zEgˆR^€Aer7›”Zn‹Ct‰J‰R¯¯€ªÇŠ›—f¶Áy§`…^Ÿy°ß©Éâ«Ëø¨¬§y^mC`‚;³•\~žR†—L„’Nx’>r–?w‹@ly6lv>†Qƒ”VnDkŠEŠQ„›Ojt4hh=Li(Qh3rR™”rŽ f‰kB…^4gY5ÀwnÍÏ¡À×™ºÍ‘£Ø…›_™_Žºh‡šJ›€B|ˆCvpBjg7td;Ž‚Gо\¾SiŠG‘‹d¬…鬒窔|Gzd@ke:TE/P?’q[ª‹l˜~^Ÿt\…ˆ_ž€f°¡{žl§nT‘zZ¤j“‚]€ƒZ—bšµm’Åu•Ây„¼b^™BPy4[W7]dEw™Xiƒ@gY3„@{Kž¤Y‡£Ob€=[l5h}Cp{IR\Gkb^Œ„»†‚ª”„§”‚·•}«zš¥r€™f‹§tw¥[Th8SXAayaqšg}£b€¢a¦Xg“FOd5sQL‚gFpa=j`@mbAokDszK„‡LzŒGh‰HfzNitGfh=hhQz†b]qyP‡oTztJ‰zXž~Hwz=i~V•Ÿj”¡_srFgjEl‡P‚‰QkvGZxBTm9Jf;UqErJbN{R‚ŒR•[¡·rŸÄh€³ft“\u{DmkA_b?ceC^dF^nMcyNv|Sp…`~™b{–\†`šŽbœ•q ~¥¦¼µ¶Æˆ¤Íuйy‚ÆŒžÉo€¤G]}=Yp=Tr>WuG`vC_yAXvATm@Pm;RoE`OguBL^58ZC>F9QF/YN/SK0_J0HX;BTI>R<>X8^N1\7EœU7l`KACjE,Mh;NjOGV?8A515,Z:%IN"GL8M4-BD'HM.``'R[*Id1K_2>N8<J0B>"[N#]|3ll:EgD=T;KK.VV*iw<Rq/YdB_\7MYTkTFZ2U^:tq7mrLU\CQN67b6JG8Xe1pm<žNX©h:eSWN1Hc'BV9MH5bJ4P_4OU?‚R)p€9[ |I{`j[@m7FˆjV]Duw<a{8^xTZwBS‡LhFT…9^oR^l7RZ;sZ<HZ2C[FGO+6G1-2'1<?8NQco)Yi8QƒMwX5[ŽLYpXX_2G?Nn=L\AQW5U`6NmAVuCBs<HO*EF)GI,\E,I|:Ln<HV(ZX5iX>^c:`€MYq\rn@XƒXKtME`+IL,zd4wR`}dq^Mm‡O¢aošNehBop7_s^^b<Tw@AzGI\/l^W1Gs=mR3\jCNrM]|:ay:Øh4]Ÿ_R|Q\\8hk7mp>ft?e{;s@J„Q`k8vz@’NŠÀo?ؘHkIx~1ž«Ns†TDT7OW-HK(2>#aII]-UE1k[,©oEdaNis@ti<‡¢j·ƒ‚‰pbqMXwJ”I•_¡R^”_CZ@UwDtuF~ Wcœe‘fDg¢rpRIvC+GB4]1}6+bK=€F©U—±y{«ƒx˜^’K€½gc’WP]=`Z/[Z6 \1Âзªx‹ÍŽ™·mtte™VsŽU‘¡c“°lм~oœ]¤–d{‰‚ŸbŠÁrUªp\r/’W‘ySñ¬i»¾{ÓŠa”lMcP<ªbM¹‰r|…_~ƒMŒ˜_”§sl¯v…>’f–•enŸhxo?¶„lbâŽjØ yÁ“lÍ¡mš´wq™`NzJ4J/G@'aO8•mH´·}ñî…¡ÿ‘ŒVn®mV–@zƒ;k `dk8rd>tqMcŒU}R_—d“ ^lp?~€P˜‹XyˆO‚€KoyFep8|qA‡ƒP`oH`nCkoJk‚YPuKMg9‘†Sw®ogŽYq’WsŽZ—da„K\vJˆwL}œQ¤{H‚uAz€Nl†VyxDfj>r^E—]g¢Xr—P˜¦gž°qVz‘U™¥\—‰X¯œv§½…®Ì‹¾Í’À礶͑xÑspŽT{ž`–ÌwzJxŽH{‚Dè®cÌÙk£´Ur™;V`0ZT+[m5z’L}ˆGŽS]B_jCXCj†Y‹™qŒ‚R{mDZo:_d:qy@GT/ŒXH®¢w¬ÌŠ¿s™°mŸº^¨ŒXzNmj=|A€j=dkBw‹Wˆ¤`ª¸†±ÿ¦›ý~’¾k¸›_©‰\“’Xac5>O5Nd>jƒ_q”k¦º’ÎЗ ÎŒ•Å|™ªf‘ŒS—‰Y¡sZfRuwQ…•fާzzµsz«i‡®m~˜^‚—b•ªg‡de¬L=i.78-b_C„‘S_‚Ci‰=k˜FZ‚@RoCWvPPGZ†Ke–]‚¢mŽ ƒº¼žÅÔ ÎžÅœ|’nP‚{_~¨j‹Â‚¢á¡ºî›–Ù{b–Qq‹f‰¨¯‰±qy§[q™Q\†FPa5Va9Yg;fpNw~Yn‹Ji‡Gr…NyZ†_…Row=Yc@bjR˜˜nœªb…›Ht@sˆ>hƒFxŠUjƒO`}GtwO}K›zM‰€HoŠSq‘]w g al•[b•Wd l{§nެsj¡Wc’a¬w¦Ò•µñ ªÛxˆ¡UrtEajF\nKanIfxJbsHesJfnLwwRp|GVn@P\9UV;rnCz€FeoH_lJl^Ktre¢}¦Àp‚¤Ibz5Jo7Bi2He0E[+I[4Ke1Ic/Ij2Fe8KqFUjGYQ-HZBO?>KZ8?Q7bL4lR/YO6i\:^kBPcEMdAlSFbgIQ˜bDYNQZ;FY54T=%L;%%"J(HN3>+8',I E7>I&TK'k`%eY.P[D;YGE>:DH+dL+Ys8[mE?a7GU1[W)Xs:NGQ`/Vb5gR.PRTlWX\+ku;_|MC]LFC6HC&CX*OM.ƒd3‘±PgrPc^CV;JX8E`.=^1@R,^Q1QS.CH4nM/¾k2Å‘O{¢qtpq•W\¨vo~bT‚NWg<zo6Œo9q„Eb†L^ŒCHrH=b@6V+;M'KI*CH*;]0*O+-3.6)1D0YDXs/WqBe€O^p85€REL6eB#dj2KSCmHWT7TV+Z\6ImE7_;KL&@R/RO&Sr/Jy@M]/V`7WlEya>dœP]x[oh:exPNxN[s/fpMVuHQvPSzF…ŽA~”ZUŽVNvXHgHk^>buIYhLct:GƒL=c6WQ#O3F]+_a9Ub7Uq>Qi>Ld=ps5ŽƒAb£hNsSUW6Qb=Uh0du2[{@Tu@€Y9”^0’wE‹M¥tn»rp‘K\BMf<IsDNY33hA0@B>eP%p[/kfAfN1vG.fp?€‘P•°oh˜yh[H„j9”ºtާq„{V¼ihˆ\mPn¡erZqWJ{[h7&»wEFµ™aE5OR1TQ7]gD‰Zn®}‘ŽT¹™cÄ‘wwuYl@Š“Re¤ehpD;P2?>i6‹ŽOf[}’KIi„Bss0ug>nQ¯¨jªÕ”‹â’ÄÓ‚¦Ý¡”ÁvŸf[Uxw0z~@„–\àÈ{ŒÃ“xƒXnyF}nMwsWŸtR‡i‰Žh’Œeª“h€´~ƒŒF†ŸS€š_i‰N¢’W¸zW³|PÛ‰e¾•Õ¦~鼃ÕÈŽœÚ›ÅhšpswUqrF¨wSǪÈý–óû˜«ÿ¢µó‘‘â£Ô‚´ÿ«o a‚^=¤eG}gJˆdN„Œke‰E`uB\|RˆxUrW„|Q›šhlœ^dx<†xLvPs~P†T|Ž`gqCvY;nnJu‰Pr€MaU9t]8k[4rY>VLozEoqA‹sDœ•\sr<•ƒLyš\]Y8eL-iV7p€H§]Ž·l…¯cމShƒ@¥…P¥µ„Šd·’j¾«x¯ßž—좟ߋ¾vœ®aˆ£]«¥Y²£a°\k~6mq>¬‚MÜ…J¼h,{}:e~Fx‹\i–DŒ…L¥Ÿr–¦c¬˜o°¥ Ɉ¹¶s‘‚SwlFbi?Ya8bzCrk>„`‚µq—ªiª»p¦Ì~¶Ñ‚¢ ]“vD‘kD†cDzb@…|I›‰a«•f©uJsF¤}[˜~YŽ„\§™g•’m¤¥s—º{šµuªª†Ã€ÊÕ‹ÖÜŽ¾¿m’ZE±][±|_†€O~ŠKwqF|WE‡iJˆ—h¢©‹Àޏs~±][‚H[s?{“\еxšÂ{ˆÆd]Es‰Vs`’ªltµh|±fo±b[Tm‡Y‹ž`‡¢qµ„µìœ³ù«Èÿ¶ÆÐ¨ÑŸƒ²y[~]BdWN•¤€ŸÖž¼ë±½ò±Ù…‘©TuY˜n‹¬‰•®‚Фis™Z}šWZ„GQpDUhQv†U~‡V{[{”Ll‡]‘’s¦œ\y‡Cgd=_eIfs–¿—•Çe_4_z1\|5fŒWŒ¤o¡dE\p:^d4][2`^6gnQœm‹»r…¬i…£gˆªq±q…¯€‰Àˆ‰Ã’Öš‹Ö†Î†›ÏŽÀà›º×Œ^dpF^bIksNarIaxF_h>Ub<=I(7<9LY@[lAGh54T--G&7A)EF-SJ1DO+@U3Ka<`W<_P,GU/Ti:Zq-Jl';\ 5S':[(?\1Ac5KqERxO_ŠRGT)OJ3uH47]??>>9A3/A/=@)UD&Eb'Sa=XfB`w?>o•JX…_CqTEaG=Y9)W;(5(42%:0%&2.;I=I%SI']]+_J1^I;G]FDOALM.dV,K=BaAFL5S[(]c/Uw?JwDPf.Ki7aK1DzOJfNl]'qy;QmGHbKES;BT,KO6ai3—‚F€²VO„oBMWOH'Km8R_ED^9_F5\I5KV?Sf?Sd>]`Fdj>yfA¨kA‘Q{µ„SŽ„BOIEN+RZ)`_.ov,›r4|ŽDMbKqIHh4QX(Et6@w@AT=:Z1/E-/;-.0)::9\CVp3\kJg€FGˆ?;iR:]8fR,hb3Wn@D|CFg;[T3^vCLrPVrC>R7XB*cc-F–RMU9Q[6Y_=‹q=q¿nid[tQNiG[f:v„<q¡gŸ‚PªU›obXWY@`a6dyN]vCc}QZyPY}V^wFHuADm7Yb/@}=Pc3Bh/BY=EM.N\6fr=yPv~RV~NCpS_P6M^5Gq=Jc#hi'Jv:6cEGN$gZ3ndIj†Ki”bLEDb1IV%RP'„c0[R=qP[G(Zc'ddAUf:tV4Š•B{ªV}£j¬iLoXZ@*•„Jˆ³e‰‰_škUs]ZT0t^+euHl{<jrIL–]B[N—N˜šom”„veN‘Œd¢«—†ˆv…jªE ~^ˆy`nq[Œ†S_cGfF=g6,G,C@$y]3f†M€tLkfY“Yq¥O¯Ð€µäÀÔ–«ŽwŠzXÄ„]ŠÜ©pwO„qGgŸTT~AaX0{p<³™ZØÆ}í垩Óˆ¦u–ƒ^˜•r‘—f¢vR«Zž©x’¬xi•WxŒD“£d—¬_·ŒXŠmR €Oº”jñ {쪈ة{Æžz·œˆ·‚s³Í“Ù¤‡”x“cLÁva¸ñÎâ~Ùÿ›äü˜üÿÐëÿÌÒÿÃlÒ{yM…„Z…„b“•luˆ^WzCwf7 tH”|Snƒ[† g}•hm€Nr„Yw—`yxDwP€~S˜~\u{Zuˆ\…yLkŠUbq=yXBtaFbvN‚|Y‹}\šc~A‚g<Œ€Gm‡D{PšwQywU„Y;tc<v|O–¢f€—M|¡Ln–J[v5v‡A¥s£§k}‹PŠ€S¸¼ƒ¥È‰ÑŠƒÊtyMjmAu‚BšˆZ€´hiŒE|yEoŸiFj;Wr3€¡l«ß¤ÖvƒžRbwH}‡Sâ{^¢ p¶Ÿg³¯j›ZWt<\h8U\0x]BŽtLyzN’—Z “_¤’Y°–c›ªg„“Rjb=^Y>cO2qU7…nIvvE‰TvzG^U7UD'Z@)_F.xU@vKœsVªŽgÃs¥–j¥‰cžsR„X=‰P<Œ_Fe|AB^7UN<lZH†[}•Qzb@pP>‚ƒ]‡˜f€‰\Œ›]}©_d”P]„QjKšc´qš»m~œX•bo˜Sq‡MuŠQo[u—[n„KCP(>-&b94t[Mš”rÁ朴ی•Ži™a]šn[reL[Z6OQA{h±¢»·…–©[gg3LO9qr]†—t}œu€Xs–\}¢fwdp”\l\y‹ZzsSxNl|FoqG|vO{eMslG`g@_od|ŒË¦¸ÀkuŽ3Z†9\€Lx«t›Ø• àz}“MtlBje:YX0QY6ZfX‡›v¡Çp|¶hn–Znš]tœg€žn„°~œÄ”§Ñ°»è®±Ü™·w˜±…£¿Š¢Áru’LVbG]i@^oBXrBHjKXqQTp=9J3FUCVuJ\rJVq?J_,0F$8B+NT3P]BOj8K\.<I 2C4K#6W.>a.F_,>b*:W$7V*<Y6B[2Lg>VoGZvECW0iN4GM3?H:>;60C,J@.BS,\I/^W/TqBegA^Q=_i>c\AIvDQTJJc>?gD(XD&)*4)<9,J,:A*RO)^c'Yb:W^<YP;\`=]J/gX>GhDeT:vQ5Ph:;mBER;[Y'Ie+N\:Oi9Zh+Dh1aK1Pp8T_LZb'Ci;MD4QL3Wm>GrCbkK?~ŽP€‚UO‚^HYRXJ1I\3AN;CK0P90ST.rjCPnEXKF\T6Wn>Qj:gp>xEn•K;‘|2?>K=Uj#Py-[n3dz;jt<S};@_19I)FB"rG#m|5Iµ_RhS@j;4_F2<)*E"1K%FI)[X/^n@jmR^‡DGzJNN>FT.MX.HT*_@$jo;}ˆKy‰bކWfœiFXNO>mW(J™E@hLGW5OW=–e6c¹bnqOjyCewO{{G¡“Fr•o`rNq|<_‰COsWPl;eh2[…M_sPmiHZ_Clj8L‡qJ`1Ui1Zl-Wm:_}CM[@zMT`Ixk@h”Nc{R[vOy‚KL’aBkNKh9En0Cg"[_Qr8?gJFO$}J.U€S‰ET¡hUi<=z4:b/KJ(SN*uR,Qo:Lf1]h0S^9|j7zyH{«[x¢`€§gu§o`oEfm2v¦Tm†Q• Wƒ¯v\¿…\‹_m„RWu<FZ/M$´M_ÉŽkgV‹o6ªS§¡€™§v“‡k•f]–ZF}rIZAj4Ž}P—_bzWƒ€CUjGj5JQ/TS4im4f}D“–Jµo§ØƒŸÁrœŸg‡KjlIsvCs_?Ø•`|ú´ŠŠW²Æ’[Žqdl3i~B{‰G J¾¢f¿Ö‰‘q[±xK”‡[©šnonrQr@¤Y¿¬ui‘\›l;“¢f–\›]ÛxT¡g¸Œc¹f’~V•l=¹„FÔ„K¾™pØ™pÔÞ»¤Ü¶y}Y€R¯m°ÿ‘ßù—Îÿ¼ôÿÂóÿãÔÿ¼zÕ‡l„O~pK•^—¥sž_tVs„Ou’Sm¦dkU‹†[cmJkM3‰dGŸiKavI_gDciF¥pPu›e‡‘gc_@r~EsR~g;\X8kX0lkEvIwp?izFr|<r„C‚}E‹’_uwHºqF†Ž^nb7ˆ£^‡—a`…Bu˜Mz¦Zy˜K†´\ÑšU¦¢u•X“ŸZº¢cuqB•‘aºym Zhz:~•S‰´dœ®tÄݘŽì“Èw‡¦bi“S¥°r®Éy»fª^•¢fœ¢oˆšaŒ e}¦Xy–\€”Ws€JrtGª|c¥“g¤®t”»s¯Õ‚k¹Zh~?jj3eu@dwD\n@~T9ffFniD‡wM†sIzƒM‡‹Reu>cc9`Y:_gGhlIyVy„\Á¤‘ñÆ¡¤jœ§l„ŠRg^:geDXgCrTDmdKq{Q‰‡]”d©_w€Id^A{|]’šiŽ—]‰™\€™PbvCf‡K`€AfvIqOqQdˆPg€Me|;Uy;Ui;xy^·…ŠÀsQ{?*6"'6)3I9Z]V›¦˜Îü©‹î˜rÀ’Ï‹Œ¥`oo9G^-6P&@F2_ZK{ŒUAe$:E&IL8tbW‰Šav—Vn˜P‚Ÿi‹œp§p©…¬pv‘\tƒNi~JkwM}‡V“cŠUxY|Ÿzªtœ lš¨Z{ˆ=`{L|™~¢ÖžÂô§ÎÕ¨¡XuCrj:€e8Y]>VmUo˜j”Å¢Ö”ßo¹fo¢\k fv›dx—mª¤Æ“¯Ä‚Œ§fz˜nˆ¬‰§Æ… QcmKis?QhFXlPf‡jwŸo{’JO^3BTHYsZ[{Q[xFOi77X,)G,;C9MZAUl?Sa/]P"HJ"1G'E^5P~EK~CCo5E_,:H)DM-GQ%8G)?U7Ol9HP.bN4GQ1EE3IB0=A4UF.\Q1oM8Qc9PSAMe@]aBF_=bK?dX;mPh€VBt_)RP>05[3!ST,Y[>NhBaT=oM;cW9VREMI>bO7R[6pS9h]?s_BQ_AWU?M[8CL9L`4Ae,FS,J`.UY'>[-TQ1A_'F]8If0Hd1Ga4[[9]Š>clM‚uCgŒK]sVcc<PxHC^GDB2.O1@A.MR'^K)go8YvZ@\=[N9bf:VuCJbA\[:`a-{_3Gœg<Sd_P"U{&Ys,Rr:C\2ON(?n1;U,?P&5@&BD)ƒK!–ƒ.QÒbwvC‚EJuES{<Z„@nƒDhL]ƒ`atHhŠLaŽJAqQAQ8ER-IO.RZ-Xc;d^6pm<wSYxUZ_OUp>jk@cŠIE„T<M2bM2w€E`›e‡€Sˆ]€€\ƒyG‰r=RdNhb3^z7Xm=Jn@Y]=To:]mC_oZFmCAK<pT(L‰SIe;=c-QW+Ml0X]0jk4x€Kk·z\¨‡n‡Pf”Lv{C}‹NgƒS^„Z]xLMˆD>i0?W ef0K†TBh?gI,R^5|o.I›QDuOSa2H€>Hq:BrBGn<M{:b}:b›QZn4ld7š{:y¹i|“[|©lH^]U:|„Fa‹Os›WŒSÿ`¼¼ŠÊÁ†ØªRZQa1˜M{sQ×w?‘Ù|¥}„t¡†O|‚]oS?pO2j_-rc6TqFvzC˜ZpzVL„e‡W>m“IIzLIL+YR)|ƒ>›Çu¢Ü‚‹£pvaFt|@iYK£‹@gRWd@ŠcB§kUÃ|ÿјËÔ½FaDOh*Wa-wo6ª†FµÄ˜ÈŠ€‹bx†QmzI|rQ’uLlqLn†IŠ„M®ŒZj•]†~=“L¼Ÿfª–r«‹dŸŠf‚tTziEWK0J6K<(UG'}[.¦s5ήYÔʉœ·~Nˆ_6àžpÑÿ½ßÿ°îÿÉúÿÿÂÿÀ¿yhqAwiC©®}µÎ‡”µq‰¦o£|Кt„ºz¬sx¨qpµsjªr…©mu…SmoCYN,iS>•_²¤q†¬nQl5hu5uC³}‰Áxxˆ`se=ka7ll9ioAl€G˜£d–°|Æ×¦Ç³‹ÄŠr£y¦j…¬bl”U}T}‰K€P`pB‡ŽMq©Sš„Dñ¤nǶo„ŽMc•T¯u°ö¢}µqb€F‰IzJ…zE×{ÿ°bŽZ¦_“Âk’·UsšN†{VÕ¹†¾Ö˜§lv˜Um‰XxŽ_‹ƒMŒ—e„•^º¨o Àtœ„U¡‘i®¬j²ÆÃq]vAvg}¿€ŒÈ~²á‡ÐÑ}ÐÒ…Š¦l€‘_ˆP‰~S‡|QŒxX†‘eˆ~^ƒ€Z„`œ©{ØÈžÿÏ¿²sÁh®~]‹ˆNy[B|gIv~Rƒ‹[‡]†‹^miJŠ`ƒ¨cw•X‘^~“WˆˆX„–UsˆKeoFewGUo4;B$PP+X]5foB|ƒUŠŒPWs.G[)>R(XK?jfI`b;SW8]ZOzŽw„‡’Ù–´ÝÛõ¾ÙÿËËÿ³£Ëki†HUy;Aa)1>!14-jeXjœSKBG€BI‹HRA`j:n}@n‹GtM—€d r–£z¤xz˜YpŠTp‹UvŽW—UŽU„`Œj…¡axšUyžQn‰DcqPˆhŸ±r–‹U‰dG‘aQ¡oGrX:haKyu\pbxªg‡º€ªØ©¸â•žÂsx¤kxhw‰T_yRj‚j‡ rŒŸdv–Uo„f¤vŸ¸lŠ–P^vO`ŽVd—f_Šbfm©tzž_Xs<EUM_rWb‰Z^‚NTwHNnEMp@<_8>^BLc>?T+5M#9L%<I(:B8XgStŒMk?Oo*6L)4.7.A$0P5>W*K\=FTAAQ3TL3HJ87;@C9:IH1|Q4wi>irJV`UT`RL]I^TBoP<kmDRxU6YU>:>hG*~N(vcF[RMj\XIDfN8bND]TFiPAZSB\TC^O7rd?€dHR…OQfOOc8Cf:JV<Ei+De)Ic.SW)B^*J]6W]1qh0ZˆETƒW\gEyj@P¤XIyuM^;<e2SJ-qb3ZSGtY@XLHW/:Z8RT=`_)K_5VQFkg2U¨[CsdKW;K`42\9O@+|N SNLpkWk3Mm'J[.@K.5I*QI%>m+@E1?J(4O36N2JJ&‰c-†9dÞ„iŽ‚t†GX‡RQhJaT6fU3IR2hV6r”Og€ZA‚M>VBPY3J]0`U6W\7pd?ro7voGc“i]‚Oc…MsUpƒJO“U`gM{mEv€X“™`žƒVf{XT[CVu;lf7MlHMSF[j2Uj<Kb7[_5boBMvKO^@P^4<_5iG4Bs<HW<=b1Gb2Cb/Q\0j‚;Œ¢X”«iv®‡v«wOœh>zN5c>AL(UQ+eq6L˜HA\5JM(dJ"SˆFaiFY9Gm9[w/f“M]‚\[Hj‰Tk|Gug<t@žYÑ€d®sTzLKj.qz=€£P|˜pz¥ljˆ]dcAWHwaEp¨lx_Vë|@±dÿW8š¿œk›l¤¤a|¡k`gE–m?ëzHÖᕤ¦oqrPjŒQ\…\Z\:JU9oI4˜™b‡£|xŠN†¡]~¢_{¹gŒÄqUÅgRsAd…;¨¬S”Ãp]mN>\/H7%X`-¡l;ë£|¾ìÔzûу±{|°wؾtÙ®ŒRn]Mz?cy9d…WUbGˆƒ=§½n›r´‡`•³~—’]¡–j•¼‰}±€‘œ_~©œfn Zc{:‰„C¡d´¯y¯Ëˆ•°ok£\Y…GJ‚NL{Y]‚Nc§\t¤XcœLf~I]k:Rc1SoBb€M{J¶~EÃÁ‚òÿ ÿÿضÿÒ_žgVf2zf2Å’]“‹Nu„A¬zB„U“¡`~ªr— f¬¹ÆË˜ÉÖ´¯ç¬‘»xd‰JKf4HZ+‘{=¥ªpjŒ\Ph8i~>bœNnh8lL1„I/oU6q|K€‘Rž[„—U¯Œ[Üpãd„qLgb:‹kD g‹´lsUr•Yg™PnPb‡LƒŒJ˜£\¢²n¯XÜ£\—Q‚{?¨’WÒû§„éˆv¤^sžJ]˜DM~=~U¶É~”µ\”¤a„¾] Kn‰I‹U¦—mÕ´tå™oœ¤f‡ž^s›bZx8s^3›‰cùx‹Âs’š\š•Y °c”¤l†S|Y>jK:„naâÌŽÿÓŒÿΆÒÂs°˜aæ†s¸v¢¼|•´h”•S–iEÀi]¼”x»¨›–h¶šÿ÷·»Án{NqLŽ{I‡„KxxO{xN„HzwW‚mº{|¥n‹†dœ£\†zM|…R„ƒP{…S{Vk~EsyI\u=XrBO{8Kr-Zv.VzAk‰Rp—Kd…5Xu0Wg6Ib;DeKQuYX‚V[pJiaVŽtq¥˜|§¯¬Ó“Áá¿Óޤ«t{–L^v:GU)/5/.'QSJq|d®b¸l·ca“?Wq5d|<M_0RI1dS<€|Z”…[‚Qu‘W€b¤j…¸fVwtEnYI€Xƒ›Xq–Vj™_pŽY{•Wv™MYs=Mb>]`C€kDzqA^w\} j†§fxªdz±‡¨Ôœ·å™ŸÆq›cfƒLd{@Tn7Q_=emLx‘LmŒGd~Xp’f|‘Uq|ImŠ\yŸx»€±jq”^l‡t jz‹KI[:U[SkchŠO]…JWsEbvG\k<JhNRsGHe.A\-H`2Je1=X/:N3TYBd{Dqx;Oh)1H #5#.B3A_2C`'OmL^PQ]Q5ak?OnJS`KYLBiD:e]:o]DmjLknTTpWCcYZWMWaFo]GSuKGSIQF6bT7~g5pzCR‚UNbU[OA^^=YWDNQCNN@PN;`S:d]:ƒl<…qG_Œ]ZoQ[k@InDCb@K_=Ka6Gd6ST*PZ,Qv7qb<™n-—qF\~Qgu]•p<e°RV–ƒM}TFxCTgGxuDl‰RM‡jEcZNW=K[8Kf@Vc:EG-UH5–g/_•NFˆ~_gAQl=<P;XL-lc%_i:OŠ`Ao83V(7K(9D$;F#JQ%9[)6G2><@<!AW+H\0R^.‚U0–d0QÛ€lr}O~??‰Y>U;AJ!KC(|Q'c¬US€dKX1:i??O9FH'FA*RP2fi/_n=€b6j VolTw…TdtSpxJv†DVmOhG;mzIvSld>WeEWX=Yj;`f5NQ7Rd7Pk8JW2PV3bV3c_8ja<esATjFLe7S_8Oc;@tDM]3Ql.Ca6h\)„ŒM~¥c|˜T|¬]ržpZ~O[Y7Ub9GtBEkBnc+Q”ASf>AQ.\J'Z€4ErJPp7Wn>ln5m~DG}^\\*FGEnO:]%F="f=¢o+†°ha¯s—Om\p|G—a±pX†Tb_7lƒI‰_H…j‹J3ÐPH‡dVK2q>z=’£f“˜hœœa{–i…xQ‡iAfuD~>š£aÚÇt¾—ez`“ƒS©uŠ®aqQ•A¡˜LŠŽPzS9•k1l©U}¬N€©_†š^r»uBŒTP<#_f5UoE|€9ŸŽT“’cž h®«eâ¢l‰—j†—hn¦u§‹NÈ¡m‡’m¦°Z¤Âu‹‚^³kI¶g`blmH™xE{ˆJ›sGšŒWœ“as‰T\‚? l7¤ŒmÃ`ÿª€ÅçÐÃ×¶„阀šhgrKqn9~ƒGužci…Mp™R_¹xQ¦lVj/}[-ŽT‹¥U§Và¡lÆÿœ°Õh[‡M[t8yƒ8|¥VTw.lp/‘˜fÏƒŠ©mp‘\muK²™i‹µrye3]1”uU`ŸhMˆMa‹NŠÍw›Ôm¡d_v>k…EwŒQ^yEgc:n}Ent@‡“V~’[ŒU€Ÿa‚{@wY8}F6§Œm”Ï„€©`—›\šŸd›œfŒ—V‹ŽM’^{ŽM€‡F‡ŒPÀÁ†©gbvN_£aXq:eS1Æ¿Š§Äy fi¦Y€£R…•Sr€Q¼œl¬ñr™GŒ˜OgLƒM›ŠY§©r»Ð„‰ªZl‚Dn™b€£_cŠH_z=q|0ˆA¨d§[vN”²a~«aƒ¡^‡©ltn¼¹†Ú׉¶X¡“Z–‰SˆmKvnIŽpH¼”b™ša{sGo‚Hi€O„_¯žo±˜f¯ˆhÒŸs¶£k²’j˜`¥£hžÃv™§l‡NzM„š`Šºh›¬s¼•sš“p©x† ]‘O‹}Q‡‚UqŒQk{Mv~S`ŒOb—[zª`rˆE_v>kˆY”¿ á”~¿iZuCXh>[]=[VGuxft‹hc{YghTx_T€oY‰zq Ÿ–r®Šn¥sŸxQRP,=A.;A+J@/JI8w{V…‹P‹•^¦º†¨Ó{ªQZ„Gd…J`~FNmAXnBcpBcm:i{Eq–Z€³o™·m›¢\‚…Jko3SM0XG;qsDxŠ_Œ¤w›©h~UtƒOwˆQlKjs;hl9_n>n†W{•]‡’Ww•c¯€™Í•«×“¯Ê{ªVgƒ?Ol:H`88K%9>.\]?^GZƒPi“Rh…ETd7Ub:dnJu|[‹^‚’bh”]j˜mqŒJWp99[NYk]k{O\g:Ti5DW5<G?LaRezM\c4I_0Mg:Ri;L`34C'*6-I\8ab6jV+HV);W3E\8Ki<Lh-&6:F$+f3#~^0˜|F_…\F`[BMAgC6\W;\RHtWQynU_„ba~cnqVqs]\p`~qUZdHtlJVzMblTN];aUDirE_tIaXK_NH_PC]UIaXFilGryI‹uHX}R]QIPf6KS<gT3_‡?R‡MKvLOj;O\3IS1sV0Mn8TVKd[2id?f7u6byQfvKmc:jtLluTdsSQTNmWWg@nkFIwLHhPD`+QX0ia.„eAo§Sq‰b?]T@;1OT&\X+]w6B|>Fb6Nh4fr5;PA[?@W,Q\.>U28=(=;?I!6\41T*6C*‰9 h*XÞ’j€‡RqJ=TD];;U1Q/WÅ]:g^XK.M`1=Z;OF)WM,`h>Eq?LM:yL-Zv>WYQjV;g’DeŠPc~L;vRU=Aev3P~I]b0qyCWeEZ^?Ef3Ob<KwGB^>JX2ES+JG1IO0ST;wk=]pJZ†MZwF_s9;hCQS1Hh/Q]3jf*v‰J`“^‚R}Á\N¥x]\LCf/HP.YU-F~Mw{BG£Q]P;IU'HO(dp0J}PKV+=i7@dBX[7Gw4Ef:€e,T¼{L‹iLuG?uEl`;|?œhz¹rlŸfr]¤kk–ivbDguDn\Fu‘YM_V’gE«•P¦ dM˜z\k>A—·wšªr~¯]CŒS:c;FK/oW-‚zFºš[Ë¡r©‘u³ˆ„·iu¨Wa|EO]3Kj/9F,>@":K'aU&€GwÑŠ~yT “^€ªjoo>tj>gKDwFz†L–Áov홪l}¥h”`“·†¦n‰‡P¾‹Vª³ÓÒ—¤è¨•gƒdI„ƒY…yKyxE…‡Y‰ˆQõÜ¡µÿò“ž{znKqu=a„Cn]3Þb@§º‡¹†ZÞ‘pװΊ©õ³¹ƒn _q™PqCiŒ>š£RèÕ‚ÌÿçJìº=lDEQ'YT&fp+Y{7Y+|ˆL`œIvŽ\s“Gˆ«OS|7qj.ã”X¿¾{x•StzGfiCœrHžµxd²y[¤bk›fj[Ž‘\¢Ùб¹ƒ™jNgCRK!tt4…®yv³t‹|H†‚QŒœ[Ž—Q£†W~‹KˆzRe—Z]S2gG/}L<ŽƒS{¬Yœ¬e}¢a}vMh€GnzCyƒL}{J~~U³xÊ„»Ðˆ¥¾xàÑ™…ß–f©eÁ´ƒ—ÍrdT1‘sB†•U‰™Ru‹JwP¹¹gˆ°W}”I}†H‚m9ŒzG‘~L¡¨l}œT^}Bs{EsyI_uAnoM^u5a0Š~Ky…Q|wI£žl¶æšœÐ‡›Áu•—g®¯•ZymGqmDzoByOŒ}Y‰LœŒ\Œ„Rw|PpnLkP™“eŸ—j™‘lµ°…µo£—^°V™•U —eñ¯x¥ _Žw@|E˜“^˜“e™}]“wb²ƒr¥‰e¨—]‚€P”N€ˆRp‚LŠˆ^•QuNzžZ…•Rkn=\^Fy‘p³ËªÖá²µç”|®T^q;JE,74 B@1ciOeqPbmHm_H}^M‡f\…p\„„_–_¢‹e‰’^etP`lKllPa`KPQ;IY0DJ&D:6{oh¤±s’Xi‰Ih‹SnŽZqŒQv„Kh~Bjs?c~Bf~L’„\Ÿ–PƒƒKŠOqˆMgs4RP*RW0fgP†„n•kpˆOl}IhwKru@^l8Sc/KU3V_DhuJvwN}‚f†¡{›ÇŠ”°k„ƒOwl5QX)CM3AU48L(:D06K8Hb<^sOoŒL^{5EY&5U*8[8FsIKR^ƒam‘v‡¤wy—WWoLQlW]‹fcKAe=FbD>gI;^<CW>HU8<K)A\*DS/BJ1KI5OV1@V4R_@Wf-3E#7H-GX;U^<[l=Sh/,!#"6[*aS1vo<s~Jg^P„PTqSL{U?ieDgeYh_TshUoy[T‚^rt]x{QntRsrPHt`BXUfV8cg/^oGagD\C2hD8cP@fXFx_OdyMoiKvWAJjMGCO8A*:*%Y-kY$na5^NNˆNG{KU_7yY4JvBiWKtZ0UZ<wL;s_5Q…KDkSHB*??#JH/e\)Wl2SiCTZ;W`CBZCAb?J_3PX-a\2fX:–m?G®V-K]H3$S]'_l:Wy:Wk7Vd8ZA6ŠU2KžfIZWHX7GhA3e;)H.-+$V+;s+7L>1V+EL(“B"”{/BئRksnf9]‰H_‡N „KUÀsKf`K^3<M.3H7II"Za2Ki;VT-R_BZU5WN+NT8aK-xj4c•TeYBvKPRA^y<C†M]\4qg.Pm9O`>Zl8h‚F[‘_JgL>L4IJ$Vf*^[7xDz’`c~S]uJRyBBO&9M+EO"IV-O`;]y:xyJE}Oˆ>4ÂBU¡fGo_5I);H);P/KN#€z<<¤W5O5EL K[+dd/5N@V/gb.MtHG]<Nl.AmDp[1Œ…H]z`pT`c1PpB€ŠFrŸRtuHpEƒ˜g¥uy˜_zFywE€Sq˜o˜zOÉ´mz·ƒ™€S}±{]ŽPwo@{uHzvV“WFw{UmzN`|LSƒ7po;vŒS€R—Z¯®…‰Í§T~f+[*2(ED.F*J,X4g?¥£OÿÏ}ƒÿêt}Va]7Sg=e‰P‚·f‰Æv˜®v¬°tµ¢v‚½³y¥É—€\€Qn{RtD²•jÖÛ¬ÄΣ°Ì ªÌŸ¾‹tµ…È„a¥´‡ÿäžÿÿ꣌pdM]R1…DbyQ`h6ŒnMžˆT»X£šƒ†_®ŽVÿÂ|³ë¼‚¹u‚¢Wt‹Mw–Fƒ£XªÉzÌÇuªÂwwÊ™W¶‚L‘OSœ_lH[g@{nGŸ®M¿½ga¨a_w0Wa0__,r_)sl;|I|ªUoµnžd¡¬v£ÇŒ¥Òޣę¹……»}š˜]qb>vb?^‰\Gt?Wl4‹nC¬¡i~¬y|˜Tž®[œR¦E²¬a›’T…¬eyˆPwcNzoY“¥pª˜oÎÁ‘„mf{J`b8erFo‡Lžt„ÂŒ±Ù§¾ñ±Û‘ªŸjÎφÅí î…ÈÄŒ¡üœRj@Y_7t„PsŽTbIZ…G{ŽLpŽArw<ij<fwBl‡@z‹F’™X…“TYy7Ia-Pg)gt8t}Cnt7d…;wŠAªxUo›^sŠN”†`Xjs=OG1pVL¥œzµ·v£’bc™…c ‡XŠxE‰~NvqIaVB„mF‡e@ pP†‹e›xÿ¾ÎiyŒQ…M‰WˆN”sHžU€tHs]8ƒ^E—dPžqV¤m`©_•I‰vCtI…‚W‘e§›n¢šd‘Te’RpŒ`…£gr›[h[†žn¯Â˜ÊاÍÞ¡žÑ~{¡S^d@FN.6C*MM9V_<UP1YK6dPGpaVyf}oeŠp]œzf—£y¿Š¥Å|¤™q–‚`viGUeBP€I=k=VoX¡_u‹Hdy>n‚Dx‡Iuƒ>kr6sm:`s@g…Imv?ci:VZ2TU.[[A{€NxJ`y=^_6]Y?rcVt‚ScnA[S1OQ.]`?[iEZdBM_G[k@Tc8^T<xkM…™s™Â}„—OWY&6?"3=",;"2;->R>WfU€†Y^q=ZtA^{=Rj2A\7IxJIWZiz«tu˜km‘cs‰hzƒRdpM[u]s’iobp‰Wo–g{ªijŽLNkDOc8Pa3Ga0<]-8N*1H.;U-DS2PT7[[=RW8?]>Lc6R_7Wb9bn5!-+(&?(!U6$Q=+iF2mp;XƒVBlMa=E|:8ˆJ5NLJ\SHPL]Q8nN5€cBˆNy]kŽiM†q5[QPK;DK/LD0LW4gW5cQ7^eAlgG[eDEeJhC9‹L/Sl?EII&G12$A'Y=!\V*k]1bf4alLj€Kz…B]uOUTEGL?XF1ZP*zg5nh57bQDH?BG%BQ-CV2PO*Ac/BKB>P6FY6DW8E_<P\/Gb4OY8uZ8bŒ7>ž\YP?{l/R‚?F`JTT,9N)MA2†a&;—\BMK`T.Rg=?y[3j?)K;?6+UN(UxAEr70X1@@&•>q‘9\ÀFm\NYByO.žŠ=NÇyQmWAe>DQ;BT1[g/hu;L\:uJ3Va<5MHC=*NR%U= _]8|u2Y SE‘`W[>hw;K…TAZ6dS3U|:]}Lq…Pf‚DVpQG[9L[/ZP'}S(tzVž‘H[‘agRM€PJƒI?q>2Q,I<"Xj1jˆAj•SEkT6J.jR&†±>b³o;ƒ[<K+;G%EU+GP*y`(F¯U:W7:R&=H!kN#Z—GIeJBR.=O(@R(X_.PmAQZ5rd:dŠDWŠgNsFZf4w};F{DPQ.hm1Œ›_„®m‘Ž[pO„}?—™O²aÊoØÇŠ–Ï™©rrÅyb¦qm{H‡{@ƒx]¿vP…}Pb]?QU.W\6{xAŽPq¥u“`˜¶l°Ã‹Zº•A~[:M*IN%@X+I;)hf1ЬS©ÖˆäÄ•ø¨`x\VG,}U9¥¤b‘¦kfzP_Y8¶P…Ä–rœo©¡c»Œ”³Š™¬y†”]ƒQµŽb«½yœ°v‡Us`DØUC“§„¡—cÿØ–ÿÿ韓€‰{^guOvn6}Oœ†kuXÎ|S¦ˆY°‡i®ŠgrƒQ…G·˜YÌÛ¤Ô“s£j T~ŽN–NÄ£cŒm}WJ£ƒ]œ·ft¤\’•M]‹Pz_6‹yO}‚B™¥`Z’M^j%jw>er:]k:]r/‘?•¡\¬Tˆ¨c–°l¨½u”¿{ƒ©f‡d’§e€žTLŽSQI*s^;f;iƒHˆ‚RšU‡™X¬£j£Ä€šb’Y¨¥c¡X‚ŸZ–¯b†Pv{M|wM½~^ÌÓ£wœZgrD\V/xmA_s<Ž|Rðû×üÿáÃ툺untA‡mBœ¯uÛã ÈäŸÚÿ¸Üh‘UsRy¦UŠ©_‚šRkz@cq/la9˜rO•–U”•MiElv8e~GLt??](Q](Sj'jl7`}Ash:žŒS’„W̧–ÅŽ‚¯u{£l…“l›‹l©”…¸¸ï¯éÝ¡ÍÿŸ¡ºn”˜Y{šI…KxwFq\@lcDyh=‰dJÇfº¤nÑ e„Ilk?y{S“T—ŒT}˜ZsTw€Gcp?Wb?q\F˜gVŒ{bzƒ]rtMne?jc6ztD™Vƒ‚R‡‡Kt‡Ci…Hs}P~zQ£uW¢‡b™¢z‘«~©Ä•¹×¢ªÎƒt–Pei@]X7KQ5BO2?L-@@,GB2hWLŠ|g°‹k¸ƒ`›_‹ZŒf¨¨zÓ¾ƒ·fšˆh¤g…{Y‰“gŠŸ`u„ZŒ—`pCj‚Gx„Cw{Drq9_n1Zn<i|O|…DrnAbd?`dCfm?€N‚yCcD†]=fe8Ri?`mNnwLhp9KR,EF5O_?ioCckAZnIhuGfk<Xf>PyGl‹c’»|‰·ZFn>:D8DP9IN6BL@\kd‘q¢X€p9\X:arCZ…CMvJltW€‡^sb‚†_xƒUi{N]oCSdDQbNYw[Oz`X}V[ƒJeQs}O~~I]mEL[6HS0Dc4Jf>Jf>U_7Sc1CZ4J^8VdCijS‚~T|DYj4PU3NZ2C:$=A3A73L;.MB2`=5UG6iT@VfK2mH?QCJ7;R13?54:941D,>7"V3(<*˜fCX’bFvvMHM?e<FN@YH.Sd5SjCT_E\WAXcBBcAHQ@^K3sL*XR@UC8<Y586*G1"VA,N]?lO1aO']nEqa<g?Q€YMfC;O6V?)Q>%UZ,He0@E9=F/<N.:I+6D&QM'HV(>fHWU>Uj<:\?NL6oY#Rw9TrNVeGY<aœ;kˆRTyH=tIDK2AI#=9 ZD)|t5G‚^HP<UR:mH3grPZ_?@hDMa=RmANg>Ct6Dn:5V,`V-¤m2\·^D‡E\C_t?Ÿ™KqÁt^—TORLvLUV=p{9h_Cld=b]ETO64P<<<(?T$6Q)HH(nj*mŽCd{TYUcŠPN…HQc4d{GrŠIb’aUƒZVq>Qw?>Z<FR2Wp?‰‹@˜®\„ÍcˆÒx„ÅfŽš_‹¶g`Î~E›piwKi–PnŠQIkRAW6GR+k]6²¢Ddç·9l-HA?9 6L#9O#rW#U®L9|[7O*6G!vg0]°X8oQIS&?[4FY0\o26h7RV1F`?Z8Y pUMGV`4Qd-Hf6Vh-rx;zŸh_ŒXZsEoPt“ZŠc§ŒYÒÍ{ÿ螘ÿÀ}Šq¸w@ŠÙ“kŽj€]Œ‘`ŠŒa{oCwrIr‚P€±r€ÈŽ{Ňxxd~˜k–Ê‹Ë“Š½€n»ˆX¥€]gFcr0]sDt„=µ˜N§ÒŠü™hÔþ¼lé¸`ˆTŠah{WyHR“nQˆX‹]ŽÇ‡ˆ»~¢±zÁwiÏ䱯³žxŒj¥‚N»¹³¬ƒ}Î…WaHqa6¨‡Zˆ”p÷—Tÿù»ÕÀ²ÍŸŸÀm~Wˆ{GhLoTdMu‡Y‚pJŠ^KŸzC†Ž`~”\¢ŽN³§nªºz®q|—T²•Pv{O•‚Rym[„gW¦¿†Ó‚r¸np¬bl™Rzš\m˜Xs};‘¶{g›TOk0sy8|†C~NiˆPr‘Fƒ’B®W™í‹ˆªrš°p‘Àt‚®j…¯itŒToƒLh~>bV4u]Cow@ˆˆIt“Tz…Ož•c´Èw¨¤až´p¥¯i—eˆ‘]”˜d™Ä{¥®|§›m ‰qœ¯yè礙èŽsZRc6\X,CA&P=ÿ×´îÿÎÎüªÃÿ«qÿŠewDÿ¼¡ÿÿÞÆÿÃø”˜¦_µŸj€©jƒž\€‘=}=a]/Vj8OK.m€JkAJb3bH)WZ5j€LSq?=^0De/Cb*Rk5p–U‰¢g”ˆSŠRvvE \?“ƒjg`@•^U¢„k©‡dÒ}eƈpó•ŽÜÇ—¼Çpœ¿_“©YrŽP|rM|jQŠXx†Y“’cŸŒl¼ŒgµŒ[”}K|c:vmH‚|Y‚Y„™a{‚QWb>SI7lUGƒdOŠgUƒ†gk}•eyŒTwuLmpKwƒQ‰{LfDfAg†CjmI‘ŽW~”Y¡`”®t“È…œ¼Œ¼É£ºÝ™œÌtqœYj|LsyI\sE_kMQtEMV<]pPuƒe•b•{KuM„‡P„€Q˜‡g®‹e¡€R |\³‚bš}W}gY—~f|‘[‰†^~Y€–]ˆŠUwGl{FZ|Dg}Vx‰Z…{MqsB[p;V`?ib<re7f\5JK,>C1T^Ko”_lžZn˜M[{<^`@^bCSkBXpQ‚Sg…JZn>caG^wMdOc—b„±Œ£ÎФ»pƒˆNotPijPvjg¨‚±¬n‡BQT+7;$DN.Zj8[w?Ql5F\0H[0HY3Mc;Me=OlBNfN]rbjŠrp zq§u‚¢\qŒG_nG^mTdyW_uJOh:MaEUgDUU=NY=R_6Le8GdARhNXuO_cHg[?hU0CT.BZ>HL:T@=iL7dW=MQDA;;g42LA7S=0pP6JoH2gH3>H215>)'9(83">6"M3#ŒC,\|H?}mZW\?j@TYEVV4Um?U`LQYB\\<V\>B^=<[@TL*\N'_S6bT4PT8YJ:uQ5b\?I`CFX?eP+eg0ˆi?c}CNe[NK6?d34V1I9,JZ&;@2O8)OE$>T7=I::F/EP.RM-Lj2MXE&T9+4+H4qP"~o/g›VV›kauS}Id–MVvU<p?7a>>Q-X< †J%cƒB@o[>G9F`=ncEAvECNACc1RQ<Ez5Me>ji=t™L]–JpˆJo~QxAo²SgšqŠ›_—¾elÝv¥b‡—PT™ccuY?zC=E:W?+Of7XX=<^=BN;PI5KO0OX4fi0^„CTyJzeGj©VX¦or…Id‘Vg€W_YQ|TZx@^€DlS’¡W’¯f–¯k®°cžÅtm‘^j‚Dj‡P€€A™P©¢a™Ý„~ëJ·‹IfRZ`8Š–Ex¤bÈŠPhá™Iƒb3jS:Q17Q4?Q$~V"n˜GF—Z;dMZi6ƒŒJw˜YO“YMrBHT5Q`0Jn:J\2Jm8SZ9}h;Y§m<r]>J<R!OK!`l9ŒMy˜h‚[’Ž[–|X¥™g–Ù ÀãœÄè©´×™wtTf9‚w4ƒ™J`“smX6|pGvnKÚoGš`}¤m‚¤n€¨i€¨g†£v r’¼ˆ‰Ç—½„œœu“¿u¸¢ušcvJ•M•¬n}WÀ«wÿà–¯±–žºzf™wphF¾¦l’Ò™¥Ð©Ì¸£|´ôªÒ¥€À©—óÈ ¦ß¦‚}aÛJ¼¤j´¥f§å³Žxc„ÒŠ¶ÍŽ££qh €ZÀkN£pS~i:`Z-‰k=šbAvI7u];‚wA…wE†{A€zA|w8|x=ΘRÃ˘‘³‡¦tp“oƒQˆmKŽczubœ|cÎΔ»Þ™³õ²–Þˆ’´s˜¹ud“M‚g7–¨f‹¦Ye‚Pr„FwƒIxQ}ªiwœX}…@بvËÿ¶£Ù}ɉ Åvžê™’Öy˜`u…TlJd^GŒzT‚T¢”]ƒ’`•«V›©X¡g¬¯x ²q–¾i½°lº¥h¨¯q±¼ƒ³·y³‰gã¡”ÿÿÝÚ뮞Ù~l–C\z3EZ*WH.^{<¬¶_Ù׃µã–µã†Âë€ë{øÊÿÿÆöÿ§ÄÿŸ}áw¤G’³Rf£KVq7fq:c‘Bcy;df:››\˜ÙzuÏhW}Ae…[gzOZS4O[7Np;Hn;H_&rJÏÀ†´Ä‚ªsˆªro e§²xÑÌ…t“VªoRÿŪæÓœÆºŠ¹ß‚ÿß•§ÆuœRsyIy‡T}N—uN°zW¬†h™™p½R±lY}\šxOlS7\UEahCsgQކ\ysCod:…`JœzWŽYG„QP‘`“‘Z¥|žÊ}z¥Q‡L†Rˆ‘Mk~;^t;[l8ywQ“§o†¸cx¢\ƒ©g¯¶‡¨ÔŽ®ÐœÉ諸𕕸c£dˆ¯o½jƒ½}—Àut¢a—ª‡Èè™Áó†¤ëyŒÍw‘Ú}n«ZxtJmS™|P¦\®ˆZ”{Kv^T†…f£œhŠSŽW‘ªl“¬ro¤ed“Po]‹—Z‘„T‰sK‚qDfiBceTr„f]†MO^7GN4DI8dtd°w‹¹exœRr–Te„OqxN_mAecH~jQ˜ƒWe}OlwVvb‚†ct¤k¸vŸ°}¹´iŒSƒ‚kvšÄ¥~¾žeˆƒRetFHe4AW%?Z(FZ2JW3=C'87)>:)CH1Gd?S~WWfr›{z±‰’¿‚Çr…¦_zVv…Tk|bxj‘˜m“ŽSh„UnyX{{L{xJ{|FquDXnWny”Ÿk‡›Tdv=Ga2E[:U`MO8;Z4-XB2V?8AC3M72D>'B@2I43U>*lE4Xm=9zM-^O)=J%435))E.H?&_I'jFqxR`jLj\@cKQU3UT*DX>MF9K^4SJ2HQ54T7d=-c])`gB\^9yWB…N<zUAWLIQL<aW9{i9lt@rpPmeA-wQ2:BE/@@ XH.BK&6B2F@%x;#Wd9BbM8I17@-F7(BA!9P9.B*(='<6!SJ!e\&…f0k‰Mh`g…MU†OBwB]R2Fx7@iFIS/hX(\m7VeO\Z<|rFNxIQeQOy?:dEXG2Tm-[]:lr6t¡T‚š\€UFsG^X0uU,c›Q—qLš¼[…ª|z–bŒ¤Ykµda£iJ{MSpD\wIfM[oAwhFsƒUt`MwPKKJhZ.^‡9EpQse;ŽFv©]k¥wcƒ^Z’V\UiŒM—TŒ©RlÁsqa†ž]›“SŽ©V‰zSxDtwBrŽIi“O`‡HqxDŽ=¤‡D–‘Rx݆¤Ê‡d«oT_G®p<iÒy]ˆ_\‡_QsKHlA<W8cR$Z”Dw‡Lp¤uWƒ`ID7WP$Xw@`bAK_2Qm1=s5TX1Xƒ?Bi;yo3o`EŒRQdDIb.GU0bj4‚—Zk†\XzKE\=m~IÂÑ…ÍþÉ·ô¸€¼‹^xTHj:ag-Zw@™„LXÐvx©gzÏwnÃ||_zY:h„JfšMu›U€´b‚¿zz¬‡¥p}¨o—cw}Cµ§R ²s¸ly•g›‹Xk[sQA³zIÃÆ}޼}€•Xr”Q–ŠNʯ~×Üš—ÈkWNí_¤ÿÀn‰mðO>ÿškãÿÝzÃy›FkŽQÉŠX¼á§œ”tÿ~^ÿâÀˆÇš«“]Фi‚‚N~n@[LuwCnŠU€}UjƒXdwH`„Ap‡L‚–Vv¤Ou†Ac‡Pžy:÷·‰œÇªŸ™iÿ¯xËË¥ÀÕ©¦v~{Z™~YÎãŸÍú¤ºë—ªÐŽÂr€—ZJrDt„K~µltN…mFk‰C‰ªp¨¼ƒ¥Ä™u£cu‰;ÌšTêèÑñžå橣ᶱ¯k¨·yƒ©y}¶~sœg‡¯q£±vŒj–ªmª»y¸ê“žØo°Ái±Ñ†ŸÕ‡‡§e€[†‰Z®²kª«m¸¹vÍ—wÿ©–ÿùƖʼn…ŒQYˆAUl*e}/`l6m˜PšÎu¶ß¬ÎŒ¤±o©¼r¿Ôiÿ´lÿÁ…÷ÙÆíŠ¨¹_ŒµXi’ItˆG\|8]}:oxJ„~J‹Q‹¨Y ¯o€™aixG^pPPY4Yl;YwC\u<Ms6x‹N¥–`£“f«ˆc¾„Vª¬zÁÍ•óÚÿË…š¥|ÿžŠéusX”ªlȶ€ÿàŒ¢¯jzŒYˆtLtfAaSA…YF’]J\K}nLgN‘mVunRYdHnfPl{K]f:bG}Imw9hs>“†R…ŒOwY€ŒWto:uRC‰rX„œ]¤Zw™Xˆ—Ti€@kˆIc{HUU8vd?…ŒJr…AkC€]¡·l§±p¾¶‹ÈÞ› ¿_pƒRžg§ÈÕê“Êû™±ù…–Ý{»ßŒ´ð‹´ð‚¸ß¢Ç륲ܔ\‰kW˜zcŒ~V˜|Uša‰xk¤£›¶l‚‰Pdr@pnV€œhŒ¤q¬mx¦rйk‰¤c’RrŠRl~[‡}³È¬©Ë‚sN_[=ZPDdng˜ºŒÄmsœah‹Q\oA]W8dY=€`Q“oW]…€U}kCwdR|yd‡¡kˆ£[tpQ…x^ŠfŒÔΤۺƒ¿bš|Tc«“eˆŸRV‡6Dm-CZ.JZ2Kd/?J"*5-63Id\a˜nr¦}Š”ÅŸ°Ù©¹áŒ˜Å{¯}ŽÀ~z®so‘d„‡Y~xKppMm€Ph}NisF`d=Sl8UeOfxhzˆhw~UowUbxFNjDWjO80/8.#@6*>;.@:+Y:0S@1DF7C82a<3g@3mO:–aGeŒ]B’m9om2U`4E?EJ6aN.bd8}^FX„I=zj>GF@L0BG%FQ*HY71U;6A5A@(<V/n?0Uc/KnG]`@iaAZLEM75[;/_?9gI7n^:ioD_mHŒO6^e0#k_4*2=0BJ'HA'@N'XQ0V1R€U7QS::6/M+07/K28_))?>17'?:$4R'CB%ZH ZO,\`4_vBS‹EIˆNH^>Tj:B€DE`DZb+Oq5bVD„u<JˆWbND|i8LwU?\FF]4Lg-Pu7Œe)€´QMœbFZJEP3E],lQ/ir7‰’[kÉ_QmmZ7qm;y„F\«^|‹^~€HsyY[zZorH‘i<x]MjYB;V2D<(`W$O„;NdGak:fˆI€ŽKw™Qq¤siŽXdrDfmBkrBso;†}K›°d˜«`m©[swEWsCNS.fg,p‹?Q}RLV3\d.ZnCAf<ZN;°V,…¿e`¦oO¯n”xYt»[b‹d`ˆS^{QMK7iLiY(p I‡}VTŒW7ZE7H3_T#T˜J:fGM])Od'Dg.P_1P[1Cx3rg4a^m‹Fc¢PQHRq>nz@XdcqPdV¶xÅè¡Í𼡶“} j_„KW…LJc>_b)h|=¨‚O¨ÚŒŒì•Ì…œÌvoØ•f`d‹Hv´^ˆ´d˜»n£Éš×’‡¹pˆZ‚À[uÙw³c¸`”Ås|™oqoEkU=”rRÄvµ¹m¥ËzЧy‹›i™“f™–j›cO‹qbeŒw±{œÑœ‡‹`‚zTØŠAÿ¾krÄ€cl6tW-ò¤d¹ä®náxTÖÑ¢‰ŒRˆ«pŒže}•Pl“O†–U¯±r¡À‰Â¤‰–yy\¬p¬·u§–l–ˆ_¥®f´Ãˆhž^ÿŠFÌ¡z™žwÄ®sÔÓ‡®Éqx~LkS¨‚u¼Â…ÇψšÉy™—_nqNTV+ix;““]w©eˆ‰T„ŠDˆ¬bͶn´ÐàÖ²ˆÑ”r‘Gƒ@—£Q®a®•bš›k{jwŽJ£¡_¨Ë•™Ãˆ½³s›Âx¶¥X¿Ì|ÑÒ{÷óŒ¾ù–°õ’¶é¥Ô¤žl«“s—¯³¬nšb¶¢b¡–[™l±´w§†U„‡Yr›XVr9bx/]j6yV8‹qL¢¥g’¦ks[v~H„™Pi–CVi0™xZ²Ìx°RºQz¡amOˆ™]Èi˜Èq™R{z<{ˆRi|E~]=ƒ}VwtQjX8nsCy|St‹\OŒXP_Cˆi¢–a‹„V”pRˆ{Zä´‹ïïš×¾sÔœdÿ¬x鲚\dV¨›x§Éˆ§Æu•—[»hUž}^rx\wne…vn™€s˜ˆsƒd˜|V”€YzwOy{TŠ|drSZ_?^oFpnJ™€bu `„™g“¡w‹ÃpyšJz…;^{7quEp‰K}’J€Hvw@su<f€M{UW|>;G!?H#>R#@R%Cf+Z`1ho9e„O–©r™®^p‘L„›o®Ü•ÑÿËÿ®Áõ“¼ãŒ®Ì~¿æ‡¶ì‰¬Ñ—ÀߪËí–™Èqƒ”d¡‹q°˜o”…\œ‚d•“z©º}–±[ky=HK'C?0kkQwŠ^y–h‘wž·vš¢n¦e¤f•¹q’Æ…±ÐŒ®É}°`e{AelS„¦†ªìŸ¡Ñ}ƒ°ck’Kcg;VV;`[>e`?g`CbiQtpLloCgaNuaq•[zqV‡v[“‚eŸ‹xϳŽÂ¸{™‘^‚|[ˆy`œcŒ´[sŸPW‘CS}AZ†>e•Gd–BCk/6Z8InSxŠs £t™«Œª€™²µŽ–·Ž½›©È˜¬Ç§dt~Poq=Ve;YlLx‚U{ˆLet=LZBOWUst„™kt|QlnM_mFKdG\oN>14\:0[P4UR=[R7RI9R>5JD7N?3H@2^G2\T4nQ6…J>‘nYn•jM¤‹TNu`NcVaTFjM3_n>GlT:UK3F;[C3fa&]‚QKZTLe?\cAPkDm`Kz`6{‘S~ŠjQ…bXV^ƒA:p[;caRc`OacKViKAbBYE-^L%0R@=;4WO,Jw?HiOSj@rVBµkFY uD\sPT8Hp;5T>GJ)JI"1^>0E7=;*2I);=*BFJD&bT*\W.jb1U‚>?‘TR`QXh?G‡S\jLN€Dy`@Ww>POHuS5m…L8{`PG8M^-cl0ZD€†HvœUKœ_Fe@Di;Ea9Ha2wd8¦£GkêDˆ}HM7Xl9oyAt„Lj™Md›YsRV}LfySGqF<L?L>$CT$?c2XS,G€/QoE_yFoŒR„ªV޼g]¦k<bJI0EQ$DH)_g)އHg‡SZiBed)_ˆ7HFWl8r{6T€R:jDPX/Sd3GS;NM+:d4…a.k˜Jšn@¤ŸQ‘ãhÏ•Xwi`zAWoNN{=OlB„7S§]NiCBj29H:>J%lf9U£OFxR>d2CK#K[%>]4=Q+[V%ru.PqN\W1ec7cj=Xh<|Gy½wŒÂƒ´ß¢È䞺—h€d”kGowZgoHce@Gr7V[$\`4ša7²pM£²h~¾…”¬hŠÌyo®p…»l’ÒsƒÇp‹½o˜Ày›Æ}¥Ò‹´Ã|Ú肳⇔¬c¦ª`¡ÿªã§ˆfKiJ§‚V„¸u °l’¸x’–q–ŒUpšuDM?b7'žY<§—ÂÜšn¾‰yˆ@oigUŸ™Xk´Zf‡?j†@ô‚R®›e§¢o Ò›uƒPqwMònL•ž€€‘dŠŽY™˜dÉÁ†•¤„«„]–¯y¬¯r¬Ó‘¤I©u@™‚N£—n¾”^eƒS|=¢•NŽ¡q —_š°ej†JƒW@¼w^·•r›£s‘¶wyŠVScA3<P_,f‚?h€=m‘My|AexDÉ¢p¯ç¢ÉåÞÞš¤Ð†}£Rl=mŽ<‡JUW4[k9pkFVX5k\2™@‰™Xn–g}—a‹±e¤ÈŒÈØŠìò‘àÿÑê“·ö£¡×‚±¶Ä½Š§Ð‡›µlž˜mŸº€|¢XŸ‡`t›ZuaGšOq‡GUR3mqNUsHWJ29A"ƒhBºdf P]…HNxDOj3_t;¤§v§Üh–Dk€4e‹9b†2i‹/„†<ž²Zo´Yb‘IyŠI~’O†vT‘—feqCjM9}‰bЧly’_•£|œÏœ©¤z†S|yVˆ§k¦Ã’´ÿ¸Çÿ¬µï°Êbª¢_Ö‡Qÿ«€——^„\±Âx°Çw’Xn]‹‹n²žÒ·‡¨•^¸{Z̓gº‘d{yU˜œ_–]{pUp[†kY‰cIˆzVˆ™\£€SÛ_°¬cÙ§l¯¯t„¤UgvGszG\z8ks>b‚8[t6_i;Vo:il@jjCYh0EN&>W'>a,>\,@]*7d!6ULf*y“Kš¹[Sp`¥Ä‚¿×”Ååš Ù{—¯h}™[„žo¯¿ˆ«ß¥Âß²Ã墯ӔÀ‚²È•Äɉ®¹c™¢i«Ä€³Û„Œ²Zp–I\‘7;d,>P8bwRoŸo‘±˜ªd{”`r„OepEibH‘’a¤Çx•Äu‘´pl™S\~Iƒ•wºÏ¢Æ}Žªpz•ax€NnsFqrEtoEppLi}Sn‚T{wCipLp†^žªpŽ¥`€†Q{„_‹‰\|Ždˆ¤w‘¬gy›Zr–Uo’Km€L|ƒS˜Wq’Sj‘Qk•QfœSmšIbŒ@Ss>ZlKp~X‚‹eƒ–l{˜s£yЧ~¨x¤›mœn•}_‹yY{xGpsEXk:Pl?]pF`oEdkKcoN`mN…r[¬xVrCeb6Q^:KSGL]SVF7}S5eW;qK>PJ=CG8I81Z@0BD88><*-1V,'OC!V4.ŠB,ºqB•±k}£Žqz~RqZKVIeY@FhHFKH?V41[7aD;Šk6KžQ}^YxCqƒRowSzcK˜_E™’S‡“l}‹n|tjTJ¡Z>…rJyp[[eSJYS9V@HP'U]-Pe>tY<s>h—Gj§p}X¼Œ]ÑŸ\L²SZxhi><xC3I>EL"VM C]-ETFAc><V6=R1?E'G?'>S.:S*DK(eD&hx4Q\a^\_ƒPesSP‘TNiIAU;E;'„O"d}GRsPDc8F[<q^'o›6[‹YnpK[‹@V‚XYo;b„S]{DlfJ²„Fgå€?ŠSP.Zm4_pEVlEgX<r‡9W•UX`Y^X7DvI8N3=M'ER!K`'`s2k?fŽNk€M{’Bx¡ReŒ^``DIX29j5A@#M]+‹†Ts²QHŠSF[1A[#\])[y4`x9i{<M?M]6Hh64J1AA#WW3VsCi…FZqIPvIpO2³h0 ¹cbÍ€]ŽR\‹BW{0Z~3j‡1a~4Fz>=nA2P=BL(qa=lŸZI_9X1?K&=[5`F$O‚<AS:TP-.]&F<%ae-Lf7fl:‡`¨®{Ô×–¶Ø£€À€] e`‡Ui7[[LQZ<sHOMNc-bR.no@lcE¶jGvÖ–…zUz—Y¥aŠÓxŠÏ€…µrša„ºm’±r ÆxŽh¶ª^yÒ|ƒ‰R†Sÿ€K”ÿêRxkP-¢˜ZŠÒ†–k¬d_yH^]4¥=+e”w_cHže<¾”]Ìï£l¦|”zC¤…b†Ž_—¼xf‚R„ˆSp¨ex”Lpt6ý…P‡—_uH¬¡o}sxpW€J×fäÇÝÍœƒ—k‰€C“†O±žh¾¼n¾xT‡Gli0³z7†¢Sg„?uq5Œ„H¦‡[˜m‡—gZJ{Š[›šgb¬Œa„œlO^BBD/J^+[u:Ov9f|3}¨hg¢cw„EØš^Ãqò§mž´zŒ•V’†Lh;]|1}‹F7p=P`3Uo?L†CMšBf”>v•A¶•W¸Ñ§½ÜåŸïè–â¹pÍ ]±¦fºÁu£»iÚž`¾¬m~“VƒV£¬rÏÔ€y®`¯ˆR’™j‘”s—Ÿm¶…_˜b{vDa@OjFC^>:L,€W=ˆ®i¿tw¿…„¹}‰ÌƒÒÿª©ú“a˜P\”BY™:Q{.V…-Z€/›‹V›Îw‡¶iš¥a”§`›²p¿Î~Œ¯msž}y–k”µœÚáéĽrsjAmI2•lS¼ÓŸËøÁÄþ²¸ÿ®§í‚ÀÂrŸ˜U¨uOÁŠQ¦»d¤Ö{Ã{£¥s²»…¿¼~°¿|¤f“sI¦sW¤i›ŒeƒŽ\yˆV¸™b¢’^—•i‡§l‰¨cŒ[—”j‰¨W¢yU¥‡\„zP¿ƒhÒ´o‰œNdq3]f5^q<]t;^q6]x4cv6Zi7BO(WL7V`;Ei4Bl/C[,FY+Kj,?n)Cb!Rs't‹7§Bp¢F—\Ÿ®xªÉŸ£Ù…·’Ä’œÛ£¢í¤«é´ä²é§±Û¥Ð¤Ï„¾‚˜¹cz°a–¸¨Ì}œÆl}½_yµWX•BWŠ?W~X¤t’¿z‰±tŠ»|€Åi]–RiƒOp†^©j”¾r Ô‹ŸÎ~µgj©v•‰–Ç‚†»}i† f—Sq‡Cd€Kf{Ps{\‘Zh~GdxSˆ•q®µv™°awšXo’HqGq‚Wƒ—b®TrœUt†Ljr@]^7XhLpŠ`|¡^o¤ht«fq¦Yg˜N[v6GJ-DD@YmTb}or–‚¦†ˆ·ƒ„©x~^xNxf?q\=UG3FJ3IX8Jb7Nc?PcFZnCSoNXsPRg=XZ;KY?M^;K[6DW>JZOUqgc]:k]BhR?[N;_=3UF5_A6bF<RZB2KD-;7F<&.P+?;,YD*†L6‡bFWŠ_N‚k]\Y`XKRiAAaODDFUI7SZ/U^>zeAxv?€pPtdI”jJvGµhU¿uM›‚WŠ•vq„icXXnL@‚T=…iB`iI[eLBSMGL<XW.jZ6U^>hS<…]7¡yC ª^å•x|€u]JfhKt„WU“YHeVBP1JQ+]c&dr4g‡LdŒY[‹UP‡SL|ILdHGc@M_4>m>GX=qW4_‚CZŽeWqXkwVYMBƒW:kN\X6p}88ZHF9.BD#CT%dZ(\~5MhIa]<uj5S¡Hnw^f’TY€SrxP¶°Vgö’?Ž”DX5HX0SR.<c:T^9qc4h„4<ŒTTFKKa4If=>e3GP-Rj._x6g‚>J…A_d?x3€}M^ˆYC{KFpGCg;hn7§Jz¸s{“ZTˆG?i6Pl4Z‹GJ†]RgCdc0U{8R–ODƒLCvHS}D]‰Lq~LS‘Re|PH—MLXDVZ1c2p—>_’4_1[†+U~'Q*^r)Rt?IuA:U=QM*w€>y¡W:œb,A.NM%8b=CQ+Sa-<Y9GZ,FrKP`,O{1]”Qx`‘¨g¥¸„†‘wqZKg‡C}rEf{QejPXf4hP.}šPq`AqNUI0ie9]O‘[E”ŒWa·€wˆM Åt¿íš¡þ”€Ø†WwTfc8œkH«xxŠd¬ˆO§ô•‹¦so“SiI±G[ÁboQ£žT~Ç€®]fˆJJX?@G)Y>&Ôc:rªˆgsMÊ_›Ø¡amXYS0zL5¢ kƒÛ–…¢l·¶kвsh”R‚’XŒ¤]ip‚ƒV¬cI•oPz…[¦ƒUÿ¥yÝÅ” ’c‚„X¬†e¯¥y»˜w†~]ª{A„‚N…¼s…Æ…pŸZnyW`ŒX–“V§§k’“b}†N†ƒZã£çÿô±Ó¼w]TO4DD*YH-Oe9\T6g˜g|§WãÄo¢é€¯S‰·tT©mTn4X`.i_.\Y1{a9j¸mŠÈyd«Xq³a~«[¥¾d¶ð‰‚ü”sÏ`ˆO¬·W¯ªfÖ´„Àz‘œkƒ–[¡‘^£Ï…ˆ¿o‘±Pk¦OX€Fˆ£t¯€©Ä„{¬_—‰U¹ƒÌ䤢ؔÏÓŠÄô¬€µjm”Y_ZBˆaN¬Å’°ÿÎvÞÔÕÿÀ±ï®Òÿ¹ëÿ³¢Ô‹t±l¶d|³eXUl‚PržU€¦\´œf±™^~†Fvp9rx>˜w_Ÿ¦l¥¦má¿|Îá”´Ïíͤӹ}lX6DG(Yi2‚©`¸ÙÈÿ¤Ëø«Í㙨½r·•YƒT¦Œ]}pEpY:¡E·®a¶‡Ù¿”»Ò–›×™—Ø”‡Ãx‚šg‚Y¢‚a¢a„ƒ_„”m…±s†¡i–Ÿn¬b›‚^ªu\žšl{RyXÃg‹\’Qz?[k?bs<bp=to@Yo=Nt2^?X{7Je.PX-YU1RT9Pd5Jo3Ee/Im4Lx3Gr,Js(Z|.eƒ1p”4Pr0lnaš³ŸÁ€ˆª{¥¿žºÜ®Ãæ¶ÅàÊë®Ä惡ⓙµz•¥nŒªi„¤Z|¨Z±aˆ¡R™›h¦Æ‡˜Ö€Îty¤Ss‘Uxžeƒ‘VzoU—‘qÉtx±Zp«c~ŽÄ‡Î‹¯ÑŠ¶Ð£Ó…‘ÎÑ”¤Ç}œ¸sޤew\z”Pu”GrR|Š]z‚c‚\hVezc‡¥v™¼u«]x^k’I`{6YcB‚xP†’TkšH]‡4@[)3M:SxZzµr‹Èz™à‚œë„Ô|w·fWG6]C4gG<^DZbTr†{‹ž ¹“™º„œ¥_„{Ek]5VD4^C<mI;X[8L`8Ja?JbDNdB[hOgtQawU`hY`lSWb8IN.CP2I^L]|u]{<auW]cQCD?K<6NB7OGGgUHhZDM_GaU>M\3DU3pR=dS<IEBU22y9-jx@GžaShiuIErYASnHA`PXd@Ib>UVF]]<ea8^RBXQ@]iIgD˜pG……Rq£ugyrw`XysK{wW†w[‰fUfrU`^XEaKMU?eQ.^P0dH8‹S3x<Ðm|Þ}I´¤C[V_R8†i/ašXX†WFtAHg=_W*rS/mhEq„RlqRŒ[G“rAb¸tjŽlibJda>^fIhoLlsOo…Lužik•Z^”\fj\]—T—YE‹Q1RE>:'@U*A\&YY#F{7EbC=T,^H+ul$j£Uhop€Y|”QÈ›Vrü”E¥³I€R:[?VN/Ur8<uKLF4v[*R‡@JvU?d=T`?Jr6\\<Wi3Wq<gs4M~9gm?nd7JX9HE/]@%Va1tvC£€K—™jl¦k`ƒU`…>l’EvCŒ—?TƒZ?VFIZ-cd'wr2r¡Tm™gz€Q{‘amªmf›Pg€JU‡RB]R?M'V].[v4[…*U}+S„,R'Sy*Wx'Sn*ExK=Z9kY4h’HˆˆA3Ÿa>E2Lf'C\%>e,LW:A]0l_2cui«u’Åx’äŸt§~jwYfL4Lq;VeDehBnzD‰}LLZM>Q-hN'€{Dt}WOjDEgJeZ8he>pmK²j@ŠÃv®w¥Ëo¼Ü…šÚ”sÂ[‹WHi@¥g;Ÿ—nŸ…jšoÕá‹påÓpO[qOwdLs€Hh™V¼¿nŸÞ~h¾yGpFU^=UnX^€XœvKÍ¥r…¤¡ºª‘Ä“|€UzŠP²žkÅæšÀɆȊ¨iˆ¶p–§a¯¿qˆÖˆ–¬m‡Ë”zˆ¯{Ÿ°y~¬{«—qŒ›t‰˜e “f²€]î{Q·‰j|Ž\muFµ¯zÄò§£È~c aQ™³u}´|¡®k£×›³æªçŸÿåŠÿÿ·îúÉkº‹K–_JM_u@U\;RG+™ƒS®w¯¥fv€DbM'{L_sLwh0z£Sp~?^y5]C½…FÜí‘t²XUz0od1ÆŸeÈ¨[k„Axw6¿¤Tÿÿ¿ÿÿüÿÿææò¥£[©¢]Æ¿ƒ‹É‰—^™ç¤²ß¦¢½œ¼|z¥cu¯pÀ˜À쪙»€½×žÍÿªìŽ®Áqw£h‡¬qïÎÿý©áê…ÈÉ‚èþ½ÐÿÉîÿÑËÿ¸¡à–˜Ó’“Ò•Ò…•Ïr‡´\—‚\¥{Y‡tBo[6bf:`f:qh=wvCdxF_n=iB€Iv~FŒtKˆvFGQ%\n1lŠ;ž†Fœ~H•zOk\5VM.VlAaƒMmŒK’}B‘tN_c>e^7£zK»x²hk‹K Œa®u¹¯~ÑМ¾ÊŠ©¬vŽb’—o‡¨|£À˜ŸÌ•¦©z…^‰jU€pM†iMŒQyyCoIš}Ku‰MvwJw|MxxFƒyHwx?mj8lsJx’NVŠAWl3Om3JO,47#54'HH2HS/NS0Vi?]CI‰5Uƒ6c€1fˆ0L|0D[KŠž€³yŠ«…ŸÓ®ºä¥µÒŠª»uªv¬ºt§²l¬b{ªc„cs›PnHvžVgŽB^~T‰žd®Ãr°È¦ÀfzžQoRj€=BH4Xe^ƒ™}ˆ´f}¯pºÈ‰˜Äz¯a}œX «r±Ø£ÛˆœÄmzžWq„Tl~RrŽKq‘OwŸ_~[~ˆU}‹[nŽZiŠ`¤€™´s…Ÿc|ž\rŒG\t4Lg/Ue;hxKvƒFl–E_ƒ7LuIg{όߨé™ÉÿÊÿ²³ù¢Ö‘q´†”¼su¡@7E/MGJvxsŸš}«šs™Z~W=fS8JL:DO7TM8k\8Yh7Td:[a?V\8K`DUgU^ybdvZguRZb?@O-8O8?VDKm`h|CapY>RN_53hd1h{Lc‡\^yWkYKX„IH\JUI4€N1i_2,ED/$0* O$Œ2!e€>8“dG`ghSHa]=u\H~qCWrOBb[VRBa_8duEnrQkŽlo…i“ g–“er–nprd…UO¢]HšnP€{a‚c\{ZI„lKJmGOYN\W*CI5P77ƒ>*¡a7Še¥~u`ÇjFš|dSNk>TF]}=bƒGK‡\Oe=eP+c[6Ub>DpTRW<G+ŽX/_¥RFtLdYKtGPUF\c@r_=vV}–]]•gtri—ŽMv¨iAyW=J.LN(?l-GY)^i(?rALK48]/=A"pW"~†?r¥oc–h}‹I;^ ö”Œº©g›eK‰d[j8dw55|U2=3b@"W6[m;NwJOpQb`6Vt?P\?W[6\s7e}/\y?Md9HM&K\/Ug6moC–tLy‡e€UnŠYwˆRu–Q\zM_eCzs4V§K]…K?{@LV&I_)rN,`4gsQpuKe€KjLYŽKUoC;[8BU(MZ)Um/X€*\+QŒ1U+Yƒ(Z…)X|/Ml@[o<[{BFg;td/H \?bB8]&@T(KT+Sn>IbF±sCÀã˜Åコñ·z½œjœl8jJMW+`l/yk:y{E{–UtzI`cHFg;QW6jZ5e…TowERuPWc7ZR?bZ7•†?ž™\q°aˆ‚O˜°fŠÊˆËv‚³nY£_s^Bc^=„{MzŠbÿvI‚ÿÖy„]@–yOh|XžšNœËf©b“®\I³bL3hA+{F8‹]EÅvRš™dØ¿{™°‘¡g¿¸}±ÖžÄ»€Ø¯‰¥—eœ‹]{}S³Q–¤z¦iPp»•bŸí¸‘³„‘¾u¤p|€Vudq¢mhˆ`\pLWsAswCo€@o5â²q½ÿ¯”å£`¯tfu0uo0ƒ|Cµ´xŸw±qX”wP¶uR㑇Ö꥚ÿ½—µ‚ˆœvr—bPaJ@H(‡V1—«p]r?1D7H%Q^32H'I:zc.s]@]a:k^)u~=²‰R¾˜eŠØ~Y«Jh“J«ºwÍàœp´q_–`t¥`uºeÛ°[ÿø§òÿº¨éŒƒ¹gªÎ‹¨Í‰¡›`y‹TÕÆ‹ÆÿÖ¦³‚”_ˆ ]Š©jµ¶t¾Ø˜¢×™Ìî´âü·Îÿ°Çÿ¯Êÿ²Ñÿ±Øÿ¹Ðÿ¥à߉«¾}ÞáªíÿÊ÷þ·»Ì†°½ƒ¨â‘ŸÑ|¾Ý~¬Ûr·¿q¿m¼˜m˜Ò~´c†¬c_˜O\wIfsQ…Y†]muAwQ4cV<nqJtv>j‡=x N{ WhoFgUBRN.<M*A^6XoB~uQˆ{Uz…Jsa8m\;xd>yt?ŸjF•{\t¢bn§[q™OtŽIªŽS^~[ƒŠTƒ_‘œzœÈ¶³ªv„^’oWŠrUŽqR‚xIk‡Daa7tpA‡uEw€R„…`š…VƒuMƒm?ol>u€R’Z‰Pl„Ig|@R:Bl/2W+.L'.J%.A-NVH~§`l CX|4^3Mn0^{EZ‰[…§w€¡hy¦sÑܕŨu›¿Sx©Ccr7ec7nl<vŽ]q¤j±ho£L^•ImŸSf§Ud˜Vp•PlŽO•‘`§ŸnˆªasªYwL\r?jwU¤„ˆ¸‹„¿qŠbž¹{¤Ê‹“ƃ}¯hn V„Œf§²y ¶dj‡FZ`@d^?loHs•Ozª]ˆ Rt‚Im„]nYo’g”«wš´lt‰JqwNgy=Z[5MS4J]=Rd;R_3^l9\o:b|cذûŸ¡ï˜©å¤Éÿ«Íÿ¼Òþ¶¿à£®Ë¢°eˆŒA@U(*C*@B>seTŠl`‘{[epLOTI{aRjvOSqGQi:cd6S_8]a:[m7I^@P^LcgVXbFJEAQE>SWFQvTK\T‚cJjH=]B;I5g@'nf3ŠuKL]LgVmhG=ŒQD]VdD3=;3?11H+ #'/0,K3'v?'q[9]VHxeJUTVR<qW0XhD`fTThK}XL„‘Nªu®ƒ£±Š¹€k¯‰KwwKKUd@8cI7Q?„RF_WK‰VNgc=AQKXP9Pf-;SJ@?:j>*¥H1•OwªŒ›xeZÐna˜yKvIZpIŒsF‡—JUaXpA^p@\mA‹XBavBP„aSQBrH2–_9|¼dgÚm˜”pŽbo‰dlzXqsT…ŒYi›cm›n|“lM~O4bF;T4KX$=l,Y])Jz3DbDBL%6[+GX)]i4zxDh¦Xr—g³ŽPÅÖdwî°N”Kh<Tm6[~Cg€C7oB=f?Tn<M|HUrEhe9KrLHeFA]0<P3DO,Ud,b‚+[o@Gf1]]/eu8€w?•ŠRŒl†Ž[i¥f„žin•f\~J=lL@8+cQ#z’CnMA¡X7v>5S(AW+tZ*TŒBKcPR^-Xo/Wg5Px@TxHCj?KT:Rg5^~=_‰/Z0W„6X†.Zˆ/S.Tv9Mn5B\0AA#n^4c¦UJ‚PFa(>q<S\?ušJw¶l¾Ä„¿ß›Í™eƒop|KI–W=E<Y`/Zp9^t?ut?…Q‚‰XT_NWV3ES1cp5kpCw€JQ\[^=QX.PS)aj:ScBlZ'u…C’tG•¤`Œ{V³cY™eLY;ix8™•R`ŒY¦^8~³k{˜sœ¥Q¦‡I›{K|’P‰Çck¤i’jE‰ªhS§w?W<]D2adE^7ƒzB‡ªpy]žxB¾Š]—¥y€xVŠ^5etFf\2pV1{iBndAˆtT¯Žd{˜b •M¿z±ß—…Ü™ƒ±p„•b{]…Žn{”`u“dh~NZi@Wj3»‡PÀõ¨¢ãœrÊDŽLJq+l|7Œ‹Vk‚D]fJWcBƒaB¥}n¦Šjðm–ÿÍh‘gbb;gk@PnBVh8€}LIq<AH*TwHKb@:]6;L4_j3{sBt‹X=‰NI5~¤~OsKzzR{‘mv£r—©€ª¹€™Ç…°Ç‡•Ö†¼Üqä’ŸœHݹn»ÿ¤®µkߘhUuT>{qO¯¿xíõšý´_€IxŠF{¦^ƒ”_§Åƒ²ÛšØù²ÍþºµÓ„ôç¯âÿÎÌÿ°âÿÉÅÿ´áê¦úÕ¢Îå®ðò´¿óšs Z‘¶i¡Ði¼X–²U¨°i¿Á|ÁËu¿Ý†ÐÿÀ¢ø—ìšâ–~‚¥ÁûØШi¡…NŽ…L§`”¦`y‡S‹…?œ…G°“T…qAakMY~W[™_Zš`e†ex n‰¯`Ÿ\k{EaR5ZQ3ZR4jlDŒ~SuHRu‡JYs=qFœ‹f•`t„R_wKj†Wvš^Ÿ\Ÿžt ˒ƃ•¡w“h}vXxvUasIosCxyDŒnI²qV’`E‰gH‡|Hw€EŽYR{wLywNntO]uI\Il“Ud«bY¥pX¤qd¯u”È€ˆÔ{hÏm^¿oW“OZs@e}Miƒ£u·ºäšºïw™Þl{¼NI‚30Q$<T2`}S†²|‘Ò…ƒÆau©Y|Èti±co—RhŒCfˆMz‡W‘ŠfŽŽ_ŠšS{—H|ˆ@lˆKu”d j•ŠKn}8oˆO‘¬r·tލi‚¨dj}MfxTl}Q_a>]jITwLlw\Š¡^r›Lh†BcuAc}Tg…Xo‚\ƒ–^ŽŽMaZ1RL/TX.NT.?U:RhCSk<Mh7Rc:G\8D^Oœ‹Úÿ·Üÿµºô»÷·Üÿ¾Ôþ´¹ßŸ®Ïˆ‹¢afqJZzMWwISkIYnJXkW]kp©Œ~—`drUyp]—Ofv@[`8p]8ec=ah>NX7ITBJ^TfxOVpFHk:HhK[^{žf¡eKgF<[GJM9TX3XgE`bEsa=tu;Š~JQ{Xa]P=Z:7?7I7,$R- :7X#$;?.K989.e1!tW2DŠP?n`JFQiK;nf7apSU_WbP›—MŽ~„¥†Š’{›bv p^ƒw\_S_YGeLNQG`lJUHRxNAO[6<VLvM:iP$^qOA\IE;:’7,Çp4‡¾…·†Œ›c[¾…‚~jz‹Or›xScKLM5R[,Uf8bc0ygChFY…Pspjz_EqTÞxT®ÜtmÖÕggƒLhNH63fN.‚s=…ª]‘ŠaZ±zFflQa;Im@JsC@p:Wi3H{1;fIQL+\Y'`m/`ŽNjvN—}Jg¨Z•{fçQqð˜>† QZ6ek8Vz;Dt?J\1X]5dc<evL\OTPZ}WBlH<P0La2PrFLv9]u+D|:]S.yY(‰‡>¨mE¦zQwm]ŒwW” fm[™kqvP:j>?JCkM"g˜DwŒB}žE^ÆhE¢hEU9AY.`G&J‰=HlC[{:Z‹GTqGeU;F†QOYHTu8YƒCg‡6bŒ3U†4X„,Q…,Ux1T€8@z=0h?4:+k6lœE_Zdr@t¢GxÁ}“²l³Æ³îŸ¾’PtVPf4q‚HLš]avCh’Ta~HSz:hs7‹f6op;KW;Q_;bpDVh;muHcƒOFsG>b>8[1J_.e[3>V6SM$Zu0{{Dr–WgzP…ƒLO}R_k;`i;td1fb=~ŒN·»cˆæ¥j¨eˆyAzs6|ŒR”µl‰œg†¯|~šd…’Qx½t‡£eˆFpnJ¯…\£ì‘“mƉK¹‘[„|UirEXL.reCZŠXq_>o_CthG¦ƒ^†™c|Ÿm²ŒcѧvÞžyŸ¢jjo?ae7€c9qqtyW~€Zm„jg}QMuEsU-»‚S¶»†™´nc˜ZSBe~8Ž{Kt€\rMks_‹rP²…j´gŒ‰_ÂuT~Õƒ›œo‘§‰—tnšf‚~D_W-j}CŽ·e[ŸMIM3FI;GL5`w:Z€C]~FkWÄŠk€’q}‹i„rV{zMŽtB’B¶©hˆ±f¬ˆPª¨d•ž]a‘MŒM·Êqe®f[gCTiNX˜g‹\›¬}ºªfƲ„ŠÏ…q“Iq—U~¥m¬Ï—ºá§Óùº¾ç¬‡À„ª¨fðé«Éÿ·Üó”Ð÷˜ØÿÿüªÿÿÃâû²·Èw¤PŒ£LzŽG_m/ig;–žc´Õ‡Àõ–ÆÿÊã›ÆÄ…ÇÊ‹ÃÓ‘°Ò‘¶ß›ÄÖ‡ŒPnvHw|P«Žk¼Ó‚¤Ú†“¼_‡‹NމTvˆI–~RެlЬo”«q„¤m›§fŠ©h¿~˜æ¤wÝ‹Yž^cbGXjA^g>drBfh:s]6fU9`f8Ž|<šŒO|Ol|@nŽFw¨Sp¤]°µæ°¨òš‹¹qm“™m|žj‡›dz–]lŽ[me…œu‡˜sz”k•¥l†šfy§hw[fŽas‹agYc‚W[zIl†P| d‰®s‘°z›¯}³Ø”µÖƒÆÝ“Øõˆ¨EKD$OM7k|gŽª£Í›Äå¿án§Õh’Ã^nœDQ‡=Dn8WzVªw ÂÇrd™U¡£w¶ÍližGXq6hv?uŒT‹’_™Y~ŠHm‹:]y?liOltFWW1F="AN#Rh/fxF”^Ÿdªck•Xb”dk†OOX4UK=lqLz‚S¤„O‰CdˆE\|<\sDdƒQd{Su…Slv<AD#6;"@M!@c(Cj6VnGepJa€H`|LV|ENt@X{l²à«àÿ¬¼ñ«½ì£Îí˜Åà˜ºÅ—¤¶¢®py—fw¤yйtnªis–ds˜s|~©wŠ¢mŒ•gudh~XoGmy;_p=ckLhtI^j@U]<O\D]nIuwLh|;Vm9YqEf}Tr†VKA4SS6OU7bZ=SvH0^W?6@Q=-pT.lS8aR:ST6PU:`L3NY0/Z=a21RG%.Y:K5=YB(UH4…A6ZPKqPU^UWCFaB`@:tD1xa=mˆSR†g\YTnZ:smFUrT]TObY@c_I|TH`P?SXDpG@~O2AkERXL_3$iB(<VBE>AmO4»^E~’X}…€Uˆ^›Š_sŒ`2xX.56?:GKY_CaW*`b;‚^C‰g:Š…T…UixdpW»gNlÊsL™£2]WPA5vW,~xG‡†X—˜aO–jHa]Ih7O\7Nd<Hl;]h/Pˆ8JcO~TUz?zyIiŽId~T€sGddCjzB½‡JmíyQ“T‡G?~fFZ2Fc4[d)Z{8_yMN^IZI.fg0VvD@vN=X?SU/MtBLj;`d&N;`o8ˆp4€]:de=YY3oe:~–N{Ru„J_kG\d>To3HzEjY5[w+`Aˆ:‹ÀTg¿t@ºz<[ADZ2i[&cˆ?nwAs”AXµ`r”Sxª`\ iQQ`t8f…:f‘8Y=]€,S‚,Ux.Pr2gb,Z‚C:‰X_TFp‘?I™U]S9އIŠÄo˜¤rœ·i“«hwÔ{l©|h©mo¦dS†`ZyN^|IZ}D]rCP‚D?^CAK1u]*†Kc]‚ŒYch`‹cfœdv•lZTPd?7W9=D!H7 X_&ŒFv®]v«hdpObeAƒƒ[MsWRd8cb,€u8¯ŠSŒÛˆh®vRtBdh1l8r]†l?ˆQ`½‡€bI¹¦m‹Ð‡†kœ’eÏœoÕÙŸ‚a…k4azJqpI`dD_\:Öe:§Ä›ž†|…KsF~V6¬U?¥lÉ©kƒbbiGYh@Tp@P^:yW3th7xk8‡fAƒ~Lrw@Vk9yjC«onÁ}nÂ^²jL~4rn(jy2uA}?™‡Q©€V|mJ|a8ƒa9¢O«¾r¹R‡‚Z…WlB>Q'aX)~{9ržNXsBioFjNs›R{ MŒ½j™XŠˆas‹RX]:dF3g\7o^5oH. T>|SizHv^:kƒB~‘Nv¢YŽŽK¬d„¬n|§l›¤m™Ât™ê”s¯[‡~<œ¯yy©S|§T ˇÄ뽿ÿ»Öþüô«šÌ‹‚¾v±¹téÿ®Ìÿ¯Äÿœ×ò‡ØÛ•ÿôÌÿ«ˆFiv0sˆGt«YPšOhF…žX²ÑÛÿ´ÁðŒ˜˜`uŠU‰›k±n˜³f·ÍŽÀí¡’ó˜q‡PelM‡‚n •¢Í‘ È{žžYŒ‰N—o@lh:ˆfA‘P}yHsdIqpHŒ]ŸÎœ½ÿÅÐÿá¼ÿÃo§fY_;@X/?H(f\=Œt@£ŒUr‹RwtBƒIs|@df6h\4ri<m{KŠŠd¯°œlˆsPz_A€aC‚wIwwEo|Ckp:okCsK‘|O€‚K‚yL‚W€Œey{N`Q7]@/^C5YM9Y]:[T:vjM}WqžSc{Iš‚ažZŒP…GdR"%#26/l~u±ÇžÍÈ–ÆÂkš¶Vˆ W‘³\q§^d“X]™Xhœk—Ɣɀ‘Áo|¶Y`PwwKwGN†BcZx¡Mm“Ls…KoƒAby5Sh4W]?ŒvOxx>G_5In:Hy<Co;\|Y—u‰«yµt„¾‚~Ÿ]_s:Xb5Qf@q}Ny…MgƒEd‚>hDh~HoŠUd…Rk{M^zAKc3@](4S ?] Gm2Zx>Y};[wJaŠ[a“\g–PaY˜³{Éá–Ãñ›±ßŠ©ÕƒŒ®n…–xŽž}œ¯†žÁŒžá¦«í›¦Ñ~}®ez–h“£}™®z¡k“j|z¬”mzˆPks@`c;aoC}L‹yDnjAau6Qk.GY/FS3GU1@E1AWEHfR>B'FJ,ZK-k]<yoKJq[KMPFA:7A;E.4@2$5:+D@1XK0e[64i@KJEL5H`;gIBAR4:M@zB7¤c7 ca’{lZaPsHGNCP53`;*U];6`QFH9GQ,h^9Xk@\U?jE?bV<j]HudCepJQfWp>?W_5ShMPA-jJ3d`E‡\B„~P„ych‡bSŽqljabwHqp>BƒH*>B"/%C$BINT5gY3_R.PeEmYH‰X6ÆuJ—Zœ’s…¦~˜˜rLÇŠ?ˆ[IAyY2pg@‚kI„—QVŒ]GtS9U;;C)?P'9j9b],z6xzZacP\i>Z{Gpm9r~FdŠJ_dJ~l4²“K~â|l¸®j–X;„yAK9C^0X`-ql0qŠJEœYIoNGlB>X2KE&FW,SwEHrCEa;_N%My2jl=d;OPGYD^e3~x<t“U]xGQS<YT+MiD]c3Vj:J}Q[`,p€6…ªN…œ@©¶`†ì…NÚF†nWn=Ut9Ot*si/~BšžR|Ékb»vB—`Z\8g~2k;W”A[0P€-Pw/?|3BV+^I'vg9v´j|ºwY¬fm”]™Yp‘RW‰Pc|K”›V„¸~h‡jcTjUc|CY˜ZOœ^P}O[lJb\<Wx=WiKt‹OzWivPguKz•[ r™¤rna[_CTT;AaI1E*;,NI+e`)y4wšYN›Zvf<“i=ej>cGU…Eat>‚‚DªdkËŽLŒJFt;p^*ZeuI–‰Qv“ªtÇ „®’r™®}š¨~·Áv²ºzfYWqFlqNŽdGyQ7hfA—ƒW¸¬uº×±Ÿ§‚“ß™R {X`A€mN™‡c—‰\ªbƒbciI]d@Tc9ag5Z„[XiC[n8Z{;N[.DG1ƒ^B¾°mºçª°÷¬‚Æ€R‘G?s1Hi+He'gv?y•[j~EdxBmvPboH‚zG¡]˜ŸY}Eh{GRŠLWƒEeW_|KZ]8ln=…’Z˜Àr‰Ôi~¡Xй`€’G–‰K€›OƒˆOeˆIlnIsM[^F†gGŒŽ_”‰Zb„Rc‹Ls ^s›WiƒTuQp<tW1•vR—®oÑÚ£ý¨Y›XŠI†½i—½oÝä ìÿÐåÿÚëÿÑÙÿÀµÿ¨²ü–´æ…äÿ«ðÿÀÅô“³ÕƒÐ{¸Õ‰×”Xl{Bdy7ˆ S£¥Uš©V„£Ux²m¿¯}Ûך†‚UOW7~”g‹Ã{…³b~ªZ•®kÊå¬Äø¦ŒÂxއ`¤šƒ·å¥Ž»n‚™`£c˜˜\†zW€yX™lªk¢m{¥v‹b{†U¦°~ºã¯¿ÿÈÅò±‡¯eUe4>@+9=&;E%TI0jT3æhK…™TmyJhh7XT-QN,WT,]W7cbDˆwEtMiuHY`@_hDXcGiQ<cg:Wj1hg;dlDhl=rjEu_LƒlT‰rKuZ?YG1>5)=-#>-#E8$1< #$M/0~oOcFJs;fj@H[/@B*3:#%3168u{wδ€¾šWƒU{’EfzB|’Q„°f{¤l„¡`‚”W ³j ¹`аZt¢dn¤lb°gl£Xw±[w—Tv…JizIj~Jr}G_{?Lt<Wj@auBw‚EhŽMhQi‘R[\j£sx£y’§r’¿Š™Ï€…ª_dv6LZ5SN?mgNyxXp†L^Œ>b‚>i…Nl‘bnŽ[n…SdˆNS†BHq3?_ =X!?k&Gq6Nc3Ob?h‡\x£p~¸r_OWrJ“›e›Õ‚¯Òy”µm‚œ^xŠf‘‡¢Ç—©Û´½ñ¶Åñž³Øv‘©`}“Z|e‡¨zгs…¯k‡˜k‘~e°zT}n:^V1PS5Q^AetEooB€e7^`.CO):C%7@%5:4>SO\yQ4@/FB-HG%TQ6g]IulPblS]SKFREGJHSF@UD@`NEWLBZSLSiE<gJRFHV?6lB-bS,rhAgDzKt}]Vo[[JKZVADfDMKHOS?6O:8RCHN4HW4QjFWrOQbLx>8^R5`QMbQEo[CEgEZEDNe;NaHoJ+]C‰oO”]UsQMx\IuJoÂlOªƒPjXPZ?Be2>b@G3/+#DG!Cd;_^:td9o^@XrQyTJ|`8lC¸`JÍuK•¥u‡œO¨};R_VP8df@sm?f†HJ‘Y4bH%K5=>'KY*IqFYc3@d@4C5I=Vg,OcBgY6yq-ŒKIKcf:±{6Øvuؤ€u@žF[@Oe2[h6f_4sr8€uJjŸVA¡j9dF9E"JZ,P_(Fb3;r>TP+Ux'fyA_€?KpKVj7Lb?~b6aO:U?VM+oR)NmDSxJ^\0Hn5PW2qk5Y9~€9©©HªÃr°Ñ}cçžL‚gSy:Gm(fi8l7t\‹VŒWc°ZW¤hc~Br‡<\“CV|5O~2Us2Q3CˆF[u@t€BšWv®kjbiŒWX†M\‰ESo4ge.‹Ka—x]jBdyHW‡[d„VpAf˜Yq‹Vb«jWpg€Ym¦lb‰ZXaCWfDwˆTsƒk„StqS\cH\kAh’QBˆV5=1E:%J\AOj,|™Lr¯ggžc\|RUwBeŠLO{A@Y)^f.jŠG²¤dtÓŽcžaKˆYq†J^¬^mZ:z])}r7©•R¡–sƒnR¡b¥k®px¦mƒ‰Uzy\€Y^hM_G1´ƒN ®ˆÄ¬ˆÿÍÕ˰ÿ®‘ïЬ糼Ňž–qš‰_žŒi{c’kNPkQNV1poA‡Rx‡eq†UP~V:Q3gM7fqauL4«J¥®vo•Z`|>Lƒ>Ar0Uu9w–R˜b[…Ur€I„…Jy~UŸkª²w—¤e‡¤X‡Àtu¯nq|AuE…’[l¬vq²s€¨jžŠT¤¦l„”R•Y^¯_~5‰Š<ˆ¹[ŠŸ]‚yJ«wRе|q‡T¨•^˜¶|t˜_u”P‚œd¢i€¤j_žc[yHKˆ?LK3–\?¼°nÊø¯„ØŽu¶u‡£[¥J´ªhõóºöÿÊêÿÉÔÿªÐÿ¶å‚¬Ïp¼ÉqÀÖy¥¾h…«_ªÆ}¥ãŠq¨b\ƒQZˆOuˆGlƒ@dA}ˆGªv–Å…±TKZe?‹¨n—¿x…¹dyªf‡Åz¦À€±Ä€Ž®|z«yˆ§}«Ê“yÀrf‹Jiz=}>™}BŽW§·•£Þ§¥¼‰š«lwvM†‰fÛ“¤¿ˆ¼Ùš°ÝŽw”^qc?YO7CD(JI.KJ/]Z8fb8¦iXyš[Ne7PF,X[BXcAX_>bmEjuK{xH‡Oˆ•Wf„PepB[Q:XX4Tn8d}JyqI|aB€Z?z[Ew^;zbDrxUgQ^oFF[;;;'71#<A*.E"->13…vVbEkoCdzJL„PL{E:b6DI>{rg£¥es‚Gl\p—W\’Je‹LˆaˆÃh„¡SgxAis;uŽI¤wÏ–Ì„”Áj‚šLu‹Qw“U`ŒNT€Bj‡V{Ki>_v>b{C]ƒBc†Gi“NwŽV€”Xq¡mª|•¹q¥h®†ŸÌ“»f[xBL]5CK;RQ>ea8]T9bb;Tw@^†SdŠ^zŸ]uŒRtzO„‰Rg59Z!=V(Jq7a~M`x>KwCX~]€…ž»‹”Ât^–Tk‚X«ZŒºXЬOrEjoPu{œ»¨Èô¿Êö¾Ùƒ«ºa{KfoPwsl…©‹¾|‹±r”Ÿ\„sEcS8Xa;R]5VZ3MP<fqTq“Ml€=Re0KV-IL);<#1623LN`xa?-/VH%lY.V`>ZbEYdK`RJaWEpfI]pHa_IciLgfQ^_MP_EgWHUpD:pT'8R6'&U<Sa1tR4pf:dlR^nL`LGaTCa\GgWH_fHU]JFuKR`CjjCb…TcŠ`]cjKMbJ9^aHYSFTH=VS;qU;PˆHhfW‰]3wo@`kRfUEdXAi]H®_Eƒ^mš~VxXL`>lc9M‹FG‡MUƒLcšQ_ŸjXˆ[[e@T;rY9foSu^I]^AnT<rY=paClUDX\FNgR\iJ`gBgbE]l;JrA9pHCR4WrAr„HCSNcE-r</H<Q? ;X)2B0J@sZ%m<QzI`hC¯z5˜É`‘̓јGª„JbPG\7Jb3@^2NI#NW/}R.mŸKD²sLbCLP+Bd8]Z4R7YyVk„;VŠCa|GZPIŽTYjHa‡HBsODY1XP*TT1ZP-Hh;An5MT(c]$Tj:M{9ks:„Š>”£O¸Äg{Ë}b¸sIˆUCe)Nc)jT&bwK_ŠLWvR|‚Ew¥TXÁlk„\[‚9l€7W SL{Her2qw2dŽ;e}Gk‰D\uIhz=Y~F{ONœS6]6TM|W FpCPh>]…JW_COg5XpCks9tƒJv•T~•e~WˆRr“Tr§a‚¯xsn]ŒePXR]J`e5z¸]i©mHz^HN-_q?XV†ŒJ•»`ƒ²sŒ¬jl®qiŽUKs@ES*Om-VˆAy|@²›Yt¾tyŠNgd<}xE\X8J<GC!rg.¨|A’ÑxŽv|…Tˆ»q‡Àw~¨g“ŠMŒTš‚ZQ^Cu`<¨‘b¬«‚ǽ“ùױ햀ÿœ}ÜìȲ±ŒÎW©¢o…¡kƘdÖšp‚¯‡c€WSg9geDufM…›goŠf[^BTX1o^GgjKB^9ra-–uFWZCaU1^€@X…?ušQw”Zhm<w†]`ŠMd}K¥“Z¥žb®¯pu«cƒ¢Hœ™ZbuDEP+]M-tL€a‰ˆN}ŽPfŽV‚{J\i5ˆi?nšaZ…8Vb*m.‹ƒIq~C×qQäÌœr–[suA£bx¥`…ªdŒÀx‰Ï~†¹ww“ov˜gq’Sd˜G]]7”ƒA¾Ô|¥Î†•Ä}‡·lpªN¢]Ðæ«Õç©àÿ¬¹ü–²ã‹Àg»s€¡_‹•St‰M‚ŠU«Å¸»p °jn–XŠjpÑNÅuiŒK|ŽM¨º…¡Á–‘•r¯sj¦^‹¡pšÎ~zÁqˆ»mªÐ}’Ål|¡_w™g¨´”ºÞ¦£Ý¡„Á{qŠJZp:^Š8_žDn—MŽ u¥¿‘Ãv³ww\Œ_ªÈŽŽÐŽ¥l¼s™hu¡ra„VUS6U\9^g<yiGomK€lL¥€\fl?PJ1xV9Šh@jo9\lAqtQ‡Nv|J}‚J|ƒOx|GeZ5^a8^|H‰–a’¯_r|D~eE{f9s`=rcF¡…k³Âv²ušµh_}EGG0GM8TW;>^45P0WYPg{RRa>pfEs}G^j5TK;\fd€”oˆ•`x”dhšjy£a|¥[ªn‚½{“³h„™S`v;Pd?_‹V€£b–¥fŠ—Pm€@fzAgTs—ez¨huªdo©j‡¯]g¡C@k.J\)Wk/[z<oPxŸSv•T™¢_’§i‰£]w›Z‚¢u¡ÅŠšÍtr¤UVˆDawG^‚HXu@U\1KJ1VjCeˆOw’Yu YvˆUnoNlk=Zl,>b)Be-Mv@Z€Ph‡Tt‡Yz›o®u¤½~¢¬œ¢ejCWw<q†Gu–Bf‚;P{Tašo”ÌŠ¼çÊì®Øs’´bwµezÈxp¸yŽÁ‹ Àw”£k‚zQte@d]=Rk>UrDgr@UV5JSJu{Sw‹GWj<ElADf@<YB;`HFhQ[vb:D%KH+`M1\]=WTAET<:R=SD=mM:]bAv\JemROe`cKTMH>_E9u]<JJ4d\fBCQW1ZS8dS;OU@gNEX`6baGmtCdOZXO[RG`RBOYFX]AdtDk}Xu‘jaƒq{ZYƒrIaqO\QS_E:T]>hRC^a5soBuZ1†G6zY8‘QBlIŠS~[vx[oqUa~IikCb{B•~OÃ\žÉu”Ó‚wÚ’U¥v[}I\p0}S,«f3}†XbdbUTLOe>GS:MO8ibCa‚EK{[e]Lhi9Sh9StETƒGH•ÅZn ‡?yZ[b36q>8I>JP%9[1?`/L\)nn2_Ž@C{UdXC•o8‘»^³xõ˜cº¶Hr\X^3Op2:l?5S*@K&tQ(p7c²jcŽYvf5^e8ea6_l1UrEsk4n©J€¥b–Çm‘ㅇ݇]ÀImFiBHV2AN)IL)LS,Bj/Gf'Zf;U[2^|0NlgyH‡~BQ™§crÇ=‡dMx8W”EnœN‚¥Vz£YwSt‚I€…Ek|BOw;Qz5~s-b¤ZI†ULm0Gn2Jd/Sp1Pn2Q‡FHsDYR)n„CC†G*P,1F5Q#DH\k8T˜T<hBcX*Nj:P_4_c:a{BNqQU^8]„Dcx8‡|Dˆ¥^n½snžah˜_X¥gŒ–a¿¼pƒõ‹X¯x‘I}¥a{}UyˆC|j:yLt•XgŠOR~SQ^AWq9Y{?Wq5am2}x9oŸTK›]]l>‰M_¬`AN>>J,L_.oX.¸g:¡™dš¸~‡“q}©mwªoy¨v²¬m°eƒzT“†a‘t¨«˜¼¡€ÌÙ‘•t^ÖqWë˜rÒ“|ž˜|”’i›iмu•Ây’°yœswS}‹i˜§xޏŒ}„t``BkvK‹“gm«|LdMgAYg9Wa;UR4TzCe{9t…Do…U]~KdwO^zK†lAœzP…pElzLl~7o•Gc>?V.SP+nu<ho9v_1[c9a[8pP5vaBCO6pW:™UZBP{2Ez3a3ˆ‘I—œRݨsw©e`‡M™UƒšVˆ‡Q¤‚T«Ã‚ot‚Vt‘alšhs“cmœPd‰S¬¾m¤Ïz Ï‹žÌ†€·d‘¦bÖë«¶ÿ¤Äø«¬ü¥™Ä…йw ȇ{©`r€Nb‰\~³kžÂp|£iu¨ll£Vke<—Ÿf ¿{€´s„©d¥šo¤µ‰£Í¤à}·sƒÉ‚—Ïz™Ëy¹ÈŒ—Ü‹l„AluO…§w¦½…³Ï‹´ÏŠ‹¸rgwHXi3On%my6”¡_q®r©|‹¯t—®€Œ·wp™d¡n—¿r§_|ƒSƒ—j¥¸€¹wošir‘f‚’b‰–b™o…®v„˜PduCQg=]\@ypHkzPc„X{„Ws„Oyv@rh8np>ŽŽQv‡Lb}FhT§|Ⱦz¥®qˆ—^t€Qa`<}U>eP¦œk•·kŠœjƒ‚Vu}Sl‰\b]`ŒYUwH\^G|seuclPh}FQh;>KO¡–Àº€™a›z¨»{ˆªZ}—fƒª§¼yŒ¤Xˆ|FˆvJz‹`y¢]u¡^r”XaLUzEXxBa„Nt˜j‚¥j‹¢i‘¯cªQ}–BNy4Be3>j8V…DV‡?g„Al†Ng…N…•X‡¢^{VrŸn²~d}]q—\]†HjxBe<Pd1LZ6Sj@e“L`”XsŸm…¦lƒNhq:Td-Mi1Nj9XkEagGgxHc‹c«y’Äy™°k‘ g‡ˆSj~EV{HYŠGg–Hl‘Nw^˜µj©¹až¬ZŸ^¤µ`ŸÈo”Ò„¤Ù޶äŒÀyš r„’e€‚\rrHfeAQe@PsU{^š—R]uB[`Ae`@R`UZkb¤oS”db‘feŒ[_|YEQ'C[6<O>IG<MA4bR5Sr<McNQSBLS?fZAMaMF]O<HI1@BA36|G-hg<Nƒ\bbiUaNy]E^~JaZMVP;a@8qR7hrFQmWQJBW_?bpFTyJXeUdjEq‰S‡“j„utoebX^šTR}UUQFPF?FFALE1OT4FS*VH5oN:ˆ_9‘|G|‰UPa]iQT\<[W,sS5†c4‹rG~‰S‹–c—W\›hIkaV`3Vg"qk*’r,vu5‡hFIhENNA[gBj‡Ih„MfsN^sE…yFhŠT]mSN{GdoF»ŒH‰ÈlO–ŽCjQTe(%p<?@>H^&IZ4Ea/CQ.dA%x|5nŒ^bhŒ—]®k·q¡Ú~SØ»Ck_Ma5L`/DT7OZ,\R&T\1~_;hq:S”^BpBG[-F`)bO*@o1pS5˜:ŽÎƒ¦½z§Ñs—Õ~ƒ¸om»gS¥m@{Y=h:Df2G\4Yh4]l1U~:XqAŠ9Y¾€X|fb{L†›QžÂl€Áqx¹j†ºjy£aeŽSMuIL\:FY6QZ;@^7:N.[b(U8z„=_œ[KsLQp1Iy8Jn;KvEih=r„L7‚eKH4Rg1>o54S#;K$,Z BO't~7r‘mg}N^„ID};X<m‹?t–LW¡ek‘W\‘RWƒJQsC~O8•G|؃{ÃxÅ~À}v°u§tMŽ©UhÑ{`qHcl9Om8[[0pyGq¢b{ƒSsuIfwA`HQ~<Kc8KzCqz@p”PmˆIp˜TzQc²YUlCHX0I^0M]0eZ-„X;ªªrŒÏŒšÀ‡·Ã‰æÃ~¦Ö“¥®ˆœ‚h‚…b–xV¾Œk¹{{²Ï–mÁŽxK§f?š~JtD©–SÊ|²¯vººz§Á„¢¹|…Ñ”™»zÀÉ Ê¡°ƒrw‹m¢qH£•[®žb€cXyTkg5co@{n?y§jb£WnDu‹JuŒMo“f”e{Qj9]t2|r;_o?j|E[CSn>ee4Xi>I]9SU5\^@\bIRe>{bFy‚_s„[qF[y8[†7Z;`9n: X„¡YhvEQX,VC"N=95/*†G3e…NWE"mT5t„Iu“]…“\•²V»ÉtŸÛ…ªÐ{«ó£—ævËn¿Ä€¿ÿ¡¼ï¢Äê®Ýš’³nˆ dk„ImyAƒAšQˆ“Y³£Ó•r«f^€M…£n¥¾Œ«ÂŒ¼ªr’nƒ_”ªx–¾vr¢Z™¯s£ÐŒ°\—¥Y–Mfk2deK o»µu¥±fž¬b’¤agwHWl4Kl.Yw2•ŒH¤•cv•]t‰X‚yº‰t¥ht’Y‹¢`w‘Xe|JuzJŒ‡[Œ‘k—¹–—Ѭˆ½„™š\ÐÌzü铵¯derGidTmo|™q~•iu‹ZsxJm{Jt†_f‡VZŠK‚”^‚š[j‘Y~…TµŠaȉY¬†P¥~R~sLtd@ldDob?¢sZÀ®}ÚΕ²Òu–œU¸ p̼‡±¿ys›QUl@ndKˆ‰c†”Un€Hg{Up‰Å·¢ÔЋ~¡c€gœ£q} x~š€¦±‚ §a’Mg‹Pp[}™X|–^nŽ_xg~¢go™Z^ŽLp‘`†¯j†§e€„Wy†Rr{>_r:Mk7Cw>UF\†@d€8RzCpHsŽBk„CkƒFcƒGnˆQ‡¡cr’K[fRŒ‡mŠ\Y};Wk;Yo9Uk<XvEg†JkŠVn—ršÃt›Cfj'I]%Hc6]pClQl„U]Xz¦kŸÅs¢¼k…˜c‰›e€—e™^}¡Wƒ‘Jq€Bgs5h{>x:ke>_cAZx<Un;cp_œ¦‰ŸÊƒ’·p¨iƒ£v¯†Œ´v{¡^g~HUrFOsKm„`š\„x?eZ8UXCKmZgŽm‚Ÿsz‘kw“hpŒan‡]TP0Mc8=Z>;U9LA5lI4_w8I„R?WTOH@RK<aL9leBiuVFaX:KRNJ@ƒK6nsA‡hvo[oREsMUGGH?,i</uX6c|RWcXeQGu_@yˆNX}XXh_sWCŽŒYv©so~wsFR‰RBy]G{rVN¦UGfPBR@H[:a[4e_0te>thCqaEyiH_b=hsGYq@;`FQF-Ef2LsDitN_–UVdVoRFbE;\BB?.RR'Mh/La(`f%vo!Xj#\Y-qu8]œNSƒ]Le7iY*…s)v‚CetX^yFn‡O¢ˆTv¶^H’IjQ[l+M„;JxHLk64U9/J-+E1`D4zu6vzQv’U‡—Ry¨]›TÂp\LJ@szFS3@W(7I&OC!J^%PE'JU(eM&T„6FaId64d4=H$GV+jc6Š@ÑwŒÁ‹†¾ti«`f}Jwi3~€6a¬SU¡XV{JL€CGzG[c2Nw7[|?ž•>eÑrh¢v©U’®a€¬`s‡Kt€9\MOgBVv4MrCKcA@Z0EZ*0Q&BT(Zn6b<…8Z¤YHyIMk2ds1_ŒESjA_e<YqC<V>FX*Mf*5`+<E#9g.Dc2S`)‹FSƒ^fg=e|=i†IXkIjU+zk6~ƒMtMu [w±hgÊ„lÆŠ‰Á€£®v‡Ôƒ‡¬m´q‡Ã~O¡s„q<y<_Ù_‘_WšQhyAqˆJs¤_d“a]„BS…9P`/zb<iƒW`ƒYhFc‹Jq}Fl”FpqEw®Pd›YKŽ^Mj7I_7rW4…bG˜œh…À†¤«i‘®r©ˆbǪx›á—•ƒ’ŒšbM ^J¡_N¼Ê¡Âˆ^•boX5|aBhW>¡„UˆœqwlO~a9xzQt]C~iB‡nEÑ\¸¥y‡™c}Ym†Fl„J„ƒAŒwN`vMPi6`n3`z8ox8aŒ;`„8h‘K§i¿Ý¤•¹_l7UU-gs2m};NzRd]<v‰Ka„Hwi?voTqwK–‘jŽÄ—w]‚‘S¼“[œ“gk[Qd3Wn*_y,h|9iŒ?”šOs·bBS,+%()$=)7)\?1W‚?#:.1S[$fp.hv2l‚G•ŒF°Î}±ö›ÌþšÌùšºÿžÆÿžÃø™”»}•Ÿ^‰NiŽN]l9ak7Bd.BN"DO)syV¯¹¬¸nƒN‰—g¬Ï’ȶ|¥‘Rs?‘…Sy¥i„—V…£cˆÍy—Ö‚ˆ·h~Jˆ›`y“NRW0jfO§º‚ŒÌl€Àf{¶ZœÊnpÑeiZ]tCVg3f‡4sw8fn7Xi5sƒU˜´kr¯VcL{ªb€¸‚‘ÖŠk»dt£fƒ¨‚¦¿§¯ã¬¬Ç“œ^Ë”bã¨b¥‰KjeExvV»Œq²–sŒ‘amzNenDcrMf¼½€–ÔŽ¡Ü ™äŸ‹Ìˆ‹µq’¥`¤—b|Œ_zzPpRvwV}}WsQu{Q¬•h’‘W«šd ˜d¸®i¸³d¥¤^ˆ‡Nd‚Mey]‹k‡©owœa¦¬ŒḬ̈àȘκnªd§’`¢“rDZŽÀ»€”¡W{}P‘‚^Œ¨p†¨ss‘^s˜h€µw}»}„±~tªeeŽVbŽ`|¦t¶r„¡_k}GVh?PsDX{H`†Ec‘Kaˆ?YuFQyC\~Ae7bl;\yF^}GU†Uf‹Xo‰CXp-Tk;tLz…EPi8Th;Zk:Xt9\n6Vo@rŠ\ƒ¥^vˆ5Hc&A\+If9ZyCl…XŠ•] [pšS–ŸZ¡¤Yx£f~©k²`‚ªbƒžUjŽ@ToDQm<Rr4Lu:S„Wh›^v¯Qd?OsC[xYŠˆ`€‚Pw‚Z|œ|µŽ”Á„‹©eo{L[lJhnEmnG˜jBƒb;RWIjsHf}Xj€Zm‚aeV[vWcqR^n\E;&KE0SJ.5W3.B7e2/y\+G„GIQMGJ5DC1^K6jb>paSfrWHa:i_bNPnD5hhDV[OAVNJFFPD/V=4~J2ˆgCtœd_WbVD\YPqbCXuDhlS{WG”|Mƒ§iLŸyVXgˆJDeU?SDy|H`Ÿ]VŠSNqI[oIVf;\h>S^?KX>JU9U^8TmCHrOF`D\i6“`=Ÿ†Eœ±i‰Ö˜pËFª€GYREX5GF-WY5Rb;Fa5Ic2Pr)Sq'Xr"…d&m’6C…S<e9L_(ar+h†AktLZfB_i@yU<zŽINšdTƒabv=f‘@IˆEK_6Ba8Sb4WzGaX]€Ma‚\q`/zŠE_—i“yLŠºhu©{@¤~1UE;I7BAJ&F`'Dr85T(HF'kS!D•GFeL;Z.NV0Zj1or:•˜T޲h’¹ŠÝš|Í‘K¼n6˜VXO,z\!e—Cc§YbƒOOŽPbOq¤T}½l ÄoŒ´k fvŒL^…HFu7Gg1Rc1Hk8Nm=Wg:eu6DvFGW/=\'8Q$S])Sx>`p:|†;YœQFtCHt5Zs=Nd.;\)UN'5V2?I#J\,Cd/9Z)ZZ.k‹BD¡cgm8g•SU^Dlw=QtD:D/96<Q(bM![Z7Z_;dq6F¥’W¶uO‚ÍzocPmY(yq2v _o•WPŠZ_[@qz;}C˜ó‚†Þ‹s§hršX¯go¸r^¡YA|OUS1’f;s]_‹UdŠP\ŠPn€GpšSp£]f›Y|£XiÆfW…MPX<d^5„rMŸ‹`m£itsB…N”‰\‚u]щaïõÀ¤Ç±mq\zlS¸œsÊ´}ivn?i[-‚gBŽO”[>|aHap^xlJ~iO†S;gT?‚jE•uYxsa‡ˆ[wª\d¢Yc…Gea8Xm?Rw<av8Zu7U‚-Ml6Z^6‚D×·sݸ~pxMZy6\g5ej:b–=msE]‚btƒT€‰L‚nCœT –mä©rÿݶ¿É ¸»•”žf}Z‚…dŠiH[S\f>R‹AV~;[|@‚‰Jƒž_EuB4N9*<-)-#&%egMUl?05=R,^ŠO`²\Fi2SQ*ke9{s;º…W¶âÀñŽÕÿžÃ㊣µi…KOS0Kd6Uh:?_3Jf3Jg6Fh8PpG~•fš\g€Gdvc™šm˜i±{Ri?rwH~ƒW™¿„j¼p„¥n¡Ò„Œºjo€D¹’R± d†‰SdqFhH…ŸC‡£J{«T}·Q‡˜M–™dŒ¿xc‹KT`1kz6[7Wn7J\3cx@r’Jj“Ml‘R¿žæ›¯ú ”鑎ÜËŠ©À’ÃÈ¥Ÿo‘_š‚pŸƒi¢~i~…cdmLxhF–jK‰|VuzOw…V|cˆ˜o ¬x®©{°ªv¯–q¦–t‰•b{…Kx‡L„~?|yLœ‚\ª—n—›c’]‰„R–|W—^”“^²t®®k¦š`‹ZX}ŽeŸu§ wŸjŒ¤c³¯t䱃À s ™`€Rxšj‘¨z™´{Ž›bq‰Hf‚LxZÀ”tÀ¯€°hm‹f‰£u™¾…’†’·oƒªs™Úªð“«ß‚£Ë€ƒ¬kl[jŒUnˆOv[‡˜_yŒSp€PnŠJXr5Qd&LY#HT'IU9czZqVf‡?N^)Q[.P^:Vc=Zg?XjAWs=]p9Sm6Ic4_nQy’KZ}1E]*AY3Nl;\m=XuDhtEmf:Ye7_v?b„Lu–^†¬eˆ§Zp‡Jnt@`u9Nb;L\3JZ7VnKw’]‡£fƒ™Vp„HUqCEpSQ{[_zTXmRoo‘«• Ï›™½yi‹Q]b@^c9cg=ji9b`?hrU‡auŒUr‚]ƒ}T‚SflJ]fRYlU60$>8#@=!0=/1</C9+i9/A]:XF@ST3RM6]W9On?^_OvRLqcQ:„h=daID?lE<›eBS’^@Xj>?E[F7mV=kWL>^MQH<i7,P]=b]EvpFfyN€fOœ\H½˜PˆžnTˆN`pQSLR`=ag=sxNl†UgžWY‡Y^iMY[<Pk?PnM[bGso=u‘[Z•t_k^WvEQcAgY3”i4§xC˜zVI‚YIRU8\1P;'Wg*Rg=MQ-Jn>NlBJv5<x;]L*[~,L…JPƒGf‰@rDtIayF_d@Ai>^J6|u3[”RV€]i{JVŒBEv@H`4MX1}m6›Sn†ad~I8ˆ\QO6ko/\ŽYŽ‚S‚¹^°‹>¦g/`U3@$5>FBYDEa,0b-;H WG%]a)DzU8U4FX*Je/_Y2m5«S±¹‡·ä•“ôªˆÙŒU¼g;•[OyCw„Gq›Ty¡T}¢X…œ_…¡[t©c^}RXxKEfDK^4Dd5Od;Ht3Rn5FrEBh=KV+Tb<=rA:Y+:Q KQ*Zh6Qx>Tn3x„8OœZUnBSy5Gk@9c.7W.3G)5H*;M)BZ$Ae-?S$IP)}b.S¡O|ŠRF‹NWb=Fc08H,.D(5C*DO0K\,G\:Um7wv1’ORS{]8^J>nHAL!_H&hh5_J\sBN_6_i/•ˆBÆÂf›èuÓ„„¢ašÈ~ŠÑ„_›^i‹FYŒe—xAm]j‘RZyF^g7s—KuWqªfpžR³^n·^k”WQkQŠo?À¯}ÃÂm†Uns:x|S…™h£r§„_âŽd¼Ã¨³€Ôć͹ȣ~x®‡sxZIxD]O)zd8at<bK7‰UA’nK‘dOwjUhbWi\INlH“Z2kƒZqxW—wLs‘WVCVp=Qx;QvAUi+M~3Y|;PN2`M9°‡[º™[}l;ajGhv7qs1qhEl†AhŽJr„Yr„\oŒ^ƒ{F©—b¬³sµ¤nòÌɴ…®˜h|•bއQz‰Y‚„Yš`z„Vq‹SnHošDy”D‡ž_|‹VznCSq;DP*3K&9N%xa5Gq<5T,…X¢àˆ“ÚƒH¯]L~Wd¥uc Pjh:´ÄpÄâ|¡Â[†„KtŠ]C`6G]7Ic5A[-JY2Ti>Pn4Ym@pˆQ‚¥]fŸYcŠYˆ_˜‰]‡e>fO0RP/pc3a[C™žp§f“™Z•¥hk•X^œh›o «cŠ‘e‘šau‹C_|6TX&eY/ce9TH1liO”¢{€¤`Zu<h\2rŠ:r„>crAgŸ\f£VWŠEiwEš´u¶ë›«àµç–¸ï¥£ì~’U˜eTŸvbŸ€kº‚|¦¢~š´ˆ›¶‡|•t|nVƒcI„sKwsMmlFgfDmlFxxKo€Ks†Sy›V•ŽZ€‡[xyUu„UZ|DMm6Uj9ls=vyH{}LЉV†‚T’TŸžd”¡f‘Wš€[ˆŒf„Šdˆše…£o‰žZ‘}Hš…Pšª`³¢l§]„†Rˆšc™³v¨©p–¤jvžcs›`sŸ^‚“X“ŠY–Šf¥¤t‚³o_£n…™€ ÀŽŽ·x‰»…¼çŸÆÿ‚¢Äd§µp¬·t’ªažNt}?guE|vMzsBwuC}…HMx9?\+9M1B8D,TbLu˜Sm‚@LW*>I+KM3C\:B^=XU>_m?Ru7^g0Kd/Ph<l…G[}3L`-L\-T^0`k;VsBk~Ecv<UyDW~Sd‰fu¦n‡¹p‰Ãd\šN;l:@U,?L%<J(>N,Db>`xVraq¡ki¬r\¯{a²—u¾—ŒÄЉ¥ZeyLs~o“²’¢Æ•“¹kr…Idd>eh<`l@_zJxŽV•T…yDogCeW;_Q7`\FjqOcnL66&97&35$G-$P;%=B/WC65Q0LD4QH,NN-ZY6VlCQsIXyKqmSDŒ_^o]GvI_lTÎQGcƒTf`nuTJiXKGRNP<>??0TD3eP8QB=aX;Z_@i_L[nJje=šb4½ŠPvsj\uxk]a]bQbNG_W3u^DgAN‹OHYAjD.p`3XpGgWHˆm<£jf’ˆXWKCS.FW0P^1Ai>F?4GQ&>U2?M86M/F6)NTDa7zZ4ir=U‡YY}QE‡QYoJjzAh–Ve‰OTuFE\.LZ'j`#Sh4<`<[i7c{9Y~DZyN_„BQŽI?pLFb:Ud:oa<c…LC†Ym]@AŽGWlMr‡Ee ]‚‡ZލWl°a[6ŒW3P=1;"1500B=9Y*@S>)YZ8?~@4a?LR*Jr/\i@}C‘§S—«€µªi•»er¸undhš^bX`zHWa4\^.a|5_…EhxAQ€EekCZŽFDwZM[3I^'Tj6Or<`n9Uy6BˆQNqHIk?Cb9;`2>a-Kj7Yu8N|7Te5t3NTThCHu-Ef/Ao.:X/CC&@J(;U4JW'7j-1H&?HQ`*jl6`š`RyEIb/=?">G+Ta/\_AWc;YdC]j8Ws7cq6Zt>W{EbIa„F?{HCV'>K'NR,`vAZr?Qn1Ps,„f/ÂcÄm¡Âm™ï ß…„œcfŠH‚>c‹M{‚Xk–QQ{RCY-[T-zŽC€ÅsxÉtp¦i‹ž>p¶V’™R„‚SÃX¿¤k‚˜go¢^©|DÓ—aŸŠj°´v¾Ü“Чm³d×lÛµ‹š”u©Ÿa™¬t^U©TckCs}GjsLe]FYJtkOrfLgkMsXKrVFLdE_O1q^>RuTwh8SrK]q7Wp3_k5Tt=[h/‚¯Z{ÙŠX§e‰aD£‡Z]ŠRJo,bc/Tq2Tx.|o8sWƒ¢XÉuÌ—u¡inžw¡ƒS¨¡\°˜WǧnŸ¥pˆ™_„KxƒHuG‡`>š‡`{§gkBsœN\”Keˆ?v’YbxJAA+B9(AL::X1CB5OƒOEœWNŠZt›[¢œ\¯¹jÛ†™»c»j”Årq½a‰’Ks‚CZ[/[t;`UHq<Kc0;X*=X-@d<Uq>VxFa‡Ps \™¾sžðvxÉ_uˆInm:RS,UG,]]9spIQwD’~Yx°jU~Dc€F{«pœÑž›ß£’¾}†ži„|P[X7_L0>K'CG%Z\8OY8r‹nwks8`k4Yp;tr9‡’HOi6bF1b\;\Z-Q_7~}\Ò‘£äŒ®ÙŒ²è—¶éŸ‡ÔŠ€šp–£uš–p¡’u·¸‘®Þ“À좾뛙ºvlœilŒWhSqzT`zEcpNiƒcg‘ZdŒWˆ¨o“s‡¥e}‰Tx@il6Ka1Ub8mzE|‹[t‰^{jxžZmŒH~F˜a £pym“fš˜ew—S{‘SƒTwM{—V§`‘°f›•Yw…GuQ‰‘a€™eƒ¤o‚®tƒ¹{†°s…¤TtŒQ{K}ƒW¹ †½Á©’Í—£Å•À}ĉÍÿŸÊö€†¸\ƒ£a§œaŸ¡Ws”Ic„BS{Ei}Jwz@hy@[}Fd|;Up<Ch21R(4A+JREhxR_o>IQ1GN,GL,OS5[X7PX6W_Ce€CRy3Op-Nf6b|B`y;K\0KV+E^8MsFV~EXv=ZiC\}Soƒb„¤p§¼vš¿{¦Ò §ñ›ƒÛuV«G@x:<V+;G1S[=btEksQvŒuˆ¼ª™Îº›á¶—È£•½ƒŠšYrt@[jNm‡~–¼˜š¶€Ž¡Ze{GJW@NVAdrGwƒFds;Tc<R^EYZBbT:lU@g`CcmE4."74"AA$?C(U>3XQ7k\=>]@;E457`7 Zg0a|G}}K‚¡]„º{K¾Žh„ypK]œVi~a…dKeuSPQVYLCCP;?K7ZE:jX6HTFOBAPR5EaCKN:O[@S[4g-¬Š<±_O†q^a`aEUR;NEOG6UY=fU7LxETsCei9JN;CM8ZM4†e1l—VG|u-IDB-![D$Pn8-_AF3/QF$MX8?O43I,8?&?E!UY1hr:c|@VvOUlHKc<LZ2hI-^ˆ4H…M?m@8b3Kd1do6Wx@\x@]„L]‰WP{O^uRnl5^y7V€S]PR•^QaVYp4I<ffDW‘Dp‡Zy’Og…VaeE‚p:X©Vf`SI~4*jG"9-'153D[/Ms;Ll@a[+eˆG]˜hM[c‚KwŽJmœP€¢]z›Zi”bc]dzQoyAh¢VXŸfX“Q;z<2h;AR)\U$V~5U‡CGlA\]/Rw4W^;Ae5FQ(O_0Tq7PtBMp9\\3oh5\nCQpDP}HKEKd9Qc3Ed3GW(vp'OšKJpIFe.Hb.Ln<1^26A>F"9R2JP,Bn*%X186HZ#ov/bšNDsT>_47Q/CR3V`3UO/]_5Q{MBtDP_/fb@zwLixLe“Qo[GŽQBV9=U(MT-ThAKk;Zf0Sr7p{2yy6q†F¡¨Yµô•ëiÚ…`žb[œJ^uKc~F_„NCk?@I+^e6††C¢`}³fyŸWj’\lpMƒ‹J{›\ЉHªN¯—]yÉo¿ƒS¯©g‘\¹štÔ©—…œ|]Ë”]“WŽmM¥sR^}mJvr?zCƒ„R•~^lyS•uN——d¦vrœu~‚dk}W]qERR3fsOh‚mgoOsINwDHb-Rn5^v>e…=ž¶_¨Ã{~œ\Œ}LsaddWŠRc¡`\‘Pfu,u~C„ŠXvºn¢I·‘bÀÀ†žÿ·kÓ—‚\x‡S sDpB‡h?rkHŒyN„„Wq}O”vD‘ƒTijIr‹NZ€<iz=lŒO^mDX`;\jDty\g‡e]Œ_ e”–l¬q‚¼}²r‰¸ušÅwŠÄeйe Ú~ÄjfˆEf–S:X2je7Ž^a×n@wA=Z:K`=RiHc~be~Xw‚\„œc™–d»Ô›Øtz¿bi³\ee?`oHƒSš—Xh‰Ff~Bx‰J]‰B]q=’’U¢¿w§³n}H~z@|Md–NOsBJf6Bk7Va4ZsJšl‘–iƒPf{@cM+fZ5‚sI˜vQ[_;O?)<G0CB.]K: kY¯Àz Õ{ªÐ}ºãÒÿ®”½{¤®`•‹b’‡`¥¬z¨ÔŸ¶ä£¶ò¯¯ù²¤ð¯´ó¨‰Î„wœ_‚Rt~\€¡~¶Œ†µˆ™Áƒ‘¯f‚‰Gfj2MZ3_V;``>\l>erNu‚M|ŒVZ–“ZkNS|Hj‡Pš–m—˜k˜¨rœºgp¥XZ7`s:n‹W}ªc®nš«n«©k“bu‹^}›juœkxaœm’²ƒŽ¿s„¦UnŽJl~OlrO|ˆoð´þÛÁ°â™¤Â‰°ÇŽÏ쩼î€Òmw±f‚¢`}YqšPt•UvˆSpxEptBYzDb„Kb‚9Yp@Yk@e_@LV?PaGcxPd‚CXa:S^1LM-?:.>F+BJ*L[9btHb„EXt2Eh9Wp>`;Qm@Tl:IpDYzPj”PbˆGVwHZnCfoL|‡e³€œÑ‹ãŸ¯ðš´Ý}‹±VušTc‰=K[2NW6Uk@LbESqjƒŸ”¨¹¡©Èœ•¹ŠoxŽRip;[XAgg[zžv‡¨lsˆgsŒecˆcm]o‹Qav@^o<VxNUxXYxUYh@eM1eG7c^JA7)B@,YJ1kU0hY8YVG:DG4144.'31$W4"XY/c}I‚O—¹d—Á…R‘PŒzeU_›OgfV{UB[|T]`ZJ\TT[SJWMMVM<LKHT=XN<gW@;^CEQDBU:KT4iZ&]g.sE7i<2i82j>1nV:`cCNgRb[LLYEaSD`y=D[@MP6Q`Bxd9X•[8`n+:753&MN*D]7D]8ER8EL..C/87/5G&;Q(ST+ek6P‚GKkJKb<<a89W=+N+C: \KSv,R|@Vr2gŽH[„RUcCbb6d|ATsHN\G?h?HQ5OT$bo>stLJXYVHWl3\tCh„GlŠHUˆ[PU=Ak4I?,|M)L¦ELoaXX.9‰75g><H/_a/]ˆK@nOBR<Zf0y{2l¦fnes ^y—Y‡ªaiÁ‚`gaŒZQzUHZ?`Z0yk6mIR˜^NrI:n61e5DQ&XP%cl,C‚HK`ARj-MW5;X,=K'[Z(ZŽGV‹VQ~GBa<HW1VW*r^0oa-Xa9Sj=I{G6`3GHte%^T@PJ]1Qf&Vj71_-->966G&FG'Sf)'R-77#DTey3dˆAT§\P˜j[¨q^¨wF—oBtYeZ@_…NjzU¬z6“rS{T=joA”[mn]…RNm@LrB_m:OtLCoGTY7`k<^x7U†5`~9¢LË´lŒÿ¤¤Ž`}ÖpZµtnqI{œUVŒYByQOF0NN/TI,oX:}‡D‰y?˜Pq¹hŠšPs‹I{D•dššhŽÔtš‡U—cp‹›h®…K—“\¦oJ…‚W{‹^‡yHŸƒQ†jg|O\ƒIs‚N•}P—žlŽžf–›f³šo¹§~’špŒp|”k[TNd<wrMr^Ud@mg-Rz;P|3f†>lGs•X—]{¢U]x7xr8†œ_p†V‘ž`¡É…f¶oW…=f}Bna;¡kQ•dSX4vZ6ÍpD¯’a}†V€©pƒ§kis?cl8{sK‚‹T›Œ]‹§zv¨d“´n_’dY_2IG(Yq1‹ŠYn€dh^Rl`RyeP’bT~hG¥ŒK…V‰„N”—h‰s~žQ‰~Hˆ¸pºì‹¬Õws}Get<k‰JMs>‚³o“ß~©Ç]b¡GGB#LE&IAf=%zn:c<‘[ˆ]Ÿ¢Yœºk§ÎyŽÓrgmRZvYw…Y•‰S_|Ac|Ah|D[q=Vz@Vh2`_#fc)bh*hz7z¡Mv¬W^P\ŒFjQU~AocK¤…p™a¯lB—=CL(OE/iS;œU1™n>PN-QG4CP5:E$L@,|O=”]¢¿w°á€Õô¦œÖ‡—šf”¼y¶tÂ|žÇ…Ê„²ÖžÏíµÙÿ¾Þú·Çù¢‹ÓŠ{³“оŸ¿”žÂ€“«n” Rou@muLcxMmlN€}^Šœ[z‘SˆT…Pl…Kr“M`…;Vj4apCm…XŸ¤l¤j–‘o—¸p‰¥`vN`‰D\~R†¨d‰³^˜™^¤—\šœ_‚™`w g|›_s™c‡¢g—¬uŸ´h°m…§dw—VrvM}yf—ªy믋턤»–½ož¸p¹Ð~´ê™çs{¼oq¬lmž[ƒX~Igq8Vc;arPhƒRa„OcŒYV~KOk@V^FfmUqWhˆHfiA`b:RL8LF6NL1LZ.Oi5UsHu†Ri‹MU{Dc{Dh€IixNm}Jq„G^‚N\~F\{9]p@SvH]‚Si™dv—Ę΃«Ñ{”®]q~@\w?`}:Vf3W[:d_;g`Enxd‰”jŸ^ zZ„_‰XswGc_<Y`>UfGeWzŒ`{…`{‘n€¢sˆ¥i|›OYi9P_>YeGgyX`yWbxF^\0QM.EH<ED4:E/IC2[Q2_O=NQG6G=;E=5@9S;,C;+QB:fdAvHŽ–V ©ppÀƒ>¡’zV[RERaKjW>nk@‚~bx’f}‹y}|i[€`Wq]QXLI`DSXAMJ=LL>ENDEW;QV.Il-:P241%?#'Z,iD+w-*€D/GZ>HQJKJ4VQ2dk:dZ9f^B‡yVZ¤fM_rRE9^K4Rp=QZE`b8LiD;X=4A+5B/DD)FW2Ad7ZY0Lc0Bh>TR4T]17h=.Z<3@#@>\]$^~5lŒHf€HH—N]nJ[_<Tk>AU;IP39U-;L-QJ Zr>TvPHoLHSBhO(gv?kƒ[V‘P:zX<I)7O"7L1d6cz0=ŽePY8ig'P•FYySe‚AH†^FrMOqFv…XŽLrŒZo˜Sh™bw‹OŽLoknƒ]F’N-RBDL(Ri6R_0b]3NsBHjCMf1>n51[.:R'UM%Ta$NwBPtGC_55Q'DI'[^-ovE\‚HUzLMm4?g::X25Q(=HMOjX+av9He7Ac:m`/U’?9_ECU%@\$JS&3a*3A7657K?!He$@R)5\=KY+g‚;m…@v|=r{P{l?ƒj@šrN–®fˆã‘wî¦\ºš‚|RKU7G5!fS-~uEt„[r¢{uŸkg”_d’QfP]€HVq;Ok9Up5Yx4vˆB„²i¥{P£¼bb•z’z3¤OfÅ}‹ˆ[r—RešbJ“d_‘We‘YfŒY_‘HL{:}m7r|F|AtžM”®[“l‚PŒ¶cˆ‡W¯œf‰¶o{_Š{H‰’XƒvJ§j¥¢…—nÄV‰†ozyS£_} t•šnª|•§x˜b³‹mÅš‚—®–‹—y’wl”{QpfW:NT>Kg>Nh.[x1Z€<Pn5ZP!dU*YfC]_@Qi4fw7t‹QfƒFr{=}n5o{=_„GXvKXo3¯†ZaºŠl_=RnD^m?f‡Pmžj“]±¡[wÕ›˜i„|L„{J™‡W»å˜|̓¥’[iŒQWi:Dj<`h8˜S–„_œˆcƒ~cƒn`ujUjlM†Hq¥TrNƒ”S…r:mk5o‚O£¯uº½ƒy¬dozN[€Ph};Rc7«fG²Ñu„¸Wi‰>:_0=h8/b5?O/cwIZ}B€ŸcÑyo¾cŠÁi›æ‡Ünj…L›nX–ky¡WeEn’Os‹LZm<X|EBs3;M N_-^g)`e0g‚<{ŸX_›Ubj?x€Ca|HanWu}\rS:”V7Šb4XK)^T:\Y4H@"xB/uxIML/UK3EQ-BA'QK0s_A”P¡°`ƾ†Âæ Á|‘¡i`†ªgªj¥^’¥qÄÓ´ÛÿèàÿÝÏÿмü²¼ÒŒ±z cuqFxvG~†TosRkoX‹p]Ž{`“˜g–^˜‚SšuN}zKj‚Hs†Kn‘GTw<Kg=UdAŒV¢¢k©’`›’X•¢eqS{vB‹yD{…G…IŒ”MŠ‹P‡š^„¯~qµol£X…¸i‡Ðr¢Êr’Ïy¡Æ{š¹o¥°e‡¨ao˜gw•d‡Žb ”]“^¯m†¹f¯l³Ð¯Ô…›Ð•«Æ‡–gqŽ>gb4P\4Q`Cc{X}ŠY…‡U…z[oxRd}YOvLQlIfyGgx@gX9`U6^h=^c@do=Rs@\ŠDcŽN|ŠQƒ„N}vAvt>ep<heCosHm~MŠUz…JWj9SnCgTu“b{©d¸j‰¶g“´cŠ¥Y}‰RhgD^_=Xq>[t:jb6hg<cjEwSy|Ih_0KH&GG/eZ=sj>i[<w[D„jJpzIavHb~RjŽa¥`z•Yl„UftK\tDOpGYiJdpL_lL\kBPb;ON0?D=9C6WF0bW7gb=`eJOZJK\LFTGTH=WC;WK?QcDR_@xa?Ž{Držd/xaKLSŽ<]…VvPo‡Z~€oszlhoh^oc`XOH[FSQ>_\8DY>ZR9la3LbH@PNXU9Ef4X`7)R.878DG))U4H,-YF+eE6ZT>\\6WqEZlHyk:}];˜—\b“qO]`eF=^b>ZvH\^CMV:HTAGU:Ia8M\=SU8Lb;DW@Nj9>u=/T7NE%UT!Ec64X;+F0DP$Tb/pg5b“=VKe_,V6KtFDa:DC/@< 2K26P&TJUh4LpNCYHDW7ZL,]l/n~HqŽL4›]CJ:@Z%0Y3V=%tc"C¨aClH^[(m;v§[m¥dw±pz¶o†º}a¬z\wVfy8r}=Y“XEI5k>%oe,cnDƒTDk@W€F=rPTV5Tk6Dd7A^9@Y)6d0=D,8N#;]+JS+Yb+Lu;4k97K2;R"Y^0RˆIS…PSwMJy8<f37a63V4<X+@S%GQ*Mj,Uj:T^+a]/Pv3:~E?^07b/=G=U$'H&D .3@;H_"L`.Em8^w2Y‹:Nj/UW+Xp27e<EE${c.ŒW£’b¶ŠY¢®ohû©F¹ž9iSU>-mY5V9ŽuEr}OczIXiIMd<5H,=9"@URq.Vw9„J\›eUY3·j-R¹aU{>os-‡BÈn‡…_€Hбn•¯ui„^]cDdxEcHygEY‚C^q9dt5s4œˆD‹¿f‹Ó~—§a´•YšiPioM–~B•‡L†˜^ÏŸl®ŒY˜x\¾‡T u‰xK¨Œ\¤›r•v™—sŠ˜d}†N™qPÉ}e´¢y~ y ‰c¤kksWPO2[hBb€aOŒ]]vEO…M8R+71G]3KY2T[4FZ+^x0`ŒG]’QSo8LS4[h4m}7€p.``A¢ƒ_ƒÇš]}dMl8Ti5„ kš´o±jx–QÔža‹³krŽN…ˆQº·€øÿ½Žá’Ž˜^mê–ašde~Ol›^€ŒOˆ~@›‰HŸ¤cƒw`yiY„lR€ŸV‚‰]u›fd˜YR]e›_ˆ³l˜”aŠ£rUuGWD#s9'`a7^s@‰rM†^pšE€WŠ‚bgdt |YÈh«cc”X‰–a©·rž¿{¨ê‘²à}¢\š‰^“‹i –g›£_dˆOuYj‚UGa5TU6J\?>J*^…Y`ÀyO~>Wp:„¶q™á‰e¯fdIW}EjwVtxQZX?cJ5mK8[RBiWBxU@HL4HG8ªZKiŽRBP->G';<"MH+cX=nhJy‘V£¢yËÞ›¢ÄtuˆTe€Aq|I{ŠVt¡v‰Ô¹×ÿÞþÿéïÿÎÑõ¦·Î†—Up|Nm{MYd>YZG{}X|KoQÀ{n‹‡i‘mR›~^•‘Y‹sNxsFk}EhnBjZ>c^;Wi?Re:bnIŸi¢£u}PyˆJ‰XmŒNdy9dp2n€A…‹HƒŽS”˜_–™cŸb²dŽÄr§Út•Ãf•¯fž^„—Z}ƒYˆŽ_¨m‘©dƒŸW‹PzžQ‡«f¥Æf{¦TŠ™išÃˆ´Ë•¸ÌŸ§Pjw6Qb5HY=RaOo{U}‚PlwKjj?]]Ihvmyšvp—ciƒTYyEOiAF]?S_Iky\z `q§Wt¬Xn¡P}t?kc9XY:\m@XkC`jUnyW`sFt€VnJVw@YGjŠGm~Nnƒ^Œ§d…ž_l€@dh6U[9dcHolWszOg‹Ig†Hq„GvŽV„…K€z9VW-;N24U4:Y4K];UZ3VN2`U3hZ5fg@f€TwXmLbtIekGWjDQc:X`@YaFbmPm}OxNhzE`e1<G>:D=JI2TN0aN3n^:bfKRZMI_DlZMYTAFRFDKACU5Z^8ie4JzE/`IšA2w†2s«_™mm¨ibucHdULUJMQDRPFUQ=U]BA]FFS@\E4_P0SeE:YHJFBB[3ma2E^-ZT;Qb;>[LU14\G1NxD\^Jmg=[nOU[N}`<Ÿr>vœ`N}r]WGb`<gmNQZJ@^DIM7QO1\J0_`;U}PTfNEqJYhN[}=AqA>i7DW*LV+HQ*Ac6G~JKjF=Y<^M7fo6=–MHZAkQ"N“;2tOBL8JF%<XB3L1ND"Xa1MvFDyU?\BIQ9_Y%fd:ƒk@?¨NF_T?c.8S:EU.t_-L§ONu_]tA‚•Z‹µdŽÂ–w¨´²‹Z™o^Ž]b~Q_n.*†B$A0L6yK%a—NBŠSZ[1Wx9>hH@O6PE+>f3<M.JW#<_+3Y-1B(9D#<]-E[+I^*Eb)8kD>T1`a,[‰JiŒONŽgKpELj4B]8>X48K1;GCL#^g)NŠ9AsBQj3Us0R{=Mh6=h?9O)8G&;Q"+L(0?!;=R\$Oo3Xr9]‡GRANk-QL)hq.AzKDZ2`Q,†T,cS8xT.fOAÁB$«±jdÿÆH™…GL4BF3MB,vi;s‘QRbDa?7U.;J#J`)]|6\=y„FFlO6K*K%fEL~LKg+df-„s1m¯[jzV’g?†Æzkro|Ll’ZYwBbv<X€<\n4Rw4do9bjH„hA§ [‹½qw·dlŠcf€Vp†J„B¯™T°†X¢’n‰š`ÁƒW—tƒ°ƒ²¡mÅ«†ÒÀ °·Žmših‘XŸ [¦iá r–ÅŠ«ªy¥pMšpG^FXY9lT0hW1mj=X’[4gD0L3Na:Kq=Jq=Gs5Tw4Zs0^o<If9ZiDVm:Kn.Sj-mm9™ˆu–½‹h›oJxA’[”«x‚uR{¢gh¤l~fMx|Q§º„Úò¶úÿºÆxŠ SÑᅙ擅̗µwy¹}\ŠRkG˜y;“uA‰o@qBŒ›Qsƒ;m5v†K£¿q”ÉsŠ˜\™Žv«·Œ=r9/83!r@3‡ƒQ§›u“¯sq™P ¹q«Ñ|©kTͰ¿ê° ·ƒ–°y¥³u¡dª}Æô¯ ÔxwKªž[¡j}V—[w–hs…c`lHLP/IF3XXEHY=gJÇ¿zfœQQS1~b>¤•[Š¢eiEn€Lp‹_†¢e‘}YŽ‚\wvQ~iF¤yjy’olTehVekTÈŽlLRLaFN|HZzClzFlvN…¡e¡»~ÇÛšªÖ}¤hf’Yq™r”¾–²è³ÎöÀãÿÀïÿÏÞÿÏÅÿ½£è‹‡§`n~JcsMgiJo‡a‡“juˆdr‰\xt]p`’z\|a£{^”‰cpZb~L`cFVV@XK=YP?eeKitKr€a®’l”Wx}FqtD|TfW^ŽId”Zš[‰N|oNšTs„=r‹F“ªeºlu¤VbEn}Tj”ZOr:RS4klM}XlŠ@kn<iƒ@z‘O„ Kj{BZmO“‘nȼŒ¾Ì„‘ªhnNc†Ra}P`{WgbeW^‡JW|?Z_@noi€›ˆ‡©zwšfr¡ax™_o–Rf_…¡—Ô†‰Ëw·`r¡L^p3UT4O[;XjCcoDoiP›~]€tFgwQ~RrI`ŒBa;Rf:YjHjzMzvKhnBL_8F\7EdId{]{^‡R‰”OuŒQ€†QsoGY[-QM.JR:NpKUuLXzKLrDHg7JW3KU2KhAXtAav;Xa9U^9M^GUdDQkBQc9S`5Ya9ciBpvFie@WV0AQ83F63A-CG-zG$jQ2\TFbSEXWHb\HaXDNX>IQ7>V3IL7[T(Lf.'e6H>(E z…?{™fTŠfR^Q\T:fc@IkEP`GaW9Q`@IiEBhEO[>Vb9ne:[oCFcILR6LU5[I0_K2N^<6nAHG5‡D2\s=[€Ym`;VfJZf[quKŠNhƒTYr`t]IzzD_x\SWOQWBEkDS[K`YA^<VuJTuX\zFPxGT[>U`1DU1:V05K$XM!xa&hHDœ[EjQAVGa@0Q{+:K_S7ka,L‡BEuFmL58gB6HAIIH_3^\7RŽDFŒaGTMRV+Eg9m\8Z€:U~Q=uC;[ELW.lqAdŸOq¨l‰¹j†¯„†•lx•U{‹O¥V…£i’›pV–hIj]Xl%A};*h8EA0e_*i{J>ŠXDW?H['1[@1A&CHIN0@l/La3NZ(@Z:;`9?\.BZ/8_/@`0N_(<i2HY7^a/_z>mˆLKŽ[IcGKm78X11J%*=.9=>NW"hf,KPGl0\g/Gx;PV(KL$6Y,8A!AO"5L%-G*><XW$Or2^h,i€BQŒHAq3ES&b[&Tt:J`37L%97?*€G'9T<M1#8Æo5fñ V¤YŽPcrAz„F’\_kP[;IQ&Jj/Yr7X{<a`;f@AoEAS1]P,^r8\q-I5Hg.Qd'†t<Y°^ixU¢lE{Ð~s›liuEW‡=Vj.Zr2\|=_‰FrIg‰S`c<‹„D{§gŠˆ^»‚G—·Y”—O‘œe„³ƒ••|ÈoFŸ|OÛvJ´—cÂ’`㲓Íu×tW•sVueA½[8’€_¬’T¾¦f¢{}ƒV~gK}jD`gM_wDI^9>W2ZP*oŽEX…TRnGVk?kb1p–[je[›RKl1PU#\Y%lrCWzEIq8Rj){v>©fF—go„\_h5—o7nŠS`}MŽShoB|e<gž_›«kÌðŸÍù¢´Ås¥P~¡G—²Y‘°e”·n™¶l–³y€°ov—Pd?nt/cƒ3|•I³pw»leŽI‹—Vª¥l‘RˆxMÞ¿–²¼IV.8@(:E6ey\ŸžpÇÖ”®ÜoUµ¼pÈû¡‡¿„¹Âáô®ºÈƒ¾˜d³¬‹v±·{Äâ”¦à…‡¯gœ^¸µn¦µp˜]ƒŸRnx1fd1BU.>='ON<kUDju<{w9jn5T_.Rd;ZwEr}b’št™¢ƒ†l“•]ˆ—T²’T¥¢d—“e••dшo§»—žÌ£™Øª¥Ê˜§ÉŒˆ¼„‹½x– d…•kuŽi›ªq§²y´¢„³ç˜çš˜ä£¨Ù¡³Ê¶¬l£|PÁ´€îÿÍ÷ÿÐÓÿŸ®Ó‚°ik’Sj‚PwŠ`€˜g„ `Œ£f h’žs™¢{££i¢€M™eL™sR€ˆ]t[x‚]x~VgdDk_A…vO{l@rdM‹ƒa““iwš`sQy~P“d~¸{˜ß‡©å|Ía‹¢K‰JxŠD[};k‘SÂuŽÏ|fR_{Ox‘c]”V=m9=S.cP7niBbvGc†K]Sogd xe©n]—a‚šm½·¯Ï‹Œµb{ ]x™_o˜j…Ÿoƒ£`u˜_s‹L`e?eh`„y¡p„‘mzšr}œir–dw’v‰¨±â‹ŸÐk³ayŸMUz1NX/XR<`k>Zs@aaCriDrm@YoGn†Nk>au<Mm7Id7HgIWrAK^>fnM~JZtR]‹dgš„©q†™SmKtWy–htŸ][€<LU)BG6MhZe‹elŽau‹b`YWtFQtBQn?Wo>Ia10I%5C)EV:UhHa|O]ƒCUc4K\5Q`;Zj9lg=_Q0FS5CP4<J:@M6RG2K<1R?0VP7PY?YSDSU<XY7bL62Q9&?737-=F&+P)6E$r[ ’™;T·m7˜p>iSAS<AQ;@N9IR6IT3JL3RV5VY=Og:ST<L`<FU=GP8OO+NT1KP4bK.S[4T_Abo=Zh>fmJOyIrW?ª[3YŒ_klmuHc}Th…Rˆ†V‰„\X‡hX^_pS?ŽZ9~iJt~P`‚US‡\dyPgŒN@zRGN;?O%EH.:F*6M.JH!OOfS'ty0d¤O-†pDMLgZ1PŠEK~LZT0iP'Yv3u‹J=kD9TESU#Ea>WN3nn7O–]@vbGS2Nl6Hk<jc0d•JP˜WL‡Yf€Q|’X†©gŠ¥m}™Z]™p^}Za~@ixFˆ{9¢›aŒXS†a8igG;"Cg,9c5Oa>^p:^pKB{G3W<NP+7z?FVLEU3?=,Ha+@c3GK%@G#FY1>^6<X8BH%;O)If0Im3A`4RY0Zr1h:JRJSAM]+6sC/G,';-7GCE_+fh8L‹BBh=Q\#<n98U)BF)=]/IR3=U*;H,>`)>lNWl4Gs3Ve/e‡GM‘EGw0=^/LQ&SV#Po19iE5O(DM)q_5BS???$A9"h2À@ˆÀrbâµc‚XoˆG‰”Vc{UYsGGhEZj:]<Vi?Vd9\c7Lg3Wd0^f+Ow7^w0M„;;Y'QK\j3…i8_^~€X¥“TmÁzc˜Z_•?bAw‚@–Kq«T~—Ts¢\[—^ˆWv£^ƒŸb{¢iˆ‹LŽ¡]š’`çjFívV¬›“Þƒª‹”™h¡†KãzGª•k‚–ytoHc{O‰uXŠy\vhN’ƒE…„Qf|Tdv;aq8aoCMc:GQ7c]CfxZi‹O[’RRT6IR1S[8vl>ru<i‘KE~B>b)Ea"Y^.Wc@QnAXy<uoKs¡u‹¥ob¢mR‹Vm _w¾€rµl`“OFe=p„NºuŠ«]©¡OŸ¥Xr©YÇcs»]{ŽE”‘U¦Í‚‘´k©‘SŠ”Tpw7]v.Xt3gƒA’U¢Óz©¿]k•DˆŒSˆ›[i¬i“¨oÝÐ lŒY?K1[]MxsW´xZÅ rè½~â½y|§X¦ÁrÀâ‘§Ó{ÊxÉy«År¨kÂÑ™¹à”žÜ‘®×ЬӬÏv˜™a±iÉÊ|“À}p¯jVj@P^8W`7Nj5[pB€Z¬®}—Ôn{´_¦m†®p†¶}¿³„ÿ²‡ý°Å©y—n‘¥e”‘\³Š^½ŒY¸œd«™i·«y»Ïˆ´Ìˆ³¿ˆž«ržc–žj¡ŸeÌÇxÄÏ—ªÓ‰§Ó}©Ý˜ÖÿÃÒÿׯÿ©¯l{^5Z=$MH3kßÙœçÿ±½äœŠºw™`v[vw¢Õ“žÚ{œÄiÁh†¬Y’žd”«r‘ ]vb;nO7‚[L‡…a™l’œ‚“¤~oemjOƒ{XwYp“\kfˆ«t–¾t°[v‘O‹š]¥Ã„Àï±ì€ŠÁUp @p…9e}3Ts5aV„¼q”¾gŸ`YŒ[a…e€§€hkS}DGV0QP7bwR\‘_dšnq¦”‹Á¥•Ĥ‡Å‡o®v—˜Ôá–¤¯ep•`t•j{—p“et|Zs}TtzDicDibk¢{…•_‹zXn_u~aŒˆo£¤‹¥Î–´Ú‡˜¶d€¤PkDWm7Pa;ZdH^hNaGP}FX}N`ƒS]„So™YgNVzEX‰PJ“cW ~^±uKZUWi“PfVqŽc‚¦x µ~˜¯jg’SMˆUk‘l„§f~›MTe/=G1BWRbhs‘nzœvp›odŒT_}>Rk8Ib=OgBGf5?X1A^CGoHZxM[rHXj9M^5Q^9\k=bl?dY5LU.PF6bG23O8A=6MA,VF2LG>NPGUO:`L6pV1o[6EM93K9:R7CU1*M-WB#~[%‚…DŠœ_[°ev–fMYH`[:QDTG?0N4?84J@,UA./J;A)-=#:+":+ J.ZD,KO5[O2^f7ae>koCy‚IX‰KHsRc^A´q.d„RcqledBbi?}h:ˆ}L˜—Wl›bfŠsZdZ_YLjqIkzLk‰Pn†\cvTPyN?VF;N5>>.@=#??&1@$7>%1?DD#iF!yc&R¥VSv^hqNo€UE—XFf@MR0lI*q†;D™Y<ZNPP'0c8PE3ac0fxH@‘`ONGL[-La@pY0sšEn¦`g™ieyWmhLqEc¥cv~Q_XXƒScƒKR‡FpoJc‹B^U^ƒP*hz48&H`-Te3QjG[o?KtNQe>Ip?Xh:gv:_ƒ`2bZAQ8HZ-6l0-K*67AB >F/2A)9I':J#ND Pw1DyDQj<Rb0kt3>‘S7ZFSR*<h0*Y9&1)5FB\l4PoH\o7@ˆIQ]*Fq7<i1JK,UwKD`JCS-7N(fW+Zw9_ŠJL„Cax>_‰IS<Ev/:`*9R'SM+hy@MyMO[5WrFwlB^ŠMKf?4Y)5B'I>(¡T2‘³_e¿Ÿ€qHd•SLV;X_,Sk8\ŒUdˆUhi;Ug4cY1O?_j=Pl8Sn4V|3Kq2@X&=8IU,HP;vO-n¤M~‹G‚•LqÆfŒ_Yf6jt;{:u˜GŒA˜yU‚xeƒŠSužUª—Y„˜kwŸN‘ž\›q†‚[ŽrN¥uOÞlPÃ~I±¨lÚ¡“½‹¿uWœn:wuFŒ…ež†j¬‡o®†f“vi„Y^w>^a?]d1iu<gz8ZxD|lHv[:od3^—MEnNFO5WF.XZ>YN3`~<Fy7;[(HL`e)‚Hƒ»d§X¤b¦²}˜Ì’»Ê‹¬ÿª¿ÿǾÿĆñ—p¯fr•GŠ¥U¨UcœF_„;p|3…‡D¨ÖqÉw^s6xq@¥™R|§V}f<_™UHf3Uc.[Z)†}7‡’JºŸX˜Lfp5ll@|B”T§ª`Æ¢vEX3Z;1{lSyyX`†mƒ“až¹~„¶vvŠRž–V°³p¦ËvÊ凱ãžÞ„×sÆÃlÀÉq¦Êpš¿uŠ»u©½sÆz£Ì¢ç±Ì…•Ì}sxQsWBxOD…dEe€St}Q¹T¦Ÿ]—FÎP΄Uã›fä£wÿ˜€çxŠtµ}aš”g”_‹~b”…bº”p¯–e”Q‰{BŒvLyM}nAul?pm@{uLļxÔ阹áŒÀÖ”ËוÜý¦ÑÛŽÁÂ{±hGy=9Y5HeDz™lŸ²y±´~°×–‹ºqnˆLt“_™Ä‡½å„©½\œ«T´WŠ«Y¡X„•Ux”]c†V_vMk€XœoŽ©£¶‹°Æ ˃©t{†g‹œmƒ p‰µo|žc„•[s™Na…=eu6xm@ƒzHƒJ†“GnŽ9b„.Vr&Me'RS.xjDhBkˆ[{¥‚€½ƒ€£¸ym“OQ[,KJ.Z]Qnžwx·}ˆµ‹•ΰš×±Ì•…²€²‡¸Ïˆ—Êgn¡`p¡p‚ª‡…«}•¡qs•^eL_sXo…~¸‘¢flmQpmYbp^ewi„¡Œ¯ê³¶íˆÀ]w¢Tb‘KMsEK^€Ÿt‡«lj™Vk—d{·y†Äws¶sqfo˜be—nl«ƒ†Í– î±Æÿ¬ºì†‡´aq‘Pe~P^s]xŠb•šh™ j‰ªw|»ƒ±qz¦ap‘Uaz>=X0>TC\t\q‰k€¡‡ƒ«}o—\g~ISl<B_;L[;SlAMjGTvU`ŒXgUYuE\iBTf>Rd:[h7^d<_X/D8)]7(CK/9F<K@9`D/eG1ZP>IO=@F5ZE1TH4nS6XW<ER>4T=-E./>&D:WJb`2zjB’ƒO{[n¦g`oCTSKH=DI+`G4EH6_A3&L8'.-*">!m4JQ0KO:ND)DU+OW3Ye4Ss>V[>LT5ie@ws2btH@THKS7e[/„`,zb=~fT”X‰hr“mo‚`d–]e‹^rvO^~[jwVPmGMUK7W>9L:0G/1C-6:%9;&6@'7F*:K0w>$w|2vzWu•Ucua]|OHŽDB`@TN1mr0ZŠS<’RAZE9\9FU<SY=eg4K‡@BbEGJ*K].ei0~–Az·jM—_A_KOM2}S'V¯O`_YM[hFZ[8Yj2`‰Dg‘S“‰e_q_9gf=N>IT4Rd3Re2brCI{LZ_AKv9V^6{e3h|IgˆQN”^B{bAf<,h45;"<C":=,78%;J'/I(C>!]D!Wƒ4M„KCk>i_7SNLUF_CDW.7_*#WJ*+_<\m1Jk;_f-M1O_>Lt3Nr8¬S*ˆwDN~w?l@KoCXy@`„Nd†<[ƒJe‚EP‚CYx?F„6Ek0IW/Y^2al>ax>|nM[pFalEq]:VT<MT-bH*\\<qsN¹‹WvÄwu z` T]mCS{@as4zŒAl«dWiVtI|i;pmDn|GUxEYi4\~.Q‘L2rE79ZR'QiA]ƒHd|G^ˆ?~uK…ŠSY©xMtImd3x‰=i‡8ot<™Š]‚œsƒ²uu‰NŒƒMl¦gs‰LbcB€R9kaDbU<b^>nwQ‰ªh¬¸dÿÀm±¼jm´dnCœz@³w[½™x¢„_ö‡i¤Ì ‡‘o}’_Ws9eZCm_A[]=bQ.Vi1@j-RT&px<MwPK`B\N2w_AZd>Yv=ChDBa7>\,Lj/mi7nnAivAs•\Šˆ__£©nÒñ¬àÿÓÖÿË©ÿ¹€ÝŒeÉpr¶`qÆgi«PP¡GBw.HSˆX*el0Fh3jn.y†=z–@i|D~ŽIb“Mf}DLj9`L*|}>’Pg8TO/W]7UT.`P)ˆ_9siE;SGd†j‘Æž…á°ƒÙ³ˆÍœ ͈•Å}~°g}¯]—N¡¡S§®m²Âp¸]ŽWŒ¤`ŠŒP–vT‡\ŽŽj’±v·Ó…Êñ´¼ÿµŠâµ°s°¸q££_…`H›b=¢Q|^_mQ}lO‘iƒ±dŸ„\«qÈ›xë vÛµ†ÒˆÊ¦|«¥n£m¡Ž^”‚QžŽT¥•i}‡ZbrMYb?ga=_T7VV?]pUp¦~®â¤Òÿ£¥Í€•ž]‡ƒPš¥l“¾ƒ˜À…–Ó”tÍ_žko¥qŒÆ‚y¤YsgK¤«ƒ¾t\pCn‡S¥Äw»éx‹µZwChŠJs—Q•½k€±g•¨x‹Ëƒ|„y¬~†±„™Ä¨Ô¡ªÂ•Ä‚£·u‡–VŠ„N{{Kƒƒ[z›^^F^f3``6X\2S[1M\)IR.oe:x„;Zw6Fj+Ee,9['=Q&La0\{E”_™™m“¤`¡i—PVv;<O-F]Gt™wÖ‚€É|™ºŽ¼–›´’‡¥€}›wˆ¡ršµc~˜PnŒ^zœy‚«Š³y‘§deŽNr{[Œ“ƒªÀ›•µy–^‚fy‚_a{cq†Ã×¥Ãô‰Är|¼|x½e¹{p¸ˆŠÍ˜¡Õ†‡»kq§j{˜h‘—m¤qЬux¨os§„“ÆŒ Ñ’µé§É÷—¯è…‘¿g]ƒKQ_CYiWeƒap“]mP}•j𦀗¸‹·tl§dfQNrA:_DI`Ob€`uŸ|‹¨x}š_l‰SX‚Q\ƒMF|HNtHXƒVc’fm_qŽV`vBPa=JZ6FU6OX3TZ4HR0U4!xM'yY7bVHFTEjDCiK<HNDH?9BH+QH-JQ/OX8EU>4E21E-/N,*J+4;"OES[,`k;}pF‰‹Kq«[@›k6JR?97O?&PS1L?2<2*5+&1,;.16"i6mB PJ)HE/CI$EW*S{5JsA<V@9E-GC'HZ)MS(9g/7R+@M.T\4kW+yu<†VuY|_xˆ[‚¬l^¥ikŒan{Lj†K‚V~}Qb~OO{TM_LBd75Z2BE)AA+68)>I&9Y4kC+_n6}dMq<] f`t\bDQ„EXT8`m=]|Y`pLR“RIpKQl?SLlwKVƒEG~H;b5JW2nj3~…7o³tTŽk>wB?T<sG+o˜;`‘gspW_yD6_HSE3iw8{D‘±daŒuFj\29/CD&F\*Z\3Sj9=l?UU;Lq2Jk?Le;`i;€mHxšQhŽbS^5~W6Q/8G).7&C8"8H+;K.2D$BE+hd1^–ONŽWaQjŠJCR6H<EKq`(2f7$HH\I'Ri*Gv/G`*WW&O„CWq>U}@tZ0Ÿo5T~ZR^<\R2Zn3Qk4`i/Ts6\~CRbBWu2RŒ8Q]/Ck;I^6[i;rg8rb4V`CZYAQY3JT1ZS8nO7o`;bbD„U;z¨[zƒVq˜]i‡Ad”Da—TƒJoŠ]qmPe‘Ye€b[qK‡b6MŒTPk8_t2„…:IÃKuSWxI]uFgp:Wx:oz@jŽN}†We›_P‘Vqo7j>Qo:a[2xi>‹WƒŒZ_šUzgGoNWyHj`IsmRps\q‹cˆ–e›•\Ž’S—yOfw€Iny1or?}†Rº”G¯›]ŠYÂ^¤_t‘[m½…m¦{xn:mo=]n3B_6J_1I`=I`2is7fƒG[bCccF‰uNj’QUu=PQ=Qo:Sw@NuPS{H[u@dwH†‚StœcgmI–}>ÕÂãð¸ÜÿÊÈö¸•¨rˆ¤bŸÈl³òø‡Ž¢\Zœ^<„@Jk5Fr5Rf0_\-]M€žl{kI}qEud_nAYK%YB"}l=|Lj{P`aGedAMp6AT4^lBcqJ†lªÁ“¿ß£Äò°Òê¦Å豤߰‘Ï–~¿‡ubo^=‹iR}]Ž´j|µh{±l–¾tm£_’yWŸ}b°z\ª’i•©xɺÃꡲöŸ…¸jªšZ¡˜gŒmx{WŒ†d’‡j“q¤w¥s´¤q޾tÈfÊ›h„SÈ‚b¾”n»j°˜c˜\’“OƒšG‡‹K˜‹a¦¢`„zKwn=\`=dY>vsP°‚¹çªÌÿ¸Ã觇¦nf€Ra‚a‰«†Ú ¢Ú°½è¹ºöÚퟙӇ¡Êwž]EfEybZªËŒX¥_dƒT¥¸{§ÌnƒžBlm:r„L{µn‚¿}”ÇŽ–Ж©×Ÿ•ÅŽ¶‚”¸ˆ¡Ã•¯¼ŒŒ¥v˜œl‘£ar~Avf?vi;gjH‚‹Wk–LRn=GZ6^N6YV9N^5Ei5Sn6w9r‰6^u0Nn1Mf)=T)>J%OP,_Y<iiAkdFztI|rDpnCUn?^~[„º›ÏŽÖ~{¿qx¬x{“…{›Œ}¯Šu¥ux¢ai QX‰Yq”oƒ°ˆ‹€‰¬kzOc~Jyˆtž¢‡•¬wŽl®ŽrœŒog‡mi‹u›¹¹Þ…’Æy‚¿ˆ“É’–Ò—“Ë’•Ê–Åy·dv”Tm|D]`AooTЧr„¯k~ªrˆ°y“»o•¿}¶ÖŠ®Ì|©¹oŸWTuBUbSh{fq‰Zs†L]Eh~\œt¹}ˆºxwªei•ea‘\S~Rf_„ªg‰©_mˆLeQlŠYu›_xU^‰We‰`v’h{Ž\n…R^rASg>LX.?J->D%=?$6F*R;!kM&nR+‰S9NY?bHEMP?>H@Q;1MF,VQ/WR6=U?LU?CI6?S0>Z0$[.B='PMOb/Lh:XpBˆr>‘KK¢]+i\:I;OM1;S6(I2,3&*/*9(> +4$1:#7A"1`.2K/KI!}U(r‹5/ŽP<9=-D(@?+5Y(Ia4An7Ua3;N/KU6hq2ƒE…|Sqh—w_Šp@v ii—nh’^sŒWmˆPn‰YfyQ]rLPe>?N=9A.E?+_?&6M3:G?Jc6Hs:|fBV~EZg\ud9gMQ•gbuSZ‡M\~IcrG_†MrvSc€LV¡]k€M]žZcs^ON‚EBfERc<`r=}r;k²^U›mQbB:m4ZK5sv0M—`l^Jre>d_gˆpc‘ev’g“_x¿1‡}6JF=P)GY#Lb3Mi:Ce:XnF\ŒINƒQSnE[rBTwTpU:{m0rŽNOmUO~I<|D6N=>R1ES3AK+IU5Pk9Q\:nL0`AXŽ]eƒD@„H9T7O\&Gq8RQ'TuDMƒjIf9Ma<b"`N"_„=lLR~HYj6]1=hM3>&4;MFMj)VX0\j3LvB=P4RR&V~0O‚1JjAVb@Wu=8jIU<'\N0Nq>?XETC)q]-hgDghETQ7‚K1gŸ_‡“\i©\l‹T~¤RºuŽË›y´‰a‡XqrEss@mŽTwzT[ƒ2Qk/Xv2¤7’¶i|}WopEa5Tn1Sl<[kEƒxFv“ZuŠGg¤O_›RZƒDR{Fb{G‡“_|¡k€²msžb|“SmšN|‘O‚‰PŒT€‹P…ŽYrU‡b>Ši3se9€g2dv6Xu6vc4`h7uoB•V|ªjv‘@s~?{`DtOprKbn<bg0NX6SJ,fhBd‡G^’E`i<lq?WS8o\0…FY€DSg<Q_>TZ4_i.Yl@[€?XB_sAi{Jw~Q\€Gbw;‚M³‚Pʨt¤Å‹vy\y~D˜y?¶¤W¯Êzo¸tiXAoJ>W|H_ŠCešQW«d™‡m©¨xrqL^F4yvUVzTGg<<K+X5 wI#|f4jk2i`9]`0rv7‡”N‰Ñr’Ý”±ãžß¥´Û˜ŸÕ’·p—\˜O¢`…¼‹Q·z£Z˜›aŸ—[Œ²jž¯dµ¸€˜²z„‚U†bHƒO8ºoO¤¢oš½ªÇ{¿ÔƒÇ~‚”Q‹‹W˜ŽYˆ]“…º¡„ª|•¿Ž’Æ›€º‰¬v{™aœŠO«–Xšh¤‘k—”d…‹Y¢ŽQ¡_œ]‰ZŒzV¥]’‚V}€N¤i‚Ë{ ¶·äŸ¶é›ÁÄ‹²¼€†™afxOt}W—©w¼Ú›Çê°ÍîÊØúÆÂï±¶ëŸ×‡ŒÂ„d¦lR\@›aXš§ak…J‚ŸQ” @_t/P\+dfD–®u‰¹}—´Ž°Ï–°ËŠ›´j‰‘ašhž»ƒš³~w‹S€pGƒOnuFcj=de9^[2jk?‘O]E_qG`zRt˜Ty Wu£Xd‘M[@Yd3PX4S\9NU6QR16C!*2/+C5$P<,_J1`Z:U]>V`<b~_ƒ¤Û‰‡¾p†¡b}£v|¦}wœq…—o¤q޶ls®_l¨cv©j©l€žm{™`rˆTdKgˆe}œx{¤lzm}rtƒjpklƒa“žx®È{’¿t„©yާ…Œ¹~‘¾z–´o¥e|™Ok:Vc5DR*GXEo„[ˆ®f}ªb€±f…µd‹¹mаh€•WŽ€Z¡”[‰‘Q]|Wx€b}‹Xs†RhŠG[yCatVŸw¶|“¶q§lˆ_oJVsPn‘WvŸJZwATwH`ŒPiŽRrŒPpbršjr—ei†Z]wN[m:QX2RR)DE -7%467#0@!=<!U9 `@ WN*cR5AL5?A*B8*S<'NK-SS8bO;QZ6NM8BN3N?/)a*:E-FD!DG-TI.\[1\i=‚w?c‘IT{UZS>RZ<:[;.F3)?$5E#Hl.=};IC;=O7aP1Gb2:T5?P'KG$PR%<lA<b:=S.DS.FT5Z^CMr<MjDEf5[q9iv<{wE‰iHilNot^ze4h‡CdZhƒR]}GjŒNi„QNxPIbMH[94P5H>+iE&y[;\m@hƒO`NSxM–Q4iŠBRxkfVBnf:kqB_¢^_w_TŠJWd;`i:jzQh„Vtœgw®nvŸgR™eXcRPe7T}H^BSYHvj:{ LX¨nAdNEG,Hj0sg4R¦Z`wV‹€X—™|™£ƒ€™„Žl›–n ¥suÄ@ŒCoURr;U‡Fa‚JbˆMvŽWi”_QMP\8V]68oK5E/V>kJS‡Dt|Ur™Ec‡ZOˆVBsaGQDXd=5S7-.#?2jBpx2a£_>U;b>UW&De*fU.’h5V|FzZEa'@fd^"~w8f¢T^“M=v>> 5`:/B+77MN%Cd)E^1Yl1@q>@M4PO%[‡0qˆDr¶j`¾}j›l\œ^U—b\``Ÿ`Iˆ^_cN`yN[‚N`sGUm=eM=u:|¨u´so±q’¤l×´wÕµwv~knoC_ŒKdwBkwEa‹VU†PW{-Sz9{z2cœJDb>Qd$Zf.Uk>TxQOXFz}@€„Rh‰Nt”EE´oh¥kƒœ`’ì§“ô¸Œõ´fÆsLr’Fb¥RhYgPejA\bAmjBhpJf~B`yHa€TZyDnj2i|M’…`³°ˆÉ®u‚©na‡StŒdhmU\hEbs>Ne?US-La&TI0hVAZbCnf8eŸ?qvA^lAdxJj‰VX}I`b0IZ/BU/O_*pi-g€=cy>^i<ad<[e:MX,Xh1]r;_i?yP;ˆhEdoISk4Da%rQ-‘kOz}baoY`cImH<dW:uk4SÅŸsµ´}mpJ^gE˜blœ_m>S‚?Dh6E]5`wSSuIYK0fB,dW1…z6®Ÿe¹È†´Ù’Ö‰žÇƒ›¸Š‚¼l_€C^_3`h:ŒgC–¨r²qŒ±d…©\z–X€zS¹™aÖÆ€‹¸mnzMsM1d=†tF†‰T„“]•”b—¯vtS•‚Q†Yvm™¦‡š·‡x£v“šn™³ˆ‘À•‰µzž¤j–šg²®h¹Ãt–YhyP‰€QŸŽR´™ZÓ“\Ëšbˆ`•Ÿf¡žp©Ã¬Ô‡˜¾o—•g¶˜r¡Àz‰«q€¤mg—Z`ŠCX}E{W˜¼y£±w´²‡ËלÆå–¹×–«Ý‰¢Ôz¡Ôƒ[²[R`6€uLq™R|™>d‰4Mh,LV'RQ6zˆ[°n»†ÎŽµÏ¤Ón®D`‚>‚kQƒ]iwAYW0u_?zlBvmCir:Yf3U`<dvT¬qc¯i›_¨d|˜aufv’bƒ‡Hhb:fP9g\CjsRU]RxM,^/9K.:F/>5%E=,IL4RP=WuXi¨ˆ{‹•‰¯`d—Ih€[ˆ¨m}qf©mo uްwˆµcsœKn‰;q„<nŽKf‘Rf’Tf„H`‚K’i‰¤na”dh[hx[_s\jxS€œf›µh…¡\jZt¡p‚©h…¨i}˜`ŽgtŒQiv6Wd@He<L{La›a}¨a…£Vz´\‚µ\wšXq’ZdxPXqIjtQ˜U¢—b¢`ˆž`hŽS^EWv?Ld<[wSˆ‘X‡œ^›a¤f–†Xm„WyQo@Rt=OqGcƒD^†DXƒQ_ŠaoŸpƒ¦ss›ag‡RSwJF`4<M)>G)>C+4>*.4%#A(!9%$6;:T>#A=!(6#=13AM=%PI&CZ/RY8VP8/D8!.-E%"'K*G*$9 *1-6 O= UV.Qe7a_>/mD>K4IL,4L.*I2CC)pL%r7V‹OLoJM^7>d.VH"=M&5S;SB(Z^(LoA9fP7P-RC$DY,FWBFT/Sd/\u3M|?QgAVW/tc2bn3WtIhm?g…@V„W]rI[_9ckDm{Ib‹KIuKIR@9U8a@)uXut4j{AStEc^6Gˆ=…YBf3C€]ZNKOX;oJ>lo>W¡VZˆ`^ŒNcl:f{O—g‡¸|w·Šb„N›dQqJbi6\‹FU„SDƒ]k[?{˜Gb qBBFF4[T(u:^¤Og‰^etMjgHbf@\T;ZO0‚k9‰¯]–Un«Pq£sw©[n˜ZbˆTauB`c=Oe:E_5LM#Q[/:vI-R2.C)A;"h>!g‡;†™_©[ŽyMpuG\tV5wQ?;%/21;=jF"n€5I™YBhGBf8>R.TP!‹e0Y|^HiFGuCOm-wj!hj1v…Dk›KBŠGoK4Ee>4T@GF)MZ&I[-OQ/]t=;iC8M3VW({6«œ[œµuЬs|žgy–Z‰ŽMŽ£fˆ¸s‚¿uо…‚¿†ÁˆuГ‡Î‰nÄ““©{™¸{𷉆Ÿm~˜_Œ…NtmFRd3c_8htDd{Do‰JrŽSXRa€9W~0p~6h«UL†KKg7Yo:kt?ezRcuQvŒTzƒO{¥Vl“E„‡M¢™dq§pž{äÿ¿ÓÿܸÿˉÙnÑ|n‹Ptˆ9d9bq=l|MpŽXr…KŒ{FxtFŽr9—yLa†G†SœÊ†õ«tÔ±oŸ™`ˆŽS…˜k‚YhcAZ[1^Y&ZY&C^4O_3h_*r^=`^4]a8pi@i¬P–ŽYrlŽkJX{HB]1AU)CO&GE"Va.SY)TY7Xd>W^6LU.=P"M_'Tv@Wm>XbAdlKi}POw?<g4VO9keHz]B~YBzbMaZEuS;QZ7nO6¾w_§žlr^D_X8ƒtNU‡MTY0]\=WU>XTEpUo“a]Q<dC:q_Pcs@‡t4—aDœ{Z™€g†yXxZxrP_m9V^/]\.ok?¨c‘¶qo“Ox–Y…›YY„¡W§»z“·i‰Hi†Qj‚W|vNtb\‘cZrC‚m@s‹NmpE‚†S‡‘f„•U„IxN…¦q—¿v™Ä‰ÏšŠ¾Šˆz…°€ž®l†¤b~’j¦\›‰W¢}K©wJ©ŠVŸo¬Ë†ÈÜœÈö“²Ùxˆ_n€SxxNˆqI‡€Y‚Vv@^^3YX?qtV°Ä±ÿ«³ÿž«ö‘Ñ‹Ít˜·k›¢g“¡q¡´og©Xe‹O„Lk”=a?Jn:IX5K\3k}R›½r©çƒÆì|ÆÖi´¸`„±QdšF]—Sužcgœ\_‚Pm}ThuJo}Iu{Ed~F\{Or‘h‰¯o”±mo“`t€[fŠplŒbz€Slg1YR(^W8osX|ž}Š¿}®‚b›bcvInt@JeBEfHQ]N^vgu¨–ïÀªæœŽ¸gs’NmŽSa‘Vw–jÀ‡¸Û§Î¨h’Lbƒ>T|;Js2Zp;_ˆP`”K`>Zt2X|Hs[rŒU]9Oe3P^;ZjIs’^¯VgŽIUzIn\yŒdtŒeqpt—ƒv›qYzLXzKd‘duk†»c}¦MwLpŠMzOiŒTh_n]g}KhvMdpEpoD™sNª†SŠŒTrP`€PP}HV}MZ|A`Df}W…–_~–\{]˜ŠHoy:Lj3Ql:]y:Uv@RzHa{Xu•jŠ r„¡srnXƒZStJ:`A6M85S?7VB:V0&B*&A#*;#D81++K4-G%9A-J6 Z?'PR/D_4;L7&=.E/(/U*)J3*;"+?/;!9B$JM%JY5E`<:[<6Z8GB7L3'8P)HI-WY(_l1Os;@b85K'8Ik:JD,>X>JD2mG#J_27iG9Z2HU!8S*3I6AK+V])Sb-Bc3B`@E`5QV.]\0N]/hn<f8SvMYgFT\1[e<U]@adGSˆLK{NBdDXK5b\%X_3QS0PR0ah7k_4n_5‚P2`ƒJgYUb[7UcDT\N|E3qžDofY’Ny‚J’«k¼Šx¥zsu\«‚EV[`<tb1r¢MN¬dn„e|œVN«sDc@5m>XN+yq0l¦KWžbFƒdAlM2Z<)J4L5)}m2aXij…‚?e¤IZyeTu6Vs<Of<Pe4Fc72^.AL%S]0Gh@LL4JN;Z%LR%t^(r™Ho›XY]]k7\L5cB%BgD:oU2]M0R<PR1_h1K_/Sa8Np97wIZY=qm5Lz^U_CMd$TxFX}0Yo3hi7b†Ck•Gˆ„A‹xRy~[amQXl@da2diI]„HCkJ@\AYd:|v<~…NfuKfeA\v>e„H`z<vv@”U{iƒT—«k¢©vªÂäÂŽä¿s¾´r–¡vy‰YlZr‰H|¥u`œ``l0kv:d}E{~J‚ŽV…‡VbmIWt>]y'{‚2r³]]Phl-S…I_h>eq>o‚Lf€OrCgƒDŠD•·p{c§pâÙœêÿÕäÿß¿ÿÁ”¼€…—\_ƒE`x6b}2U„Ay€TŒ—ahškixMgj<`r:zr4`†UÿwHÄÁ‹Œ¨zmUszMwpGnyPKeET^@VhB@n;Hb4Wm<P~JW€BTy;Wj:di?fbBwsM§Tƒžd_nNRf7M_6CS<3C0DM)K_.BS(iK&VF-OC(CF"=P"IX'dc6UsPZi=XC/VD-RR:K`EUJ3lYGUYD]K=gMD`H?dM?ZO:bW3Ñ‚Z¦¤wzlSdqS|‚[m›kdlKi]CiRCsdMywRmtJm\FŠnZ°nQuf=dv.l>˜–Q“§ot€_riLa]=CN(E>!`C$w\0–z7•…Fl Wk|IsœWh–Pt‡U©¬w‹®_Z„Bhr>z{KyŠZa¡Z^f/F]-D^2VV1W`>}i:r=^|4Ur8Yq@gr@rn>wH§¢r›Ï‘‡Æ‹„µts•Uf…K{ŒY°s‘œa~ŽWpMž“h¯¿{¿ÑŠÈΜÍ÷ Ú}¡ f‹ƒRlrAB>%D/S9#EE&04O<:Œ«v°Üšçÿ±Þÿ¥Âü…»a—¥^€„Jte?psWzX€‰]v“Y{“UsŽQ~‹OlzAgh5^c*q„C’±R©Ìb£Ñc‰ÁYwIv¡Gf¢MxŸXŠ«_’ WŽKˆƒN‹|J~ŠQzSy‡Zza|l‘ i}¥ZˆŸZdStŽw{£xeŽVLq><f7TzIrŸs…´‹—Ä’˜Â•t¤gZqJ`_>evR}ži¸}•¬€žÉ“²Ô‡¦¶fy‡:Sb5arIm‹RhŽ\ˆ{¤ÄŒ©Äs{”JWZ0X\)Rk1Li,Ji*\h4^o5^t;Qr=XzH_…\g~Qd|ELk86b7HjDp’YyVZrALi;VlHblRhfiˆpy“t}šrh‘c`—e‚e„«RyŽAms4Tf.IQ+U^1ZwLt¥xµuŽŒ]vxO\yK\vF_tJjzK{|K…xGp|R‚™_z“Kes>Yl8YjGxzY… a€¦Pey6Oa/Jl3Jp6Jd.RP1^Y9UbKZoUi}`sˆlvŒqp’|s£wr—kU\Rt]UwWXrH+>%,:%3?"D7%0:)7@0E'>@"9221O5&QF3WU68Z=_L:1d:2Q<3>%1G#1K(FD)Q_8IqK?eMHT>2b4!K-E(&DA!@H*IM)Mc*;T+/J%<GIHOF+OJ7B[:8\4GY+KW)F`4=dACa6Ro3:Y6?M0>V-FX-Ta&Bd<Oa<DZ6E\1Kg6^u:Rx3MmEF_9RV-Q]2Xm@hlBd‚J]–R>…QKm=LX25P4=M(P>#DN%BY3QG*ŒD(ha2W_]^H7wQ3<n>RDDS,qžLuŸkˆœTŒ³jmŸ~|j… hi«P›tB†ZfZ6~y2zBo¹]†¥mAÀuTQK9w3UV3q{7{”Xa_O…bEzRDnG?jDVfAr~@£_WÀicuUzm*JœNRsVLl/Fn9YV8Nj4An2Ea)Kb22n=+M95;<<C?!\Z'o~;m”JQ’LMmF=U4h=*E&}_4ZiLJbANs?>g;<[4DP3]Q&o`4fsF||RPYA`JNZaq"c‘CXlHsG-fe/tŠ>}i2=&oF(ZG'S_(mT)kv9fGj{JVqN\sAow9hƒ=]cAPW2^l1[€Ars@™i+‚–Ks·cmŠX‡ŒOš«d…˜pj|XyoBŒj<}~D—†Dl‹J}G–½mV|lr;w„C|‘_ˆ—glhd{VfvH^†HR†;wv7o°OR—UUvD}sAZ•O^uIenAlv;e?_u;³ŒJâ§vã›ÈÖ¢ïÿÆùÿÜçÿÔ©ÿÏoªzp€DZ€BKp2V`!mw9sU €S€~UfgBec9Zp6l{:{q:‹‹aš—aznO†pCŠ„]lantMiY:wrIi‚P[‹bhtUs_nXn›[lž[}©kd‡[waGm{‘_}©S_sIHe@Qg@OjGKoHRk>X[84c*@? HU$HJ%LF*?@(GJ$FL)e@)hA0QeI[P<V[7eY@SvIhWEndSoeRqeVkfLgbPcWFd`@§qH¥pB”W=‹^H¤’l–žv•ˆbŽƒifnMwwPw•_j…N™|OÌœ`ŸUuF_’Ko‰7š¥X°Í†…»v[iCOP4Hd4<S3A9"SE$[h4`qLz™lp£]nŽNbŠTš_¤¨g‚vBXX/S\,a`;Yh?nuG>p:BS,K^7Bb5HX'IQ&O_+Lj*D[7J]@LgCBpG?rC`wP—•m£¾}‘«_u€C_o;wzV·²x¡µt‘©vºzŸÂ‚°r•gÀ¶˜äù¿±æ ±È}Š¥addBKR34>*7D(DS48Y1/<%}KA¬•[Ç«gÏÄqª½_j…AmlM]–WJtAŒvVŒ‰]tKbIryE~ˆcˆ‘]ˆ`\uKKP*DD#hP0Œ‡Rž»gËjt³WižEp’KjŒJs…QŒZu‰Tv…Uƒšl‰§hЦn‡t„¤zƒµŠÄ“’Æ‚‹²l„Xg‡QzŽcq‡YeˆDW†?]‚Mœvº’“¸’™¬†–¨v`RfeFjgCsxK—^ޏp‘ÁqЍ_tKS}<Eh<MdIg„QbŒPqV‰ n‹©jvUCf39P!D^#@\%K^(J_)D^$KS(M^8XtNl•di¡pm¯nÇ‚wÎ{b´[j¥WtžTOKEf3GV2M[AXwWl‰nt”`yŽas›[€£T‚“Ijy1NT";J'JQ+AG"6<"G^Dq—tœÁ~Žªa†ƒPwPbzJi|Ux‚[w{Odp@_cFŒ€Fƒ€6Sg-K[(EV0RbArvJqy9Xf0<U;F^?Pg9Db88R7:M4AN6KUGXtZb…^sŽd}hˆk‘bƒ~XgkLg^JfaA&3!./1<%A?"#3?3,61=2A:9EG(FI1OK=zL>Qj?XmE2aH4S:=B(:Z%>T3g^5UQDkaE]KZ>5RH2I[5NL)LT.?G+>L'1S"/D 6EFK^@$TV6^bAFqD@^<MS6KQ*^Q/Nm5Sl>Ks>=i8FF*;K"PS*]\)ZvDUdADb@Wa5Rw5SrBSm6L`;?d3Ha7Ub6`p<gmE‚~C`™SM…jRhANm;Bf@8Y79T3JT*Of-HW2]K/iR1DU4DZ5Va9?`9G[.]^0yl:w LƒŸep—WV‰bruQ‡‘Os nb¡~Q˜lIƒQQR2ja4|v3¬jJ¸nJƒbYpD^‹IeyGy‡T]¤d\†ZQ{QOuNRvRi„Rtœ\‚ŠfW¶Y?}kiZ*\q!EHKW3F\'=U-AT,MV+Fc1F`/?j:,[>1J11S2;T6drAVUiuJ`†FTeDOT.GB,^?(oK&Ib8QO&Qi3EV+IV%3V0HB*‚S+gqDx~TV„WAhN\i7j†3m};?rK9?7U=_n*=w5Q6&>D$:?"FX#o].i…KcqKflER‚GNqHepDV†CJg;Hf=^n=W‡GT}Dc~Hzs>s˜C_Zgl<vu6jzDc‚QY}P`l7`x@duH[t?|m=¨ KgÔ•`‰d““Q¨¨p©Î}{®i`”P\z?_c0_†3aˆFiˆJ[s8Rq@ZR2fZ0c…BV‚G\s9`z?q‚H›‘P©¤WÆÚ–ÚÿÊêÿÉßÿÅ×ÿ³¿ÿÃrÉ•‰‘hs”dDŽ][i*g}JdpSƒqMsOgAdl8cf9_xLz˜^–¹€s“^mzB™yY¢Œ[‘¥wŠ›€‚hksU‰\@ÅX„¢dsD—jI•lŒ kŸ¥{zfoiC©©ok£n~‹RjžZUn=Xb?Xh=ZwAPwHEj:Eg66Z*?O%9G#H>"@R*<K%;R/BI-G<'s?(pnW`uTcb6nyJixNv\CxTIwZMoZGpZI{ZH¨_I‰lL‚{N`Q9H8²xUŠ©n”`<²fIwY’]·t~ªj—Z°¢\‘µ`е`µd\°bŠ”@¢¥b€¡lOl<\F/ga;L_8EK6FO3]iA~‹\‘¢ji¤bVn4zzI…j¤ctuMe[>\qGf|M]†TRyDHd6G`7HX0RY)Jk35[(?V/Dg,:Z1F^<NkG\uK[k=vf7’†]™›k}¼s_‰WQzJe{U•«|ž±z³¶ÂÁw¬¢o™Ždœƒ^ܹ’ßð³©Í†¦¾|åµzŠ`jxQQiKXpRe}Xu—_j‡T[pErƒJWx;i_?v•d`§aN…DuzKn’W}‘W¨–a”›]~[qxH–sU˜vKˆ}@wY3X;!:62;BE$oc8˜Ÿb•Êyx¿ijN\ŽNe[j jz¯s„¯v‡©g‚ŒT{€T{VƒŸhŒ£qœÆ¥Õ’Ê|ªfX|MWtSc„LVƒH`†CTIb…\Ÿ…‡²|‚¯x~¤ih—P]†Fi{9`~ChˆSt–eƒœapK[rAPc>abKk{fn˜noª_`NnˆQ|•TrŠZV|D<^.BV)@K 8J'@]):V&6N"CU,Qh?i…`Ž®‡·åÒÿµÁöŽÏiy«Tg X]‘WL{>6Y&.9:;)WN;ssKqEoƒB{}Age3HM&2G"1D EL"HM%-C"6X7_„arˆ`qˆ\oyRmqDggQeˆ‡Zp|FYa5Ug4eg+Gc$>\*>b/Fc9J_6NX0;K4FR<Vd@Pb@NZKY]F^Z<KR0GN7HR;OZPdvdpˆak~R]bF[TECR>6E0:A-6/66.7!+7!$A;$#6,1377A ^H&VV/G\?VRHVQ=|S?NjE9kL7W@KK1E_2joAfJ?j]I?E7V2)B7F4/KS+Ka3<K.8F-:V(/].0C%IBJL"SL.eW>jW9>`?4Q<8F+7F#O?%ST(F@.DH65Y(6K*2D ABuR%Zr8J`DH^;Tb:RuEOl@Hg1Y\6Up3ax;Zv?Z~@s‡>~‘Wl™b>ŠcME@Ui.Mr>9h;;K4GL)Fd+C\<KS5JtGRu[ksJJ‹SCy`[yGR{:_t<f|Ak—Q^ŒPSv<in<€ŽP}žhošnZiO€UOz@Lp9wb6xN~¤tf´fe¤obŽZ[€Mm\u›cg”]X”`\‚SiIl‘T]\cƒT€vK9ÃkEhMZj7@{*AbE=c-:Q(5G(:D$@P$LK/Bq58N2?7EL(elFr¡^S˜s`ZN„R@rCG[?JO:FS1RR2FO3RN.8j48C'AX 4A#TE-{U4m|Q`yW\|``tKhŽOb…SXeKV[><c??A-V[(:}8F>$F>#==#OW$€e7]ŒUW}MaŠITnB[[5dhAK…<UL-]mE]HY„DjB^w:Zt9pf)[ˆDXZ6WY<zi'‰qFZ^>[c/om.kp=dnDZl>¬ƒA£ÚƒÌž§d“W€ˆK]g=]j;I].QW+nv7xšDM¤_Yv=a„HJ’d[€Kl‹E`LiLrŸ^u–Pz”Q“}CˈHãèŠäÿËÑÿ¯Ðù ½ø®¸†‘œ`“”]X~;gv-nˆ:\yTmp@ul:gm5in7n†Pyžaž“c’‘]~{Q†w]»“v¦Æ”ºÂ‘û {¼¬Šš¨‹n]•m9_r?OhCq[@•pL’g”{Rh§m•Yui–\rf:l [\~U_T>LL6NB/D<+C2'M6&Ob2Fi:>R*/7 ;3:Q)[Z9_TAFVEE8+MHoÑ«P‚WfrEœ€NnftaOwc[zdOzcP‡R<rC0a5&9.o\GnQA~dBˆ€Q^xYqM@’eG{Sœ¼n¡ºl—†Z¦¤e•Ê}¾r…³b’»meµ_•Gƒµv[†QXd3mk=T^>XM;[aL`_KŽj‰¥^l~@Mo5ai;~Q’F‡J|jBjl5cl9hwBQo@Lk;Gj?4I)=4)^xSAŠI;W4J‚MPŠEa”G_zAZc5VR.AP:maLwj´wl˜]Zd;atL“©l‹¸l—¥i®œj®žqƒŒ]¡oO³¢pÓË…ž¼y¶³Ôñ¸w¯¯p¤‚`°o§®k©[ÄŒR‘o>uzGd‘K_„QŠ |“¼ƒg¢ZKt5^f;bo?n‚Pr]“[‹PŽvCx]5_J+LA+79&74"8B(>R*:X&Qd;N£i_m—Ol‹Rtƒ¾‚³z²pqŸaf„NclHlqZynš±}§ÎŽ›Çƒƒ´oy°re¡i_ak‰b`‹Zh’Xm¢ku§k‚±c…ªYyŸOp†Dd}?\{IXyB]€WmŠWq›ed”cQ`OaS€aiŒsq „wv§\bŠJpšTm¡]dMOy4F^&>I!<F'=K,?S-9O(Ba0Mi>Z|Vzž€Ø¤ÖÿªÅÌi€¯\t£UfŒM\†HF|<3c;2];:];UkA`k8_d/bW/\_6LY38Z/3N'5P'BV)AS(<X8U‚byŸe{VtwYlyStiI~iM|mVžW†|B^e2Fd,Ed.Ff+?e0Bk3Ch4A_5<P02M9DR7Mi5Ti>]jEqiRjhMY[4VU7HU7AT8ISH_dUg|`c‹bQ…cVTX€@A_2/*#.&219&A%"< !2.54JBH.YB,`K2^L4JM6]C:^S3RQ@>T=>X5TU,Xh1_sD@aD2F9R7&@\.9=7D@4JI+Qe:Jh7SR.Kc1/^0DF(JFMM"PO6bO:<Y=2@47E"0Q*7J5F9'3D'2.->-!;E"-X&2>@AgS!LlAN[:ZV.^_<Kl=Ja9df.bj5en1\i5_k7[m6uq;‘IiˆV>zRKF:Kb-Kl6Bd4:h2AT-NY2Gg@kUAhnQdŒp€jdl‹S_˜cX‘b]sKTz<_€Ma‹NK_O~Bhp1x{EmŽQk_RˆVCgGQ`0Ko5gb2z‹8|²ko¤dzƒ[p®YU¡ihqUkŒWlƒWj”Rd¥Xg‘TRuIRa=OiA~\Ga¬II™qQjSWj-Cˆ;@aD<\-/C'6>!<N$BE-Fe.0W@5\"HD'|U,gTi€]Y…VWkM\DZk:E|WKJ;NR-Ma4T`8/e6;<'B["KE"nG%“T<Œ›Wo˜sp‹hƒŒT‘qKjpEOqEA`PH^6<rHPV@Bx:;P0:D(?0!^V$v„9f‰Ka‚H[{IP[>R<%bB#[‚:\v7{Qf¦faƒO^ALZ>ER'ZV"Iz7fK0BQ4h`1Ug.Q[:Uf5`n:fu=Lx>f~B›¥U»Ék€ë qƒls‰S]•XLo;Nb3E^*ZS*ou;|–Ll®WXŸ^{vCpq7bwA\q@fvG¥U–ÚuÆt_™PPxEph=ä±aÏÿž¯¾y™P¢¹dq”Z‚x?yYOƒIZm)gt*iˆ2f|:dƒEWo?ie;€š]v]fvAjV-ŠI2¶I6ðzW½¿–Ñ‘xÈ~c»XAÎR6WbCTU/xO.‘gBrzQƒ‰^y¢iykOŽfÒ|°nSjEUY2€tIpº}`^CU>)JB+BC,DD5F@/Q>*^D"<I02?#/>EQ'aZ:}]@„gRNnY˜VAÕШd¸‘^ƒR}‡R•…bunZŽjPƒfN~ZEnT@`C4WL7eM>‘SAqeQkvJvSsaOitUzuD~N’›Vƒ~HˆV3»…P§Ær™ÍzÀu…ʃ†¾a±qœ•Av”\\sD_e9ilDq‚O¨Ÿ`—¹ƒŠµ‡pžmHf1Ud-Vh9qs?t‚Oo~Ebw?Oq@Gb6Re5Yp6TwBUwJCqKOq…¼lÉŒ<n;hjBj—Tax:FW&EJ4hoJrr¬ƒšn¤»xnÆvCoCS_8~kE}Œ]ƒ|QŽŒRžŽa–”_wXš¥p¼p©ªsªžpË»ðá•ÿã¶®d«wG¹‰Nƒ‘D‡s6eb7cxDp„IlzPƒ‰^Žš^m‘NKt?Kp@ZpEY{Js„Vn‘Un_t„Olb5OK.ME0HB*A?'BK-FZ1FjAS‚Mf‰Qš`‘¨st©bZU€’y—Ëž‡Ë‘…ÂŽƒÐ–Ë’kºtNT[`H~[˜q¹}~®s‚³pŒ¯vw«je“Zm‰_p•h|²f|¶axšKg{<\s6S|JTƒXN†T\sJkuLbzCds=rzL~‚kŠ—tŠy€µƒ¾‡ƒ³}¹if¡L^€?{‘JnBVy5Cg.7Z#1>&AH+E]8Cc0Gk9\|Rg—`nªv¢Ä™Ê曻܄ ¼hŒ®^oœPZ‰P\‹`a˜b[žl[¡e_“TiKrl?PS+NU+U_6ppCgkBJd7Gi:Gg;D[2Ld6W|I”Y~˜Zg„V`uV]fNppX€z[p‚WyŽIZ8Mm<HsEE|FKo>Rw6Ki8A\<>\AM[=Lb9Ie9Nj3P^9ZXWyqlWzgBo^UdUefHUnO^qUcbvŽdrŸ]hW|wLki:%%*;(8 /5'?##:#27"MC'a.1C6:=(7?'>@&OB(‚F*8S4@>4>F'DQ&[T,Nl22gA/::2,"c2!E_3DO;DG6IB2]M?Nd=OT:9W.2Q+BFBOeIYS*O`?0U;:L2IT)Lf:8kH>D3AB&7;0.2,:0 /C/J 8:sHGo>DZFRN(UP,Eb0G\/M^(>S(PO&Ri2Kf1Pd-^]-Rg2Pj;EpAGO?BM+=[,>O3BP+Bp6Nf3=a5eD0s`0UuQXegna=l„SQƒgUmHfq4j†?^‘SW…RVKVB\wA]q>\v9HxCBg9F^3FU+_a.„Œ9x jg™af`vvPm˜T_¢b_„WX‰WpƒIa¦TH„U@fNIZ3Dh:WZHŠk.UÂeA‚j`hJP~&BxL9_:.I(5B&6W*NN/Ap<7cPFX5Ot2jr8Z•K`ŠYSˆTZzIR…Pm–UU¬kA“€Fv[YxQVœXF‚]@eKBa:Vk4_^>¼G<¶Œ>|¦zwmWsPOI5QE"\> EP(\T-^qEL†_^{[E}5EZACH6hd0jE_ŒIVwKVc<Me:AH3cS<jYŠŽJ´žWw‘^muJl~DMqMEZ2R[#V}6Qh@s]/T…OXi3U`1Yk8au:lPy h‚¬r—›_QžËon®‡}j:l”WUƒJOz:Ns6Ga;z_;|¤JvQgƒQMrHNa.\k2nƒG{P¥£V«Ðu¿wžS~¥r¾‡Óð¯ÿžsndƒLhsAN`6bO*oe2Y˜^O|7^z+hƒ/ns6w‘XX‹Ww‰W}±x`—ZGl<KR-JW7gI7¬gF›³€¨›rt]NY<db<SlBb_IqaKŒjIoO¢ƒ]„bg_Hž|]¦Ä‰k«mWq@_Y4x\=¥vL–n:5&;2$@2*E=,BC0AE/:F+A@*8:.7B&;O%DM-D`;^L-uW1ol@ÒŸlrix™T‚«t¸Ð‰šÜ{´‰†˜s‡€fllSiVLoZG‡XH—LDeJ{‹XˆŸkoVt€EyQƒ¥Xƒq?IC/G7*©a?µªY®¹t¤ÕŒ¹à¡¥ñ¥‹Ø¤Y±pv†>nŒKax?ruT»z˜Ö¼Ñ}‘¢j~yKRh8M]-Ta6ig6ppD^tNXvFT{JMp?Nn=Jj9YkAg~Ph•n²™«âÑÕ©@‹P>L$_e=Lb6>`5C^4poA‹ˆb¼¹™€³‚†“d¤»vY¢VGqDJ_8‹d=Lq~Ct}L‘{Oˆc ¤tŸ±m–š[ªcز˜ãç¬ÿςήaz‹Jnu>n€FY}DVb?i‚Plœ\j™b]|RstUnŒZ\‹Ze…Y`‘W]‹]i•hk“bvan”P`}FhfE„dR`hEI[9GN8OcQ]‘[}œa b‚¢g’³qƒ©ed“Oe‡]™¦•¾‰”Á‘©Þ´šè·šàª„ÐŒS°eM„SsˆX i‚µt®ln•]z‹jq™tp²{Œ·—É‚·tlŸ_P~JO{PXŒ]i›i›hXŠQ^nF]o4Hj-ES.X[3ZZ/dU6|gHy€V…‹X›Zv¤RP9W}8_„;St0E].Fb&3V-0T0@T;[i;Uw?aZy°q²wŒ³¿Ú‘±Ïu‹£O~’HoyAXq?bvNg†Rj‹`o”_mŠRdm>b_4\S)KL-JZ3Yc8jd<qbC]zGS~FKf5H].Li5]Dn„Qwƒ\p\e}jœr‡¬p€°m|ª_f•JOqDZz]mœ_^˜L[{7EY/?I:`_J^gAYnDZs@Gf,<C,'H&<œGf¹z}†hik`dn[jvWy€^—Y…{IzzPbNWoB4A/;'$.-5,:"@#,1"K>$+U++K:2;*-:<:D9EB)4S7;;46?)EJ'ZQ-Ik2.k>?G;AG4\=*G_39cHLC@NH/QF8_P=<T8>C*3R#6=$4B!]L"KQ%BW3H]0Mh>aa;TU65O>@=)@@1A',0&*,5*+<2=^DOv9HhKES7BQ.JS3Fa4<W-8R*<P*?U.=V07P-Ia0Yk;Sp<?T>;=2AE#Hf3L|GKmFJoEJl?@q;Q]6MV4J\EMaHm_HtJCv\LaLS[.Zp/Xt8XwDZ~HUNUCH}OInEQl4Ff78[43T4eD)h:\ŒgmfAVŽDWrZpuTq—]džV`š[o¨Wh eN›eAySMlEGnFIqQzrGh›PQ–mQ…ahuAKŠ6BhB4_/;a3KnAYvBVPP‚[^ƒLZ™VeŠPs˜Sp²hn¯vpªu|u•»t˜Æ~ŠÕ‡À‹³}¶x|²u^°zS—b„;T¦^yi¦—a|µgYžn>kR6?04O+/=#/8E-e6"td5h¡kl‹O_jKU]JloCf‰@eyLZtWed>`qFo‚X˜’eu¢u˜‹C‚~@Ub:g^.…x:\zEEcCKZ%\l8SƒM„mIhn@LiHSZ+[hAnOŠž[œªeš²hˆ²‰‚°iª‰[^ÃijXvjA^CiˆNh‚NfhBej7m‚D`t:g]<I_A?T1]]&sp>izKŸ•Lª^w˜P•£Q¿É~ØÿÁÐÿ¯šÜ€hŠZgV0bEVk:McDgQ:q—X[—^U|1X|+}w7‚—n‡¯|vª}i[C\U1OY,RW-jV:paM˜|Wɨ}¦‘sa`Ffd@~[Œ‹eª…^€y[‡aIƒWH£jQv`YH8…uT–jyžbZ•YNL2VC2¨_K[ÍŸBNE<B2P<2TD2A9*:.!G9$8D'=3#;?-58'B:*rK/ThNFW9i]3œ¡tp¤pxŒXŽ‘d¡¸‚¸Åв»„·¾€ÞÜ—±ÈŽ¡vƒ“oƒ–wu“w{x]“‘YœœgzmRfvJ‹’Iœ®\`¦_L_NN_Fnf>¯‘I³½e¶ØŒÏáÉ䥸ô¹Œñ³d¿„}–Jw—Qˆ˜Nɶk´é–žÌo‹Sg]<VW/K^0Va1Mf1W_-dg?^ƒRn€SW‚PWtFTzE\Oo\~Ÿiœ·‘ºË¥´Ë¦Vªj4X-LU/QW6egH\“YVuR¤…à×̰ÿÑvµŽ¯lj›V\iAleBluCxp?p}Ot‰S‡†až_¬ŸpŒ§b‹Œ]™ŠeåøÁ˜¿´r¦’P“RvŒN‹Q|˜Yp‰Tx”T{ R—ƒI‚cAdSE€eujj£j{šhpšhu•lx˜hx—fiŒYbƒVssI’lLŸyR‘…R|}[z›wНr|—Z†xLŒƒF‰‰Iv‡FgShŒUiyGyu>‹W˰‰âÚ¥¸á¥±â¤›æ~†Ômuºcs¨q}¶‚yµvi•fe™„ŽÁ–Ë}’¶|œ®wš²‡Ã€v²kj¢ip–jv›irXi~I\x>UpCMk9CX-AM%=D!38<<(HQ8PqDY‡OWETu6Hj/Ux9Q„4>s/>e=PdM‹W;aCVdBTuGeŠ\ˆªt’©l„£n·¢¹euŠ?_v8G`+FR)D[(KW.PV2Wh>_wC^o@Xc5H[-BI,WU4L]/LW-Y]/mc?jo>Qb2DY+Ff6Vy@\Ms…e‚‘q}¤‰·€’ÁsŒ¯rˆ¨l€¦`WSUyOxV|J`u6BR)2@2DO@acETnMfv[j}M5U.6&$*@;/cJD…Q\WPb\L^dLdf=le=W`>_l@]pH07%+! !*%34"8*5D45E'%K27)6.E3]:"L<.0D//6(,2%@; QP"Rg0Ae9=^?9K<e<*ej4O{HTCJV=6S>6HM5CL3L=)9N)8@'9@!;F&?F dD$NW)>T@AD60I),F/7C!.G"-;$.A*,;+#6+..$6I%rS&L{:LeRFoFKb=I`;HX4KN&BJ*D[3Hg;Bd<Tm8N‚D@rSC[=3S8;2'PB[k2a‚TY‚eLm[PcLL|FG{BLi5Pc7NjF~lNouGFnU9TLHM0NZ!No2N{=YwA[|NaRS|GKtGHoAJ^-;](6f-]T/e€:GiTqHe{7Y”L_rZbrSlŠOy¥Q„¦Uu£pd•hSœ^IuSNW;Wh=lŠNbVZŒaPT\oBTy/?>UtCd”QXžh\ai›Wi§gk ie‘VuZŽ [‹¥c‰’QyI~iA€q<Ž…C‹‹SqwTqgDxwBqoAefCRtCpz;p|8r€Jw‚A}ŽKe–^V‹YIH=sH=V1.W329-F2}D%l„8tŠMv‹PZz`_wDVn7g^9W[5t[4‡u@„¡^¨ªjv¸xi•`Rp3FM1T[0ms;]DKbDU~;i”Mh–QdŽZŠyFQCTnLqjCz¬`nsNij8ÈL4¸Ÿ^”Ṛ±t•³sr±ŠoUiw@Šr2gtDXwBwŽNaTWq?^W3Hc8KW1JZ;vk+u«\‚ _a…<{k2’²UÍá€çÿ´±ò˜Š±`Ve@_S7k„NsZŒie‘kƒˆS\£oYAl‰7ƒ‚D¢l¶yneAK2RC&ZP3mY=€e†pp´o}[lrQŽ]¦‚œ©£€W‘gSš€gŽ„i}iL‰XcqZ…šlc~a‚…_wŸyK„UYF<ƒTD©¾‡b›y^QB[UDgO:XQ9AK4UI2Me6Ga1T[=?Z9:B/MJ0|]1Z^.__7 ™am–`m‰Oƒ^¨´€£Ê–ŒÁ}‡£nª¡_è©n²¼†©»~¹Ë °Ý©„Â}†£d› p|‚Q|Yx•Ty~Pž–aÈr‰µkv¯]€£M§Ão´ß…¦¢^³~LÄ¡jÈÓŸ™Ü¥kž^t>€‚X•«Z³¾r“Ñzp•RcvZNuGOj;Wy@[}9Rz4V‹Ip^k¢hi—iZ“Z\wCpƒQr€JnvW“w¨°…¼¬}uz4k6Lk>RzLpuHƒ¤l_¤j¶—wÿͪÿﳪՎ—kq‹QTuEd€Tr„X`MirL„x[—Šc£–e™£k‡¨oƒ“X§ˆ^â Ѥ|Ÿ’cˆ™[˜’\—“TzˆO|’a~‰V„Sr‰OqzI^lAJP9~pUެw¼w€¼„Â’€Ä”Š·~z½„x§pp›dx˜c}†Q‰U’dµ¾¾”£À†~›_npCW`5Uc>ZwN]zSiŽY]ŽNAi5@f5u†Z¬º¸Ú޽䔫Üq—ÇYŽ¿f…½zˆÀ„ˆÀ“~Ìœ“ئ¦Ò”¯bt~Gn{R–”v¸½”—¾}} ow owšcrŠL\v8Yg4Yg9Vi9Re0BV-7H(.?&.C(?S2\`?x‡PqHRv2<\$C\,Zs7Rz6Jx?^ˆ[bp|GXsP]\cžiаr²q|©c„ aŠŒK^b1OM)=L 6@"9E<M&3G(8L5Bb:Ga3Xc8Rl:@`;Ne5Jc2<X,=T)?X/JM.VM2OW5Ke4VuCeKn~a…œxŸ¿‰Í„’´g€šRv’Z…©m»ioKe{D`p?I\5=O9;VAB^FPlAVsB]uUn}ds‡YEr@(Q)";$0;%6F,;P1DK7LC9]N@JX3M]9N\:J_;XW<$(&'#4)+1 46';:$J(7(1.?9>9"64$22#*8$*1%9>=BQR#RY.CY=<P8^K3r\:R†L=_OLA9NO3@J6HJ0@B&2I(/;&/D!2>%9C%LB _O*>V6GY9AX6/Y;I]7Fk7;\5=L6>P7=a;D^=Yj<bpA[wK[qR@kLLYA@`<6^:>Q/NN(RZ8L{MVrN\wLKtNEq[KmV1iM5HMO8&bh.hŠ^j‰s_t\|n_zRRŠQOˆOYyC`n;gdElT6GlH8`X;YDLS&Pm0Yy>_‚H]‘V^‰nQuMNx?CyF:a9?L&Db*Xj.f€8L–eQxYiƒH\‰>MxKguL`”UqSy£YgžY~R`œ`?ŒdDbGZ]0ey@hŽUQ˜cFxSVv@^‡Ih•F{«^u±rp©lzœnwŸ_q“d^…Xh|Mn‡UhŒPIgM?U*<@$7BH:Te,bo8`zQVoASvB\nAV€HRXWyDKn9Kb-DL+^K4Yz[Xj\et4Z†EWˆFU‚JA\E@THSL-fh.}v?Š‚Cy„PY’[Du@M_;PX=twD™RŸ•Z¤„O¥~M^oLft3E[6G[/…e.q@gˆHnNh“\rŽQ^€ShiR‘k@m—TT]²a:iTJA,Za4ñ='±w9ƒ½‡¡šy™È‚n±pYzJh}GSn@lh;‰yDi‘[Z‰DVv?Qn8Zn;MnFsŠI®{2q«^Mq:lL$™j-ѵY¿ó“n‰[\^1\b*n;ˆU‡Ÿb̪jÆ…‚žb_Ÿ`_wFh†F€“U””W€‘\XpG9N5dB-pd>ƒmHÌzO¡’oŒ—q€fŠ”n¢u³¤|Õ´§ˆm’€dŒ~i¶iQ˜|ZroMÁoM‹nŽˆe„kT”yZ‘~[ƒ«~bv[~G?¹|^½†’\MvaMfO>Y4llBnwGetH\l6okCJgE::5>C2TT2G=&fK:‹‘dl®in‡Y…n¬ºƒ©Ð›–Î’ˆ½‹~¸o•¡^»»k°ÁkíXó‹O´ŠTžždºœoc‡©b‘Ã{¨Ýšœæ—’·m}¼m»|«Ý“¸ß‡j™^EB4dgJ–t[ª¦}kÀrwB…„K…“_”ºd›¯bywC†gVe”UZ=m?g¥KgŸJu¡R³r‘ÌÅv¶tR…L^O-RC/`XT‘´•¨{‚©z9}ET^0mŠL‹¤e‹ä„„Ý‚{žeœ±|é¶Ž©Ç–††VdBSiCrmK‰xKƒ‚Ub}Mqg@ƒdEˆbG¡‹W›šiˆšdš‡iÔw©…`~rQxˆNuP~k9tEmNlOnxFm}HdtImdEVhEi[J”›gŸÀs”¶i¥À‡¤Å’‘˚‹¸¨|µ‚œ¾ˆ›Ÿx¸»†©Ã·¸yÀ¡r¦_puD\X4WaA^€Wbhh•fihPYU…\m©o•Ň¸Ý±Õ˜µ]z¨Lƒ©S€¨_Œ¦tŸÈš©â«¬Ý—¡§is‰IQnB^sIv…_”šsŽ«x~ŸoxžswTWf3MW*OU2MS*E@&IC-FQ5I]D<kD6c<AV/<U)=C>5=)4*36!D[0Eg2G`GaƒZbŒHXi;TnXtc…–`›\¢_š¡WgF\b.@C+;A 5;,/.62>%EK3N_@Ei?Bd0N\:irI]{IIn<He9Aa0?_0Bf0@c3>R):C$JJ,Vg5[?eˆMŠ‘b®k¡¸a‹¢Ok8Sl8apM”‰Swx;X]2FT3GU<CbMTtOQpHLe8LV0GQ5IE4\C;aK=QQ9:M/5N(-K#/7+>K1AW8<R3HU8FZ<JdEWpSGhR' )/#&**(#/,;%!0".-36,6"3+4=!.B*+?+.<#;3CJ":R5J:5fK,dZ=~UC[sHFvL[`ALl48K=4<,5A'+<%;/2A#6@)GF%RJ&EO.L=+VO+YV3X\8^gCTiKK`=IS/aj6izIerLSlHPM;PX1Sc<Vi?bvEQ‚MJtHYl?dr;i{I^|IV…Oa‘P]ˆ]N{mRtW;kN-ZRL>=lc.wXq‚y–†fŽtg’r\‡f_ŽdRXI‚RSn;R^4UfH?nW8e[JX4Tg1Uw@owDj¢ZU—pJ€WPs>Dx>-^<:9,GQ(Wl5j}AY‘OP…b[}QXˆOW€9b‚AS€\k[v˜Vb£gj•[v‡NP£mDz[O_A]m>j}Sd—Y\®in›ms¢k‚lx˜ZopQhFYr[[c@NsFJb@mwGp˜]KŠY2K@8.7_,Ea<@e;Kh3iu7Qœ_X~XSƒLd‰Kb‚LQ{GSi=E4@]7JM-iO._xWEplHR>OG$][,ck8lx?KuEL_5g[3`‡GuiCxf5et<Nt?I^7gp=z…ObmAeO4xV9{f<SpA_r:Eb6IZ.jp1s~=‚BŠSx|M|‡Mqp@cl?‚ˆRxž\y‰Sw‰N]œ^CŽZRpB[uA•R3؈J²Ä”¨Ø¨n¹wzG†ˆIa‹\_~SwR4zr>bVWnJhn<n–TxŠVo·\s dZj1=S,MG$ah<Ñ¥Z‘çŠDtm9<1H@(l[6y|Pp†LŒŸ^{˜jp‘ay›eT™izŒa¯ro‹YgzBWcGMVA^RFtTF•`R•Žqš—t…wR”kF³x^ˆfÌ™€Ù»Ÿ§›‡ªx]¥«…Ÿ”n›•Xi„K”tL©¥vz™j†zVxkP‡W@™žor~f\D>žQD˜¦|€„iŽƒdjS`n;qiB{e=mwMVtU‡yK^†TOF2PP6?P,;B(bV=sOr£]m“VŒ˜nž·†À®Ô¦Þ¬Äsq?Œ›V|§dg‰N|_™gŸ¥fËÕ‹¼Æ{§™Fy6ŠL½£_»ÂzŸÓ‹¬çšÃÿ¼Øÿ¿¦ÿ qÅzT¢hެˆŒÂš¤j”XV{N…yF޵]ˆe}¤UpE{cD†Ck?c“>{¬ZwÉnr³i©¼v³áž£Ù»rRwD.9-) ZB9ž–s¡®r’“e}‡RUvDOh7tžPj›W®´f£Ñtq¨\šj¨¤æ·™lŽ_Yp>esFryRnzGroKpoG_]Eof<ab5f<‰qC“†_˜’d¤i”’xs…fpTu›QYvH_c7€{Gj„PboBq}OdƒRgtS^…ZgŠ\~™]„§\‹¨d—ºk˜Â|£ÁŠŸÄ’—ˆ‡»ŒžÉ£¾Ý¢¹ËŒ¹®s –g‘sHrdGxrPiw?[sAXzNc‰Yr—gu¢sо‘‘їЊ”ÐŽ¤ÙŒ¬Ì„›Çf}žFhDg”Nl¦ax¶v—ƧѰfvŒXi|PMyQ[yVrƒ[y~Pƒ‹av›p„lmzALM'9B.MY=\g?GQ.?H0<='DE,gP;[l?AY1;S)2I#+J >2$0:L(?h6FnO`„bo‡JLn>Vsbo‘ac{Cek;]V5rS8q`7GW+;H&38 .5!-6'-C'0F.<N>RjPe|SW|?P`3kfKq…Xc…HTl?If;Gf:Go>Gn;Vf<Ij=>Y8CbDPs:]~9fz8g‹GrGj‡>Q~=Kq>FyHNh9\W-EE&>O4E]GZuI]vRbpGIa;;U3AQ6?B0,8%*,$E7.;8#3@*8K)5C*1:->H4GZ=Ua:Oe:@`BRp`t‰l) !%$ $ $)"*,+%3"6!&0"#.&)8%B9"1M+#?+&2^)WO$<T>6%>E/E=*\T,jO7Kg;[i<Fg:2E2C7'1@'/9$;=4B"16",1 E3;= <3 Q:IL%fa3Zo>A^>OU.fa/PyB>TNDX3)F/8/ OGNW)PY8VX8Pb7:S3AB*aJ$AZ'NG/hE&pm9pX\™tU”jNx\9pZJU[nE0{y:v’r•„›‚{ut¡j]šrS“c\ŠYV_WY]†PNd?‰pN‚Rb}U_xJs|LxMh•bUšbV‰QM‡I7vH>Q9Od4]€Oj•__—ZXŒUP|KY|HW‰F^|@c}So‡X‰•Tk±hp›qx™koqJ“sFeKQs<c…Oy…Erœdokj}\]}WHt<CW2YS0OwFQeAA`=ZV/os@k’L={U)91<:"b^/Z¥MLaKg4sm0bœQ]–gX‚OVpN_zHgŠTO‹PVv8BˆGM[@le>sƒSP}WB^E;J/JY4BE1QG$Y^&Xs4tu5c€JLs=Ic.dY.V8a{=lƒAIa;9L1LH%RD&mL+eT.^rDJz>Fb/qj+qˆA†|CzvBtyA]CXt9zˆKz¤^j‚Jnp<fpNiaAbZ9an:`v>iu9µGê·vÈÔ~mÈ‘l™h‹”V}—eWoGfV7~o>p’NQqJah=ŒX/©P™hm©fG}H:W$[vHË‹Êÿ£ÄyrfARdChmAziFƒYƒL”ˆYˆ^‚†\sœ]t“SŠ¢l‚¬ng‹RroD‰`A†nV‹bGŽV=‚R<¼]BvUt² b|lzx]ªwPÈXÿ¦xËầ—€ÿ˜wÞ½ŒŽWw[‡£y¦©v~‹]UpgJqX@†Vr]_XJ}cN™¤w™¥zŸšlq–_„>®\r‚\z€[~·w|¯uR[x:T`39U2Ig9awDa~Lt„Gl”_ƒ£g¤¸Š¸Ë¦éì¼Éø«zËwLt7|o;…ŸSv†H‰‚L¢\•TÔ¢i™£\y¢QhŸVx¥g™¶}¹ÚÆø™Üê“äÒ}×Ù{ÅÀx®¢c‰S ©e¥[ƒ¥Jms@qoHh˜Z‰©U–«N—G|=…ƒ=c„7e6d›<s›E‹C‚–L‡¸i¬Ài©Çl™Ó…L°_0_-HJ)jk:€€G’ŒIuGN\1KQ%Ne2€‹SxÊfx—Mœ¢_~©b~Yk‚Q›nEtwGOg9\mBs}SnxNiuLqkDsqAp^>YY9WkMm€a“…u¢’p–~N¡‹O‹UxƒMv€Mu”XXŠOd€H„}Rv‰d}„[‰uOztY§z‰Ë…{Æw…Êz‰É’ךšÔ’¬ö´ÿÄ ó©¤Ü£ª×Ÿ¿Õ–¥¼|©bvHkVBxLhŽQ`zD]xHd‡^n¢s~¶„—¿Š×žªâ¡Û—žÉ¤»mœ«Y•Ee’;UˆB_žW{µj‡Âm‘¸j‰Ÿ_s|FXi4[cJtŒfo—rv™k`ŒUVnL~„\}Ž\fu?BQ)AB1Y]JehC_T<gZ?H^83I38G.JN.GR(>Q,0K&,;4J#.P!%K#3R%>`:MvZjXbˆAcqDcxZu‹elKUsBHf8CO3UO6_f;XsABa5.C#2>.7C17N8I`J_{Vk€Res>Qg5XcA{uRo„IUv=ZxAUzIX€LOsOJtJJuSU~^TŠ^X‚MT|<Jp:Nr>]ˆK_™RV•KR†PZ\XŒFCh/1H#/D&@Q9[hG\yGHk<GV4AT8I\Eb^AX[9BU89M1=E0>G+:E+;G&A@-AI7CN4B]5H`>Rd@GgNj}\"!#!$ #*&,(3&6$ 5!"+!#*'-7,Q> 5M(#A+1/[)=F' L9-(1?6"QH*=]2KI1Z]2@n9=M@)F.86,9C'0>&-:&;%2 &-+,D,G8KH$WU,J^:EG<9B&LE%kd+>‹IRVD;[3.@39?$YM$Nb-E_6>N8KH29I'=D&=P!=O#8A%P?#gC*ka;qr_smc¡sP‘^4rYVEDxb+y˜\s¢np—ng‰ij€]j]w–ip§hj¡lo›f…§`‚»ix¼rg´kažrUyTkOz‘Yj—]ebfSb–PbœMa™Sq™M|´hz¿t_ªt`‹\VƒFX‚B[ƒCWŒF[ƒEfH„‰NsžVc`l™rh˜oCfSnQcx?R‹[fnIf…G_POvCKG7Hc+=b0ZR-OwC>nM9SB^T/]xBXy?.kG5C/FX,fq=i›MCždNfAls8n‡=^’`[sGfzFr‚LfpGQs<jx@LšG>bGZ]4[„C]•\M^Pe=Rh5:^ODK0AJ,PW._W)Vx1Sy?Kk=ag8mw<xz?h~IR`=HQ5BS/:d3BN'iV0lq=Mt<B_4jf*mr8V~E^e;_Y4\o2v~CŒ¢\g˜ZWrBwvITh>LV4EU0SO,Qi6Ye6˜|E Ãi©¬jˆŸ^{¬t•¦cgŸ`W`oX1|yBp‡OdfDTc=`R4Z3Œ?ž¤mKŽZ_b1¹¸Sèÿ¸³ðœwšgd€XpcCuoA~iG‹h;oŠH†F}’Kc…Ge_2|€A‘ jhšccW2uU4ƒlB†kKzfKfbS‚fJmZ±nXâ}[ŽÊ¡¤žŠ„›}rkVÄlGå„Q¹kÜ‹lÊ’o„‰o„|U¨˜o~šqzcNvqN{–c{W…„UuyTflMbC“Š^‘žm»›r³h†«\ª¯Rh‡Í‡‘Óx؉d€RSf2Jk:KZ;ozKe„S\zLf|L{š^½¦Ì™ÕÜ©ðò¬¿èšzÀzM“OV{=|J`G^Z+]P+l[8—w@ly8tp:ˆz@š¨_©Ô…»Ñ‡®Þˆ¥×†qÃtttEƒzB—d?ƒrL|K{‡[u„^oŒUh~N‹“\~´cu—Ftv1h€6c„5Sl,\h6b‚<bˆ<Ly7OZ%lb+}‰E~NŒ¡T|¬][¢bJyI`b6dZ.ow<c?K;?x7Hj*fg8‘ŽS`ŸIkm;rrF_wGqtFr}P[†QJn?Sk@xvMu…Qh†]^‡gcyf_qKgfO|†]š‹rÀ¦†œ–rbzThkO}‡R¬Tg…K{kIŠ‘b‘“bŽyWªk¦¨€Ž s~~hž°…°Ý˜§ëŒ£ášÂù¹ºÿ²²ý¬Ñÿ¹îÿËÎÿİýžœÑ™¨ÁŒŸc“†U~‹[ehD{sRtžaiŒLZ€Pl›o·‹¢ÅŒ¨Ã‡ÊÖ™½ä˜ Ö‰¸i~–Qfq2^f7_‚B\•HoŸU~NƒªS{˜Je…CUm0CU0L]Lp‚b†’_€ŽdoYONSoDfp@fb9SL4JJ=ecZlxONS2U=7n]F\sTKqHDf9:V35L2<T31O,$H*0C&<N+7^,;`AXw_`ˆXZs<Rj>b`FsrPekG\[DhkS\pJTaBTgGvyOnƒF?]8<K<>_PL€[O†Q]†KhHYo>I^4EW8UfEjrGXtBQtEg|La‡]d’_`‹R]|KmmPojDjd8TT4UX>Vg=OgEtƒUx¦\džPgXrSUi65Q&/D.J!;K5O\:Ud9BY+;M2G^<]kCkj=ph:oj;fg6TZ3QV0;L)7D+FE/QU5ES3IW7@_AGhFKmJ$&$-*") (#$,%9")>/%7- 0(#-!&/(3 <6 ?9!@E%->'1/X2LL,-S<:@53D&=G'=L2TN0QZ8Kn=Ja>7T?H<08;'(8(2-.3)9"$/($-"G2SP'FY4(=665$>> P?!i[*Kw5GQ@BJ9CP2HU0N[0?N6K<-=h:BOFDM-=A'6J(;L*/O168,G=-^<(_a;_uYbp`ueE„LIXNtY4†ItgY‹^ZƒVm‘Zr«ho¬vlŠi^Ž\lqPy~Go‹Uu‚P\QH€TTqMj‚IwYd chSfš]dZq‡Nk—S†‡H{²^w“h\™_R~ZOxNUzCV{=V‚;T„D_Te–hk’^lai©x_’n[Š^a‡Fd…JKRTlN[o8R{A9Y966&OC$Hk2HV(Yc-Rg?EaFYc;GeFUe;=|LE[7OY4_\8’D^ºlV‰\SjGpw2rZw”jhwMJW;EK(dT)nk1j¹k<wfTJ&lx2„É|^îÏJx›YO+_U-XU5QT0AY2GE3LT/Yq5`m=oz3cƒD†h2kb<nObdOYkHGhIHe3`j4fv.Qv3A].La+ZY,U_.Nh4KU6`i7†HtšWZzJ]_5ZqGW]>R\?WwAg„Ib}>sk8†D™¯_c˜e‹…K~•\}yRz~E_iHXqBqm.aq&YM.kX1X\DNK0I. wDk±hSlQÈn+Çáu|—všoI~°‚i”r[@ch@]\:bn6h‰DiH_ˆJZ‡Ruy]}™eYzR^R7cE*‚S4„†i„Žl}}O²‘y³š}{eŸWÿ€f»Ÿ‚®’~w|f‚M:{]G¢kI½¾€Ò“yˆc‡œv·Ž~–~…fš{[Žz^|]‡™ax}bmiLxgTŠyN–—eÆÓƒ©Ðu™Áo¡Í{™Ì{¢ã¡Ýš‰È‚[rKK[9Xl9WPuUeƒO_}Ig†T}Ÿi›²p®´†ßÐÕÙºíšá¤l·la¥Xo˜PcŠSR:ro5‹ŽN‰Nl€AguEjfAªžfÃ뛼òª¼ùŸ¯ì±äƒê†‰Þ~cÖx‰’\t—Y´™n¦}ŠŒgp„U„—Zš¦oi®bRKTs4Y]'Q^0TE\ŽPa”GIq93?":-Q1!hh;dŒPk‹Hxu:††J^wETgBgsLh’J\“B_…9Lx1Ib/s~N›¼€\ÐvV‰NTG[Kdu;hd2`m=]o5aq6gk:jrN‹ˆušÇ®€Ó¡–v¬’c¨Œc»~˜”z‚Žhm`pmP–¤qšÈw‡‹Y‰‚\ £uš–n¢‘pÛ›|½©x˜…\°›Àí¦°ç‹»ÝÓñ Õý§Ôþ¤Êü¯ßÿ±Ù÷¨´ÖŽ™Ë‚™Áƒ{§ofvR³s]sŒVftE’TtGd~L~—nš¾‘´Ñ°Ñ†È…ª¿†¡Ã}{«[`z7>R%9G1bvDg“Lp˜Gu£PoªWm¨NY‚BQh-Oc?RrV^Xu‚PkPnƒaq†[Vr;Kb/W_2QV5^F;r^Iˆ_IbZ?AQ>PK6smL{†TXwHEi@H`7?`5BY2D[58U48H.<Q6E`LWzX_|LR]<Wb;\`:]XEjfGaUJ‰iY“|b†‚PwˆTa‚Iq‚OiŽ_U…^ddu—Xi„Iae<eW?gZCNV6DO6MT2Qb2[cD]QX…Vj’rªyiŸd]z>?H,F='MG'99!093UYDflA@S=hjEnxGYkLizUW„I6g85S+/M,6W23[8@U1@T/6P28Z=F`@Ga;Kb<IY7KV2UW1[b1X]1CR.;Q.FV-CQ.7M3CbRNucJ}Q)!,+,$2%(-4+4F%*U:(?5!8*"6"$3%-1 (6#14)88"3:%57C<!^?%ON49S81E2?A-8G(6C*JC,\Q.Ha4<Q?0E025#41 *7#,-672O&'E."1&6,#SH KY.GD/8B(3G#13"G3OM'Fd4HZ2<T.N[2Fg6:G=`5)¤C$qt>GaTBK9IE'JH&S@'QR5>e58I2LC1[A-^pFOy_SsZPpDS€Ias?\|HUMTmCizM~’_wva¢zeƒgRˆUUsJPoHOqX_XKStKPsGZ~TkŒXp›Y^œclmN\{JS€S]}P]ƒOzNn¢Qbk`™aQŽdRmERuAQ}J]€Gt‰Im›`n•soSp‹X_‘\UxUJiBeX6f{4OKKoVXm1@j=,B(:)MH!Bj6@b3[h/WwJR_?Zs;NfMgn:FO:RE?I,aj;‰•MrÍ}JŠgHZ?{x7ƒPRyGSE9S)=\.LM'ªM%“ƒ=?ÇHkT”p(ÖÏr™ÿìF¸ÌGOAVD)\J5m`?f_5aV>YR3p{D]‹Sms:[u3}m@wM„V’Ww—[VšmZOZv5Uh*Gr/A\.Ri.Mn2U\/KM*[W.f‡FexKŠtAS¤TYfBZuFUoMp’H€¤S|\i†VYtGƒpGv©_Y€WqIks<lrAyCreGX•qJ€IRs(Ul*u\6_VBXX?eg:‡„A•¢pW¿‘y£o†Lfc>…n@ÙrC„¿{i˜…b^BLg;Sc7b]/bz=rB‹“M†¤bzš_i£}X‘sVicxZM£gO†‚`w~aÕzTÒ£^¬¹€žšjŒpÀ…m–eZ‘]S}dS‘UD‹gHܤ`Žå•”jWÌ’lëÛ¤Äòº¡´”˜|S£•lz|f˜–l‡¸‡…gŠ’_w™b¯¨q¹å—Áv¼Ás³Ü‡ìœ®ç˜˜Ì|…®kKkAN_EN~Kˆ‰MzŽUf‹Od„T{“g‡¢s¥rž¦qɡ¾æžÉ멣㢈Èqz¹V…Ãj—Øwwärp²VŠžV‰ša°b»^zº`»Çâÿ±ÝÿÎËÿÈÁÿ¦ºð ·ï²Ñs²ÃhyÒ}‚±t£¿~¸È‹À…x¯my‘_މ^¶ws»kS†I3O";?^@"sd4fw8O_03<),/+V?+xyJa‘MG8`r<fzQ_„\oŠSxŽNy˜EQ‰>Io3Fv:qF¾µuàÕzs»be‰DX~@Rj7Hg7N_6Jg9Lf8WrBlxV{zgº‹iÑ‘r¥„ZwH}wH¡tP•}b§|[–…\‚}[¨‘s¶Ð—Œ¼vrV¤e¿©~ȤǬxº¡p“€V‡gP½˜o¯å“°æœ¼ñœ¾÷Á쇴㒼존ñ©¦ë¢“Õ›‘¾ˆ™±yxƒ[‡jGu<l{4jƒ5_u8\zEx“n¥º…®Ê•¢Í‹˜¾}ˆ²h’¸ks®cFw99W3;a8Wt<dŒCaŠ@l L…¼f†Ñnp²WLwF[nPa€[oNcp9WY-PK0TB,K>'>9'AC*S`9cfBmjVeuUmp]ƒ^T}QYpMt€MbKTxKHpFBd9@^0=^9Jf=Hi@MfBKnPYtQZn8KT3VfF^uLWlA\hFbhFueI•zLyvEyxJvzOb‡b†¥€´|x \hvFSb2JY-EO4YUA]_LaaF[^@P`5E]3ThCi~Kg^šyˆ«q`Ž]Ol:4O.4=(58#),(EHAkoO^uI5[CM]FNeJJ_G`iEXjCMgBF`MFv[NƒRAq<7Y2@Q;R^DOcLP\F`fMaiBR]<OV1JZ4DX*BV2W\8Da5>U5@Y;B_IZndof-$!-&!1 -+=<=S0&IC(>4"?3!6.%. &5"$6)-<,'=(+2$-738!0>%L:)AF0.98D.-.<%77$8<)L@!?Z//G4,8+<4'1:!48%-/9-AF&<H02M-XG.QT1/F2=N(:T",=-3&%@8DY+A_6F\-Rc.Zy.U†AZ`G^K:XJ4P=3NG/;<-B:#R?"*> B*R6"J[.=s5XV<\d?^v`ay[YwJQsJPu>Rd8Jg7Yf<x‰KxœnožNš~^\\Z^/XˆB`ŠYP’`P‡hOeGX„RdŽZg‚]tsMY¢OJWEqFVd@X†NT˜aeˆ`r€Lr¦ei°nO™mOpWSrBZk<^uAi‚AhƒMd€HsyHP€PEcH?T1<`8FO1^\2_Š@M‹^Hl=;\069%>5 KE!E`5Jk<Yl7VƒKd~IMzITgDfxEQ™R;ƒ]QWDkŠF˜§YqáNžsSsOƒ…Gx‘SG’`?\QCT+8[&7H*aF+™N)‰¥P@f…p@ß¶o§î¾I°»MVGiR&nU1fdDs^Dk]0zY;|rCc„_Z…JjOŸVŽ„LwnBue>q=pd>Qj?J‚4Ki)Ni)Fy2Un6Rk,NZ3RN2jk=`qIa{O}‚M_†Pa‡Kdy?f{AzC{‹OnoFnrEa†Q…vAgŽXV„QMqERY.f^5\s@ºY4®µŠLštOl*fi)ŒI‹o•’s‡“e·‹]ȳj²ò®©ñ›\»uz`7mqA‚K§’fƒŠZh²dzoH~KQo3^}9w¢N}Ìat¶diET,–tD’˜l}¶„y·‚w¨Šh•om‘l£rŽŽ_`Ÿ†\™huiaŠ|m„pdwlUlJŽS¢eu‡e—•{ì–hÿ£k°¾®šrÏ´‚’¶x´«c¦Ä|•ÎŒ“Ñ‹ˆw¢šh“«b›Y’®w§Û–°óã‘¡jo…NLuEWUEYlJv”T lnžav£n‰²‡žÀ‹–³w¬¾†Ñë¯Çü¹Ðù©ÝŽ~¶eIÛoÑÿÀÿ›žñy”ÓkžËf”Ñe±a†±g±Ì~Úó¬üÿ»íÿÈÖÿ±Èÿ¢±úŽ‚Ê}‚Š[¤°~¤ÅªÒ«Ç¹±„’vj‰VsˆU£´w•σU‹M0J+6L)/D!0:98$3Q2*M,*G";@,LH5`U6YN/OO&Ti0bf=pƒSc˜]f‘\k™XY‚HG]/KY4e‰d“Æ‘—Á}pŠEUh3\m6Nn6Ng5Sa9Fg8NeIfŽjv‘Z†R¤†OrBpoH\U\‡ed„c†^~€Q‡Ž\ž’c“€É¹¦¯â¢u£cžiʫܬƒÌ¨o´–n™ŸsskMz^O«…j³à޼ö‘¯Þ}®Ûw¨ß~¦Ûˆ¯ëœ»ò¼¹õ¼‘Ö‹˜¤p–lm‚Nj‚?b@Z–>Vz5Ta5}u\¡}¯¸z˜·y…ŸRkx8opG‚›\SŠLLn>Ij@Qg7Wn6Y…5k˜Cƒ¯Z˜ÇyŠÓzjŸag€WhŠT_h5KQ(3>&+4%5"*>/:J:FPMNoZQ}On€Vz^†›k¥v¡¬suŠWlyKppPdwMf†UVNCq>If@Id<PYJVmU\y]a}RQd9EP8RdPbZ^…U\SaoHWgB_gFPX8QO@nZUzp«‡¡¹mw†LQT6=K3GP7KSD\cPsq_z{Z†{PdxAIa0C[0N[3Nc8ahK‚Ys‰Xi€QcrFQg=9Z:3Z=;[GPoTi€^xƒ`O}LRoF^uL[wGSrUW~iT‘}]žnšle‡SIh9B\7LW?aRBaRBdZ:ZX:bN4bP/CR+CW->V,>[4P^:K^6FR9Y]BOeG[b\$',$*2!9.%??&3K05L8-J;"B65..7&0@)-E./B78/$+ /1C?<7%V3&4@*2)1;("9<%8=$85"J9 3d23E5,;(99!7B"/=!*28*7=$E:#FR-BI70;+67$E@ =Z&X17/+K>D[/;g;?Z4R_,ti-l„9`~JwRL[W9Gd@9G;9A.;>&0J.,-&,45B"JA#[G'ay:\‹S^„[SrJCa>DF3L\-Dr?MX6t_1{n7…Sr™pK’u?g[ZR=lv2fL`‰S[ƒY^ƒNc„W]\Q„cgsKVL`aBXv@^œQe¢ha¤k\wq–dx¥fe¥sR‹i_vUHlLLe@O^1Sb,Ml<Pl5]n@CwI6cG?O)9d:?Y>[O*k5U^DjAIT,RC(=L)AX4PZ4XzHXzN\}Ie‡ZL‰^\|Zm˜]l¤gZ¥dd’ZqS¥ª[{Ú~Rª~qvEZ…ElX4d}:E„gFi?<F.8F3K]9xwGz–RNŒU‘q@ k›´ˆG‰EdKSa<Z]6i^9PdAbb:pV3¨pA‹¤d‹¶l€¡_pxSddEu_EaB~bErbB][@TlDHk.Pb'Sm(Sq9Wu=Uw?epB]oGlZ>~›\g¨rb‹]X•PQAZ}Cf‚K_}G[xC}…F[•aqvIm…I_UHk;QO3fd>ak@ÇP½²lO…YIp*aq-–v>Å™dܬ‚±º²p±uPÛÆk´êžW‘[itCpi6]6qgDŠrV±mH‡Ë…\veFe’L–‘M–Ùk~ÜrHždEO5rT-Ÿ[:´_8£¢o—¹Š»’„¿—|¾›…¤‰šƒŠ—m”‹_Šj\ª~p†t‚k\dKl‰Bi’Y’št—¬†Â {±¯ƒ¼™hÂ}N¯§p”e•[ŽxUž›q¨·|‚φ‡²n„¨e£Ír«ä˜´ï§»ÿ¦œß—zlje’\e˜XX€Q]†ZuSª©q‰º‰ŽÀŒžÄ˜¼Ê™¥ÏÈàš÷ùÆÝ÷»Àî—ÐzfšVjc1§¥VÏÿÍÿªµÿ–¦ö‹Úr“ V|—YšËyÃì—áÿºõÿ½ÞÿÊåÿ¶Îÿ¤Èÿ£—í›~¼¼ì½ÿ±¿ÿª”Îu¡¨fŠÒyhš^v“c£¹ƒ§Õ_WHX7A^14P"(@%=^AX‡WG’V:ƒDOh:XdIZƒ]@qTBQFau\X•krl…¸“qËr¡n]’a;lFIkKˆt±Õ—~±pJb@CY8NZ1`k?IjFGrGJsMjwU¦ƒg“‰ekkFi]EXaRmwm¥„¢ª…£¸œÒ§‚Ή~³ƒƒ±tœ«}õ¹žëð®”׃|³e´n̰|Ò£l±¦k¾œd‹[j_KT_>€W=–oG”B“ˆN¤µ\ŸÒr°Ì€°Û·á“›Åx–Z›“X™…Dh<r¤Mr«Q^”BQjFowO‹[Š›V~–Pf|?Kj4Ca3c€No’NPyARu;Ce3Ge1St4\z4pˆJ‘»s¯â€Ëp_‘]txHMe9CO/6E1*8*3GBCo]TˆlX…muvo¦e¤qeŒS‡tO«ŒlŸ®}{ i^h@MM0PO1c`BiWc…YN‚YLWAvZWznx{l™fX‚NU}abtlœnoŽfbxT\cE^ZFfaMb^UacU\oeŠˆn‹‘k‹c^nKIU7;L0;=9QG?ZIHi\HjhA`e1mT2YY1EP)@M-DN'AV+DW7Ze@d~NsƒPo‘R\‹O`…G\|MZ|MayInyFkxANe2Ha:aqGh‚SrdŒ—~—¥’œkqŠPVwA?n=Db6Z]2_Y6V[;Z]9I]0:O);K,DH-EY4G[3C\.HN1QL4IQ8JW??[@ \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/lagrcv/test/img1.ppm b/SD-VBS/common/toolbox/lagrcv/test/img1.ppm new file mode 100755 index 0000000..da1e24c --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/test/img1.ppm | |||
@@ -0,0 +1,3100 @@ | |||
1 | P6 | ||
2 | 512 384 | ||
3 | 255 | ||
4 | … | ||
5 | |||
6 | |||
7 | |||
8 | |||
9 | |||
10 | |||
11 | |||
12 | |||
13 | |||
14 | |||
15 | !!%$!!! | ||
16 | !/9$80#)/'/ &+#)$ | ||
17 | # | ||
18 | %#%% | ||
19 | |||
20 | |||
21 | |||
22 | |||
23 | |||
24 | |||
25 | |||
26 | |||
27 | |||
28 | 0 *&&$ $$!')'&,'/+-*4&5!)7-0".# | ||
29 | |||
30 | |||
31 | *"-5*$!-%2:') | ||
32 | |||
33 | ' "$?-%C+6<9 | ||
34 | !$&+#&&"" # &-#*" ($$4&#&$2(1'+."3G#0F?D<<B5+=.%B7'C7"C8)0#+%/%(4<4Q>,,""$$)*%%)/"3-6B;17+0.8'1/7+-#"-)*3+.#&- &!+"-,&:,/ '"%BA-U-D%)$!!,.+&5"%# #/1 >D->>'E;D. ! "<58|PgQ3-+ #%(5.974N/GC(TP.'54+ | ||
35 | % ) ""#!")")$0 +<4>EPZ^I`cBQQ:5902-3A=-84/"3.2.;A/-E52>3/=).;".203#=5&>373>67;*RG6e[<[\'23#++)#&111BKALR8?C%ED#LH+FD:FB4RA0NB+x[4–f1_R%:<0DA>OB5I8)I>=;?>1929DO:Py8Ge9BD9KC;P@.<B5H6>7:827VA.CI-Lc:\vIb„LfŠPh„“fˆÈofSVQDLjJgn:I\1^R.WQ+A?3AF1BG>MXQXbTYm[ms_biJYR6MT3NJ;(4;-G1GR7QfDCkK6R@/GC*8o7`¼T¯n›||wweTly_z~c’tĪ¢¸Àõ¥ÐÿxÉÿyÝÿÐðÂq‘lK_SI``QjeLn`]xSbsFXuQo™ÏÆ ¬Á›¶–´šž“hš”xµ¹³ßóÎÿë§žo‰£p…©jzpX\JEHF4DSGK^MIC?G;<J7@B86H<1>234+56& | ||
36 | |||
37 | |||
38 | |||
39 | |||
40 | |||
41 | |||
42 | &% | ||
43 | |||
44 | #' ,6"?&A/%40'&)+)#!# & !)# | ||
45 | |||
46 | |||
47 | |||
48 | |||
49 | |||
50 | |||
51 | &" $%)$&-"+(#' $ %! | ||
52 | |||
53 | |||
54 | 23:J/C949<'A' | ||
55 | |||
56 | &&#&$#4/#,7 | ||
57 | 7+.5%#-((&$! %'"&15287/=;;?,9A89>4PV2EWD^#BO(@D-BV!/H7D+4 1'5*'(&2+55#,9"8H0$?!+6*9&.*6*.!(13#E !>(974/A2@@?+5(<#-:!(7"%0 &$"(2#40"0/C(&$/%%/&! | ||
58 | "&")%*!,(1(8!1!'A!(D#,(0/SlB<g3&:)9$)(+%-.0"';356Xa/n_(Y/#@ | ||
59 | ' | ||
60 | ?$ H'1&&4"?#&6@,&#!!#%&-)?*J.H/%3A7=[TKmHVY1FN+i_,6<7*/'.'10/1>-+-1)*7(04.)-*4%1:)GO.YO+[K1KO1YY6mjP^T>@9#/*#--)(0--<A93@9/>4,G44N2AQ2:N?Yp7IZLCgh[‚cV};IL57>INF<OH0MG4EB13=-FB4DD?8C:?B8>AB3;;/03*5:>D/CC<GN?<P/EU3_v9o‹BušBƒ¢RÉœws–RŒ‹HETW=bEUXGRi>Me7OR:8F>BN;VaJ}pGˆ{Vj„_m˜WdjBfi?\p1>B0.6;7O7GZ;DI=:D.5=02<WCY³swÄdo¤i…”iyhŽ‹À¥‘n¦¾¾×èºÔÿ¸Òÿ|šÿv£ÿ£ÆÛl{SW`AVqIelRTrKMkHRcC[jbc€›~°©Ê¥úíÿÿ‘ÿÿŒÇǤÇÖú½äù©Ù¿–¡†}t_st\dhQYHHN=>DDBM>CP><M76;4.;:;<9<A5>@3:A0 | ||
61 | |||
62 | |||
63 | |||
64 | |||
65 | |||
66 | |||
67 | |||
68 | |||
69 | |||
70 | |||
71 | |||
72 | |||
73 | |||
74 | !&'"!&"/8#F(F4!28,)-*+!( " %$$ ## | ||
75 | |||
76 | |||
77 | |||
78 | |||
79 | |||
80 | |||
81 | |||
82 | |||
83 | |||
84 | #%$" | ||
85 | |||
86 | |||
87 | # | ||
88 | ! | ||
89 | <'B:68+=*,)&*/)4&" ! ## | ||
90 | ! 8&H<@?'8%) | ||
91 | (3=83I&'4 ! "&/'0*! #!#!,%<*@&=$:9$GO):RD,IU<OMEHC0H66>7(7&-*%<8&A>?IIKFPDDVB4G6:1!7/+,$ ()4<<!ND21++ 7")!*$(6 <9*8?+>N%9M*:2&.2.78:)+&$#)* 2; 5K(D'* '"(,"&/B3! | ||
92 | !!%'$/$+##) %,/.T,>IWV*FF$F@56+8( ()&BP(XG(O)7^b;Y3 G)S&L5FO:S+[>( -*B@BE?G0/+*2/;:Cc#<q )<)JF>><]>I9KL;ZfISf-?;+9:#8B*@I-nG&CA ./&/0"11+44/2D>L^=nm4ej4M\IH`JNkJ9D,*8$%.(,!02+4>7/86.5)!(2&,>(0>38H<B[9CN3HuBKƒCOQ:?65<@@IHB@<LB?GB124/g]6†h5<D1.9.7@17B.A:'D<3B@9OG@QLJX_;^[7NY=BjKTzaZ™~…Ë{w«‰ej_lCFPOAYLNbPIVAIP7]]>^cKVp__…jN]r]_ŒbX…RQC[t=Rn'\Z/BC=9R:^e1<H+BK%CD;WZqXo‰ey‚Zo€fu“~|¹u¤´l”Ðf»ÿªÞú€´Ëj¶Œ•Û]“®U|FXt7_n<vŠD`y>XgBQdEQb^fz’𥹴Ñåÿÿÿÿÿÿÿÿÿÿÿçÿü÷üÒÿ°£¾~Ž|†‡l^q`PcSJWEHW=DP=EMBDR=?F42>3394/=7.72*;7*72 | ||
93 | |||
94 | |||
95 | |||
96 | |||
97 | |||
98 | |||
99 | |||
100 | , | ||
101 | &$ " !*"/%=&I-!M5*7>0#+0' # %""$4"5)$)! | ||
102 | |||
103 | |||
104 | |||
105 | |||
106 | |||
107 | |||
108 | |||
109 | #' ! " " | ||
110 | 9,36,48)-''#%"*(#+ | ||
111 | ' 3195B.;P9%<,$)" | ||
112 | "+:(A=6R+);9"/))(' #'')359B=,3-.++."8((4/"32$48?;&796,1273,NC1FL5672>50,.43$/@,553PF6Mk18Q,:F)9Q)4BD:$33"&%$&/$2.1)%2,#*.(;+$18 188(2%-$,A(474<&7@/86&-+6*(0,)'.&/#03 ,% | ||
113 | |||
114 | |||
115 | |||
116 | |||
117 | "!%#! "'**<2*=@2V7$7,%0%0,5F"<%)FFQ4,g'CO n%Tp-'3*"- .<EV)P[)MP#g[SU5B(2B<AGL%1J)'0'/5-I55D;JT@||Jiz:]c*GO,226BA8mr9€|$UI%.>(-7(/<0<=?5AF<OV8dVA[?IAJN@PBQ5,(&%+$0*& ,,%-.05,03)+'&%&#"0(.4.3B2;;7A<<EQ2??3E0+36.4C;@A;@?;B47:;fbd\qUGL-73*==0:=4<=5D@+1G>}}E†“;v‘=‰¹<Rd9FQEFPPEY[ƒ™Kx_X€sLj5eh7[VDSaH`aF^Cƒv<„ƒ?‚ˆ_„•…™fjqELXANbDE]LFdFPq@Nr7K`>IUEJ_KBY-DX2JX:HeXOg_am]SqbNswk¨ Æ·–qsŸf€Ô´ÍŒŸ‰…Ÿ‹ ŽYuMfIJpOTnMM}NNoDMiB]fD^k\x¡•ÿÿäÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿ°Ýµ‰€ˆmSh[HUPMYJMZ?GS:DQ?CP3?G25?11<6,75)41)/2/02 | ||
118 | |||
119 | |||
120 | |||
121 | |||
122 | |||
123 | |||
124 | |||
125 | |||
126 | |||
127 | |||
128 | |||
129 | |||
130 | |||
131 | |||
132 | |||
133 | |||
134 | |||
135 | |||
136 | ! ,# | ||
137 | |||
138 | $3=%D+ I7-9:2((3% +!&!-#14'9"#* | ||
139 | |||
140 | |||
141 | |||
142 | |||
143 | &+&,%( | ||
144 | ,%011657)(4$! -?&23'&*.#9*(51#*:@'=& | ||
145 | |||
146 | 2 84(A#6.&B$2+$%%! | ||
147 | !&.0">K&EQ*8FJ? =@I<BI9G=E&+K.4?+=P#3T?K-5K97L+>B-?N!8? ?B4A>*=Y5ENT0AA-6./8)&'* 2* !'#!!") $747+%%'%*'&0/'."+2' '5*"6'"% !&' '-% | ||
148 | )" | ||
149 | |||
150 | |||
151 | |||
152 | |||
153 | "!"$("#+-$,5#:&&% !# $$D?$@'?#U^<M ,7)JH@]d?jp5@Q8@Z1N\2LM8IG0TE'64%B2%6--B38BAH>XQ=aMTlHT_5OF/nr;_oQh|?ˆ-HN/WC,XC1AI37I6PLA]USHNFZ[9O`B\h6F? ))!-.%"+#"')45,-8(-.!)5"'#!&(*,0241;9086:.05+003,.B/3D9:MH9995>IHi†vekb64<2075/;5B9;@88*3HISV\tLf–NŸShŒ@\]:QXAUdDOdbXfCMyL]uMnyBixGgŒJs¬]–½g¶¿kk›fr“i]Œ…P†o`x<So4bv7fc9[[6L\AJd=Ja4E\7LdFYm/Rp4JY8FdAF_OJfJQnNKqˆP~¬f«‡^‡kUw“j{¤Sz|Ktu`†[YqDFeC<ZFFdQQdNN`FWiLksPpx‚m§öÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐÿÿ×ÿÿÿÿÿÿÿóÁÅ¥f|sGXTANJAOBEQAEOBCR>FQ7<E/;>.3=/.1'+-,+1).2, | ||
154 | |||
155 | |||
156 | |||
157 | |||
158 | |||
159 | |||
160 | |||
161 | |||
162 | |||
163 | |||
164 | (9?'I."U6.7>7).." " ("!!#%'$!',"&&!$ | ||
165 | |||
166 | |||
167 | $,$ | ||
168 | |||
169 | |||
170 | |||
171 | +-$+&++(3*,1#$ +% | ||
172 | &F(@(!/>5^F MO+*8&" # | ||
173 | /((1!&! | ||
174 | ($:-&3836B,7S-4W,9M)7R*6N*6M)9Q48@*1<*83)7@1*8-9//5I80O;+G*7B$5E'5B9(C5#2(!!"!&+/R08)*+()($1! !%1$! | ||
175 | |||
176 | !!*, | ||
177 | |||
178 | "+C, | ||
179 | |||
180 | !-@::O[IemE:J6EN8K[4Le3RS6<V8MY/PT)KF+MV3GL7'3D&5N$5T4TPEWF3VX9QQ9T^Ef]Ms2DT2\i-Mb6BE=cf@Ta=C^?=\P@UK-GI.J/&,#+*!/(''$)3'-6''0( )% $!/)#71):<,@H/:=,.8.3;(BB+M]4B];Ov=FZ8bNeiožb‰m5PG0</34-8;64<>7?48-<A<VDOAG[F€LZ|Hfz@Yg>TiDPf>Ke8LmCJoPWzXa“Gw“Ql}m£qµ‡Z~kGlgFl`:^dDeGHiDYjHfu=Vc1Xf+Pf4F],FS1LQ5MX2Ef8@_9;Q@EZN=GM9K;FVTK_‹Op„SyvQszMjrMWpGUhQeIlr6Jc6EY>Md<cm?XbJYaZgx^t‡—¿ÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØéÿëëÿËéÿ“Öÿd•šXaaEPB<H@COG:CA3G@;J=3F9/B//8.+9,16'65*31+(++ | ||
181 | |||
182 | |||
183 | |||
184 | |||
185 | |||
186 | |||
187 | |||
188 | |||
189 | |||
190 | |||
191 | |||
192 | |||
193 | |||
194 | |||
195 | ( / | ||
196 | '<F*Q3%Q?//C9%*6 '!.!&'##$ | ||
197 | |||
198 | |||
199 | |||
200 | |||
201 | |||
202 | |||
203 | |||
204 | |||
205 | |||
206 | |||
207 | |||
208 | |||
209 | |||
210 | |||
211 | >A/+1" | ||
212 | 633$2.'4,"(-& * 07*22,1%( 7K=/_T?P\3!* | ||
213 | |||
214 | |||
215 | |||
216 | +,## !)" | ||
217 | %,#6;:#GE&4<*45*)0*(**#$'06.0&"(#)40 H:!=E>F11=,(8*&00.4+.:),4/(&$)3/<*A$#%-2*GQ$*9%*!!/ $" ""/1) # . %- | ||
218 | # 7* 2+$ | ||
219 | |||
220 | |||
221 | |||
222 | |||
223 | #$ $ &4 ' + 9%A1 (! -P/5M | ||
224 | |||
225 | |||
226 | |||
227 | )(1*"),GQIejP\V1/;03F:>E@6J>8M?=FIBTGBT;8WD.N2&;!1.&.-;L6L@9D(1M6:<<GJUSbRHLOHGZbNWf<F]AYrR=VB@H@06@+43+4:*,8&*%),&<6 0, #.)+0''2!%+&*!*/'95-5=2?M6EQ2:?+JS1hg8zd7qX@LTD8HL<Yc>cšJaw+6O*4*0;)B>0BB5B@1GE-<@A>I5BY<a|LNeJitOfpDMeG@W8AZ1al6r{KboGcsFaƒC\€YMo„AntRkJK^I@[<=S;;V=>_DDXUUpNPb>^g4O^.Ie2^h8ch8Y`8HO9;I96@>0=D-GDBV7ik=LcHWdI=SZFia^mWWcJR`YLcRRlB3R5C[>I`GIgNNXKY^]Ykzk›Àíÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·èÿèÚÿžÌmppJYI?L=7D?5C;4@8=C7<G;7C4+:6-5//813=43:'/5))-% | ||
228 | |||
229 | |||
230 | |||
231 | |||
232 | |||
233 | |||
234 | |||
235 | |||
236 | |||
237 | |||
238 | |||
239 | |||
240 | * 0"( | ||
241 | |||
242 | |||
243 | |||
244 | |||
245 | |||
246 | |||
247 | . 2 C) M4)<>7*;<%%4%3*23!$3 &!!"#%" ! # | ||
248 | |||
249 | |||
250 | |||
251 | |||
252 | |||
253 | |||
254 | |||
255 | |||
256 | |||
257 | |||
258 | |||
259 | |||
260 | |||
261 | 0*!I(='*3 $""1+-6&-,&--$62#6(-.+(-/1?8K%:'8=N0Ij@hkH>a6 | ||
262 | |||
263 | 6@0/G/8(*-)/$ !)0,/%:"+%"2.7*-.+.5#%3+, /3&.<,.J5&9>*>,5#/ +$02#A:"@9/.'$.*"5 '@.(2#18=NT7>G$!"$!",.7/!" | ||
264 | !&"027E .J=FC5+($ 0&@(I26$-''" | ||
265 | ")$+0 ('!(#(.>:M!F\#=G144;0S'3KRrWo G&F-mLˆN T, | ||
266 | gDD3I.2,A B?LV\]H[@8D'4:-VR-BI:3;5.=09N?0:8;@;JC:W?&=:%GD(YT5–n2IH*J>.IG?SKMY_=L`=]eILXE7CV0Ac6D;??2<>-;8./3*,*%,0%13+:@-4:4/!**"$) )('-"59,7912<4099(;;.<+;L9D\R]‰F}©=t”5ed>F?c;@i-BD37,,1,)016F:FD6AJ6CG3LS8_m1O`5e‹A[qHe|^]…ADY67O1>E7?\D]€L\€BYƒKLqUemJOeLEOIEb6EZ1D\.>Q*;Q.?O9APFI]WO]HH\>;[A=]DToXr~\n€L^X83E3im9˜]:(.C(8O6[KNkNck?M`:BTIm€P{…Ol{PYlWI]@>C/=B>;HDAMFIKEcRRYiƒmªþåÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸ³ë{¯¹t†{ZiTGNE>F9<?61>04?26D5<K4AH/@>,5:+-:4/97-2.*.'$+$ | ||
267 | |||
268 | |||
269 | |||
270 | |||
271 | |||
272 | |||
273 | |||
274 | |||
275 | |||
276 | |||
277 | |||
278 | |||
279 | |||
280 | & (!'%" | ||
281 | |||
282 | '3>&H4(>=5%:>"!-!1(9*43#!'$!"& $+#"$$# | ||
283 | |||
284 | |||
285 | |||
286 | |||
287 | |||
288 | |||
289 | |||
290 | |||
291 | |||
292 | |||
293 | |||
294 | |||
295 | |||
296 | |||
297 | |||
298 | |||
299 | |||
300 | =/!+,2,4#8 $0!3()-++'""@30D!3<# 4'##G',CB<827); \%h=f#1* | ||
301 | :92 | ||
302 | 67 | ||
303 | 6!I-H)=: 4*'6!>!*-5!(,")$#2 -""5' !"# ($!+""!!"%#!$!-(#-<"#7&18 ,7 78&C=*<82'/***#!!&.) ' &3)AK.6F%`E"K?633,<3%9O%=4%5E<FD8OFR4D4#ZI$1F ##" | ||
304 | |||
305 | |||
306 | .#"0'4/-,5'&0'E.<P:.$$$ !*00A'.GXJ/>G*6*%;#> 2\%AT9O,C-%U@.a<5[)c|0aŽ%:_(6'#' "$.5?BSNORLFW2Wb&AQ1-Q4+=.,05*55 /),40>]5\_5Sf-N]4|sK{œKNY3?T06M:XcBqzOVgJHXI=Q6CF38@;A;6:E8>E1<=,5=(59#13*:7,3E2VO.9>%-5))$,+!10 72/76*-7..50(-200(XL9JFN9>b7Vt:XZ\€Fg~:jp>RP315'+5$22/07B7@I6B>5G61?5?T=;Y3]yHTpZDaY<NE=N2TJ.‚[8OUY^bZTaHDTHH]W`iHKa9Pi/I^2GY*>Z,>_$AP&9J,=O=TfH\lDL\G?W87SKE]it„g«†]q€AFAiAXˆaCUA738D:>JX\TcnIM\>Pea•iáU”›Zh{JFTBUa6]Y9IR6EK?S\H\fMTgoeœÿãÿÿûÿÿøÿÿÿÿÿÿÿÿÿÿÿÜÿÿp€Âav‘TefGULLR@OG78?306+1=06B55C9;G0<D+7:-,2-'1*&-+!(#$# | ||
307 | |||
308 | |||
309 | |||
310 | |||
311 | |||
312 | |||
313 | |||
314 | |||
315 | *.%% | ||
316 | |||
317 | |||
318 | |||
319 | !* :E)B0%271+,8*(!" /( *$'(&)'!*''*(&$ | ||
320 | " | ||
321 | |||
322 | |||
323 | |||
324 | |||
325 | |||
326 | |||
327 | |||
328 | ,*($)& *>!&J4>:(&2* & %.,)#3%&+;#?DDZ67]8S%# (;'"67-UA=K?FF >K*<M')D&**0$%")$ $)$#$% | ||
329 | % # %'%!)$,!&% ")+ &0#'74(88%1<-@V,/B-0-$*!$.5*523=5CX52S%E?ZU#LN/@F!FC#MF1?I0DR";O 8O>(C=+.'(/;* & ) | ||
330 | !%" !& %=@ ) | ||
331 | |||
332 | |||
333 | ! | ||
334 | & !&" %(74)'<%-4(7"37?5:2H,!<5F=*E`6\1 ,#-,/.7I8F</C:?SB4=90/1)('+!"/$'.'//8ID_d@-F?JQL^YqL\ˆIIC39F+;A2JM4RW9YGPQ<DL;AGB-@31839?@>IGAF79@,:6.3;*.<,&6(2=0@F)@?&10!/3#//*;7.:6,03()/'/2!03)190CW8EO<>9G7CN?PZ8[V1FM6^4>I+55%14*/812:A07:/80*5-+7//7-.F>AeF<WB\V<OU9x}L¾º@v>jNZh=WbAXcRXjKT[GRa;?R1;V,BY)N](H],LU.@P=NcLVrEQf/KY.CZ9DZeZ‹ý÷€zsS<K[/C•Kfse\9D@;2@P@^^NrSNjDp‹}ÆÛ¨ÿÿ‡ÿòWè§ILTK6LH/RE4R4Mn@[rKUtGS_dc†÷Ëíÿýÿÿ¼ÿÿÿÿÿÿÿÿÎÿÿªµÕ^kqV\jLTP=NK>QCPU96D238,4</4?42>7/;7,902:/43)*/$%'%"'"' | ||
335 | |||
336 | |||
337 | |||
338 | |||
339 | |||
340 | |||
341 | |||
342 | |||
343 | |||
344 | |||
345 | |||
346 | |||
347 | |||
348 | |||
349 | |||
350 | |||
351 | + *&$ | ||
352 | |||
353 | |||
354 | |||
355 | |||
356 | , : Y,I<%3:4.*3$#%!%!"( &%)"' "&+++( " ! | ||
357 | |||
358 | |||
359 | |||
360 | |||
361 | |||
362 | |||
363 | |||
364 | |||
365 | '$@,LT$?Q0 7,!'O2#GH=C!$=!"6>!7R#"LH#&62*G%*)/)2&/P(9R1?M70H;+81/+ 1/#,,44<9")!"*(+&4)!" | ||
366 | .&& (%%!&1,8HGH)BK/4HC=4#!'""%'.6-N)'G",*"6;-R1&G."<%%81"D2/64-3/;B.5L5-9":!0"#"-30>@gGF\.G8") | ||
367 | |||
368 | |||
369 | |||
370 | |||
371 | |||
372 | |||
373 | |||
374 | |||
375 | &"'' "+. "" 2)%(?0G+\I- ),&!)&K>T?4<.?&275%1A+44$4G*634:%" #(/'%&1$(/I(6S0*:7;IJ]JRqZ\eCUE15/&665@9E36I5G?(AB/B;453*2206=/:A?G@5I54H1391113//$*/3.89;I34>';7*.5-274=@0:?(,3%35'=;'27*JE4JR2JQ-W\-Ra=[f<aZ>bW?KK:AM*?D0@H27>3lM/rD+7/'1:*6:&7920@65MKAfIl‚U`|’q¾†r˜Rg‚S`nIkp?n|OlzPoq>Ww4mz2W^+Q[/\t.Pn6Lf;RlAMdOGmBGb6MU1G^:JduBqøG§êP†]>OK:AkYV{U|Wº‡:GBHCK^C_INnQq„«z®ÿŽÚÿ…îÚùõsTY547>385-936P95Y@:XGKjdQ€ÓÿÿÿÿÿõûÿŒÿÿÇÿÿ±Êÿn’ŠW`WKZMOVCGOK5GC2D<4G17>0:?01=3*32+43/40/6,36-0/#*+&')( | ||
376 | |||
377 | |||
378 | |||
379 | |||
380 | |||
381 | |||
382 | |||
383 | |||
384 | |||
385 | |||
386 | |||
387 | |||
388 | |||
389 | |||
390 | (&!$'! | ||
391 | |||
392 | |||
393 | |||
394 | |||
395 | " # 4=%W/!KD+<=;&1- $# # %!!&$- !" | ||
396 | |||
397 | |||
398 | |||
399 | |||
400 | +&9)C/<;/5A@*34.!,/L(!IWI@UC272!-6$,;2&"0!))+/%*!$ >92GB5;2!8*<098>D8HI8)0)*'!'. ,%*-,!"!!#!"!" % ! "!%#?,-0.;25I=01E<-F9.=2$(* ! ! ")#7""*%#6!$1(&. /%$/#..0+9**3%"*%!!*!6:=J7! | ||
401 | |||
402 | |||
403 | |||
404 | |||
405 | |||
406 | |||
407 | !"%(#!$ /14& !83K7?3'0$.,*)!'%,-$3,&5 ##+@:026/$B53oM'QR7PKR:EKFPK[^3e\j[)Lh,4=229<742-+518-)/)13-.77=A<)65(56(-+/8-0<$:?"KD7@B<7</1?.'/5.29.=;3>24;%1<*.;0+8,MX7Y9Tp6Ld2e…5x…C]~JW|?Hj8@R57H51C74ECFsXf :l~)JO.?G.TY&CH&7F49PNDmWN{v4\=egKniTpdRkZmren†ei}BQp<xƒ?W{:R^8Ib8@`4Dj:Be4BhCJb@KZ;Ni5lW:DZND[¢8WÂ-ML5KH;U^AhA[§I‡k3J=3Q>Lb?CXXP|Zxà^„ÿV‘ÿDŸ²:^3<K$CK!5B,6=02@36>9DN^Cfír¶ÿ”ÿÿ§ÅÿpŒÿf›ÿb†ªurejeMCTEFP<>M89A?-;7+55080,<,-6),/,+2),44/5127+./)$.!)- &.# | ||
408 | |||
409 | |||
410 | |||
411 | |||
412 | |||
413 | |||
414 | |||
415 | |||
416 | |||
417 | |||
418 | |||
419 | |||
420 | |||
421 | .,#%$ | ||
422 | |||
423 | |||
424 | |||
425 | |||
426 | ' ' | ||
427 | # | ||
428 | 4B)F/$E>;>8C&05("# '"!&$$ $ &!!'" | ||
429 | |||
430 | |||
431 | |||
432 | |||
433 | |||
434 | |||
435 | |||
436 | |||
437 | #2F:!:P20E: A,!,+!%*17S>WS%J>6*1& -' '&+"$(:%:-$D+):"&4(*3&644B&49)" !$*%&#'($& "$ $ !"#,)<>TE#IJ&5AW6*6F1*83-8,49!*+!-%% %'(/"!!% "(!#!( &&%(&0 | ||
438 | |||
439 | |||
440 | |||
441 | |||
442 | |||
443 | % $*;7;2-)/3+&+ 'D0 !!$#! #%$,)%3 0@%L[4WtCEd=a=HL6MP?esFQoH@\FQXFGG.14+69'04(+++(+)'/ 0-,:755)66&(-()*1&2/,28.=9,B5534+40.4+1<-555-:3-60&23'/*/.)2:2Ab2Mb5Vg6R}=ZF2WR4MM+@B,=;(64#1106F.F=Y„9QU=K8@VCH_;5P'3I$:P1RWG?O=0GE4DP>VVQb^Smng‹iR‚jQ|Qd€T‚]›H‹”<yl-oX'YU,0G*,L67U@B_YIhZYqIddDn[>AL=6G/:I5]iLn~_`h‚6Oq2C:/=9B\<G\WJ`ƒTj€Yn‹V\ªOU7F0>R11E'-@(3?%0?):E/;IF>O¥r~ÿt…ÿ\v¬jm³S`»Zi}ey[hsLX^COZ@=G52=,-91/4./53,5-*4):0)-1(/4-)31'0.&-( &%",!)* | ||
444 | |||
445 | |||
446 | |||
447 | |||
448 | |||
449 | |||
450 | |||
451 | |||
452 | 2 | ||
453 | 1''# | ||
454 | |||
455 | |||
456 | |||
457 | $&" | ||
458 | |||
459 | + ;R'J6#G:2>=7/3.(%"## ')##'$,! '!." | ||
460 | & , | ||
461 | |||
462 | |||
463 | |||
464 | |||
465 | |||
466 | !7&14;A(49/'!("&. &=(34%"0( & | ||
467 | &"6#!*&%*,#% ( '.2<*9!&"(+8"5%1%-2107/3'"" ( +"$## #!**1,.+3?8(=Y5=]25T+,M+9Z4J &"!&! $ !* #) | ||
468 | |||
469 | |||
470 | |||
471 | |||
472 | |||
473 | |||
474 | |||
475 | |||
476 | |||
477 | |||
478 | ($" "(G9 ,# !"$(%%%'&"(:+;Q'A`/AZ1:k?MA^bLLTe>NO5GDI]@W^7YU(A;06;(07&"&%#("&(49/?E,AN,&1'+'&0.';=1N>603766-30*43,/813G1>D++0)38(iR+eE,H>+eS0fh5GZ;<OJ7RR(4=*,:/415A-D=)6;#?G.4@<7EJCXDP`9@S9=W6;M%6E(.B57N;0D/*7+0>1->C1PUHeRap\OjRNmU^€gn¥‚‡½u‡ºd{»Mz¢<f€(6;&&5/1:>0?A:Sagth]}Xq?”s)(B&1D6_pITtKLnDJP3JI/DO4PU=IYFY]dWbkfrkxv^_cADA18=.4=(24,03)=6&:>/:D>_Uki‘𮳥•z”€dojejsp_lkVlS[eFTa?AP26=)58),9-:9+55(C6)`>*X3(H5+27,,-)'+%')""%"$+! | ||
479 | ! | ||
480 | |||
481 | |||
482 | |||
483 | 6 | ||
484 | 0&*) " | ||
485 | |||
486 | |||
487 | |||
488 | |||
489 | |||
490 | ! ' /?"I,?6*B8488>)./ %( 2*#"#)&!%.")&*()!%!'( | ||
491 | |||
492 | |||
493 | $ !!I! }K)U1 | ||
494 | |||
495 | |||
496 | 5@=-73%/*+%I:*>!'!$'%,9/7) $ '&%.$*###& -(&3%"! ,&,-!&'*!*$/7%'9%15 ,& 7+-9*2&/%'&("$2 %1 )!")!!4#)=&%KM"@K&39",:.#<$ 5$" & | ||
497 | ! | ||
498 | |||
499 | |||
500 | |||
501 | |||
502 | |||
503 | |||
504 | |||
505 | |||
506 | |||
507 | |||
508 | |||
509 | |||
510 | |||
511 | |||
512 | &"4)3)#*$.! !""&*,)((&-,1C7:7:<68:H9HLSXIRJFH;3==?ESESOMWC?G2>B/CD$8/4/2/!/(+47.7B5,6$C>&O<&::3;E,>D%GE-BB&36-,33.2;=A*78%6?:FiLa—9nv@hzJF`E.697E0=C3*-&H<'D71H=0BI2IR,Y`+LY'>C-@K4<Q64S.4F-?I#=B#0;.3=4-8(2@'/=.78+?9CQXNNZDFS4MnFxz[n‚^~–K}„5^„.[p.SG+7*'8,/859?;;Dd=]xIaˆ9_‰Br;.1+"8LQbP-KH9NDOi2nh-]a=VkErlU}uY‘vigy|toTmLTZ2QJ.<?.<A*NK.NO2MQ2DFI]bvkŠž]•¤^‰cŽ}dwfXygVm^TbUNiLR]ASZ2GM/@J+49,4=(36-S?5fK6‚P1^A.+6+,4"/1#01 +0#*/$ | ||
513 | |||
514 | |||
515 | |||
516 | |||
517 | |||
518 | |||
519 | |||
520 | |||
521 | |||
522 | |||
523 | |||
524 | .*&'' | ||
525 | |||
526 | |||
527 | "% /H#J2&K8/>50*25"%+#! 9.-""!)( " "))(!,-2,5&/' % !(W- 5T&%#'$" | ||
528 | |||
529 | |||
530 | "SMM=B3B..+&53DOW`',[!(D#&"/0/&?(*6521 # 7&! #) *5%.-(!2($(.)!&*393/6*/51"'1#18=<2B);$'6'4-'+ ***!&!%%(* " &+3 '' !'2;N);&! 2(0'&# # | ||
531 | |||
532 | |||
533 | |||
534 | |||
535 | |||
536 | |||
537 | |||
538 | |||
539 | |||
540 | |||
541 | |||
542 | |||
543 | |||
544 | |||
545 | |||
546 | |||
547 | |||
548 | |||
549 | |||
550 | "&!) &&+*'"190+%$'-1'T;@+ - '*$/-74<.52&5A1AD/GE3B?;LDJCBFCG78A,/>6/@K1LE6K324<-<38=)RI)CE)LG+4A(<>#13-9B=-C8/K:=G>0?4,@7/<4,8*(1(-82?L4Wn*Im9If^OYoHi]JY[DYC8A+=A,6E#CH*hi5`~1pƒ7R\HBS@=WAGX0.>/-4-,9*!.+&910E,;@(.3(&3(5>$0;&B<.=A1AM8AXEH]@LL06CB\zOj‹W|ZˆWƒwEHBK56986!:8)DF2AO68HF7Kc6\^8Iv&<W/8$6;;-DI*8<KKH\c]eqLfuXch_^˜wÐîxÿÿj²œ~ƒ|wYiTBlKGb:QR7ZX=UbIS^JCOEAI\p`ugs†ev„Zo’Xp|[rlJ_V=XP:PI=TFGVF;Q?EV1CM3;G37?28<1A<?UBFcG;;:2$+,&1('-()0(*2''1' | ||
551 | |||
552 | |||
553 | |||
554 | |||
555 | |||
556 | '*" &" | ||
557 | ':"1/#<,492.)-0%"'!!# >/20'$6/,6$-!* !! &"&)')-+5 )3 -+$$! | ||
558 | 32*66((, | ||
559 | "*%689QJ;;MB@8812+,(-.:7%OL8S7,*>J9K4BAAMaW#,!"! | ||
560 | ,%2 "/(&'#%)%(1-$(-%5".&!&0 '$%')*!4#%211"-7%6.&2F99#)6(,-.,?+9,6,8'11$ "+++'" "7&2""& @$!5;%,.!-2$& | ||
561 | |||
562 | |||
563 | |||
564 | |||
565 | |||
566 | |||
567 | |||
568 | |||
569 | |||
570 | |||
571 | |||
572 | |||
573 | " "#$ "*)-4!!+5;&5^8Q3J>55=+"$ 2-:<#5<,DT$D=,97>81?:>:CE?HF@@G89@:.>-,40-76)4@(37983==2BC=T\CUY<EW7JH-F?,FP*;A<CA?4:=/:;(47*-775195+21%(0*/1?':33A-CZ<;PF3RG1BK*AB,>.*9/5C1<XBDhV=_W<YV\pDlm@DKE+>=02)/3)-/)+!,+*586BH)JB&;8,&1//925B5;C9<GE9GE6DH1K:;NI_kZj}Yngl™_h–<b-cn.v},rx.qx/R_4=Q3AO8OY@IV:<H72I,IS+=J38I3I[S^o_dsbSi_Plv;dáSÃÿÿÿôøÙ…¦¨eehAA_IF_MX]KapYkmWYgL_ZIYnb°ÃxêÆ]|`dxaXekFY^9LQ4DF4AC6BD3D@2?>1A<;F58A.?E.<@0S=>_:B`?=0-+()&'2'+1)'-**.$).' | ||
574 | |||
575 | |||
576 | |||
577 | |||
578 | |||
579 | |||
580 | ! " #39%>*)93*)/,#!!!5 ,2!1.'22#..(#*'!$%!,/$0,#.4!,7%(-(#.", %6,2+ "!%*" &() | ||
581 | ;LL:IZBBL61T/I",$8)1C,:D 5*&-0&/#%/ 1C%A+(""#$4(71 +5"1%- $"!!*.13!7-57*2#.5*"66': :%$3$"449/!4+)/"(,1%-+"%4,*62+9525&#! '"%6!)%"*&$0* | ||
582 | |||
583 | |||
584 | |||
585 | |||
586 | |||
587 | |||
588 | |||
589 | |||
590 | |||
591 | |||
592 | $ (#!"'/8&?/ (0." (),+,-(-&*,&0.#G37H5=KGgf0BP-RV3[f;U[9ET>2@9.7-.6,21'"1&#/$ *+.;69K47CE=SW-IF&=B/M>8R8U_2SU1;C,?N%5=-8=$6?)7B0<>*KJ#D?'7:+61.+,20674:;(40$/503---,'-'06-?<78;BN>6=SG>^W-SI2R14D031'25(:<!HB L>+T;8>DN->;*9&+..-133:I<=8*7=67:(2:429/>NL^eRiZ@deHqkGocUnB\pFUŒHq£JažGiˆ9U_/AT3Wc;Sa.G[,EV5GY1@P,>Y@BR]6Kb8Ua@YW5LU1F•=nÿhÏÿ¢ÝÀi†ˆFY2)=7:SKNgZNhbXvVhvTjt_kx–d¤©‘Å{z‘^QoZQcMFZJJP67<<+99+48+;78984996?/7F2<F4DJ5gD9ZA<[@3L4%*(&'1$+0(!)"!($)0 | ||
593 | |||
594 | %% '+:<'>+$:1',-*) ! ''%&& *!% $''-'"0$"*%,(!$&!""-,#(-%#( | ||
595 | |||
596 | |||
597 | |||
598 | (($ | ||
599 | - | ||
600 | |||
601 | ("2I028E*4>".=1;")&)&#+.I,A.,0"3/+0"6!0/!5+%/0$'!1 $)$% !%"' ' !!&)/$8%0!"*-&*5((''!("*% !#!'3$C1<77#/('61$/E$ | ||
602 | ++ "$!$" | ||
603 | |||
604 | |||
605 | |||
606 | |||
607 | |||
608 | |||
609 | |||
610 | |||
611 | |||
612 | |||
613 | |||
614 | |||
615 | |||
616 | |||
617 | |||
618 | |||
619 | $)0 !*# " !#$ -#)<""-'$$-!8#,5#<=:PTQ`9HSJLWUX[HBLA9=384(16)=9+33&6."72"/.5+1:4:D2;K/8;+,0.-='/D<KS9M68F63C:DJ*JQ%KK.NQ1PS4JQ?IQ2-</,>(06'69)FN-4;%,4'4='@A 31"-4++7.5S<¦Ž09@4GI<#/A'414C+BH.GR0JQ7Re7s|?±šAzi?2<>%.)&2%;<-KO9AH1103)/,(/,.*,,,E/?k?Ld6ACIVPM`SK\GKXC4CD2XOEuU9eSSrJDRQD`Phi6<W0=Z6M_9NT.7D4+?G*9>&:D*8?:@0/4>EOº=hÿ>|¬Ea8B044'99;LZM>a`LZkHac`pk\l‚h…´†•ˆo]]^V>TG>IA@N:9=5,30%2-58-9<64<33<3+=3)>8>G<tJ<?:A792IB+:6%/4&&.# # ". | ||
620 | |||
621 | |||
622 | |||
623 | )%! | ||
624 | 2<"B(S*E5%9:),./&" "!/0$($&&( -" "&! #$#*%$#-)$ | ||
625 | !5$ '#!"(0% | ||
626 | |||
627 | )/$,0/00*/. % !!"(6!!91(!8('"!*%!!4(.$ ,=1.D#3<!8J'F$$&#%'% '&2 1+#! ,*!*"/,/+' $%L"5>H+%>(%-$6E$39$#! ! *$ :'&&($$'9)&2)4 )*13 | ||
628 | |||
629 | |||
630 | |||
631 | |||
632 | |||
633 | |||
634 | |||
635 | |||
636 | |||
637 | |||
638 | |||
639 | |||
640 | |||
641 | |||
642 | " !!,.!))!&-"+&/* "(')" 1''!"%'(.*1C6OB5B@8KK;SO?K<9@/JH*E?419144%99".8',6)0/+.448517=)DI"@B#--/(%H,-A27::A=,7?-J>F[82LJ3YH/RB<N;(;3'*1%,-1<03H94C&)5%0<-:B(/=&.<+>>DGL€Mfq29,*3111',-)351>G@@UD>OQ<Th\wc“QzK=E.)*(%4/`J6/CD&D9(1+&3-#+''1*-9/(1J,7K-::<G;=ZPThER`5?F2--:0;D,:T/EV9RP8Nf;R@6H.6P>6WH7O27@-98,5))%),AC2LK4B>9GGZFSw;D]8CN:7/;5+G6/C9;=AK:C[8BeEUiOcuJeŠU|…Xt`TdCJNB=E:6C84=.*3($/.4?4;?039+39-032/1<TAC}G93'5"'0).+)3)&1)(/$(')//# | ||
643 | |||
644 | |||
645 | |||
646 | |||
647 | |||
648 | |||
649 | * &!! 03"6)A.#?9+;65)-0#%"# ! 0+44! '00%*%'.&/1'1",# | ||
650 | $.+%<'$+(35)/$ /52+,/3,$7""# 0$%.% .'>#16+)'!-9**! 0-/#A-8A/&99$&+ , $(#-#&! ! 4S,8X2N24@.HC!)+$ | ||
651 | E+)'$)! | ||
652 | %',)*>*J?"4C07,2"/ +1)(*%""$! | ||
653 | |||
654 | |||
655 | |||
656 | |||
657 | 1 | ||
658 | %, &$"&.$&!%?) (("&!-&-&.07;<+,;:$AD,I9A8<7)47@<E=C>4G7>N=8K2;B,>C5A?138*14*8;89-EA0E</79;6B1BF#JH(>5*=73MH38J-(2=#6D&02%,;!*?,79/1''+#('*&,,+6123(<5';7,EG14>'05(2F@<Z`QhoKT.>B2C>%=2'C92IR>af?eZ<^WQkknTiˆLUV8<.78+*4J-G>,00#+8',+"0*61!2*&#-*'1/$-51<6@G><>K1?Z?SCQV2YM)?;*5951<;3>81@H@E<'8'2;/9<@4C5;P-_W+dj(l4U@K2BLFTFXPH>C9=I=<B656:G4;I<<F8547:/;A,<I1=T;LXCWiCUt>XdFZELY;AP4:@4/5)(,'&122>41>15;+1;,*4)2:7wMCuF50$"& '$##" !""))4! | ||
659 | |||
660 | |||
661 | |||
662 | |||
663 | |||
664 | |||
665 | |||
666 | |||
667 | |||
668 | |||
669 | |||
670 | |||
671 | 5 | ||
672 | 2&( | ||
673 | |||
674 | |||
675 | !#/ 1%7% ?+!8/.3/-.%+$$ #*$0#(#$(%#,)&-50"#%!(,!*)- .,''2"/+#"! | ||
676 | |||
677 | !!*'.%+8"1<1/+4*-#)) E?@*2!8,;=:;?H8V,75/350I2?%<.2#03;,%,,*%//*(5#>0) !' "# ! "_9^n(7GA,-5&*1$!! !@1$1+%$ &$4/#K4-@4=@*GL%:5#83#++.2!2&&*-! | ||
678 | '?' | ||
679 | * | ||
680 | |||
681 | *!9U#- | ||
682 | |||
683 | |||
684 | "#%# T460+-+"# "!!,('#% ! &1,,?)9<-735O1Ad5+A+'2/)B2+580>678A9@??B=HH5?J61?(1:+;L44>8<H9RM5JR./@34D/,?5=Q,AK3+E>$;.)/"'+.#)!&$'&!,.1<(>721$;;'@7-:A,JJ,/?00:7%3*-:->E529HJXQNlCXe6ek@[t4bx5xxBpƒYc†NiWP€TQvB_n=;L/Q^(1D8'7N&/%&2$,8&'4-/;*58 */#15#(2)#/1(<>,D6BHD8LIVoD‘•8€/gY2*=.-62,963F.,4$4>%<E-5<-)<DLh^Yqww¸`…‰PGHW@T]|‹Ohf<QP8362=2:C>BK=@D>4.6-5:1)46*3>,@A8P@@LKMTOAHK>S=?P6GK/=='#,'!)1)05*32,5.,7&+4(4<AuUJvE,3 !"$0/!79$ | ||
685 | |||
686 | |||
687 | |||
688 | |||
689 | |||
690 | |||
691 | |||
692 | |||
693 | 3 3)*' # | ||
694 | |||
695 | |||
696 | !!27$D+F0#<4(.-+2'($%!&##($(,'.# ('0" 0118!<$&&#!#'$( &-*$#(,",.! !'# | ||
697 | |||
698 | $(($!.) +4) 4#!96%<G(;. (".NBQ)9L(;LIK?V!AM**P2!@**##&.,9DH1;D/-=,%0)#/*2/' '1 *, "(+%! !""!'++.KT1A5/,"&E & &H2-)82'$ (7&-1, /@2I/6F+<L%4G'*6#.=/;.8 26")!$ !'## "*#$ | ||
699 | 8G"$H -G | ||
700 | &,. | ||
701 | 1 | ||
702 | +)( | ||
703 | F%zUmUU5JB%OM;DS! =# | ||
704 | |||
705 | |||
706 | |||
707 | #*1H*mhJO,>-;DH@E787?*0!(#!' ##"('+.&3+)'(F%:M*6.%') '4),3(-4->22=;AB:5BE-=A380:75?=<307*0L3GD6F9:A0(-6-,7+5B@J7+.8('&* 54,,*+,-!71).26>@+PY,U_/@K/7M65J8/7*)/.!%-")5+:1(:0<XAQ`>OcEbˆAp‚EQƒ^W‹Zg‘ZmŒ^X}OLwKDfNIlI3I8+C0/H'1=)-6%)3#*8$#4!,0//2&'-!.5+/5&/(69/$571D08N@Jdlnžs ªU†Š9<>*$0,,40)8219);E/N]+@O+45C6@nWllp’jvFBLKKWk~‰uMlM>L='46-3AA=EC<DA96/0+57*76()2..93@E<8F?ET<AK;5GB;D>4I4BF'40%&*')/+,3)+3-+3+38+F7G?:L91,%&.",9',<' | ||
708 | |||
709 | |||
710 | |||
711 | |||
712 | |||
713 | |||
714 | |||
715 | |||
716 | |||
717 | |||
718 | |||
719 | |||
720 | 43'+-" | ||
721 | |||
722 | |||
723 | |||
724 | |||
725 | "',9#O-W@%:@-20-3(!')! !# %#&"*("0(3A#"5(!$ $ %''"!. &$(3/') #'(!( #%2"2*,!$!"24*+*( | ||
726 | |||
727 | !&*!)1$E(!>-@=EL'HF28A)D13) /279 :.(3@C)6C&673+600&! **"CG-9B4%.-# *%$9/5"#% *"(#.+%( ! "" $%MI!PQ>-87"*$"/)" ! | ||
728 | 'D5/33- "! 1"//:+5 6&+7+?@+8.(/'(5 "-91-+%'"'),*- | ||
729 | |||
730 | |||
731 | :+/$)J6XCB`=QCHPVY) | ||
732 | ( KAIH$D_LPNJ>Z5$B3!AC6b9'2(*&2 ! | ||
733 | |||
734 | |||
735 | |||
736 | |||
737 | " : ;L.8%"+,16.2G'/8''),3/1:2/,*,"(!%%"',' $&'-00&?36;A8&/2'(-.)/3>B<2<6A<4=<.8?36:7?=-5;-6>=5>=5=-;:!.*"$.44A5>H!*)/3$:S%A_"?:#<7')>(4;,BR:]lMOyIYe;K[8T`9DR'D<%?061&?K3>T3/ELAbC>mHUzRZ†@p…@Rqe]vjNm_>Y:?Y(@[2>\52N(5?*7C 0@#,B"37#85 ;3"/-((/$94$+5*A@%))$#/(!*-#372@8>RpSj§i”’Zt^QL'5/%45+<:-291QX<RR7\[4WO7qkR’b‹p‘®LusC‹tcbymhfJ4=:*,-(/:.8F5=A2:2/0,94/=>%,3+2418G1KL7AO8HQ5EF6?B76?8<F3A@$(-!,6#25(+0*.3*/3,B28<+8("$+"/9$:=& | ||
738 | |||
739 | |||
740 | |||
741 | |||
742 | |||
743 | |||
744 | |||
745 | |||
746 | |||
747 | |||
748 | -4#..& | ||
749 | |||
750 | (/4$C&Q5(;=9-29,%%%! # !&"+* %!"%%".$*! #+#)3")5)(+%)&!*'!),,43'?1)(=++<)0118>#;*! | ||
751 | |||
752 | |||
753 | |||
754 | |||
755 | |||
756 | |||
757 | # -/0&+'&"E,@_#:F2IE*6U,8="*-1.,%/8!)-/#38=B /E*1B!1A&0E)6!#,,12(7#',<)%=C"5A109.B,8,(, 21180>+H*;:/!,)1)!*/# &&54EI!8.1! $ "A69@65%%$#03)2".%7*>&*F#26#()"(,!-, /<(( | ||
758 | ,4" )2&2*?1):%@0A_AAS<-J/7?*Sh9_s'XlE`+;L6I]DDe?)N:'&'+(>4:s\"5! / #.!! %"(% | ||
759 | |||
760 | + "0!)7='9D$DG)7<#91'% !'+(-*&)),&+)4)+?-)3.+;.%0) $.*,7D:2F5=E7-A525;094,44'-1&3/(51&;97J11;)0'&,1;3A1-2%#!!%)6,@Y3Yf+9<.<C3LQ?HY@4\KBi;Hz8Jo;Ko:Zl1jr)qz6F%Bk&+A.'<4(?;<FB9S^>sJLe@JjQ<XM1@:.D5(:+5%%4,/6//=%38 02+,:)0@+BH'-5&)0#03&.3.8C,-:"8:$39&49-3<C-BY2QyOj‡s~f~3v](=B/@N.[S>SSS‘‹NxkNSlIifwœpEulLjbUƒ\†§g{“b“•>YR0&.)'-4-A+1:/8/223=>7:;.64+:?2GF;KR>EQ8>V;FW8Y]5WR9AD9>E(19"/8,4;,68'-1+@0+D/1@+$% "'5=$?N# | ||
761 | |||
762 | |||
763 | |||
764 | |||
765 | |||
766 | |||
767 | |||
768 | |||
769 | |||
770 | |||
771 | |||
772 | |||
773 | |||
774 | |||
775 | |||
776 | |||
777 | |||
778 | 0 3&*)% $ +5$H$L4*<983-7#' !&($%#") +(#'%$%#+$%#*$*$''* "#(#'-&'&*$%#!#!$ "�-)#,/*+-./&,6)'63!($$ | ||
779 | |||
780 | 0 :6/9/" -+:77& $#166HF6=<9G6-I= ,3" $, 5#-1/.7&B!$,*(-*'0-04,4<&$7%)/(- ) +<59@N<T^&/Y?L1F/8#3N%7>+A/9 ":0&' %!#" !+ (5#+ % "%*& :36907)& !+(7' $*2%-*215%&*-(0;:2@,;!8"#6$$<)(3#6/,2<A2B= 40 1)0@O0Ha$NT/AD'58 4?".E"3813R+aa?Th"8C@DJ'#% | ||
781 | " $*%,3-27IA90F13A/JK@@91".0$;8#.5 '3#&6++846A/',1$!""'/10:9*=,5?571*11'01%/.**#"&)-/*<91=88-80AD!66+6?.6B"69!!&#TfGQiDFO'C\6tzHƒ„.\W4Fh<Se:W8:I<8RK5Wd:eAMy2H",?, %.%64BK53GFCG=08;4F62;10;6(4++)&&()*1/1@1-;*4:+AK3JG3WW4&.%%/%22/EF3MM1C9#>?'.:(29,-3.2:3)8_9Qw[t~„hD^C-D=>TR‚ˆV`m~Qt‰`{T<JO*<Z&Ib:CS[`cU_er‡~m‹tt“Z;R.*')+'#"&+%+42503566;967855.;B4HW>JX?P\9GP=AMHDUJQ_@JQ5=E.@D,;@09;*9<)26,;/+6++9*#7 $##""$(8.BJ) | ||
782 | |||
783 | |||
784 | |||
785 | |||
786 | |||
787 | |||
788 | |||
789 | |||
790 | |||
791 | |||
792 | -4$)( | ||
793 | ( | ||
794 | |||
795 | |||
796 | *1B#N-\:)HC4+74 ( " !!(!"0&""$" %$&&!"'#$ *"$ #(#("#*("*1"(5)--,'.!!* " | ||
797 | (*= 1/"*$- & %"-)#'/=(!:>57(;9/4F*.?')85/5!!," %'%!*$".&2+ ("'282!/E 7C#;B)<E#5?42%! !&C'6:T+,K<)=J/88!F48.#9(.('!-#,'!##"-&4 $*!"#E* $$ %# '&# %'#!"(!% !%E25,)3& 38(/(&!! !!"!! &5.,US0sK+%7(!%%%$)/,&-,$)7+$1-!#!#$-!5),80/-+<%79(1.5D%W$6M#()3!8. | ||
798 | |||
799 | |||
800 | '!'!()4184;4$&9,2A@E5]^.2?#/8,59)(-$#'&"*05:'+1'(!&%/$.,()-61-6/44)%%("&)'%"%& *)+351*53'.34A94E.=?6+4+77')3'(Nd4>`G`{-7EDZudqTYv-MP*EP*8T.Fh.+4/"$C '7<M)>T%-9&)+)&/2)45=H3AW1=E+4L+1K,>L,:C%:<$4;$&1()>.+@.'62-5<0F>4E3(0 #$61.0663C;/H22F1.3)?>)UH'JE$,05+>f9X†ZkMPD .G';b3]l=V\I`{=OL6B1792B855CAB[F:WRatofwwXk\8B,57(0/"-1$/,/'24%3=3:8542)65CG@AI@?RBC]8QZ:KP<ENECS@WX;KR7DK2CP3NV3VQ.=?+6.,*#*@.#B*&"&%5012.-#""$()>* | ||
801 | |||
802 | |||
803 | |||
804 | |||
805 | |||
806 | |||
807 | |||
808 | |||
809 | 38%*(' | ||
810 | |||
811 | |||
812 | 2=$H)P5"[?-EI:067%'*!"$#"!!!!*#+&%('##!#'"+./-#*$$! "!#&"('#!# # "$!$%%()!&*#"'" ( * | ||
813 | |||
814 | |||
815 | |||
816 | %'+!""%#!&!(0$" !&57,&N*--'6*-1-)'9!-7#/=5 1+.'>0(+'%/&86)8G'1C(+8##33-938N"4I>#91#5$- "0 "-$$$ %%.,06#' !99##=%-/,2&/!200;-/0/,*%%4$-+!" %)+%&( ?01'&) | ||
817 | |||
818 | ,!5# )0(%'0(A! ),5CAc6?04*)$$##%-2M9-'.(2&"-1"$/+ /'(>'!6R):,0%$ #-* | ||
819 | |||
820 | |||
821 | |||
822 | |||
823 | |||
824 | "*!%"#-'#33174'%$#!",-77>O:;=,.3/#4.!) !+--'"*:/$()))(1"'/(%)0'7+7A+=E%-1 *+")%,)5>,#0,$).&,>&.622/(+)*,)-&**;,(4/1C/Dd:T^k=am3UMD_6=V8'/*!//"6 )2.3+3*$>)":'1A*8 2<37C4(B;-F#0C#0G)OU.>K-;J38E(.< ,3 (4*190)/0*29-7*&/%#/3--4.'-1(*0#20$0+KV3bm6<P''2'%,=&5t@Sl-=)''")?&1Z0BJ>ID>B8'.3,@/;J--9:+<G)7Q/O]Mm[gkD/:6382+2*+7(5>,134/5.143-13/917C=6F>7D@7JDAR>BS==G<4HBCW?IX9>G8=IB=TB>U>AI,C9#A/-bC*T:81"9?*7;*,: )%')+(%+/( | ||
825 | |||
826 | |||
827 | |||
828 | |||
829 | |||
830 | |||
831 | |||
832 | |||
833 | |||
834 | |||
835 | |||
836 | /8$*,) | ||
837 | %$77&=) Q/,O93IA>.9:)$*! %#"$%((., #,(')-$413-7!*3$)*#)%&(#!##$"!" 6-.!4 !!+ $&#!# " | ||
838 | &(#(""%((!("!+?-5A#GA&8 )#$(""'#2315 3'&!(8;06E )?4560&!'#%'36!&@2+:0.2 !, $+%)."!##$&&'-*&+ 0$++-/;BD;&.%"#'34; A9 3=0=;F)17-&5'(2"%!/*-0.+&!!$!# )# | ||
839 | $# !")"% ! ' 9:*'(& | ||
840 | )1=<"28'%&%% #1)%( | ||
841 | 2P 1$D&0#2 =8!'L0b[NSJR ;."#/$$.#,'1($%,)4 +",( | ||
842 | |||
843 | |||
844 | |||
845 | |||
846 | %"))-%46-/1,$'$!*)5'-7,6$-2"%.$%*#)% &+($$# "'.%"+!+#($% #%%2 *;&392=,('(!#)!(5$+!*/'$+%$#!(*"."#(#"($ + )/*(&%&1/*<B/CFF\EDPEAKI<B:+1"-+ :7"FU8>18"+!$ !!)&! ),+0517,#-'"-# 14'<A9O5/E<2I,&=#%6!(/*$3/,:&&4)&3'*%8:),2' '"0/&1/'*3-0<K;UE:G1!( ((",<3FD:<"*(%',4.'2<+9<2F-3A*K<4FM3<E-HM.B<7%.Q.6W=T=(03*/13=-8644@19;-2;-.5,'+*15/4979A3BF76E<=EA;G98A549=3>F4H:=?8=>::@><DA:D5E;1<6AXN=qJ2E:.9;,(/*!'% &!,& | ||
847 | |||
848 | |||
849 | |||
850 | |||
851 | |||
852 | |||
853 | |||
854 | . 4$"+-' # '0>&C.$V.)^;-OD;/<=($+!%!/'%,7&28!!6& )%60*7E+(; %.&.*#","-0+9 /# | ||
855 | $!((#>8-3'; ,0 | ||
856 | |||
857 | |||
858 | %'"# &#&.21B$51%9);06(<050$#,G0/H$$$.$1#$$"$'!&&/#.*'$,,#%!2$#(*(##,(!!1)%&!"# %!#& !-' %8!362/(3 .80(DB;)8\.2I+9K/$@'(/(4%,!")(81%- "')-** + 1&.'%%& ,4"( %(,A4)8D8A).-,64()# % #6"41*:U8C-A8'2# $-2:.0 B0!"#+$%$ ) | ||
859 | |||
860 | |||
861 | |||
862 | |||
863 | |||
864 | |||
865 | %#%",$*238@+=4 ' !)(+-%*3&%,%1-!%3!!*1 "'(&$$#""#$)$&!#"#*)*845684)! $! !##!&%)"(-))"'/%*)!*(0. 0'%##(%"#&'2222-7-6;.=B6E;;K2BE$2?(0<',>&*:'4O/9*" ,).--(+/>=,8E$)1"" #7'.%6+(9$#."+$3##1*"/%#1'-"%&'#6=,@?-($*(**8$/:*03<7B<?C)*13/!*0+742?,5; ,/&-5.07)-6.>D2HN9Vd7ao1`r8\g5<I*)-.)/<286,3*,1.(21198535.52)00$,(&)#06,8@49A3CJ;<G56B=?E9AC3;<33;4>L9JQ4FM2@C1GG;;<4--5*)I99MHG;L63.2-&'""'!/&$%%&" | ||
866 | |||
867 | |||
868 | |||
869 | |||
870 | + | ||
871 | ($&*, &09&:-F/#Z5-HG=7:@))-!#')".!!1"'#+%-//6(-?% 3 +#%(%4293<#*H*#!% | ||
872 | #"(*.5(3'84"!B#&) | ||
873 | |||
874 | |||
875 | |||
876 | |||
877 | && *%$, !" "$&&(8()8*;85I6?,*=,..$'03<+9"6''!#" $ $#('%(/ . # &'(/)5+"'& "#$ %' $!$#%#'&,,(85%-*''3$"&3*&N29#%=2A2" #5"50630+%('+#!$((' #2 | ||
878 | |||
879 | " 0+(!'!).!/'. "! | ||
880 | |||
881 | .%?2$1#%+#4 Y>'& " | ||
882 | ! .." !" #-!&''"11-+'/1(0 1,1*2*2 | ||
883 | ' | ||
884 | |||
885 | |||
886 | |||
887 | |||
888 | ##(%!(%$(#%*-*55;M-MB &#$%)%.)&/&45(63"(& %(%#*&$#$& %/ .0;6 18%)54-;-#*++#.%)%%!##&*%(!13#(, &3",E#?`!Yb19 07#7J,5K+=P,8A-;P59S6Rw-Ye(09*$- -*")7#-B7B:@!BHHS4>*5A5-8-(2!% #)%&%$ %* %))'EF-GF(6:2-'-*%(,&-/,*445D*TS#\]4<##.0+3038,3:(/80DF-;95GPDFVL;ZRGlFQvJWvIWn-QK*45.(-,'-'+-+*31,9=3:2(0.$'&&+&&.(4604=22=7>J8@G74A<7?;8M6<A1/982>?0GA2A81C70?73=1C+-6+=4.B;3<504 $)$" ).44!9B <>5:$! | ||
889 | |||
890 | |||
891 | |||
892 | |||
893 | (8 !)" | ||
894 | *+!,"-#;(&<1&(=5(,<&(.%#$')*45*;"'=!/% $$$9!&9$.4&$1$+( | ||
895 | %(*: )$/".%&$! | ||
896 | %$"%"" &!($!'5$*<21>/.<,$*$90"("&*('*'"7!!,(" '0!+'!""0!")!'"",33&# ,"34#!'"*'(#(&&"" "& #&('&,,02)*+0*# '%('!!"',(#""!7$79$1=)<?$%4'".$!'0'#! | ||
897 | $& #''F6#*% &$! ' | ||
898 | |||
899 | |||
900 | |||
901 | (%'1) | ||
902 | |||
903 | |||
904 | |||
905 | |||
906 | |||
907 | |||
908 | |||
909 | +*#$% $) -($&!'#+6(3!-;-+Y^)KL0 | ||
910 | 2 | ||
911 | |||
912 | |||
913 | |||
914 | |||
915 | |||
916 | !$(?N(/ '&!B>.9<@3@0.9,(%#!'0*+02/.4--6*%(" !!(,3)%?;,FC27B-/92,-3'%$!("-2 !.+&) ''&(( ),"''("!")!)H!<?,)'$!',&711'1'-1((214E<Qj2Um(EK$2B=I!KB"DA)A9)?O*3U--<'83,49&&2#$*&.'*,-.-&*!#(! ""%"#.2480?037)02')1"(4('2&/8,6:;0C=+B3-A(5(182.91/</&04/>:4C:<O@Us=UY>INCAYBB^L7fFaƒ7FP(:C'43(49+,03277'0(!(&")"01&+/*6=02:,099AL@;I;3B46>5084(35)30*.5(/7+/2).2(-12,1C6,]A/Y94F440%*"!$%*'-8,6C):L+7I/!"$ $% | ||
917 | |||
918 | |||
919 | |||
920 | 25&$0%!( ! ,1 +$!#$*! ("'/+""'&#'#$**)+"#*,'18$;"%0$) !!!&21K#,% "-.&'/. | ||
921 | |||
922 | |||
923 | " " "%&,"','.0'29*1>-4&")&1.17L<>P'OKCBGA;ID>@<76)"#!+&*#3"1-1#1""%$;+1B # #&# $+& &$",&'!%%/* #+-'-1&./(60(/2%+$)'!! " )&4&2.5#%6#%""! | ||
924 | |||
925 | |||
926 | |||
927 | |||
928 | |||
929 | |||
930 | |||
931 | |||
932 | *8 %#$(("!$&(0+#6("4B&/0!-'$=* C9&. | ||
933 | |||
934 | |||
935 | !/2YN&@H:821>&7I3QR0?B6,*)5*366)73''))!*()/ 1, #$--#.9,1=9:X7/C22B/6<%$2!$%+' #! %"% #!&"%'(#")-*)#6,.##"'$%)"&'&27;>UY0NF+>7 ,0'49,P7E^8\l7:P04G.-2)70'*0%!($/0#-, )&*8#@H'\E#,#(!$ #! !!"$ ',#%1"''+-($##%"&$*%//+28(+.#(&',$&-)/'.%$!5+86)380J=GY<@R:9K?(9?(:N4JS6A/)<0)71(40.50+7-)5%#" #)*$1--5/9?,=F,<G3BI95@5,21+3+,41,,%*/(-.*(.((+$%&+#+/,3K>BsX=ŒW9Y<):/ /%(#+)$..*35.+5-(9+);6 $""*%$!"%! | ||
936 | |||
937 | |||
938 | |||
939 | |||
940 | |||
941 | |||
942 | |||
943 | |||
944 | |||
945 | 2;&$0,&. #'$$ ''!"&)'(-,+).#1 !!!")%,10.*.**2(0&/%( $ | ||
946 | |||
947 | |||
948 | "',# # $##*#,! | ||
949 | !% " $*#(+% +'$,)* ,%"$$-)59'/0.B;#=-$52%0$)>0/C*(B-9&5!/"++%#(,'!$&!."0=*7 (*$!'+6%A%2+ "!"%**!*$%#"%'#*((!% "'(;$,' ' | ||
950 | |||
951 | |||
952 | |||
953 | |||
954 | |||
955 | |||
956 | |||
957 | |||
958 | |||
959 | |||
960 | |||
961 | |||
962 | |||
963 | |||
964 | |||
965 | |||
966 | &)**2D +=!5&)('#'" $"!1 | ||
967 | |||
968 | %"3-3E8I.MI!Zd&Zf77[D,K/ "!-&+$1(,5+&4(!#!)$*#'''$2,$:?,683+>=55>)5)35;G3#)" !! 2*-$'#"+!#&##&'*"'!!)"%8*=`^`aXA3"-,.=:?078"(*'0*3=FJU9TC'>2(3-)5%"((")"(!()1D")/# (4*:Y!C/!(2.()!#%% $$"%!%& " #(+&(&#!)$$$)0%"# #&"" !%!)/0@1EN1>U?4D7"2+#.*"-4 -A //'.'/ */%*,!),"*%!%%!& &,!,/-;19E6>H:@K9;?-97*42+08(02'),'*-$,*% ' $#!(/.7YH\‚hd“hB^G.<5!2; ?8=<'7<+38*',+ &%$.*$)!$ ("''$# #!! | ||
969 | 39*"3-%/ | ||
970 | '*"+69%3%'%! !&""!'! ('&&&' 7&&?'0!!3 #'(+&$ | ||
971 | |||
972 | #'%" ' !)"'%%##&"'"&"&,)*(1%'&$*(- *)'/-#)$+"*)",2,6+8+.0*#)('B-".G*3,,- &(" '(!*'#6'!'%!#L6"&6&# | ||
973 | !! | ||
974 | |||
975 | |||
976 | |||
977 | |||
978 | |||
979 | |||
980 | |||
981 | |||
982 | |||
983 | |||
984 | |||
985 | |||
986 | |||
987 | |||
988 | |||
989 | |||
990 | |||
991 | |||
992 | |||
993 | |||
994 | #.) | ||
995 | ! $-$'+4/! | ||
996 | |||
997 | #)</+<8BJG@LWAOR6EB029<@=;+, !'$#+/0"+0'6%,5 5812"2B0BO8ER/,8.4?*"!/ '5$!//"""',*1593"% "%"&"%! %!7%B7J-cA=b'H_#Qv-[V%'@2GQ-H[D,A5%,&@R)?K=9.4"$0$+)( (-%.)+%(7#3 #)%$* !$ !" ###"#)#)3%24$"+#54)0&66.)!.7#FGM>,/*;A3HN2/A-&5.&-**3%'.$%(&!%! ! !& %& )$&+$;5"5.(# %/!.43A3?E8@I7=E0>A,8=,69+/1%'-)).(**%$ !(%*A>F\tis‚cJYF0.+*&-'/=):F,7<+09&&(#!"( $#!% !! | ||
998 | |||
999 | |||
1000 | 48,"3.#0 | ||
1001 | "'/ (#:8)G+13++$#!"'!*)/.302=#@$"1)(.'0 ,)$!2# !%#%$ | ||
1002 | |||
1003 | -)*#).'.$&#"! $/%#1,52 !$ ,,*6694=49"$# /%-(/;0*0#(()$7!&5$ | ||
1004 | #/ | ||
1005 | ,! &!-% +/#(" " " " !)$/02 -7,%!"%," !+-".$ C34EC2*,!* | ||
1006 | |||
1007 | |||
1008 | |||
1009 | |||
1010 | |||
1011 | |||
1012 | |||
1013 | |||
1014 | |||
1015 | |||
1016 | |||
1017 | |||
1018 | |||
1019 | |||
1020 | |||
1021 | !!#!$#02$579" #% $$ | ||
1022 | |||
1023 | !!-3)5B:L>@=:5:,03+/:,7J1-2##&$-(+0'(/+369-2=26C:H\D=SDAF+34007)''% +.0/(,,%('%,*&.#(' $ %#$!# ,D&8.-'96*G/VJ2/WZ+Yt3Fd64C#&+$0$$5%/@-695%.&-%(-#, #)!$+$*#!"#!#'*'1',8.25(59(EF*>C1DN+WO,BI=]i@nx3XU3FNB@P3(,) ))$-)*1&.4"50#).0/2,'$"##+/26@.9:'0)1)#(+4)37;C;AG:9L9BP7CE-)2,).'$(%%%&$%"'(($(!"4(=I7[VSgaUH]E,?-"''%(*)*1*-6(18(.8"!$ "# | ||
1024 | |||
1025 | |||
1026 | |||
1027 | |||
1028 | |||
1029 | |||
1030 | |||
1031 | |||
1032 | |||
1033 | !::7$60'0 | ||
1034 | #' 0"7 @#629,$//((%) | ||
1035 | !#(%-,)/ !4&-$"3&#-+/"3% # !'",% 2&-7".! | ||
1036 | |||
1037 | |||
1038 | |||
1039 | |||
1040 | |||
1041 | |||
1042 | |||
1043 | |||
1044 | |||
1045 | ""&"+'#3/!#%!%((*/263.6-2.')'#!"$#"%"# "!&!%$"*-1%&-*)3*?4@2/A!520 *5+-"$D((% ,& '!'!" $,$ /' ."'*($ #!# !%#( '6"*(0# #$!,"*2,3.% & ! I)1,7B,1(!! | ||
1046 | |||
1047 | |||
1048 | |||
1049 | |||
1050 | |||
1051 | |||
1052 | |||
1053 | |||
1054 | " | ||
1055 | |||
1056 | |||
1057 | |||
1058 | |||
1059 | |||
1060 | |||
1061 | |||
1062 | |||
1063 | |||
1064 | &%!( #%4;.,-cC2WO-<P+',)06-+0%5!#&&")( *.#)3'451'0232=+=K(@%27"0,%-+2B">?$EB)-+ +&' #&! " ! "#!$$# ##%2'4ID4=FD'@.$9.)?%#1%**.-7*;=(39 C@80'1 * "&++ " #""')""-'"-13;39>36F:HU;7>><RJMdDT[NL^gPs_^`?9F@.:319$35&*.-)./'7+):''5(':)5=)4A!()" (*);658361/4)=@%5:(2>73C?:J@@HBAK@?M22.('+$((###"#" %%!*.--%B96YBIQPYRIDQD6A;'<:@A$?? ;6 <A"@O74'"$ !""! !# | ||
1065 | |||
1066 | |||
1067 | |||
1068 | |||
1069 | #!5*74"&31%/! '&"< 8';,7-&8.(+-*%#'" !# #(()*-!,!(-&0/##" +,"0&#! "$4 (; 3!! | ||
1070 | |||
1071 | |||
1072 | |||
1073 | |||
1074 | |||
1075 | |||
1076 | |||
1077 | "" '!%& ,$11/7%+?),;%+869?S2C)(& !((&% $%#,)#*-<>R 3P!1E/;=$5;3%)./'% "$ '07K3J%0(*""#2 -7'1=(?)B19=;&B'(%& | ||
1078 | % ">0'!54(&,)( | ||
1079 | |||
1080 | |||
1081 | |||
1082 | |||
1083 | |||
1084 | |||
1085 | |||
1086 | |||
1087 | |||
1088 | |||
1089 | |||
1090 | |||
1091 | |||
1092 | |||
1093 | |||
1094 | |||
1095 | |||
1096 | |||
1097 | |||
1098 | |||
1099 | |||
1100 | |||
1101 | |||
1102 | |||
1103 | |||
1104 | |||
1105 | |||
1106 | |||
1107 | ! # | ||
1108 | ,2-),! #/'3;*4SG&H<#A005$*/,"1"*&(0*(!"(!#"!&"%))(+63.;<-+>.&/0#*$," %"#('-7)05<N2". $"$)%"$*#)#"'3024'(#(''%182811@0)H9BHN6*0%&, 31"A8*0 +2#.5&/:15I-;D6,6""*"#&" $& *!*$ #)*/(-% $%%2%58-;93AF@I??M;1DN6O\GVN=[[So_[vKRU4BH/BB/7<+>>'78.'.. 0++1$!+-$1-/;(+8 %0%-2.35.19.8=5;G27:-2=18?::D>9I@JUDDH06>%./#(,"*,"361.',.&--.A?=NJBZLF^E@A8438':@'?L'CT%:G#2>$8K&=P"?@" | ||
1109 | |||
1110 | |||
1111 | |||
1112 | |||
1113 | |||
1114 | |||
1115 | !!&# 5'=."'72'/$' &!(,#-,3!>(=.(30(2,(&+(#%*( - ,3-%--$) #.%)7!+1#!7!)' #)2&!& | ||
1116 | # )$!* #&)%'-.22,3 7""&## | ||
1117 | |||
1118 | |||
1119 | |||
1120 | |||
1121 | |||
1122 | |||
1123 | |||
1124 | |||
1125 | &)%'! '#'(*,"'.$-$''""*&3460E5)5#(.//14*.!-'/*&1-,+",%-65(?$- %#-&.4+6())/##D&(" 54'??$('$=(&/ $.%)" N5ET'*&%46&$-'"$+'&5)%2(%0$( +%(1&4! | ||
1126 | !#"#&)0=4.A7*0+ | ||
1127 | |||
1128 | |||
1129 | |||
1130 | |||
1131 | |||
1132 | |||
1133 | |||
1134 | |||
1135 | |||
1136 | |||
1137 | |||
1138 | |||
1139 | |||
1140 | |||
1141 | |||
1142 | |||
1143 | |||
1144 | |||
1145 | |||
1146 | |||
1147 | |||
1148 | |||
1149 | |||
1150 | |||
1151 | |||
1152 | '" | ||
1153 | "$(4=!-&"20/.$#24+.F*23C8-73*$%!%& )$$"0!"$$"(&**2?,=N2<N479/)*%'*"&).69!bH+1+40/@(-0&;*B4]: # *'4)" <59*/%* $++&3%(3,*5'0"%/0*;(.C0;W2Zt:Hc2-3./%-</7S$7G"1:$4="6:.1:17B355$'0" # !"!!&$&##&.$12+/ " "#+2)*/(+9!1@);1 0>,>FAKH#6L&DT:WLAQ<CR=OY:PQ;TS/RR$IG %('1%$( %' .%-3 '/%*4+,71,941@82C6.<.1>7DP8KN9:BJ:QCNR;69.38)27#:4&-5)1<&8@);804;BFAEWIBQF5H9*85)=L(;A)9C&=H$=A%9@)=H$;G# | ||
1154 | |||
1155 | |||
1156 | |||
1157 | |||
1158 | |||
1159 | " %#"5)A5.4.",.'# "!*&#$(!$"' ,%&,#5 B(E0%1/'.(,/'$!+5=6&A)@,39,3#$+%")*(,6(&4$-%!% )%!()7&)#"'+ )!,&-&&"# | ||
1160 | |||
1161 | |||
1162 | |||
1163 | |||
1164 | ! | ||
1165 | |||
1166 | " !&)#"" #"$ &#&'+#*&#B3!@<.4&&+6,C-(4"$. (2&56:@$)802;(5,0/1+6!03)%0&% !$!!" '-0< -K")>7<IK0O"0(66"'EP2R/=I9P/6 =;:C9B)-(!./-41()- "1+ ,&%($ 6,"/&+-13+! | ||
1167 | |||
1168 | |||
1169 | |||
1170 | |||
1171 | |||
1172 | |||
1173 | |||
1174 | |||
1175 | |||
1176 | |||
1177 | |||
1178 | |||
1179 | |||
1180 | |||
1181 | |||
1182 | |||
1183 | |||
1184 | |||
1185 | |||
1186 | |||
1187 | |||
1188 | |||
1189 | |||
1190 | |||
1191 | |||
1192 | |||
1193 | !%)5IFgU+P_"WO%6C&?L",<-BO$).)'%(((5-&(.#+,.,/!#46'F+> *,'0%'0!%"'(%/-;;P8_v&md.vh$eWcp&Ic?B‡(0 '!#+34;.((",47%6-#+ (+1'/9%,6'-%/%&."(-" 1),-#A7KF9P86=#8<&8;4+>8,A,-9-/C,-@..B*;H05H#'/ !(#& '$#, & (((, , %,!%.#'+(/6!-6!"3((-)((-A(;. //!->-@C?UDBKKG\NF_KQ`QVhCFX%.9!)/!$2"'#)'&1%$1&&1%'2))8/)7,/=+2<,0=?7MGCXBDN@FSPOY>EJ,8?16;05=.2>+5E,:J/=J1NG;fG;cG@U=8D?,/3)+61.9/5?,8D'5D'0B-9M'<@% | ||
1194 | |||
1195 | |||
1196 | |||
1197 | |||
1198 | |||
1199 | |||
1200 | |||
1201 | |||
1202 | !#((3 ?, 0<-71 #"&$&/#)+"&"+$./'+!7H&D3%/4,7(+/'$##& -@;"9+=418#)4+ ,))% %'%$,(.%$1 '-! '+ " ! !)/":$&*+ .2+*25)""1"'/* # *$ | ||
1203 | |||
1204 | |||
1205 | |||
1206 | # $)(0%+!/'$!2)"/*&+>)/@'39&5!3%13!(>6$ &#(+#$,'4*/0#3@5B?C!2E,6!'2%"%)# "" ' (0,.$CKDe'7^/3H<eF7)"5/50+!.1$-#+$6I/5C-.B!'6% EE+5h#%@( " 36,#!%(015.9B#1!/#72(*-". | ||
1207 | |||
1208 | |||
1209 | |||
1210 | |||
1211 | |||
1212 | |||
1213 | |||
1214 | |||
1215 | |||
1216 | |||
1217 | |||
1218 | |||
1219 | |||
1220 | |||
1221 | |||
1222 | |||
1223 | |||
1224 | |||
1225 | |||
1226 | |||
1227 | |||
1228 | |||
1229 | |||
1230 | |||
1231 | |||
1232 | |||
1233 | |||
1234 | -/*JPA1PV-MG6@77H./A:35788=<9#%2*',$+9'-5*8)3#*9"!1" $ !"#&) &)(%&",#%0&-!'F%0T/E^Bb_]„J`@Fj8D=KG8b7&%&&4./")+!'+'&)'/ "#!&/*0 0,'4+5&(6!#/"%"(,83>*;?+9B/6?,)0-%).$1-%32$12+80.=5-6-%/')%! &&,$* &.",!!#'#$# "#& ($%.-$, .%)5 %.&,&(1)0'*74,@>0DA,@T3IR?TYBYOG[.3E"&2$0 -,8)47),-!#-!%5#09%-:-8D.CK,KD26FG;RC;NC?TR?TBCH1>H.=H.:A*5;'2A09H55D<ROJbFvW:WC5DE,CF+:2*22(.5$57'/8$4A&2A%/># | ||
1235 | |||
1236 | %+%)2/"#3$41&=2-2( &3!&/ #*&#"),./"1)%2!<)40#//.3),.*")$!' #/3$8+3. .7"*<,.312()# 1#42/-+.++#*, *)+# $!'++>9&E441F):&#-"!+",-#3!, | ||
1237 | |||
1238 | |||
1239 | |||
1240 | |||
1241 | ( !!""!'&%B5#*-,!& '9!'4!+$+&(#!#(#''&(+/"*6")4(.4'8@'4F(%=(+%4/5*B<5.7! | ||
1242 | # )-,:791>5+GA0$H,*7)7KA 422FJ.:`(13P>:W"G+.<%!$%6+55+2.!* %"$'#K."99-3%.3!88'/*%.&%4 *,#)&" | ||
1243 | |||
1244 | |||
1245 | |||
1246 | |||
1247 | |||
1248 | |||
1249 | |||
1250 | |||
1251 | |||
1252 | |||
1253 | |||
1254 | |||
1255 | |||
1256 | |||
1257 | |||
1258 | |||
1259 | |||
1260 | |||
1261 | |||
1262 | |||
1263 | |||
1264 | "3'*?=086+96*7-2<1=-(-4(>43>03?$+("+)%-+,'4""- *!'3&.5!*#*$#$"#$)6 6>#GH77"%&+)+6$+M-D_=]QC^Cm€7«@„Œ2pe\$gL+KA%,/#"'$)" %' &!#('$%$("%!"%2*BL,>Q(7T&5C&'0!&*!$($*1!-&)/+&1+&5 (0)+(%)+00'+"&(&")$# !#&$)$%()#!+"($$0(*2%(.'-7.192'96;C@6GD;N@>O1,9# ('"#++ 2')0 !,".#+5)3:/9H>FQ@KW5CI5<I42@=8MC1@?3G76F38L.7C-=P#2>%4E.=K@S]\hfXnc?GR39L*<H*7<%89):@%AA",0!)5#1>#1> ! | ||
1265 | |||
1266 | |||
1267 | "!%/"0)##$%&0.<0!*3,'4, -(,1#&+, ''$.(8("2(?&!42#4&%,#"("* $"06+77"02'34')<.+5&,.#+-(,>(B4?8+37%.:"#=-"! !$$ !$+#$)('229")6$,96:$'4(+%'+./!4 &#'+) | ||
1268 | |||
1269 | |||
1270 | |||
1271 | |||
1272 | |||
1273 | |||
1274 | "!#!!%$!!" !$$(+535$1#* 0$,!#4")5')5#*+:8%?""%%#1&(7&&2#, $ | ||
1275 | |||
1276 | |||
1277 | #+-938F_8_%(;&4;6D8(!#"13*!(8'0&&3' %!"-.) (&7!$(%%&.>*$/K$J;)@E#GN!C;+,!)'>+,*4135+,$($)"& | ||
1278 | |||
1279 | |||
1280 | |||
1281 | |||
1282 | |||
1283 | |||
1284 | |||
1285 | |||
1286 | |||
1287 | |||
1288 | |||
1289 | |||
1290 | |||
1291 | |||
1292 | |||
1293 | |||
1294 | |||
1295 | |||
1296 | |||
1297 | |||
1298 | |||
1299 | |||
1300 | (-&*025(;>"EC)3<18D%27+&.0/:)&0 ->$#/"%,&)&&("-2)/)-&'*13)IH3YB26B%,:$"&+)(115D<w}~ªžv¢}‹]r¥aqMWX8<;!@<98_EfQ-, ! !"*)3/=+ES8Sa.-6&%2!(6&2#)$% /"&4%#.#)6!#.!)/$.7##/&$!$%-1&%"'!&(+*/3<:&6>$06$27 27$&3++>,)@88N>SV.OK 6B9;)""'"+'#-',".#1B0>L:NZEQ_<KP?JO6EN-?I.AL3>I64E4;C47K.@G+6A&):)29*AS5KaPJ^OUZ:KM*7F+=G,F?+D@+?=)5=%#+!)!5D5>! | ||
1301 | |||
1302 | |||
1303 | |||
1304 | |||
1305 | +%%.4#"3/*>)53)!1.'"*#*0"0,0.)3 -*',/*$:";'4+C*$7-"5*'+&-!% 9=)7,%70%-6$.<,13,$3 &/,.318;$>=.,P(?+-''# !%'" "'!&*&.'6$0!*&3"33"/8&,9)0!+8(616*7'0-*1 | ||
1306 | |||
1307 | |||
1308 | |||
1309 | |||
1310 | |||
1311 | |||
1312 | |||
1313 | |||
1314 | % $% )( -',&. %$)/#26(7%* !"#"!* (.#2&-8,32- !,#) ' | ||
1315 | 1/ <6-:4+43%0$&8 "4%00! ,"($$*#$*+<7$%&"*^.' +*X814(/G><(4B#3/'(%'<')9+ 5!$+%+(*,% &! | ||
1316 | |||
1317 | |||
1318 | |||
1319 | |||
1320 | |||
1321 | |||
1322 | |||
1323 | |||
1324 | |||
1325 | |||
1326 | |||
1327 | |||
1328 | |||
1329 | |||
1330 | |||
1331 | (,0;0+7:%<(3'74!4$/:"5:/5>!9<%4: -2/238' .6%0?*:!+!&*11(5D>Fm9lm-@H"653,14023/>MeqZ‡vŒŽj†u›”fpVNqˆ.Yh+4T;(KR3dC&<# #!#$ / ,;# 7L#D?*;'' *!"#$ &# (&#"(!#+%(!#-&$,(")""&!!!!%#!#&!+%#('-29$MV%2<,.:-4D-0E'=C,*8''4+29*163-;S?^MLZ1:G,)E*7D$++ '4/387&(68*=C:RJ=`HX_BBI94C59H38J08C15G43A0/=/6E,7>#54)2./E@2\O;^RCSU=AM-48)*5-3;1?I/EH/B=!..00.3!3?' | ||
1332 | |||
1333 | |||
1334 | ##%1'3#,$$8$;3-+@.)*(/$6/:4J>B7/8&0/#72 *69*B,31$=&$9,!1,''' %#(<9)1+"/9$:,-0")#!-%%($#!*+#*2),70>34-" !#!# | ||
1335 | $!(! $!*",()**%*/7$46%*=05)2/2 +8 (3) | ||
1336 | |||
1337 | |||
1338 | |||
1339 | |||
1340 | |||
1341 | |||
1342 | |||
1343 | |||
1344 | |||
1345 | |||
1346 | |||
1347 | |||
1348 | |||
1349 | |||
1350 | |||
1351 | % "&+ +&/4 4* )!*! *&+,"0()!--$6+&-&)(#!#"$"#%"# | ||
1352 | A80E)/$%*! $! $(*) | ||
1353 | !4"&#*A*3(;$5 œ/ M)*#'0{6(h`)HF8",'*)/% !# | ||
1354 | |||
1355 | |||
1356 | |||
1357 | |||
1358 | |||
1359 | |||
1360 | |||
1361 | |||
1362 | |||
1363 | |||
1364 | |||
1365 | |||
1366 | |||
1367 | |||
1368 | |||
1369 | |||
1370 | |||
1371 | |||
1372 | |||
1373 | |||
1374 | |||
1375 | |||
1376 | !$*4!9%$'')""'.&)&(1- 3+*7*4;+%:%!/(#/'!0##$+$2,(6&(;<D.6AH'>C549V7NE<T(7F'2J$;K (D$Pf2[qZ`a\Zw_S{n=mXAdK*LZ&F^ 8C!/0C"I!&!#'" ! $ +)!&"(2$7:*%'0!%'%&&,$,#* +#)&0$)$&*".% &!!$0,,"%""#!!! &$'8%>6,% ))'C6.AI$QB'"&--,.9)&-C#4S#=A'>*)31->!$- )/)>C#9<#FE.9@14=B4CR5UB-=>@B5<J1/=/3>+A@(3;-08,,7.,>+7A)>=1C:Cu\?Z<_K7(--".&"!(',-/:06B5@T$FM!CI!FE$DE- $ | ||
1377 | |||
1378 | !"" #$!,#6*47(+952&-C*E6 J>"C;(<<)%5) )+")(&+);%!:(5.&<##@,$9/"9+"''! '5 ..02%&0')())"!'$%('(!&&-+'0' )"'-!! | ||
1379 | "#%%*)) "$"!#'*'!'''&"'!"!) | ||
1380 | |||
1381 | |||
1382 | |||
1383 | |||
1384 | |||
1385 | |||
1386 | |||
1387 | ##,*),32"1 %"#-%8*0328 2)"/((9/ 31&!"**.317 *6'3*# | ||
1388 | |||
1389 | -9#!<.1+%%)1(&''!#" $!7E$99 (8#"%#$,?$of+4T5!‡W9nfaGCJ '$ &'90').0(& | ||
1390 | |||
1391 | |||
1392 | |||
1393 | |||
1394 | |||
1395 | |||
1396 | |||
1397 | |||
1398 | |||
1399 | |||
1400 | |||
1401 | |||
1402 | |||
1403 | |||
1404 | |||
1405 | |||
1406 | |||
1407 | |||
1408 | |||
1409 | |||
1410 | |||
1411 | |||
1412 | |||
1413 | $"#'+.11"-6#, + #*8)*.$(*#&##$( '!*)+"3%3I2.J52F,/:>2F;-<+#1-%7),,EROLCQ@flKPgJdV8BE5?7/L</>3' %##>9N:<. ;;+)$/!3'.)4$/%0*/?$+=%'1 !)"1#&$$' ($#%("&%$(#/ (, !"! !&$+?32(*#,KY7OT>O\%:5!25)EB$33)$-1,2.+8"-6(->$+>"+*&(@4FO:GQ/@L*3A-(8='8;0@7:K1/B3VO2+50/9((/('7$*3("-1%82(7:DAT‚fZjBZC,$#'#"+$.+1:5.<2;L/;O-EW0D]4 | ||
1414 | |||
1415 | !# | ||
1416 | ! !%&#%0)5211'1/0:+*F1!^?(YH,3J1!85,2 (("0! 7'6'%9&7(!3,%1*&(& "'%",-80!83'=;&4@$; &-$"+#* %&&&!,$$% | ||
1417 | #&'!! -! "!,!&+ %+$&" | ||
1418 | |||
1419 | |||
1420 | |||
1421 | |||
1422 | |||
1423 | "& # | ||
1424 | $%'&33+3 $7(/"4")/!.!,&!)$/%&)*!"("()".+$'*!"* ',78&8 $,!$ | ||
1425 | |||
1426 | "'%""9% " $("# .?/'LX&."9_JPlfeLNE'&" | ||
1427 | "&0!# | ||
1428 | |||
1429 | |||
1430 | |||
1431 | |||
1432 | |||
1433 | |||
1434 | |||
1435 | $#!&,/!)-&(8 )3$+*%&!&%%$9,:(,)37 ",+=:>A0? &(6--5%7.4;.:?+DG(/6"(./GA0DY@;UG4?G8B?7WHJZ5NZ.Oh5Kt)RWKA=I@Is:^|+X`*7:#)#- ,*.0'-)'$)$*"#&()"$ $($!"& % &'&$%%"!! #! "#'&! %/'A1,F)H]6isVu{E^iCtu-fU30H-D= *5#%2#&1''8**8$#0&,*.%9)?;*?@8H.?B'1-)&*'.=74D4/<6-I160-%*&&$)"'%$!%+'+7CCVƒks‘hFZ='*'4/ 520/#.-',:0:>09@/?K.<L6>N7 | ||
1436 | |||
1437 | $'""!+&'*(1,#,*)8/+?0%M3 S?,>G4#<>%6'2+$2$!5#=(:) 5+$,'&$! '#*+,"822E%)D.*:5"40'%#$ !' $+ ") " !! #% ! | ||
1438 | |||
1439 | |||
1440 | |||
1441 | |||
1442 | |||
1443 | |||
1444 | $' | ||
1445 | '$( $('##2&'.&)(2&+!% "#+(#&%)&/*%,!"+*(-#'..$.%+!%+77&=' ( "0$$ <#"*2@$3-*$ ' | ||
1446 | !" !$%9%+ #4$\4gSC93`PIK-0' | ||
1447 | $+(.$1% | ||
1448 | |||
1449 | |||
1450 | |||
1451 | |||
1452 | |||
1453 | |||
1454 | |||
1455 | |||
1456 | |||
1457 | |||
1458 | |||
1459 | |||
1460 | |||
1461 | |||
1462 | |||
1463 | !&(*6,-5213/1$0&'+%66%.)%'1$,!-%- &&(56$ES!@D-D &C%2D'#@!"1&2%%/&)%.7.IO7fl4X\RP<C#O^4goG@L51C0$27:ID.<F+?D-:F/6F45@';6=L9.C]4JaEc@Aj"`ZMI-%($"&(!'!#'*!1= 6B57*)%'$&%$!)&))%,%(""%!"&$&& &#! &! ! "#*&8$:1Y%Jw:c`EeeGm\hv30@7;K(44!(%$6%+1%$1%09%83 "+%& "#0/8-E9Pd2h\'@6)6>4DV3RU2LK1FB"2.#!"!#$$"( *-4E@Zrij”hHnD"5( ,4!-:!47!18$59(6>+6C,4E-4H-4@/ | ||
1464 | |||
1465 | |||
1466 | "! &###%.!$))'50*C0%?8)D>)5A:(:7**!60&+%6!4'.(/#$+& ("%""($,!$5%'3-%-4(*,$%)'".(,"0* !"&"'!! | ||
1467 | |||
1468 | |||
1469 | |||
1470 | |||
1471 | |||
1472 | |||
1473 | &("*' | ||
1474 | "*1/!$)"!%!!2#(/)1<46.%8 .%!/*!/( ''"#$$,7*4%#"-&%'#"+"(+' | ||
1475 | |||
1476 | --2%"#3./63%&)$#.W4*ƒgOj]5,2E62*$ !! | ||
1477 | |||
1478 | |||
1479 | |||
1480 | |||
1481 | |||
1482 | |||
1483 | |||
1484 | |||
1485 | |||
1486 | |||
1487 | |||
1488 | |||
1489 | |||
1490 | !!!')(+3;&'6$#)$!"%!,9#:M".<&05#&-(0 ,4(&.*-B45Q',7%,!"6& )'')2$).")#,/*)9U6`\BjK3_=!;84\$DQ$F.*5((2) 2,=Q*.<("3$!.(5@+072IH9D7(*4=*<B,;A7UGQk1=A8?.-!,%! 3.4F'1?0(0(/$$ -#*!-"-",$!&'"!%!""!$## 4I"P /^(=a;DA0<,GI./2 #!-)+8#4$*7+;D&5;#'5:?$51./G.NUEfFD[4H^CTf@XlJE\DEZ/@E %&$$ !# ##1.2P>SULmBJSI>+,)#$(#48';E&CM$8E%6@*1=*-=)08+$/$ " | ||
1491 | |||
1492 | "! $ "& | ||
1493 | #,)&%#$%!$/#-, 41+>:$@=$56-186)31#+%$"93)1'7"-$,%0#.*"%"$ #&)!&('*,&+(1$ 2&+'(+).*11) | ||
1494 | &""% | ||
1495 | |||
1496 | |||
1497 | |||
1498 | |||
1499 | |||
1500 | |||
1501 | $!&!# ($#-## #"*(/(%?#!4 ,%.#5 1+16(73.3#''#" !# | ||
1502 | " #! %% '-+"4$&#%,62#+ ! ,35d8DZ9=6*/*&"!#! | ||
1503 | |||
1504 | |||
1505 | |||
1506 | |||
1507 | |||
1508 | |||
1509 | |||
1510 | |||
1511 | |||
1512 | |||
1513 | |||
1514 | "#$$(!"!"-((0#/,)(2-#/()80&1'.0($"#($'#*3$1)8(4,%4!3> *.&-7)>!'.%&2"+!"%+7$/L.5G,3;'&"+".4%)##")6"*.$7;58C'15'4")40*6/.>Bby(OZ!==)*8+8HGDTJJZ/<I//<$!(# ! .181& &(%2""#%)"!" ""(&#& %!%(.3+)8898-17(@87A!(2&>6#+0 -6+<4:C$',):@02A$3/398HAIQ9E;5CBA`PVqNNWAAJ75:'+,))"1.%!%$"90:ZJEoIF=):)#,$))!6:&@H,@R*:F%:G'9?%-4"(.!++" | ||
1515 | |||
1516 | " $" $!#&" | ||
1517 | $&$%'%("(((&-,43!18*3;*/8)+/+'.)$)*#$"!& ,2!,(+!$;!5,!/%"/$'!%!% "$#+)(!'&",!$,"/+(0-#/.)%" | ||
1518 | " | ||
1519 | |||
1520 | |||
1521 | |||
1522 | |||
1523 | |||
1524 | |||
1525 | "!#!$ +$2( $+)1/@32)$.#)"-%)"+5#/(),,>3G/5/&).,2,2)7'6"5&0$#7"+&&!##(!" | ||
1526 | " | ||
1527 | ",%)? !('./.I*C! | ||
1528 | &) )&! | ||
1529 | "!(((9J;2@>(#' | ||
1530 | |||
1531 | |||
1532 | |||
1533 | |||
1534 | |||
1535 | |||
1536 | |||
1537 | |||
1538 | |||
1539 | |||
1540 | |||
1541 | |||
1542 | |||
1543 | &!"#",%%2&@= -7*/.'2'9;'&/%05*415(4"$-"+ '$)(3<,,@&$1&'-'*#."$-)0;( 0#':""%*#0).$*5!$-1>B&)813 -% +)"0D'@W(A>5J*/?&7P34SI,EH+C6 1$/498"("!"")!"##$#)%!& ("'!#$! !# )# *11 55)@E(52.*'*)&3#2>=BM3m_"@<?6'.;9;I,C>+2=<MK.BB+>>48D4;I0;A7=KKOmRN`<CP=FV/SV'<<&46#;790'I9>hQGxQ2N. ' "%8;$JR)CP+=E#9@,47.1;%4<"3:2=& | ||
1544 | %"! !##'%%+#(&# ##" #&%$# !%$(*..%(6+.'1*+%,( ,,!0322 +3-3-'&$ %)%"#&$ %"$(,*(!)+)!!$&$+ # $ | ||
1545 | |||
1546 | |||
1547 | |||
1548 | |||
1549 | |||
1550 | |||
1551 | |||
1552 | |||
1553 | "$*&!%%3 $+!/&"$'(%6.$-2&/$')& +++&5(*"(4#+/&':!6B+45+45%&!.+(3-$"*%!"!'% # | ||
1554 | !(/'073$G(.%!!,&$$""'/ - '# # -+(/1%,8$ % | ||
1555 | |||
1556 | |||
1557 | |||
1558 | |||
1559 | |||
1560 | |||
1561 | |||
1562 | |||
1563 | |||
1564 | |||
1565 | |||
1566 | |||
1567 | $ | ||
1568 | 3$ ' | ||
1569 | |||
1570 | ",*;)8)06,/(&05(/)#9&0;+!1-'5'&.*+)006!'901)&!& 67 84'*). %'-&"1,"!#"# !!"5&,&'#'!%%%/(6B%?F *!(#(,)1(1'$()"6!,$'!', 4%#"##&)#(4:31('/,-$+0287?06!5=a_CB-1'$ #&"$!"#/7&??0/;0(92)-&&" /1%*,7:L86KE6O?9=-36#%8:3N<PW26ADS`AQR@FL3?F9<@0165.<G4EPE\FHdEceADQ80?,*5+.6+?C3dKK[X{\>U9"-"*-$CH*:O.2@,4=&4;'/2*%-($6&06%$,+ | ||
1571 | !& | ||
1572 | " '&"+,%$$ | ||
1573 | / | ||
1574 | #" !)" $"!!!%%&(0"'-(*+&).$-$%-$+-%,+$!-"#%&!#$ $(!%'!"#( %!#% #("(%%!! | ||
1575 | |||
1576 | |||
1577 | |||
1578 | |||
1579 | |||
1580 | |||
1581 | |||
1582 | "%"& %(/"*,+&."(',) *"0*&5!%,!"% *3,<.731)%"! # ("-2+2;F.3?!*=25),>*7'1'4 )6&$ #-$(& 952/903I+#3,'0 !-&=):;.*+@KC$D -<8L@ | ||
1583 | &(''0/!." " | ||
1584 | |||
1585 | |||
1586 | |||
1587 | |||
1588 | |||
1589 | |||
1590 | |||
1591 | |||
1592 | |||
1593 | |||
1594 | |||
1595 | |||
1596 | A*M: | ||
1597 | :(@! @@ iasyQlo^PT&#"" | ||
1598 | |||
1599 | !4--1?- +(A=)=B&86%$,0*<'5C(-4%-:%,2'6/$(%'-$!# 1C+7G'4<#PM<?QJ#@D &%+4&/+4%-4!5G 680/##&$8<4H);7/8&"')+ $&%)(#"$&"!#$'#))2;$/ *#BV*Mg%lr!IX&N^5K ,,-'+7*LW3L_><^#>G)7%+ %$%!!!"!!",)--!$,2(91#,/32.B223#A;*EB/>F<C@A595B;/-.)&(5")G)?;'3A0GR6OGES;UW4BH09;-86446A4=?=LO9RI9H9-.-&/+,21<;DiTZ‘f_kUDaG'JB!AD%@O-9E)/9"%-$#'" "! ! !#%'! &#!( -($%'$!,$52!46"12"*6!-# !%*&',%8:&:#2!0 !!"" $!$!*% | ||
1600 | |||
1601 | |||
1602 | |||
1603 | |||
1604 | H+A ' )" * 3 &1% !"& ( ""'*&*%74(1-#)$&)*3,5<#3@/3 ,$"%#%1"/1!,7 #'#!####3 ./($:/,-')/$,4" /!)$,$5 !./1,-$ "-.%#33%'"-)'-%'93>+$"4)/**4+%$# *!&/ $: $ "" (!1"%3($')$#" | ||
1605 | |||
1606 | |||
1607 | |||
1608 | |||
1609 | |||
1610 | |||
1611 | |||
1612 | |||
1613 | |||
1614 | |||
1615 | |||
1616 | |||
1617 | |||
1618 | --%5=n(:e. (<9M\Hw^Op3Gp?^•/, | ||
1619 | |||
1620 | |||
1621 | |||
1622 | |||
1623 | |||
1624 | |||
1625 | %#'0*-5)+"1<86G29H*"*$!+/&74(($2'#0# *#3 ''*&1,14)538P52C-,;91E$&'$#&&#)$)'!,!#.,6M%>OKP23/)+',<)*E %#+25.0(343!#69,4)!0'% '$7=.0 IL71CC6^B8T;2X+(8%)5(1'+;V8?[C7M2;K&!-1>#%+%())1*(;10)60&-(!2A &#$ #'=5)=1(CA2IO,;@/KP7SV9KU8NV+D83>K2LH%BC%00,#7".5%0B1BMGSMYqHah7>F4:C.49+/54%2=4ADEM,X_%MA&)/196I[Nd|aamRDaA4FJ)?Q'9K&/;#(0! | ||
1626 | |||
1627 | |||
1628 | !#") | ||
1629 | ) #",!* (( !".$.9.5%.6))6',1"++ */1)2%;'G$-*1+3&6&/''.' & %#(& | ||
1630 | |||
1631 | |||
1632 | |||
1633 | |||
1634 | |||
1635 | |||
1636 | * :',"=9.5?(/:C8D<<6(1)1 ( % | ||
1637 | |||
1638 | " *',-+40&%!+$$#"#'!!,",.!#&>&%35'>B$2D 9"$+% -30!%!&'&*-$!!-).!,"%$1#%+(- / ! | ||
1639 | (O'JD9\:8+B4!#$ &%2WA*G203/3%".!01,;='" ' #' 1"3$ | ||
1640 | |||
1641 | |||
1642 | |||
1643 | |||
1644 | |||
1645 | |||
1646 | |||
1647 | |||
1648 | |||
1649 | |||
1650 | |||
1651 | J /82R'?&K%V#Xn | ||
1652 | |||
1653 | |||
1654 | |||
1655 | |||
1656 | |||
1657 | |||
1658 | |||
1659 | |||
1660 | +268 +2+'7&(7,9)52,9(12,""")+ &-$ # #('/!(4*%4."+74;.$/)"/(2B1@5>#&;$&$%+$"10:?3L\6=Y>J%>T(2>$0#,)A&=)8 ,7$ /H'1G/2,.:/$*-3-5$1C%A\9Oa&4?56A.;D,=;23+44#>E7DS8^u-X[(<B'-" )$&)5#+!"#*'=F(5F#\e$7;$00PAB? $&%(22:SJ-XU7lg3ZIAIR9Z[DYdUerG;TJIS;A^2JJ>oj;IM/*.!%" #%/#.>(:S*MgLf@,96+22*5-%+(!$+$*;+<E1XHAZ-/3.47HfWXY^dNJVG/]S-G@*-0&&$ | ||
1661 | $ | ||
1662 | "%" ! +!&( ,!$ (00*$"!((!(+)+.))/&'0%"-$)(#7%<2"@=!94 2/%)&.' !& $!!!$# $ . | ||
1663 | |||
1664 | |||
1665 | $"$-+ +$12<:#RX17X-HG/Yd0<j@+V.3$1.!'$ | ||
1666 | &,/;1@8"*()##'!52;=7D8-,"(A> =]#/P-&3'"##$&./-*:/! !')!((&,##)%.*$.-.!+ #&&# -&(3*!%2&92*@) ), *#+! &10(800)-:C0N!,/@4CA#0%/5@'4F-; "-,"4 | ||
1667 | |||
1668 | |||
1669 | |||
1670 | |||
1671 | |||
1672 | |||
1673 | &"0 | ||
1674 | |||
1675 | |||
1676 | |||
1677 | |||
1678 | |||
1679 | ! '.#',/9'$,'%&%#-3-*+'',(1>":F!3;$*3'+"+"!*#3#35(?L3XW:B<A.48)55(&#(#*%2A4I\9)60$4/"21(:#3>""()!"##1.6"*$.%1'9L"DM!+6,.)-(/="IJ;Kd/[g&LQ*Nf)G\)|†OP1A)Cb5A`<?XG\ƒ2P\%2=,7.*"&/2++'/(/<+,7.9G56I+FQ0Wq2f~(QZ @.$402/DK4Pb@[`TkIaeY\kPL^aUlNPUC9QNCJLPfOJ[L3H3"%# !#+(&.5)5N-><:7)3,'%(&$)%)&)--0/7.,>+/9'..A<Kx_\†^OZ?FcF:VB/:?*')%*+ | ||
1680 | |||
1681 | |||
1682 | |||
1683 | |||
1684 | |||
1685 | ") "# - 0&$. )(1'4#1,/0+1%% $"## %*%'%"* '!#&(!()+1#5-*4/+-,4+%'.! !! %&'$!#" %!" | ||
1686 | |||
1687 | " | ||
1688 | |||
1689 | |||
1690 | $% | ||
1691 | .%!9-'@C2/PI6D<CHI&kT 5V$2*"$!!3#J1*P04$1-/!8%+,(# | ||
1692 | /&@8"'B*0((#-2!, -7'3!)$%&-( ,#'(-%2$* ""$#!'%,+-300 !1"'!$$)!"&!$# ## | ||
1693 | |||
1694 | |||
1695 | ()!1!.7 | ||
1696 | '' 0-H@RSFW(HK,.K2C$(M3;H#/839%A*&.$%$ $&% | ||
1697 | |||
1698 | |||
1699 | |||
1700 | |||
1701 | |||
1702 | |||
1703 | |||
1704 | $# | ||
1705 | |||
1706 | |||
1707 | *#3:4-'6# | ||
1708 | |||
1709 | |||
1710 | &%+##!-2(,;2:KG>I&<A$.@#(8/'73EE./>%,1"/.!')# !)).7@+>L7C]:5O0EX+M\(Yp)29?XO73!)074F]8@N *3 $) ,1$4;%...#36$$(2/+/)4>2WS,;I!\f#Q_!3<'4X6*B91I7Rj.I]9`u:qŒB@f&2@0:F2OX0D\<_|Hh1K[ 7; @9!WM"]FG;IA"6:$'/%'1-.:-B@5=LAWm?[s$X[TI9*D7,QF&"'(&:*2J:Aa@Cc?]TTgVRTSPaUzx8DPC<UNJOT5F<#*'!"*$-5"%//0:50:/6E 0,"// 0,0+,--(/-+54*651EC^ˆplªnHXDBT=:?02$*#$#!%#)0 &1 | ||
1711 | |||
1712 | # $#$)% #"" ") &%-!/,-(!/*)2$2",')"(#"!"#!& #%("!#"#"$&!)&!*'$2$%6#!@$$:(/!$ | ||
1713 | '(,0!0' ) | ||
1714 | |||
1715 | |||
1716 | |||
1717 | |||
1718 | |||
1719 | %#' ,L>5e&,F1%*A36),B6+8J<0"#4=5I=Q*;E@=@&-H#7; ;5#)5 $ | ||
1720 | " | ||
1721 | ''!/'+!4 "3*,D%=/#""(0!).(,'!)(&)$!!$) $+-!$"(#$, .("*%&+%#(+50""% 0 # % "@Y.8Q/4W7-J7"1+ %'<&(/:) 5%)#(#).,/(*?# | ||
1722 | ' | ||
1723 | |||
1724 | |||
1725 | |||
1726 | |||
1727 | |||
1728 | |||
1729 | |||
1730 | |||
1731 | |||
1732 | |||
1733 | |||
1734 | ) & #*:(4'#,",' | ||
1735 | |||
1736 | |||
1737 | |||
1738 | #% *+]B@C 4C'6M.4KD5G5/H3VT/@9"6<+0>>,0 2''+#)"# )&+.24)B>7@25;<<N=AU63I>O,E[21]!3B(9-1F2EO,!5'7H&BK )'-717'% )#32"CNBL#4<3Gh65F16G>+P4.B $)4 %"$/#6;6M7/PC;eHLd/Ic)1G%1I1#>8$CO)MG1G/<K)ML9v>lu<qt1ZZ$>;!/007(>I,Mc0R\6QnCTv=So3c2g`*CA78A/),*("1B6RY:QUOZP]QaYLjIhsf^wK][=;MB;]@JS*M83*3,($#% $."'7&/6,2<60?-8<%2<$75)44%>3(2,'00)376IDgmwlJM:>U;50#$ "%$#!" ""! | ||
1739 | |||
1740 | " '# )(%&'%%(#)/",%*(%/&"".(""! % $&-"1#,2%-)!-%+# | ||
1741 | " %.5!6#!' | ||
1742 | |||
1743 | |||
1744 | "*1 $"4K39++" +(/">.#..;4439(11*1G/G8+F50C=-I-B..1$$#!! ! #6!+12)8*#&#>*+(',7!*735/H;6^R!Z[HH>D1A4738)(/>P>DY"<.07924+=.3 1))3!-%% (+ : | ||
1745 | 8!6.!A-(/,&/-2%13AI.B)06 5E4+ *3)%'/2!- *.&+" &&*.% | ||
1746 | |||
1747 | |||
1748 | |||
1749 | |||
1750 | |||
1751 | |||
1752 | |||
1753 | |||
1754 | |||
1755 | |||
1756 | |||
1757 | |||
1758 | |||
1759 | *!! | ||
1760 | ##%*,.'*>?-5('B?"<-/G*@G0LE9EJ52=41BGMa,BO-22+D; (#*"13"+-*"$.1!'* ',%6->M-3@0FM/F[*6?1)?67:,AT)0?!;F/1F/+/*16=.*:*7C"/.&)%$5#5D&0!)>G(MV3HO-JW.*945:(EE1D>*"2 )-%1$+$'"3)'802C07@3)<-?I#37(*-,4*-6,7I4AE1;APY}T‚Š\l–HaƒA<M)HL&_k&NW7AUE6I;8M?:TEMfH]zWh~CTT<RV.44)8?);@HMTLPYLMYG?UU:NYE`gHni\q=YL=4>H-RH^r+^U'UO @BIEA7915=#5?%9B+=@/?A':8,29.31);3(41*0-+:59WLd”sw™jJR?4[8+%%*33"$ | ||
1761 | |||
1762 | ' &!! $"&%$+/!)"#)'*#(0)6!!2 #! !(" &) 9' ;&8*7% B& :'(*'. $)#"! | ||
1763 | |||
1764 | &$ | ||
1765 | (-*,!3 0%'! #(75$+%+*%775Q+&C0/$$),0#0'(7%14$(% 3(-&-- $%$!'0() #C3@V+Q)6:8J08N*\G-FVCGG7.?014.1)'()*6 )5'-#*:=,.0*4-6!;4.+6',0#)7$.) "!$ | ||
1766 | |||
1767 | |||
1768 | |||
1769 | |||
1770 | |||
1771 | |||
1772 | |||
1773 | |||
1774 | |||
1775 | /9KA?$L./'3&4F&9(,?#40# & 3#)%#@#:*5?4I$*$&+"%.+!"!%* "% | ||
1776 | |||
1777 | |||
1778 | |||
1779 | |||
1780 | |||
1781 | |||
1782 | |||
1783 | |||
1784 | |||
1785 | |||
1786 | |||
1787 | |||
1788 | |||
1789 | %$ $#& &$##&$02EO)PXCB%EA!12&676Ie9G\4:K*<I8>J7LW.W_(Oa(;@34(2!&5 GI',)(+0,3%-7))&+&8@1DS(W]2Vj-=W(AI!C<#2F(/>%4J,Ee+LU GLJM#fi$vo(?8;:"G`QR"'2(,@.)06 /A1Vs5Ui3D`/,=!-43bs4c"#)/5 49+#EJ"NB&)(%40#/$086:Y(*1!%,'3$,A-/;*24A=YMMzU8]L<PB7M2[k9Qp?fˆ8n€3gq3WV2Xa2R^Lm„S`rLdm<[h9DM6BQ2BGJV_TX`JDM:LT6CP83=S#9`.Q_D[<4C1"1P2FYThPxƒ=OT25H8;M)EK&DH+:B,9D/<E08G.<C,48))-()(-02&;:2<BFtZe™zt›lQyL>S:( % | ||
1790 | |||
1791 | |||
1792 | #!"" | ||
1793 | |||
1794 | |||
1795 | $+#&' (&''"*//$*:#%/'*/!15)7+*/"/#)) :&A*"A1#4/,5(#)&! | ||
1796 | ! !! | ||
1797 | |||
1798 | " &!#'" (&6+&( + (#-" *1"5)(+,(,-(2#+77/5! $%*"($",3#//0+6//@! =28)3"#!!:%$5"9.$!) '$&*2++7C@:5!64%'#"!+#!11*'?/4$4/ /9"3;'(8"0&' &,'2"%+07.''! | ||
1799 | |||
1800 | |||
1801 | -(#&&!E1+./()")4.*!*$!(+1$"-2,&0)3,#%5 | ||
1802 | , %1!)* | ||
1803 | |||
1804 | |||
1805 | |||
1806 | |||
1807 | |||
1808 | |||
1809 | |||
1810 | |||
1811 | |||
1812 | |||
1813 | |||
1814 | |||
1815 | |||
1816 | |||
1817 | |||
1818 | |||
1819 | |||
1820 | |||
1821 | |||
1822 | |||
1823 | |||
1824 | |||
1825 | "!#$+"%&!1,5'8B6Om6Xs+Sd.:F$GV/[o?Vo;IT-:J2Q_4D^>7\@5M95B%-?35"24%2A.RV>XEG-4*."#)/ 9<.]q6c†7x…4K\&<O0Zm,KW'5H\_.UT6Ui6Pu1Lb6FsE`ŠHK{-//Yy6,V/4C&%3QN"LUCJ/fv<[m;Zo-2: 3?3G\LHg47B23*6A-+!$(9<r™-bl-+#&(>K4Q]66?&(1"%-% 1-.7'/;-.>4+><&5,,7*3A5J_B.OIZpMjŠKfŽGgˆ?Uy>a}Iq‹OVjI^|Ni€>Sb@OX@GZN\fVT`OJW:J]4PX,DD',(2!.L2FA-2#&.6BGQJYlQ}\dz6P\4;D;EM4MU-QM,89:6A8?@76>/6<'**"-*)0*/133:;Ltnz¦}’pY†X;1(""+(&$ | ||
1826 | |||
1827 | |||
1828 | |||
1829 | |||
1830 | % %)'#&,*%%!-!0 ("&'))2"%,$('.!5!.# ."-$)$$+&+2!!$'! $'#'( *" | ||
1831 | |||
1832 | |||
1833 | !$ !$% " !""$ ,* 7'+/>,7"2&#'$ !#%'%*''"0.$ + 5%+<#1 53B)%#&'1#)*(<!2$##&%(%/(*8$1 6.%-3(2/.313,;-7"-- )0!6 $))/%(+!%(#"$$$'/"*! | ||
1834 | |||
1835 | |||
1836 | |||
1837 | |||
1838 | |||
1839 | |||
1840 | |||
1841 | |||
1842 | |||
1843 | |||
1844 | =&$0"#+& %*1& &( 4'/! ;'" | ||
1845 | |||
1846 | |||
1847 | |||
1848 | |||
1849 | |||
1850 | |||
1851 | |||
1852 | |||
1853 | |||
1854 | |||
1855 | |||
1856 | |||
1857 | |||
1858 | |||
1859 | |||
1860 | |||
1861 | |||
1862 | |||
1863 | $9 " %&!!!#&## )$)'*-&0% *'$KK/BRC6IG3O74J/3G<BXHTrKY|5TT1M^AVj8Pn02?.+7*&-$;F#:U#CX)Fg/{u*p`,c_9H59<81J4ToLCZR:[IJd-9R4V`H_y8JZ,Y`=`t@JwBMh?.O78N;1FIAb0 %1[9O^ !',+$zeC`w/9P<^}Nf~@H`5AQ$RY-Mb=/B74>(+8'.E*6L)>*664KW>b2ER 0<$(8<Mj:3D-2?'48!!-%".*"+.'5*,9&*5%*4)'12,D1(473ITBhN<\PHhG<WF8LQ>`RLoHP`UOeVXbFim@K[RRhYUfIN]@PaIUm?V[2UQ#GA,AG0AD !*37CC@I]GWkFhQe|6_W<ORJS[GPZ5EO8ST:JP7@>)91)3/#2,#*.)*+.?7TdYqtq[Y]D6 1.+)-$ | ||
1864 | |||
1865 | |||
1866 | !!$ !""'" | ||
1867 | & "! $$15#'!+ $"!#*(-#/!,'-'8<%6'7#-"%"1">%0,%!#!")% | ||
1868 | !$/ + | ||
1869 | ' " *'*!%)4'/5->(@-,0&,$ #','$--#,..%+:.8&7!+%(& +:7&#+'- +3,,"*'4 '2!('"./10"&; 3&!+"8-:,+*>$)" #( &(! | ||
1870 | |||
1871 | |||
1872 | |||
1873 | |||
1874 | |||
1875 | |||
1876 | ! | ||
1877 | |||
1878 | |||
1879 | |||
1880 | |||
1881 | |||
1882 | |||
1883 | |||
1884 | |||
1885 | |||
1886 | |||
1887 | |||
1888 | |||
1889 | |||
1890 | |||
1891 | |||
1892 | |||
1893 | |||
1894 | |||
1895 | |||
1896 | |||
1897 | |||
1898 | |||
1899 | &/'1OLJFE | ||
1900 | ""&$ &/",%1"$3#)5"%+$*1+B>#6N5=Q0:J)/F*"1&!1-&76%<E3ID9d6qAViCUZ6N^*SV dQ#o_*NU)OY/RO8wŠ_‘·Ln“>Ro&LM(R]$;;+*7<>P.KR7AL8IO5_hJOq=4W<U‚Fd}FCV:LZ8Lb)cc)lk-?K' $'0>J!B*2."(XhZM|93B3,@P1MM0I86I59P<2G3#/%('&"$("$( *9 ,5*!24/A+%8"!/4(7:#:+"2*$7!( &%$*'%3'!*$*2*(3&+8+-9+/94-4=(;8%:<9P0HU20@@OqMhzOz„Z€PbrLQdD9KKGYGYrH^oLGaQHhYQ^>FV:CS4XT)>5'87>5<>ESLJX_MdOVkHbkK\fEBG@4AENWFBJ;@>3O>*G@)E5">2!0,.G@EyZigT]L@BI4$-'#:=94.+)*,-/3682. " & | ||
1901 | !*#,(&- $+(! | ||
1902 | * %!!$*"'"&$&$!%!##&&*#/-!&4$B!G+L/'R*=-0#!*#" $ | ||
1903 | |||
1904 | |||
1905 | &# *,,7%% '#% !3 +$%%+&09,;,C#(8&+:.(1('85.B3)7!" #! '$# ('*&,%-/)"38%7=,=%$3!!' % "% $!++%>$+<.&H".$&4+&4#2'$+#"#&"!**"0/))+*/% | ||
1906 | $!!" !* # | ||
1907 | !)' | ||
1908 | |||
1909 | |||
1910 | % | ||
1911 | |||
1912 | |||
1913 | ! | ||
1914 | !% ! | ||
1915 | |||
1916 | |||
1917 | |||
1918 | |||
1919 | |||
1920 | |||
1921 | |||
1922 | |||
1923 | |||
1924 | |||
1925 | |||
1926 | |||
1927 | |||
1928 | |||
1929 | |||
1930 | |||
1931 | |||
1932 | |||
1933 | |||
1934 | |||
1935 | |||
1936 | |||
1937 | |||
1938 | /)(8!'7 "" $!'*'( !# %'%$$#%.7'+/@%-G-!4*%6)"6*"/$+''&".,+:8G[io¤Bi|2eƒ9NqA}Xœ¹G]r7k…>±¸A‹¢piŽwIkbAR?T`7ak6O^"PR)F`/S_-[’6aw9HtN4R8&5;5D\JhMVs4]‰@s’4]vONyIP`*'+*('-8"(,#5IL?P8HQ+LU,IL15=*2?06>13='*2() %(%,''!)%*7!-A.8)!$ !'! ( %/$!$'+..8'6@ ))'/=2@S-GP3H`XW~acŠdYs\XƒM^j:3=B@SFKiO^lOZlQV\SF^IHSBGWJdl5lk,mm0\_8PQ@UbLANQ;KK>NT;XH:G36;B?ID<A>JI>XO7==3D>0D?(436BCT|dTdDB4/76265<D&?M$<D#C@:5(+#. &33@:93540 | ||
1939 | |||
1940 | ! | ||
1941 | !&"'('2&$50')($ $%"*, .)(3.+$# '&# ',$ #<?)Z$$e2#k@"JC*(2$!4$% | ||
1942 | |||
1943 | |||
1944 | |||
1945 | |||
1946 | #""#! !&$)$ !## 0**-'3#)!%% '!#)&,/*00(7;#A&(7&3, E=#FZ3*J*,?60-!# )!+"*+*1&-#9!2 +,'6*8!*A*%5%&2",:#.&'&$+.$;+4!""!-!%%!.&#+#)")%!--'4%)3#"* $"#!#%! #"+1 ! | ||
1947 | |||
1948 | ! # | ||
1949 | |||
1950 | |||
1951 | |||
1952 | |||
1953 | |||
1954 | |||
1955 | |||
1956 | |||
1957 | |||
1958 | |||
1959 | |||
1960 | |||
1961 | |||
1962 | |||
1963 | |||
1964 | |||
1965 | |||
1966 | |||
1967 | |||
1968 | |||
1969 | |||
1970 | |||
1971 | |||
1972 | |||
1973 | 2H5( | ||
1974 | |||
1975 | |||
1976 | &/-.K%3"(# "!"$ '2#*3 (,, '("$)/ 6C*9%)%1-.1*-418,:LMIdl?zCIzCk‰D“ˆ€¶Žm›Koj¤Ü˜[|_f{WGd>8Q>e~Ct€Ihv;8T3[_@Yv0Ur=UlMdd@=;)2="[s1[xC]6a‚ETpV8WO=C<6:6S=$"/4,17E[<UdG^vF]w:Sg/DO/IS/B[,=M3L(8.96B'.#.#,!)/0, *$#,"/"(")4#=C21B%!'$!4F4Yc6Ze;7JI1J[0KX4MG6IJIs8JW0Q\B7KPEeSN`TPdC2EGC`=@OD>\WcvOhyOt€FgnB`a:DF74975999?@2=4>C9BE7>@<?<J8;<344/2535->76TIaŠiPxM,7*"&.&:G'>O*>F$08(/? 4532(*'.9(:B!>G%;I( | ||
1977 | |||
1978 | !##&(% | ||
1979 | !$ !*! 0)$ (()$-#$ %!!) ..( *)%&+4D$W"f2 dE+>B703#"5*" | ||
1980 | |||
1981 | |||
1982 | $!!%!)%# | ||
1983 | |||
1984 | |||
1985 | |||
1986 | |||
1987 | ##(+3.8127'2$00&+)#."*/..(%&*/#"=/%/*(6"#5')<;/J%&$-..+%%-!(;#3./0:33:#8 / .&&#$& .+$7"/&%'(-$)!'9"'*-+#1*%!,")006)6*+$$%#%4'5, %"+))%%% "'. #) | ||
1988 | |||
1989 | |||
1990 | |||
1991 | |||
1992 | ! | ||
1993 | |||
1994 | |||
1995 | |||
1996 | |||
1997 | |||
1998 | |||
1999 | |||
2000 | |||
2001 | |||
2002 | |||
2003 | |||
2004 | |||
2005 | |||
2006 | |||
2007 | |||
2008 | &6.H >i 5 | ||
2009 | 3'4G26')K,C %&#%& 52# * ""44"0B'CN!IK88!<=&Ik _m"ux&OO3.?5-22J]GwoZ£kUxk ŸQtŒhWk”i|N^„O;T:2@<WkZsYYmJgy5gjN˜3Q[Bq}WŽ›8py&Je%=kE8ZQ7IECPM(B851/4=/QZ*UP#--/=-F[>CZSAW]IeSJ^?AY8H_;?Q9>O*7A$)+-0>"'9$/9 *1&3*1 * & %/ )015$16)0D--:$+!,B?s•Kƒ’Biq78C1,56',,&524JKWu@p‰;@H75BH8LKAV;BF6:N=IT61ALHfVs€`d}V]pBRj7[e1ZZ-?@-08/59.<>6=G7GI;]X:I@-/,+*(-,/124;ML_ŽkQ}T*2'"+/*9;*.:*.4#-5#/9#=E!>D"=C'5D%.9)3A- | ||
2010 | & # !"! & !$%'#$ | ||
2011 | %"#)*$= 6)E#%Q$`1e9+3@9$,+1(" | ||
2012 | |||
2013 | + 0(*6!3&)#'! | ||
2014 | |||
2015 | |||
2016 | |||
2017 | |||
2018 | |||
2019 | |||
2020 | ! $(!2)13!.9(&1()5!0!#*# 0.2A-3:%* +)",4#(:$"0*(&O5SM!5O28909?G;:N+>0+* (#!*!" !'3'!## 2/ NH W*(*$$3 )"0"+!")&%(")!." | ||
2021 | & !!%"6 & +%0 | ||
2022 | |||
2023 | |||
2024 | |||
2025 | |||
2026 | |||
2027 | |||
2028 | |||
2029 | |||
2030 | |||
2031 | |||
2032 | |||
2033 | |||
2034 | |||
2035 | |||
2036 | |||
2037 | |||
2038 | |||
2039 | |||
2040 | |||
2041 | |||
2042 | |||
2043 | |||
2044 | |||
2045 | |||
2046 | *iF==73'G)%"38(#&2A'20$1#,# | ||
2047 | $&#../5"/)1#9?<?$)-9%7/96,F2Pg+J\->VCAULdyXJ\8^c%{€!œ|6k}a‹ UiyHPyˆd„[iFaŒRKjK‚‘1ƒƒ1vk[‡¥^]sK]sP]tg[fJP4[`Y[eTba4Tl(<N(GS/?<2MK8@:!<D!.636F9B?),$"!"3@(:N;5Q3GL6AQG3J:5F=>M><N2,;28Q"4B&0<.,:'/?'($,%%1!(!!)*#''+5"7E&?Q*EI'1;%<F#DN5;:>E2OfT†]Z~>?Y*;@#::-1&;FBNuV_xOH[1IM/ET:5?=3E19O;G]23C1.KNmŒ]q„Xq‡Pq„N‚›N_z6CK/672B@3jc3KL;P[MeeLQK-0("+#'%#+&%=<<`r]RbM/1'!,( ,/)39)19!,0"2<#/;,5?-2B(9>*/; 0:'08& | ||
2048 | |||
2049 | |||
2050 | # #%!""$#! ?#G+e(&`1b2^<)2A36!(=+.%%+1! | ||
2051 | 177435&9+*81+A& ;(#' &#,! | ||
2052 | |||
2053 | |||
2054 | |||
2055 | |||
2056 | |||
2057 | |||
2058 | |||
2059 | |||
2060 | |||
2061 | $##"&)%"&&,!.3('7$. 0 #,+:!)%'%5)*.(614-#;!2'#/"1+ 00/1>?I0QD373AE5Q#5H&.I7.B.8! $! $*2(! !.1EB.#FK' # * !")( | ||
2062 | ! "'&!"! | ||
2063 | |||
2064 | |||
2065 | |||
2066 | |||
2067 | |||
2068 | |||
2069 | |||
2070 | |||
2071 | |||
2072 | |||
2073 | |||
2074 | |||
2075 | |||
2076 | |||
2077 | |||
2078 | |||
2079 | |||
2080 | |||
2081 | |||
2082 | |||
2083 | |||
2084 | |||
2085 | |||
2086 | |||
2087 | |||
2088 | |||
2089 | |||
2090 | |||
2091 | |||
2092 | |||
2093 | |||
2094 | F=$J[WEl>=a'ci!L_ 1)'&'$+<*"" "!.' ("&'*#" +* (5-3+8 FO.=],8M(:#) *-<IIToC-I1*<;8PW_y?d”Yp®iޏuZ€Y`pv_|BJRRSkfZ}@œ’@ƒŸT6pg4ZgFrph‰a_~?Wv:RdJatIsm5rf9JUG_t:8k.&7,VG,GX9<Y<GU+Bb.Na$6K.LZ,<; ( 3&(:.3@'?F1FX5;J3<H8FR0=J.6D*6:23@-3>+ 5%" "'(!&-3!/8#& %/+'A7;O?DU9AK19K50N0E^&[d0OWC>MY7M<'?58O-S\'?E+*=:/LQBjL`s9Um<\q6LW+0@-3@?7M14C(>M@Us]Ž¢W©TŽŸ[z˜Zk‚Fnw.xr8szIŽLo{@stX€f]\.=>'3*(" .#-B<MkRO\B--')*(6"+7%0=&>B4=!3B$69),:02=.0:*1:!.7#/5' | ||
2095 | # !!*%!&'%" "(BX%i0`<#a8*L@*D66A((=/).%#8;B<N-CM3;W+<P..D(*;"*7.'32"+##,$+,$ +# | ||
2096 | |||
2097 | |||
2098 | |||
2099 | |||
2100 | |||
2101 | '""!!#&+!+5+ 6#9')--3!*6#(7"%6+0&&%#'*6.(74)2-6">:,30+%,E7-:038/5;)+B&!/.) * " $ /%')254M1BW>2$$+ | ||
2102 | " !(" | ||
2103 | |||
2104 | |||
2105 | |||
2106 | |||
2107 | |||
2108 | # | ||
2109 | |||
2110 | |||
2111 | |||
2112 | |||
2113 | |||
2114 | |||
2115 | |||
2116 | |||
2117 | |||
2118 | |||
2119 | |||
2120 | |||
2121 | ;SU<ROMT\\QHT_'-O -#! ! !!$#'"$%&,516++/1.. &12/7 .=#>]?FZ;-G,%! !.2QSA)2#=9%1=1CNAE]Lnxr››~«©Fj‰WY‚P^m8D]BEZX€‹{7mS%367GLUtTlmWO[<^b0Rp-i†EqW‰žGoƒ5WkQU€&Vc)q€;^d>PO=RP4BW@M^-5E+1K96 $(-",9),36/C3'85-C>)D93'.22G+%21(:%,4$!&#$"",2'29#5:""&1(:J6JA?S=NV8KQ67LBNe9P_4@R/6D%+3+,7:@X38F(*)!/9$:G8VCNiJQrCUo)BP'IX5Tb(ER+Tf=sˆYg‘»m޶`Ž·UЦV–¹UªÀS‘¦bŒ¥a‘©SŠ”\`{[DT:44$/,".."A10VCJzWAU<$,-&* *4'*"0:,GH)06'/3-6C);;&08(0.%%,"&1')4# | ||
2122 | |||
2123 | |||
2124 | |||
2125 | " '+$!$ | ||
2126 | |||
2127 | |||
2128 | " | ||
2129 | +CY'e0"h80N8,E/*N)1E3!A:&-20'!&;:J2J=6K;7KD<G;.J8:>0:@*/A-83$352837C8'M",&## | ||
2130 | |||
2131 | |||
2132 | |||
2133 | +#)7)-####,("*<""28G?%N&$,!!+ %*#+4#<**%#!*#';%,)",*!#$*'0*'6% 3#!.#*&(#!+)5*!1 " $#8"9>2H15$<*5% %60% .:$ & | ||
2134 | |||
2135 | |||
2136 | |||
2137 | |||
2138 | |||
2139 | |||
2140 | |||
2141 | |||
2142 | |||
2143 | |||
2144 | |||
2145 | |||
2146 | |||
2147 | |||
2148 | |||
2149 | |||
2150 | |||
2151 | |||
2152 | |||
2153 | |||
2154 | |||
2155 | |||
2156 | |||
2157 | |||
2158 | |||
2159 | |||
2160 | >LhŠR{ŒVew0gk^? | ||
2161 | WAP>rnDHiKgM'"!%%"!# (' 2)%8 '0%(##(;&*<!"3#&0;1>='B$ ! )3);=6BT>F&7A$NN.DH8¥œnyž‰v–~e“<@^D-H>%4/2>B3Us(3%,,5#0HYmFVm=Nr=Mx;JaLt’lf‰ma…I6_4C]5~Gx`SeDTvKYˆ8lc2\z7Ff(9P$")4)4!-!%&)&$&1#)#/%& %)"($ ",)"3'(9 29'*!&05,8B*@B/JD-E;0C>-CI5SCAY'8D%9= -62$96-> "% '('580IED^CUx>`s;Wu8Nh:^}7iƒR…£Y}˜h`m\“hr¤^m£ch s¸t‰³h{¢k¹g“¬ZZfHVZ4FF*KB)?=+PA;_NPƒ\?\@!(-*,.3:;%;>5OQ0:=&&%,(,-*9)0='/5!$',$.3' ! #,)$$$ !!! | ||
2162 | -M\+b5$j5*F=*8.):+(F2%<85526.')?,0J$&N;#2; 46,273:1?<,7R);E0?H&6H26L.)?+&<$(@,%6,1!(' | ||
2163 | |||
2164 | |||
2165 | |||
2166 | |||
2167 | $! ",0&$ $%$%"%"$.('/"20'BBA"<U?(B+'60"#,!$"&*"'"!%(#21 ,!%$%2%<6% | ||
2168 | %5:0=@!+" !(!&- !0 ) | ||
2169 | $#$ | ||
2170 | |||
2171 | |||
2172 | |||
2173 | |||
2174 | |||
2175 | |||
2176 | |||
2177 | |||
2178 | |||
2179 | |||
2180 | |||
2181 | |||
2182 | |||
2183 | |||
2184 | |||
2185 | |||
2186 | |||
2187 | |||
2188 | |||
2189 | |||
2190 | |||
2191 | |||
2192 | |||
2193 | |||
2194 | |||
2195 | |||
2196 | |||
2197 | A4O, | ||
2198 | G$f!n@QPjJ;ZAPTD+3>~€fZ„G„–_ŽŸ\‰€gr*?*&" !##) !" + $ &('$2!/#6E-BT$#*#*"+7:;BPS4N[2H[0O[.[^5}cEO}“claƒs[lTXl337&2F;J+):,"#(; $)8@AVeD4NK:H>ESDAXa>WaJzI7F(E\JSoeSch9ZDXdQOZL*P@':?%:5%3",(!$.&#!")1 ! #$'&6#,81:'&/'*0.*564C+8@/EF2CI?DP3IS/6@%*3(*2*'3%16+-16:A&3?.=Q<JdLXzFUt=<R<BeM\{\p’ax“Rx’PD[PHnTVnOHkW]gxŸ^n˜i‘¶p£ÄY•£Hƒ’@ƒ‡:‰s3VN6THKxZ]~^@iH&825<&@?)/=.UO0:=-6A(4. (! ((2,&.$$*2&;8) #"&# !!(!'*#.$"0'$!! | ||
2199 | |||
2200 | *!1 '0$:=^&k3#\6(=8)2&"8#"C+ >52/21)((%/ 9*28 !(, !#2%-1 4=#>G55J48H5/J<&;3 70&*0(4(!0$"+(+ ()"! | ||
2201 | |||
2202 | |||
2203 | '("65.7(64-340;'<984D&<$+* 36#59"8D12?+$:#.#"$, | ||
2204 | |||
2205 | !0% '' ! (# 6(0&&&%!)+&7+3!5 | ||
2206 | |||
2207 | |||
2208 | |||
2209 | |||
2210 | |||
2211 | |||
2212 | |||
2213 | |||
2214 | |||
2215 | |||
2216 | |||
2217 | |||
2218 | |||
2219 | |||
2220 | |||
2221 | |||
2222 | |||
2223 | |||
2224 | |||
2225 | |||
2226 | |||
2227 | |||
2228 | |||
2229 | %:5K<L3PgC@45)E.JDT802De‡1JSvhwq|›…*K—@rƒ3dcfM(-<]7€^V`5"& !!!&+",'3"%&'160:F07>6>BD0B&(I-,@83,A:F:@D=m{JaŠ>`UO<U[RvU_}UElC)G%)@36G4'7+A%+%24*825GC6D*EN-@P6<S75G8&49:D(EO86LE5L<3G2)<>/B*;9( . $" '%! !! #'@B ?E(?E&-7",5 )2#/9(5B08K7Jc>^l=gn<Ma1=Q(>?"DC 3?%4K"EM5=#7H#@Q*KW2I\;Sh>Oe7JY0GV@C\QOpQcƒS`DLd8I\CNb5Zp7^wQfU_Š_·p”ÂnžÈ`—¸[¥Àbœ½E¡—IŠS}gXoRJ=9,06&.4(?E.A:6LO2NF+@<$$*""!*.#!#!%&7=0SQ( '"!& + .#-(+!($!*$% | ||
2230 | |||
2231 | |||
2232 | #!$/(/!(/<"7#X#_0 m8+9;(%%%5C%=3)(.4*%'*04*)##7*;@3H#=;'9G#8>0,L0'<59*'&$% !/ +&# #'-"(& | ||
2233 | |||
2234 | |||
2235 | |||
2236 | |||
2237 | !!'/&&! 32 0;$58"/9 2?#4?(5D8@5G$1F)0@&7&$' | ||
2238 | &"#.!) %&&"'! | ||
2239 | '! +$$!& | ||
2240 | $!*#%$#!!!)$!'$%#)$)"#"& | ||
2241 | |||
2242 | |||
2243 | |||
2244 | |||
2245 | |||
2246 | |||
2247 | |||
2248 | |||
2249 | |||
2250 | |||
2251 | |||
2252 | |||
2253 | |||
2254 | |||
2255 | |||
2256 | |||
2257 | |||
2258 | |||
2259 | |||
2260 | -%$"# | ||
2261 | |||
2262 | |||
2263 | |||
2264 | |||
2265 | |||
2266 | |||
2267 | |||
2268 | |||
2269 | |||
2270 | |||
2271 | |||
2272 | |||
2273 | |||
2274 | ~U†wmj9*6W(5H/A/FR*We-IZ8Ns//3QnL;^bbECy8[5.0T7AD*BT>Y $T("7R'Lc!9R#(#!&20'&+"%*&+AF(?W*AL*-;,QQ,MY#,:!)3%FH#4E% 75N[BWK8VC,G,4CFGXF2J9;A!'"..@< H?&=DPM?N#Pf%,<+8Q)LX58F,6=- -'!1$'27Qi.3>.-+(&)#+4'(9& "!*',%!" ! (, &".)3,:L;5J8?U/>F&-1%)2*4>+GJ,FL55GH=V_IrO^p4W_/>Q/BO/6G)4?-8H-AO*GK-@S1Ib=L_9QlBZm6Zl3N]9DW<>OG?_SPfCE^9L^=I`AZoG[wMh„FUqZS‚ljjt¤q“Át€¸u‰¸t›Õh¥Ä^‘˜TlR3EC&40!6;-WV3jm7IR4RM,02!+),,A;#.-,# +-A<D^3 ! $$% (&(& % )# % (#$"!*$ %! | ||
2275 | |||
2276 | |||
2277 | |||
2278 | |||
2279 | $ )(11)11!",)*3-8D(?0K'D.!J/&07)$*3F';6(-/0&(, (#%&4$24.?E'4K00@1'B21-("!)",#)%!%%$+$/.!$,&" | ||
2280 | |||
2281 | |||
2282 | |||
2283 | !%,!$8':&,5&:=*4D'@B(?L)0L% C+ 3)*2(&)(%$1 | ||
2284 | |||
2285 | ' | ||
2286 | &$-4 ,>2(#,9&:(0*" ( | ||
2287 | ! $%$ | ||
2288 | $ +&)" ' !*7!0#)%% | ||
2289 | |||
2290 | |||
2291 | |||
2292 | |||
2293 | |||
2294 | |||
2295 | |||
2296 | |||
2297 | |||
2298 | |||
2299 | |||
2300 | |||
2301 | |||
2302 | |||
2303 | |||
2304 | |||
2305 | |||
2306 | |||
2307 | |||
2308 | |||
2309 | |||
2310 | |||
2311 | |||
2312 | |||
2313 | |||
2314 | |||
2315 | " | ||
2316 | * | ||
2317 | |||
2318 | |||
2319 | |||
2320 | |||
2321 | ! | ||
2322 | |||
2323 | |||
2324 | |||
2325 | |||
2326 | |||
2327 | |||
2328 | |||
2329 | |||
2330 | |||
2331 | |||
2332 | -j=q|"if2]&3S':.5P7;L?O4B4IQ5Sm)Qˆd_˜Lh|?Gp70R*Iu6)S,():"'/'-),23&## %12(! !+4$*+("$*4- )B:3BM0IM)VX@]v.?U"%0#&41(#&1K^29K7-5"8?%7K45B*$&&"&#!&2:>_BSw1BaB@L'AV2-A#K`0K_6Uq+4H +%+0/%(?0@&-.$$%!( # "$ )/149?"34" +@06&7$38+@->C'>C7EVCD^<Uf3II..:E(@P7PHIe7JX5FW2CR&<E'4C)2@0@Q4HW5CW7;S8:WGC\GIb=BV7@R34E/,A;5C9>ODUgH_lHZ`HGbJHe>DZ:?VQU{Yd‰ix¡p\…]bŒp{°€¤Ár•²]••5uv-†ˆ7„|?‹‰Hy‡BV^6>L-83#EF'YV+^j,TQ"5=;/#(.7);@ %#,$$, ( "" !!""#% | ||
2333 | |||
2334 | |||
2335 | |||
2336 | |||
2337 | |||
2338 | |||
2339 | |||
2340 | ""5-'D /"-&.914&3(D)!B*$G-!?1$:*(+!%)9 !1) 4"'$48#1@6%@< 14"*&(( "/'-!6+#%(+'0(."0#+# | ||
2341 | |||
2342 | |||
2343 | |||
2344 | |||
2345 | |||
2346 | |||
2347 | |||
2348 | |||
2349 | |||
2350 | $' %&(#(0($1 016K21D/8D/4L20?'(7"2!)!.& | ||
2351 | (3-"C4'*#&2*#%, ! | ||
2352 | $%.+%'$ ! ! '"&( *%" #&",!4#%%( # | ||
2353 | |||
2354 | |||
2355 | |||
2356 | |||
2357 | |||
2358 | |||
2359 | |||
2360 | |||
2361 | |||
2362 | |||
2363 | |||
2364 | |||
2365 | |||
2366 | |||
2367 | |||
2368 | |||
2369 | |||
2370 | |||
2371 | |||
2372 | |||
2373 | |||
2374 | |||
2375 | |||
2376 | |||
2377 | |||
2378 | |||
2379 | |||
2380 | |||
2381 | |||
2382 | |||
2383 | |||
2384 | |||
2385 | |||
2386 | B85-",!I?!8:+6**?32<?%+Q0e".^)5J%3<#2Q$13 !'+&(.)' !" ",1/: %,%.&%58$/,;!'7(0-/">K1Zd:Sg>RaAGP(9=# !"!B8-1"/+*,+7*:F<ALH=D(7GJOaEObAAW5(=)17&:M6/A36E>DY*KQ@<BA!/8 &# &!*0:H45F2+ %).1?0AQ9FSI<FHCUISi-=?!(2,.:EJdLl~9ku6af*EW)BJ(AQ(;I0DT6Ug7\\/NS7=J;2D8:F23D0,6&)"#11EVCRkPUpHYl;EV=OZ2V`/UZ8QeH\rPg~NPjGOqZ‰«tœÅy’³sš²L|žNsœX…²]ƒ¥V’¡H~Š<hd0OJ-hk@ˆAsA^o)>H%ET#I?#.27 #(#$) &% "$" $ "&$,-$ $&)%5/,';%K)#@0&N.&D6*3,,;& <'-)!)"%+?.9I0 H5 )(%%.-05)9(+#**/-16 6' | ||
2387 | |||
2388 | |||
2389 | !)"#4%!%#(.1)%6)78)1@% 8#!')&%.*#+)**2 | ||
2390 | &;!") | ||
2391 | )-/->%-) ## #% $#"(*+ *!%# $#& !& 0!&""!#%#" | ||
2392 | ) | ||
2393 | |||
2394 | |||
2395 | |||
2396 | |||
2397 | |||
2398 | |||
2399 | |||
2400 | |||
2401 | |||
2402 | |||
2403 | |||
2404 | |||
2405 | |||
2406 | |||
2407 | |||
2408 | |||
2409 | |||
2410 | |||
2411 | |||
2412 | |||
2413 | |||
2414 | |||
2415 | |||
2416 | |||
2417 | |||
2418 | " | ||
2419 | ) | ||
2420 | |||
2421 | |||
2422 | mGI3@ R<$(##)(!"6(!0+#8H,(-9!!"#/#")(.""(# #"$!33+: 1!#/&+)7.F/?)"'%,"?E3L_@;^A„v<M[1.I/52<C=2$3+^o2 5@'?>+>/$)8A>,F;*>-XZ1=+8A#b_06"+58FP:Pw.Vs7'C ([I./G7 | ||
2423 | |||
2424 | "&7@56-+)6?:;A54E7:3(#45%<H5@V=GQ1KV7CXOasDCW)XT CI98F[8c\Qxbh‚H]m6H`/W_4PX-2D9/JAFf@_y8en3HX/BM19J'.8#++',1I[EXkNAXK;XC;U?h„B‹•B—§?”•NyPrƒE`p9LfTd–hq¥t¬wŒ³g|b‰¡\‹ªf|˜išµ] L‹§C˜•F„‰`ƒªZ†Jfx4Sc6dp8v„1rr< '- .&( # | ||
2425 | "#$!&"&*% !# | ||
2426 | |||
2427 | ##%$+0$1(230'7"+$3$8*!D,):4*../-#!;+ $-$&/ /.4,47 "C&.5(4F3I2#>:-%++./72>&+=%(;&)4!,<#A 0*$ | ||
2428 | |||
2429 | |||
2430 | !)( *,#12/<->++@$93(0"!!1/ % %.&6,7*:%+4'.6+45"9# 7<'/'6$,7!4"%$#,-# +4. %A$%0 3!*+* * )")' *64 | ||
2431 | |||
2432 | |||
2433 | |||
2434 | |||
2435 | |||
2436 | |||
2437 | |||
2438 | |||
2439 | |||
2440 | |||
2441 | |||
2442 | |||
2443 | |||
2444 | |||
2445 | |||
2446 | |||
2447 | |||
2448 | |||
2449 | |||
2450 | |||
2451 | |||
2452 | !!!$ | ||
2453 | # | ||
2454 | |||
2455 | |||
2456 | |||
2457 | |||
2458 | |||
2459 | |||
2460 | |||
2461 | |||
2462 | |||
2463 | |||
2464 | |||
2465 | |||
2466 | |||
2467 | |||
2468 | |||
2469 | |||
2470 | F!}YV€ˆ>›—*—›Fe‚$RB?3˜j$`s"8K"6J2%* #*&@6!9.Q'ƒv^7 _B$(%"%)$#")'2%.6%+/! +. +'(6$.&-3%+13*:*=I:SOE€©j‡¤@p|$aYGF/$,$1#;,);TQ#A$".(2&EP#1$(3/9C<:N-,=;6O88> DL-`e<D_G#.G&!'".u„<Md3>a5' !!&'0.=+=E+7H3-54)34;R6FZAA77&BJ85J9.?><K;<K:.DS4WL0CBDe>G^8BV6>CK*:Y.NTK]G0AC+MF?_3PV*KI66JH3LSYFTk50D3/A,8D#=C!GG5HUPS\>7I8CL7GSI_~dy›eˆn›Æfœ²RnŠJ[x7SgDTv\c…Wn–ikˆjW‚b_eޏj¹j¸o˜¼_—µb“¿^˜mЍoœ¶X–®EœH‰œV”¬R“±N | ||
2471 | % ##!""#%)" +&!# | ||
2472 | |||
2473 | |||
2474 | |||
2475 | $ #&,$1*0!3267->"3##2#4%!9%&4,&3()-(!*!####"?& ?Q1N".=!3;(69"6A->/#726)+H;6N+C+A3%+J/;/("&+&!-#$" | ||
2476 | |||
2477 | |||
2478 | |||
2479 | "!$ | ||
2480 | #!* ("2&2,").%()#+ "%&'&!/.3$58"(=807?2=?>?T$;Q)6C!2B+8!!)"''#)& | ||
2481 | "'&/&%%"-$$#"#&"#-*<!!!&!"%&') | ||
2482 | |||
2483 | |||
2484 | |||
2485 | |||
2486 | |||
2487 | |||
2488 | |||
2489 | |||
2490 | |||
2491 | |||
2492 | |||
2493 | |||
2494 | |||
2495 | |||
2496 | |||
2497 | |||
2498 | |||
2499 | |||
2500 | 0>y"UˆD{o ›]™tž»I@m:‚Ÿsš·XGW)Rg-Z_VOF?'„y;ž©)rG–¾{©T¯ÃOš£A7%2&/-&%3)51,0$#5+11"#00$54/)8 #- ok:Ÿ«W¥‰Lc{\f^RtFn”7<g++"&44<:,% : #LI(HT.?ZC5-:))3.=J.6?-;@4C@%)82&5I'B%!&!%!3/+?JkCLFO`A* (%"/$01*9.JR'BJ2FOCNXDFR/AQ/2@=(46)226=5=A*::;1)7'90=L1B??W5GZ,=D'*;2P59F&!-5"19,K6Wm-XZ,4G;<GPMc1-4&"(*".*%3-(<;O\HJ^/"(.#>6H^;BdVHjfR{vbŠyrapLgƒEMf:ChOTzMj‡W`IQgQax`{ n}¯q•®l€®s˜¿s¡ºx’¹hаt©Ïr©Ða¥Ém Ãh´b„«` | ||
2501 | ! "# ,&"/$$ #'# ! $ ' .0( +*2,'8)/+/3396D;1D#C3+E+)>. 7-!4-!.)",#!,#%#'G/DM'DS1;H+1J"E@%7N+*C/*/&;14C8?3:N5>I#)M000##*'&& | ||
2502 | |||
2503 | |||
2504 | |||
2505 | |||
2506 | |||
2507 | %# | ||
2508 | "$()$%-+/-')6?9"J 54,5C@L+3J'=C&I.#7//8,??$3K%?#%!& ! &" #& %0# !'$%(,'#%(! | ||
2509 | |||
2510 | |||
2511 | |||
2512 | |||
2513 | |||
2514 | |||
2515 | |||
2516 | |||
2517 | |||
2518 | |||
2519 | |||
2520 | |||
2521 | |||
2522 | |||
2523 | |||
2524 | |||
2525 | |||
2526 | $%!) # | ||
2527 | ' | ||
2528 | |||
2529 | |||
2530 | |||
2531 | |||
2532 | |||
2533 | |||
2534 | |||
2535 | "0{oUqeu)-v”ž…¥O‡Œ†}œƒk`?KbD9ZQ=[MoŽAadt~Ž’wŸwGx“*G€,;¥L|\‹.8/96122.$."0##5")64#8E",,%+5#)!*&,LjpŽ›k¥o“CuNn}\~Œb-F2881=CG#7A.5+ag7Ih;P1+0ENE@W1-3,ER(&:&!"*+04uk.L]/pf1]Q$*>!)*#ZU ~w!MR"}x,XgA8SA&4< | ||
2536 | |||
2537 | # "!9-HF?V?G`FD]@+;6/0$(&#".+>FCqz>І:ƒ~"gX!)--$/2&6<,B5+<!!1//B+3#$#8#@D?V0'?7G[;JU3@E 2866 B@'4903<=>P&8;$%+ 0?;P?HYC`xPpTI`U@iIGbBMc0KY<JfJRyL\|D…K}—[ƒ§c{j~bn‘x‚¯|‘Âz¨{¥È€´Ó®Ûy³Îr‰«t‚¡a~™Z !!!#&$%"* ($% | ||
2538 | $ | ||
2539 | 1(%#,&'($0(035>B:"8M!-E#)5264<B<#8K)B)3:2#=,+4+ 3*$+% (!+*""*B2ES2B[@1_9'D3$2))9)50-&&/03:)6=26E4-J)(<5''""$ | ||
2540 | |||
2541 | |||
2542 | |||
2543 | |||
2544 | |||
2545 | ")*#/%''.*'# 4<>5F6?@H-J!)6#8.<?0B?%5J#%:-:)*/%3J,"I#,#1"9.''!+ % ,**0 9 &$(".%0)(" (& # +--"!*#%)-$0/&#"%%$#"& | ||
2546 | |||
2547 | |||
2548 | !&" | ||
2549 | ' | ||
2550 | |||
2551 | |||
2552 | |||
2553 | |||
2554 | |||
2555 | |||
2556 | |||
2557 | |||
2558 | |||
2559 | |||
2560 | |||
2561 | |||
2562 | |||
2563 | " &+, $(!$ | ||
2564 | |||
2565 | |||
2566 | |||
2567 | |||
2568 | |||
2569 | |||
2570 | |||
2571 | |||
2572 | |||
2573 | |||
2574 | |||
2575 | |||
2576 | !)zPd-2GvŠe›€ow…uœxa~VSŒ=Ia-gxDŽk„©[\—w"Io/8G=J*#$(>CSIJXDA%XW&=@ )=!.$*/1/2-"#1=,(-N+LHZI&+-&_I>iŽnBqzT|q[ogJemCxfAb(+8,#:7'G<)0/%6)/BaL^=.G2 #6E&);8-B0+/&-A>8A")52C5,B`2CUKmb>dDJW$BS*1Tf#QD%"-;ZMka0G?%<2+@*H[ ! :3:)5J5I810$%' .!9Y=_tEvsMtiKl97C"OQ:F0QQ-a_"]PK@!8@(2>$'! 1#/)%1,><3I8<S+BR*S\0VW.IV0Zb8gl5cj&ccQI+V\7]iCWsOMkLPg:ZcB^gFcuBq=s{A_sJa{W«b§²_±Yްaz‘amŠcˆ£iv¤h‰qƒ²„Ä…¢Ò‚žÉm‰©[}“^iƒR ! | ||
2577 | "$!$# "&'"/$9$*',(.%2,' '/&)(022(7;$%I-385B:(>C#8E&?B*F?,L/.?8%*,*1(#(!%"%"$*5-ND.3W>8IG6E6!>"(($#8"(2; :>)8I*.F29'#" | ||
2578 | |||
2579 | |||
2580 | |||
2581 | |||
2582 | |||
2583 | &%-2)9!,4'5.299+>&&.'>'(9/28/,A+1>4EI%A^ JV+\[*Uh3=R(< $"!"/%-!#).*+' ' &+57(=!*0!&13-4;*>!') ! ! *#$!J C,,/:99> ;$'!! ) " %" | ||
2584 | ( | ||
2585 | |||
2586 | |||
2587 | |||
2588 | |||
2589 | |||
2590 | |||
2591 | |||
2592 | |||
2593 | |||
2594 | |||
2595 | |||
2596 | |||
2597 | |||
2598 | |||
2599 | |||
2600 | |||
2601 | |||
2602 | |||
2603 | |||
2604 | |||
2605 | |||
2606 | |||
2607 | !% &1''2 | ||
2608 | |||
2609 | |||
2610 | ( +% | ||
2611 | |||
2612 | |||
2613 | |||
2614 | &&*10!&( !7%3X5X[9at&:ZTQK<f.47LYn~3N}@U_?5&JA0R_1=772.FK8O]14@@09/;F",.1/?<$/;"%03$)05%BDJj–I‰šKàÌW\,VJ_``VcA6IOcmMD\BibTSk6)A""! (!*#!+ -,*")D3E)xq_n)J[)“v*H:-3,0C-DA21*UN/)-6.3P2=.R*EH+KS5@M&)&##2/3F.5>L,5(',: | ||
2615 | %&0- "-& )(*6-.--$"0."JC*UX0\Y6e_$@@;?76"6,M%1I//W'5HMQAo€4YaEhqG]vTUpED]+5F$06.257"##+,*4/$=5,B47WA\q7L_AavNpˆQv“Dq‹>f{7\q<NjBFb?@I=7=CKeIVmGD`OHmOZˆRp“T|‘_…–lНpu›jw¤f€šPuƒ^f_i†_daPxnc³yµkz›_x’Pn„O | ||
2616 | ! | ||
2617 | % | ||
2618 | #!!$& /'#8.) 0.(1%0&*-*"-. ,/ .,"0,'9&4"&.*6*-=?"AK/<H28A/64,6)*F*((/'/"!, %)'#!: 74;C( L>'/?*:&%8*#,%#*1)2<!5>-7>,:0*) | ||
2619 | |||
2620 | |||
2621 | |||
2622 | |||
2623 | |||
2624 | |||
2625 | |||
2626 | |||
2627 | |||
2628 | !&'-!) +, #$!!$).!$/!19&=-,7$,$"$$'3!!5,%,$*3!.32A;/?^</[E6B<)604!.?!4&* .!.,43 | ||
2629 | *%%?$*S+0+,6,4K>BX(-H%#,!.# | ||
2630 | |||
2631 | .) )!)*?K(H1#0+%"5*)A(90$1()"' | ||
2632 | |||
2633 | |||
2634 | |||
2635 | |||
2636 | |||
2637 | |||
2638 | |||
2639 | |||
2640 | |||
2641 | |||
2642 | |||
2643 | |||
2644 | |||
2645 | |||
2646 | |||
2647 | |||
2648 | ! | ||
2649 | '3 28!+-% | ||
2650 | |||
2651 | |||
2652 | |||
2653 | |||
2654 | |||
2655 | |||
2656 | |||
2657 | |||
2658 | |||
2659 | |||
2660 | $ /+,7-0#4;/5%/#.!'#-. $# $G ";/($EAQDe8Rj<OP3ck?†‹H}“1€~/ˆ”4?M?FK'+0(4;0=A,",0)(%%!+2&3+!3FjeubƒŒ~¨˜„£EGPL9RKAU9MF;JYN[]AReSd1")*#,%(7E%6C$&>dvNGh<-@PAnpQ|)]m*9[4CT4TV+WgDEc%\Q$8;(;<14I719!52$"-Qq$&0%)+" | ||
2661 | # .$!.;#20>7JO(1:"%.&/14033#!!#.,&.LL@apSt„Zvˆ\ŠJU\2CK?=W)<G?:-."EI&<E+HK0GKQLY\9LR/NZ(@T%;E+37%0!+4$,7'7I=@11"'7*8"&3& 1F6Z?VgG\nYZ{Va|Xe‰S]wIRmAH`:CZ8Ui9ko3VVB2L>:O<8MK@_U`„ap’`qŒhu™^ToS8gXMu[UoUYsZfxQevHI`P`{esŒk€£jq—^x^n…T % '%$%* &$ | ||
2662 | * | ||
2663 | (# #6/. 0;.: 36&06%36%*8 (0$.& ,.(4#:+#58"!8!1&#",3/1.:-0'++ "; !,'"*#),)! 2)@ 70-1' !($!/'0B(=&$6-&3.1/ ' | ||
2664 | |||
2665 | |||
2666 | |||
2667 | |||
2668 | |||
2669 | |||
2670 | |||
2671 | |||
2672 | |||
2673 | |||
2674 | |||
2675 | |||
2676 | ""'$&! !!%0)#$&,$( '%4:'H> KDI%($ *.(2",*13&*?0= :=A<RCRCN>\I"HPB8X4 _M 6Rj9?gHY?H-?G<6!PC%Rh%Lh9%S791!&8))#%"(*.$#-)2)=+)!4 ($&(%"( | ||
2677 | |||
2678 | |||
2679 | |||
2680 | |||
2681 | |||
2682 | |||
2683 | |||
2684 | |||
2685 | |||
2686 | |||
2687 | |||
2688 | |||
2689 | |||
2690 | |||
2691 | |||
2692 | !% " $13)2(2*-( | ||
2693 | |||
2694 | |||
2695 | |||
2696 | |||
2697 | |||
2698 | ?3$ !$()2,5#)3'4:.6B(!/!")&)),4843)9 #!8&!A.0FHQF?^[NVwt„v¦„Ov)L3+<69@%%5(%0/%( +#"("' -0.; #,*!ˆm-€£nZ‡_Ik„K¬i!,;*/06,:CLDEV<9G?<HN†‰N,5! ##1 ':19>',3$+Y5B4LV),:SDLB3OA4D13GD8S=8Va@ZFd‡FKh%6J''-$'*;6:4"")&S(6#+4#! | ||
2699 | 61*)!#%'*'d_7nr:asH[c2Z[%p]1Å£,ƒf!XMZQD:3,('II-db$AC-:?J4K_Lfo[lqUt_\n>W]AZW;XZ1CK''/.3G@bq@]p@Q^G>PI1@0%3!%&'#'"$5"*-!25<M'<D23 )60<7E)1*!3?DXDShIQgJLiPLeE:S@<U37L2:PAOhKWvEZk4CS+09+?O8CRESlYlˆ^ewU[n>1F7,<?DVMWdD`kO^sGUo?XlIXx\o€^baTt]Y{\OvJ | ||
2700 | !"" %%$.'#($&"$"$%+# .*&.2749:!/?*(8.&;)+2&30(,2%2)"-6"*;&22)3>&);3-)$!-+#2&#)-/&"0!( /55#;$#!5 68'H&8,$(##' | ||
2701 | |||
2702 | |||
2703 | |||
2704 | |||
2705 | |||
2706 | |||
2707 | |||
2708 | |||
2709 | |||
2710 | |||
2711 | |||
2712 | |||
2713 | |||
2714 | &! "! !")#(&*-*B57E-<*366F<TK"@]0/W<"- $$$D#):,(+4;2 1F?;":]%EQ.Ll1rb2|‰/x•<e5Lu+Ci;^h<D});[DFH0?P1EH+LM)TU+/c?>DH5N>,7$"48$$)%"%$4$.)%$()"++$(& # | ||
2715 | |||
2716 | |||
2717 | |||
2718 | |||
2719 | |||
2720 | |||
2721 | |||
2722 | |||
2723 | |||
2724 | |||
2725 | |||
2726 | |||
2727 | |||
2728 | |||
2729 | |||
2730 | "%$ $!! | ||
2731 | !,&+4#&4.2$3B#/ | ||
2732 | |||
2733 | |||
2734 | |||
2735 | |||
2736 | |||
2737 | <)>X4Ji%:(&**4"!0 $$'+.GE/34291/,- .3+,',$*% E2%JW;BI3BN@DQw6Jx.;M>;$(0!-.&+*!><SZEN+/).(, $KA5„¢yOŽ}GƒS/NHRLR@R=<#<@+1A817=ad1QjUd˜ehr#NdEa%&&.0BI!RH35:=J;29#38<%<2(D',0-1:2/9&9A<BfZSg'CZ'8N'5/3;1>HN'! ##kj&Gl/< | ||
2738 | |||
2739 | &+E/@R ZM <>9Ifii‹_PqbmxO‰†IûÜañÿbÒÃRûãGȵ:I\+nh/mp2}}Mm‡Huy;AI:GRH]ldƒbz‡fšUˆŒ^€‘Rm€N`r28='.5?6RbAbNHRKT_5BL!10$%%'#63>O*9F:?7; 0='0D!1;',/B:AO<3N8=Q<<P71A,3@*0@&/?37MEDaEDY84E&7F'>I5U`@^sS\yP\qCNb1*64@/XiE^kNfwGO[:=Y>OgEUsSl‚O[qKOkJBYFEZ: %$$(',(-*%,&,$!) (!".+ ! | ||
2740 | |||
2741 | |||
2742 | ( | ||
2743 | +(++"%0!32$39'26.%;0,-'/.$30$17"(9$3*'&" =)*=;&;:/>+/"10 ./&$#"'3"3>,6$$*3 +; 6/*)#,&)" | ||
2744 | |||
2745 | %! | ||
2746 | / 0 | ||
2747 | |||
2748 | |||
2749 | |||
2750 | |||
2751 | |||
2752 | ! "!&(# $!)"+23FJ#HO43H%K< NQ#@U4-MJOA<rR%ppdz ulUtEr-3T$+4/<)E((7!>G..L.<>.<S3JPLDXUP]Z8`F&?@39-:K=IZ0TR+4P*KB'ia/_y76`E)C,"43-&!2& )(-5 ,6/549.0+% #/$$!,*&!$ | ||
2753 | |||
2754 | |||
2755 | |||
2756 | |||
2757 | |||
2758 | |||
2759 | |||
2760 | |||
2761 | |||
2762 | |||
2763 | |||
2764 | |||
2765 | |||
2766 | |||
2767 | |||
2768 | |||
2769 | # ()& (.")"&# $ | ||
2770 | !(%&16)&,",&0 % | ||
2771 | //"#"& | ||
2772 | |||
2773 | ,.( | ||
2774 | 4(@/ 2" | ||
2775 | 7+ | ||
2776 | $.( | ||
2777 | ,%84A@AF$8T"+"3%&,5?L(;F;?$<J(1= NF&LVD;?<0;DG,IT?GL44>5IP><P4:H%16&'5"#+3)6+SS=BQ.C>67/5 %)2G0Xr08K.?%+&39B[’/(68Ki-"-# %*"?W9BP[tgZuBN\BNp69I-4(*#)5E[q5,@-4?/;H!#+$05+ %78'*7'/@*T]*7E@,@B"70-* '/8@Nd'!'(&%<3851:!-B$/ | ||
2778 | A5K>7FGH`j><B71;S'9U#1R/H`[mg^‘e’Žv–‡œÅŒÛì_…CMZgde‹Ÿhase[{Qej78DB=Qah‡_ˆp`}`‰crQac9Z@1;(7;)2=<8B9BQF;U7$5-4A**((&+&+0)@)&4'$<)'6!#1 "2"(6'.#/,1A/!3*(;56F'2>%2=#'1#:&/>0%?6BV3FN+@N-CU:JYCLeJOiPauDYm+G\&U[?qƒNw‰M`pIW\2IS8QkD_jM^nQTr>Mb5;P95N; !"!#"*!.)&2!&*(#&!',"0, 04%>!1"' | ||
2779 | % | ||
2780 | (*.-).)5 +7$67#;>)1?)46$?9$0?);%$();*CA"9N,%=.+"*08"/( -*!%,9 ! 4 H4!9Q$:F%5=$-70,3163-943%*5&, !5 1;'5$-" & )- 7 | ||
2781 | |||
2782 | |||
2783 | "( | ||
2784 | |||
2785 | |||
2786 | |||
2787 | |||
2788 | ( +"(,*74%9),0)"8&.$.L&(HT2PX;S[,=]9=NG5?>_:*Qw-LoIK`SAmHKeQdeJQd:*J"$1!0.!@8#-G (9#7? AH%:Q'bL0Yr5?r81K-0/I8!_V)`j-Ts;Xg.i~:h~LI€GHD05e8%5*755R'<##!;(-C'6& 3%#+ 3(%$"#24 -*& | ||
2789 | |||
2790 | |||
2791 | |||
2792 | |||
2793 | |||
2794 | |||
2795 | |||
2796 | |||
2797 | |||
2798 | |||
2799 | |||
2800 | |||
2801 | |||
2802 | |||
2803 | |||
2804 | |||
2805 | |||
2806 | |||
2807 | |||
2808 | *2 " ' %*&")-"04#/!*:!*8+*7%&'14 ) | ||
2809 | *.!(9), ) &5*;'27&:@,AG&@D.9 'H&I_Yd[1:" | ||
2810 | &+8C*?V:'/@&&%/')&!AA6AI/3B/4A1CT'Z\9ck;Ha,9[/1=&<G4EH8OO8?M30;9@M68F/&;'$-" ,0"5??,C.+*(4:#)3!'#$8>+<<)*"!2*@R7G$*@B#79,-<C:@YZOsP%QC 7?;E!ac,ax#)(#: +#"+4A*2@,7(-%-/.F =A02FB:J(*4*2D$AZ1; <<;9E59F&-466@6u“'>L(AG$&- * ++71 )#(6L9OhBLaMbwHFN.>J-:@+37'6CCS^N?QS4GfEbkZdyYwd\aNBBQ7AdPdtB]TDYahwB^[9SZJCUd`l[Zj^;\Z3PgEa8?@2,6*7F-1>.4F/<J72;' " #!/9(^q'qpOJ3.# &#&1 ($+ '' #/#1( %/ (/&0,9L1HS%>G!4;/;">G&2<3:S<\f7LV1BP:CR7G^>JcHWoCLg9Pe?LdIHeQSrTaGhv4Oa@M_EiuGPiEJb=Wf4AM4>L1 | ||
2811 | |||
2812 | |||
2813 | |||
2814 | |||
2815 | |||
2816 | |||
2817 | !# -,.$4$!)( &-',0*7(=($1(,$ | ||
2818 | |||
2819 | .)/0.+1 (6%.#7,$.F(*<0+7..1*,5(/2*5.'7/E.TGZ[,Ea5*O56-A%B&1.$$!& $JO2&0%$GCF.N--<<G80FL*=K'CJ%DN'?G-GJ.=M(*J+/).9/:"1*$)%,$ )!"/) # )1*3 %$# | ||
2820 | (# | ||
2821 | ')#! &!*.=7CA"RL'YP&LZ!DT)ULTWPcJ_@=cG:YF;SQ8NAQJ5uj+k…FMlLBm=FVE6R=EGAKgIDP=JH(ID9_"8R-8?DD_J >U(G[,D_EPLGPP,GZYf(Le<D]K]XGKp?QaDVWSxU(`522 ##.$" !&'*'1+%%$(:!G&+*176"$ | ||
2822 | |||
2823 | |||
2824 | |||
2825 | |||
2826 | |||
2827 | |||
2828 | |||
2829 | |||
2830 | |||
2831 | |||
2832 | |||
2833 | |||
2834 | |||
2835 | |||
2836 | |||
2837 | |||
2838 | |||
2839 | |||
2840 | |||
2841 | |||
2842 | |||
2843 | |||
2844 | |||
2845 | 9*U8 ^c_g'4T | ||
2846 | "*!#&...)-$(+%$ $'$*/*16-57-;(!1! #( !*&6@$-1* '/3&0*'"34'8>,4=30<:13 2se™2‰¡Z”˜L}J^l%-9"$ | ||
2847 | +=I!<L/2S<&?!$- $;?#BJ"7C1EO/jf/\d'FY0SODirWaq?Ma1+=$-8*IJ1KD9<E2/C)=H12<+,$ .""' *+%*'+%--%8!Y.M2:9,-1#$(66'"*.?)1;#48.5?;;DDaS%RZ#VE,z\E49BM%J.1+. ,,#*!)$) !$.1%5@/=\4"7%+,0+364,47309*1@0UX34=*EC!VT*[aA[fQj2Zp/RU'35234*#('9'I'9?/L'89<A3;C-?G/4K44JD0B11;<DQTk|JKPGMUB`e6Ya=€]ƒ†@leRoy^r‹Tw‹QmUyR]d4"417DCcj@\f&HI'HR/<H)4E/';/,5'.5<=>]V^ŠQ‡ 5€Ž%kkQKBCDA55&*"%#+$5'2$+%"0.7)@O8BK/:J$(5&4H'<I"(<)3J=Ph<L\6R[0KK13I<RnCg~?q~?`r<:G82J?GXHHgSY}DS_;@WQ]xD\kE\jGSh6IX8L]2$ | ||
2848 | |||
2849 | |||
2850 | |||
2851 | |||
2852 | |||
2853 | $!$0)0"3!(#$)#&1&/'%2(%/&'# | ||
2854 | # ((&2/,-0*2&#-".)!*/";4088*0;(82#92%D9$H@%JF$JR*Q^=CcC4S@9"'t' U<!5;1)%*$#PQ6)6*4';@B9AB;>7C:(8N1/A=154E524J<4M82H7782-?)$9&&+':)"->)62 | ||
2855 | ) $8# | ||
2856 | =?:I*!F"*# | ||
2857 | |||
2858 | |||
2859 | |||
2860 | |||
2861 | |||
2862 | !$1++- #!+&?7<@SI2SY1@bE8VI@FAKS2"WB"<I.?E)@G.7=7;=8E0BG-dX@V‡bZŠY`B !76403;,KA7QcAaX.Qc/@T3YQ)JZ,7O+9<*73<F71MO8PS<Gc2NN4?\6EPIVC=Bb4:SC)A=0<DKD@+`:$1"++/9-2!$,+?>K$#&*&%"" +%)%! | ||
2863 | |||
2864 | |||
2865 | |||
2866 | |||
2867 | 7%UM 7? | ||
2868 | % | ||
2869 | |||
2870 | |||
2871 | |||
2872 | |||
2873 | 2LIJX | ||
2874 | 74 | ||
2875 | DLC?7WVNLHR8\A$ | ||
2876 | #-!%$)%*+$,&$(/&!*" #('+'!,7.(3&#-" ! !'/-,*8%/2"3=$7+*1-,67+?A4HI39E'"& | ||
2877 | |||
2878 | (1S\9\z2\}sxnlœcb’R¥'r€|‚XR9//?K+5I*()"JJ.>'!!;G4EV6BK1CT=TaRTiLTk2Q;8ZrYbjLW\=ef%Wg"8N<Ld@Mb64S"::-19&=A"2!+ 8>DK)1'&("3#M*Y4J9%25$,/($'*++1"/$$+#)8D,BQ-4A04H/P[_VxEjrCm–GTJ(kX$qH&„\9@'(""&!K9%,%4!-B'3:6*30515)(:5>Z&%($46ICI3Zu@MrRVvKATO*G?4NQYk/5A;F##3"&#$(0! &##*$OP+OS4=M6G[0CR*/9/-<,*:5,:G+AHFT67;I4SL%8kCws:dp[}Z=^j=[o'Bd$Aa5LqGc068(>PHFc]YxJv„:gr8:K+8D0;$0=,105#9L0J_Jg|h}™fo˜T\€>KZ4HW9[k,HY#?F32(/'23>"1=5?-.'1.)/@/);+MT&.7"2>*2B%"1*6G;BZ@Ng@av6Wh/IY9RgGJmNM}F[|8CO$(527M21KG<[CJ^>KSMVq[~Me}NI`==Q:/G4% | ||
2879 | |||
2880 | '!)!$/) ( $")',,22 < '" ! "+!).&$3!#/) ,"*' 0)C2"HETH0=P+@C/UC,PX2OR=HX8M]E:[;;:AC"$|)%SS#*;J+%'0:@-#//*-"+E-ME3EP5?E/1@632:361B7)HT.HO9@L2AF)LL1IW)SHBU!V-)"!%)!+*&+"*+&#*(*$-3(511, | ||
2881 | ! ! '7(@8BE#:%)5/DD.<S5/TI/BO+A:-50?2%C$,.":')%+1$<:(PH,ae2UqTFkOJEF:B@>;I$HE.Nf9LW9QR>yc8Q€1Td?Fd9:O0DI/<K*DD7MZET^E.[C?>6`Z9W=JVA,O607/&4&.6%)D=)-!&()*ED$PT )=<3!$F0'%&+'%"%$" | ||
2882 | |||
2883 | |||
2884 | |||
2885 | |||
2886 | |||
2887 | |||
2888 | |||
2889 | |||
2890 | |||
2891 | 6'LN8NU?XO)8C, | ||
2892 | ''2 &9#IQ | ||
2893 | |||
2894 | |||
2895 | #+*1<6<?6JYEPW;E<&+IDKBJR!=! "*!#* $(-")!+##$!&!,-1,+-'#2$!+'&.0/"5>,.6&;2/6B+DG#BC&@:+dm6‚‰B‚–>ŠŸ%ˆœsDE<!+*)!+&--(5#K'0WPV`Jgt’g„”ei‚HKo.Na/@N+09 (N:$+*)"&(<H-,>;MN/OX31>@1>F)8C5>3UnEhyKJiHp‹YcŒM(?318F7SHH\.HN+KG(8G.+<<5,+4H.[W:-5&(3?2(04)KD'?)'31$hZ"fPK^Rv.(FJ E5£Y€€…$18hM6.7*=D-;PN<LIjuDVT>\b>¯ÀNÿõGÂ:Rs#18.=-;(46",+8&*".'%2 ).,*D):B&IK23A73?B2_e9agVs‚D<VE4D-@@#/:BOrHw{%6N(17)7-6*0!':?2- /*J=.E=AJ>%<D2K0,'%9 %0#'1&&/)AM7<G,'/-.78,3K,2K7W/5%;%, /!*9/=;DO/SYLUeG3JZLmgRzOEY-9F&FQ*@I'<H$RW1Jb9Rg=LiWUvW5PQ/H>9I77C@>X?4L3AR-IY"KT4C'>N)8G&8D$/?4:$. -4$:D/]p.\X:>)2>'0! //0G?JbDOkJYs5Xc:GaEVn@ObH?\:BP!1>$DK-IT<U_A^j?^gLh}YrX\qCL^88F.)9, | ||
2896 | &&$!#%"% ,&,79"' $'#*)4$#5)O2HJBL&JI)TO6JZ=QUBPS6S`?WYODfDCVK)L;`">_5i=+HK;(6P&&,)%"-"?&,:.)%%!+>(FB,7I8'6:2,390/CC,SI(Vc3Tl6OfAU[0Xg7Sd8Mf3>c;5M;4'&%:+8C&@!1 !.)*!E,BICDDCE&%*! '$=( 281 !""#'#"#'./)8%78(.K31'1$)9#+:;(5<.-*#3)+& &#,.0"#)%?-"DK)=M>KOSC`N[L<<l0/P48D7CG2TO=_c4If9?X=?`Q@PFF]@>4(&.;B83D6K><2RC5CGDE'QM5NmX]_BFf;3A*G:*AC$&C(9,".<;D,A&(?6':6);%%E260 (;!$*!/ ! | ||
2897 | |||
2898 | |||
2899 | |||
2900 | |||
2901 | |||
2902 | |||
2903 | |||
2904 | |||
2905 | 50OP=NTMc\EYy@WZ,DU&'M-1< | ||
2906 | |||
2907 | |||
2908 | |||
2909 | %4CX*6? | ||
2910 | |||
2911 | #-017,9''5*/8(>B 0+*!85?/PL)I]<^_=@J>`O/J3D4#F9 20%J8XW*2 *"(+/)"(#&$&((0++%2/- !*%%<",-18-7cT4Mc:]u[cyn^noDe{0[l->%D58M+&'.%-NiZ{:?"#%™l0’‡<S[u¤‚yy\{ˆAw‚7D\39H+$5'$'(.:9018!CI3CU81;"((&'2%)?)=I?VLO\kA_t^c‰O@d",>&,<2-?@J\;=P8H@)PN'Yb/0J &-,%FA)"66%E0\6!l>$Z2NG,‡¢ZmÈQMnBE\?<T 4)+1/,K[[¢™UɧH~'[lCAY%073A?.±ƒ8Œ‘Vwž9ZlEov~Da¢4q['+4;D*5#-@&),!+*&("-"#')#,774AECV]$Vc$LH@\nHLmbMpOyr-QV2Vg.Pf;g}ra’H<L#5D5A >K 9==A,5BD%NP4$7"&$)-/./:4*)%) %(2,9-9),615C CC!7E"9E+6&.!!)!!)&,A<AVF4MSk‡Bed44HM3MJ2A56I-M\3[p0eh1\j8YwDyŽFbv:;H61>(3=-AL3_b0J_1/:+;E:Jb<\n3_p0V`1<H)6D&7A#.>;A3A*EM7Ke=Sj%<;)&!,!)>0,@9,@=.KF\p54?6*ICW|=^d4L]'GO*GW2=T4<UGD`JQaLWs\]uLOe:>S+0=%%3-( $(% #!"! !"!#)1# | ||
2912 | #+*;/23+6*-I.HLVR-[b2Kb;GU9HYAMULPR7NSF;ZD9LG:B>598c)IC‡:8UVD<FJ7%*<'*!! $#1/(*0(#)9+#//.&:7 K?%UQ+Tk>Ij?[WHZh=Jl<NbGJ\AYZAFc49N.2;B89Q'-F*$9!&-,(1/2?<E4EK7<P.4L=(8&*5"1% (#0.3-691A2,>--2%0+''(3-(3+!&#)))$/46,%''!!.'* $.%03#=##1/3A64K.2*,14.19 7A+ND5=Z4DJACN4CRA,A515&V6+T\1\h?AhJF:500.L+:939918,K:!OM+T^,+R;<8(QG)Q\;[eAZk?9\NCA>GS-GU:9L?H4!4[*"81$2-%%(&& !# ' !) | ||
2913 | |||
2914 | |||
2915 | *!67;9@EBFH6ETC>C=QE;P<),)$ | ||
2916 | |||
2917 | %.+O:4%> 3.91 ';-(+! )!"*)J=EO3ZX0Lf?W_L3>F[dB]m@cz6^j8jx8;b,$!ZZHcp.G^8' +A:"91$02"%#!!)2/#.$&,(%!)$09#,?C/9BJIOKPS5US@E)$:+G\EQ*"0`M6`€3Mg(.%0J0]uYb}jBZ>…ƒ‡}’lgxpijR~=Un1=F 1B@=BI$7=,.B%3C01;88?+6D*<'3&4:*AB8?VFB]Lx‡L^o,?T!."X@(*E@4,6G<E_E<YICc(3=" "$/-$6$$kA2OB5QD1¯AG_hJO[7Z77:,L;.]| A7 MM8¬”€¼ÿŒ]Ÿcjs;[e-@5,UeCLŽqJoTVfX¦E«·D_|64K/FN4B(8E#,7'DN 7L8:%/) '"*#-)CN:U_HNlBuˆG]hLKV8JNXInSwHQz@XtB=Tc4FQ<L&=F%5A)2G+CU&@N,&;'=D313%(&/"+*+$*$ +'%$#- %2%)0$*2"(-'@Q,>P(7O(8E%-<'8"*$##/",14?)8;#Hf1S2$5)&3'(7.6E1Wq:]pRq”Gd~ChyP_OcwA^s0gi2r|7~ŒBw‘B\q(4B*RZ.&<?>TFQpIUm;]f.CM#2C(DV/M_)[^/PS3=N<AT/"-!& #."%0'$)9+D6`q'764$?GMp7FY.5K.(91+E6Yg;T_<=SD7VD>TDAT5;N')9.) -'"# $ | ||
2918 | "# #$%'* +$1/0 35!/;)19;77D IA7PU6OcDUX?Gb=MRAMT;AXB>UE7H:B;085/E$!24&‡)=i\9:N[*)27#"!&'( .$5*"$%.("2,0716"8?+>L.FRGQ^CC\68e=3OKHD;G\@CVACZ<BZ=IS0LR*?\-3N58?*/?!+8#47, C:->V/@P?@L9.J358,/A4.#,*;0?@/D*#<4$27$0#.1"24$.8 (;$%8'.1&%/!)1)%4,( ,#'/)-&./.#$(A4&A#7.1@$B6/(J$ 2#'$&+'6D)&FC+-6?@+LN4:W4:E"SK Gm@;YIEIB5O20"&2'$UC)<P.BJ3IT>=XI@IC37"2F+<G=>IG5NNGBGFQ4KT8P]@LY;BP1<M24B'=> *49 "$,% | ||
2919 | |||
2920 | |||
2921 | |||
2922 | |||
2923 | " :<+9*=;04C61;7<B88>48V=(/&#*"3 | ||
2924 | |||
2925 | |||
2926 | +.#16)&.,),3+2&(%(87:=DNUH@SQSJ@7Q2FE?D[UWfY_cPOcX}…I\iNeBM4ZXVdpLSu-7E-38F]9IZ1LT,LP"NM4A!#-", )$'330>%*&$,!2,$.=62<=(=5!#:*$!8O>g-4QF3:37A#6`>=XTOW;Qf*7X!L^6}©Z\rL‰ HD°cn¢w~z]…e™›Rx‰G„š-at#BL2NP7LS0<H(5<*08+AI1;N1#1#)*!C9*EZ1Mg6=H6al]s‡MIq0S`M?'&16E"4%<SW)-C %!*#<4 kB9ƒt5w?T•ŒU@8@>BJ-*:.%|~>B`>01"9FA.K‚3S{1@OsoD·™E“Ô;d—D"2:;;?‘Æ^a˜Lnc_96<+0K70I+#,!'-1E> 6..3'1A$*-$"/4:FGEMWCG\iI]N9R<0AC:GAZ{LF\LD`@?V09N%9E+9A&29%$0*EV=>N* *"&/ #&,)3'/%.'3(.*"& ,#/'0#(''8D2CU/=P'-A'#5!"/#+'(30#1?#$)#$8%1''0'/!'/',74@WG]yI\yYSzOTrFPlOg„Mf„LcT_‚UVW_€Oh‡8ft6]i/*2)-59+@A4IHA^CL\.?G1DS:HXBXw8`v.NW4OX"43# -""0+P8_s%<:7,F<MY,;=*2!'543T;:Q47I-4E55L:3K2T](ML*0)$ !&$(+"+&! | ||
2927 | &3%'$%0-1*-4#2<"3B'>9)<I.JW@AVBBUAFOAHT8HVA:RB3G455-B0.G)#50+y')aR38Nd')>%'/"$% !$ '%"#'$$$(#*/*#!/'('%<7/JP5,U9.9;(6859.:A:<J::K55L8:I79R2;T9KG;BQ.6[3-D.0/#A8.Q(#CA!79(0:25;8A.:@-/C*-4 D;!=J2B 7C<E57D;(<:(.' /#8% /=!"3)",*%#")!"-#,+"+6+2#/%*&&3(2"%-"+0+%!!$%/*3=2+<">*,9C" A1!'%#/",&+5* 6B$6L-7N8>;/@K)8E=24739..C/MB)LGAJSI-=[B;>60B63?=-?:2<.C5.ID-/C::8<>;0AI9CO?5MA8GC-E<)@5&>/&3+*5."*"! | ||
2928 | " | ||
2929 | |||
2930 | |||
2931 | |||
2932 | |||
2933 | |||
2934 | |||
2935 | |||
2936 | |||
2937 | 3 06*9'9.,MG(T]8DS3=E0%>40>4(3+&""" | ||
2938 | #10%.)" 1,/ +1'$00$!#%2.FT+OG.JMFCR73741YD2301A?DHL%1W<>6-VQm]\oQYa8PoEPFY]icSiDNJ(7=1;:4Q@FKASZFS^FGP-LR$>R*!)0' 5(.030B!-5,-3-JB&KGFLRP#NSTP5ZdCTO5IO#0-,<=<SR:8Y@?JIF@24D@N\uRfSƒdiq}ZEIfŠ¥b|›{‹€‡‘`ˆªrp‘K`}6P\<GT>>M5BJ.IH)+50->0064?:=+(51.C<FL1jaNWr^Ea4 72!"" #&<GE(73/,G:)’Op’th…’nud}¢188#EJ#Je/=fa2>-¢V)¾£):9*+.*A>0Å”vÿÿ{y‚Z=85-238.;QVAHN3?O6TBHL$/*+9>(3>,/ '+&)$$2)#!""'()&)(1(>;5EZ:IWJ8Q?7L0)2)/92)E=4H6.K0);('6"HP(EM'<O+/$@I8.E#!,.-#%15-8 -')*',#- *'2,7',;/1D.:L(+6&1#+'"+!$ 1 &3?H)1#1@)AM?F_>I`B9N9-@;2HAKlTIhMQpP[lEQeITkQb}Lo„?G],*.!#.&$'*5/)>COm7IV,DT6FW>IbGXn:Pb:\m*KK68 0=Mk-KY .406N-8B/9#/#*(!0*)>%5H)1G+2A4;O6^o!IL#$" $#" '$)', , # '& )*(+91 1= .;#69&=C*CB2<P3>K@AF=KJ8JU;>XD4J;481A(*Q*97+X*(H<+3<X+$3%# "'"&/$1&!/<67F2%G9#0.!+"%($'0&38'.A-8=,=='?F-HC1TR(J_A=UO2J-,9'/8')=43A(%$*$* "*"#4+'76?3+AC&>O46O=6D88?35E4%=84.%3;59/=+#6%* %"!)*$0# . "$"+##*".1.%2$++."3+J>(JJ*5N*8.'&"-)&8.C=DOUO%JZ+@O)1O$.>-J?/9T./7!';!T6$Wd2/`>/35#8= "/30+"67'27)<?%&8/018!-" ))+5:1;;#40 $),(!*%8-14355!"# | ||
2939 | |||
2940 | |||
2941 | |||
2942 | |||
2943 | |||
2944 | |||
2945 | .HA,8C&9/ AK8=?HDMK@P84E0?''-8""$4-"*% | ||
2946 | >2 | ||
2947 | 50 / ) | ||
2948 | /*>8 JAFa06#0$ #0/,*&-!'(!&,#1/#YHOO)0)%8/?IPF;C?5D@R\-Sh7WN#aT0@4.*?$ H/DQTOO]P>\P$2.D2TOWV8QK=44$9$ ")C;7R`HJWIL]AAL=EE12C".).9 & (1/!;B--4)C<'OT??ZASd=Q]@P^I^mBmuT]eEhi>Tf.=S3Y`HW’=`j/Wc2HV*;A4OZ?\€VPhfŽ“9vs„Œj”ƒeqpp™ty ^NvMGM<7L7ES6:O3@U05H%+<(59!!-$:2#DIIO&^c<TpP6hFBZ4&.!!YKDS5I$#%' #&&*.=:=@)UOMH9`ƒv_q]qzXejmFMbQ6(I>,$85)401@&¶•W½¡až':Y"*66BR¤XÉNI4F'#."&5*627IX7oX+kX4„q7{{2705)00675@&,!#*!+&+"-5 %21$42<S6"*/+6'0=<K$6@".7%"7!.?LS"EN1GX0PP BK">G+26-99D+0#-1;F2@%9Q8:"%(!.% ,#1)4%3B*BI'1@$.'2(*&$!(%2$,A(,;!6B(:I,1H5-B/'G,DR(2E3AR;?[DQlFo„Ajz=XkF^xPx‘AV^$(-(4&40,H;Zg1DW/=P4RiAZi?QgCZk7Yk,AO76 | ||
2949 | |||
2950 | %-?W:D^(AN->G+.9 9G)/%"+ *:';J$8H*0A,/@:6P=U`&,")&&'%" "'!%" ))""#$!&&""!&%%)")( " "##''.2%>$(1#/5$36';B,8F1.F89>08C1;E99F:>9<3>+H &[0">;/A./C/+B2IG)0,+$ | ||
2951 | % &) !%'2*).#'!%& )*"++#0.'98$@F0KH1BX41WKB@ICR8=M-:E51B)%63.+0 #"%1& 4<&:CC5FC-@8-=- =/4332?!-=(6-*&&+"#)"#*) #%!.)+2-/*.!4-/999$#>+&*%A2$HI21H:C3%2@"C#&/*):7-@I35M?3>4%85-$$+,=2%4+.-S<3Y=!3H''#1 !(71+9$19*2<(1932.-;!** %1/#"$9/0E'+8"..&$--'1+ ). | ||
2952 | +& ") | ||
2953 | |||
2954 | |||
2955 | |||
2956 | |||
2957 | |||
2958 | |||
2959 | |||
2960 | |||
2961 | |||
2962 | |||
2963 | # '8!=(@)E81AR2NR?4L:'35&'!2:10/LDWa#@D"oW)d}5bk,Xf"`i(cg2_^,;ID64&&"'$),@J4J&*'0 (6"<f;QZTQs;l~Hf)5CI5?-dR2lcMy‡Iy}Bx…Paˆ=[j8>X,'2'$VX<YcJDTDVW$O]2DPI5D>076)H,*(,+ISHScBGXB?P>KM95M//@&) ,9##0*.:;"UF27?/&@-&0@*7?46DQcO\lKNlL<Y\?cQBINQTIcb;cZMORZLBW9YFPL5<B-&,A.<]aeH^_fvtd‰tŽ›pg~XzwiiDrG9H65N/8C4DN3NW38X+'L#*E(,@82(ER2Rc<0KH0O@*32>B2@S9/a|FJd:@D(4?LW4=OS9+ IF5MS3^n>}—8aiPqvPjwoG…WTX>U‡H_†6;D#3!/7*VgŠR¤z\ba±³,¯¬'ZqFQvZ¥Ÿ<¢’'M>&."96$PLS’À]kŒFkƒQ`^:t{$ˆu'…… rP à™'pE*Nm9957""$,)#$("(## "($&0/<4:Z$?N/61<&+?(:C0WW5Uk8ux,mp.}u&Yd#AP(>H5=:?'@P,?T(5H(8L"+$'!! -!%5&?N(KT?H1>#/) !(!*$,8"4A)(;$,*&*-(9,;I-Ym1Sh:KhENtMeItDJhP^‚LWn(>I$("%%0!6AKz—?tƒ6\d3L_AVh@]lEfzCg}5]l+RYB>/- 02 /.%,%4D6;K*;N09C(9D)K_"LQ-4.8)5.;N/FO.H\)>D0<G::M3)&/ .-+0-#/!//,'&#$ ($&$&#(#!#%)()!) %! !#" &*&"( (%.($04*(8543'7>,1@04>73:0%=/?%F-046;'6;**--;.#0!$+"# !#! #$*"!'#)-!,&&)+10%H?.CS6AW=1KK=A8+J7;=:AD;5G.1B58@+/A.)6)(12*%<11H%'A7(74"42,/!)&&*$5'!6''$',&' ,#"'$.#'&"+.$317C*4C.9A0A)@%6IEG.-E8,8(#7+4& 2;52<,%B04.-#5'"**(+#B(KM:W@28*6;-""% E5 =X*+B((0&M0&1R*'<%8!%$( | ||
2964 | +(+1 *&# )#($"$ $ | ||
2965 | |||
2966 | |||
2967 | |||
2968 | -$'- | ||
2969 | (+ | ||
2970 | !* | ||
2971 | |||
2972 | |||
2973 | |||
2974 | (&-.1(5859H=>B@;@,;A 4>)E<)^Q-_mDPhA6TD6T`>[M7\O^[Q\|T@VNdsHh}3Yo &%%)$*!3069,+ $<$!#.'".,)@).H=H\IV2HL,bXA^€Sr‰rW…f<PVnzVPPIVV6wrfq XŠ@„nSkfEFVJ5OPTWKEF=?5,WC,76(4!*.87BHPK?EV9]^DWK9SU*BW'-3$<0yE‡r.‡8xš72B+/286!TN'beHTbF:PH6/+DP?<T7lcJ‹š]nxVmaL~;nh3Je?.N21!D5$R_IfhCz…b‡™}YžolyWs†]GzJ/B?1>,67)7A./C5.F6 5)'# <8CDC8(5A:;F?,A)(,##,Of.bw4Nh-E\ITg::G.gR&‘2gd&Wb5m%m`6]YDWcSNZkSeHI_]t€PqkF’A‹ŠJHLE@T-=B @H-%2M4=J%*?LZ‰^Åc+60FWB<jwFyhbœ.@e+.67=mdo[g?œ“AyP?¿ªUž¥cÿÿfØâM—›tl‡8?S7LY*<T%(<""%).$-.'+$*,*.-,28L"0N5FW"?K3EDC$Ta5\r>_mH|P|“PpF[}43D-6D)MT$27<I+JY-@R$,;)HW$=B+-#!&040/.3*4F5Gc3Qd*CP &0&&$ !#*#/!.8#+50757>E W].\f:`z:Sp9Wo9J_FMkYh‡=L\>H]IQh3=I"/?%,66AF)SZCr‹[_‡If?]u;\mCXsNjS”JXq:Pm2P`7H%JV!7>'*&'.?+4E7Yf1\_*V`0Vp:O^%1A =G 5=,)6- 7:/I:JV/;K:EW<D+D&I%A#A#@#E*F)H)G*B):':!80'" ! #$$! | ||
2975 | |||
2976 | #""#$ !#$)*-3%.5%+3$,7''3)01&#+(.!$# /4(6"'"/$ | ||
2977 | # $)#%+&(#'(("+'./(0#/&#>(9B&?D;9L75O@.@.:7#$1*/*">80.6-5/+6.321&@!$4$("'--5'6;05>&+;&'-#)-!,3"1$',$!++!"#"%'*&*(,/-(7/3+$!$$*3#14)0=.0' ",! 6.$4'"+'+"%*-70951;./5F)5<C/C/3&%(>&!C4%2-%26@9&+ ! '%(5)7. 0%/0.<EGBB >16033$) | ||
2978 | |||
2979 | |||
2980 | |||
2981 | "=-0<!.("! | ||
2982 | ?0!'=&0<25=71:7>34bW/de1]hCYob^nQSlE=-09-3?6->47MY`vFLPGY`_gwPVr*41$7@ .2'@ '#+(*; =<+HP3Hd=CWEKfT@M\FP]WT,eaPi[HZ„LŽhvŒmhylk€ax„\It@XE;{S]ƒ8L„6\xE{•6Qo/;/\K&p{@f=l€GBhI9_J2H;wp(el5…„W„ªmŒ½v—¾r–½FPi+FB-O\AO[LXYC_a:ee.efAzp;ƒ•T‡—w©¢kfnYmxg5VZ&1?9%)5*B=0ZXDo‚Lm}^n{pQx]eyXenW7_@3<(0A *3#*3),9#(3+'14786/EE:2\0@@;)!#0+@IDG1OjC=^8AM0ciAtŸ.SpObpw\yK®¶D©¶Oƒ¡N‹ŠO}qMOsB^o>z—>^rvZˆc”¦Œb|tLb/IE7Tb8O[2?M"7A)`LJV9“‡GCX;B+'7$""-4/:B,)40<3@dJhjF_a‹ÂX¶óoK`oUl¬k¬vNiV>O82A+DP8<A.AR#9K.9)083.')#)"P^"_j?G?N%<SAPr'?V"?K2ZfA`pD_rU~‚^{–X…™X‡šAr|0ao,mm0bl'oz.[p7[b&=S08O;0I-$? #*19E$<M-=R'8"5,"4>J_<=T" ,(&"! | ||
2983 | ,%0"'5&)<%BO'Yf-Yq2Gd=[tF~D\hLT~8e|9\hL\rDL_2Ga?F\9?G'8L%NT+cq9}}=s}K\tK8M@2QBd~Gz’E—T˜a… MGa@=R>C_(2@'3D,)/ 14&,=%2B;FfCWt>[rCXnBiy-NW0<F)+9&'1$#.10@DAN1>L5/F5›F(—C.“D)šD)’E*“F+žE,›C, F*¦J-¢H0™H/”F/œ=%A$>&q<g0 X.G+6%.'! " | ||
2984 | |||
2985 | |||
2986 | |||
2987 | "#$!(' #%# '&/226(*4&&-)$3(+)).$% 57 -! " # 36/39#&5"(30"$'%'/#5().!7*(;+/)&60"67!0C+-%* $%13%%9!#1&3' ('+''%#&,(-"+.(1>'#?+.!%,'&*(27/8"!2"$!'!("# 4A<!4@+8!8;#F.2 :;"9+0/$ %%%%'$ !,*,5325B!!.))4!7+%# %)".%' | ||
2988 | "!!(:@-6L836& #,"68 163#@?/F+-6.13'8" | ||
2989 | |||
2990 | ,5)/<4*(, +& 81" | ||
2991 | |||
2992 | |||
2993 | !3E$>G2.8-)4+#:/B!jZ;jsVVvTMoXCBOIKX9N=#%+/+#+REJNpBCTAjN^Ap^(@'$1-$=:06>*)21)/" 2,54 ;O--N=/B;6I.2ND&7,+32VVASoK@GAY]^n|jryynhhxlZpb^kRFxFE{b.6T>OQZXA[xpuuQkl0`^E`obk{f>]/JD.;1`P*WZQˆ}\QŒn[x6R~/KEEwWŠMGQ:\a=LtPedQq~WynY„‘_™cnst…—rf‡]pQIUYA=<A2&*!42%dQ7P[GRLWWl[njT&<E*8N&5T=F-,A%+:+1>".8"(%-//9!,'8;/FM0.670?1*3;2<J&\`5HY1H`:go0Th/V\F~{V”¶@¡¯O…–IáÀ•–’–Äl•Öq~®jbk>~ƒM¿Àj|ŠS†jdpQ‰dAPuU8NUH\rP3M<83+II.h€E2Q=GZcNe306+,8&+!( /:$(0F8$#<3+/<%,I+e&9^*I/K<;:F0D4/;+:?,=J55A&WY.LM+<C%% ,5"6?-.32HU83I6Xp):O&8I;kyJ™*sv8v…BŠ‹@l„G]w_|‰\tb~™]u›HbyD{‰AkRz¥Lv“Al5``,4J+0='")% "%)".'4$9K1;K5FO''4 (4+$$476L %-$&"! $)#&+'?9A^Hg„@||HcuTa‡e}ƒNTfH`|]pTp‹Pmy9M_?Ha@Q_/Xd<SmHd~_† _‰¨Oq‚8Vc1jzD‘] ¹cŒºb—Ác‘¡Edn6y€.RZ.MV+BO)MUJF>=6B$CS%EG/1F=;]BBaAH`EGgEfx5@M'+/$%$189R=N]3H\3ˆKEEKMDŽJC„KE‰IBMCJF”CDKH›IHšOL›SLŸNEœXGŸNKšPIœMA E8H:’E3‡C+n;,Y8$N1@/1*&%&$$! | ||
2994 | #!!('"!" #&"$'$'% )%'(!-//"364!+$' #'"'"* "#" "!".).4(/7(+3(-8!/60618/2$/-%50$#)# $!"'"!%!8#A&$ % %*/$("*1#1% # /"-6$)3,&0*($"!!&"&"!(;)D<>K$BI72D)F=''M6,6"=1$<':)&C$),&'!$&"%).2)(%7%+ ) "! !% | ||
2995 | 3&-+*+ ;+GA*2E19' % | ||
2996 | |||
2997 | |||
2998 | -1*-2$12M7IHXOKP%!;%) <-&.<*#1-*,#+7+-"CHDKb^MX^WZJci9]l8irG^l$<D(,*$ 0:MSO5@c;8CU09(2=*D@/G),<-$/(1&%XQnc]R-,,6/$5-:2!<J("I.$8":,mKB€ŒPou&V[FHZbwpfpqki][sb7RKOLJE\O/>/2/8@EUhVx“MH`Kp@;bˆT!`^1L/2/fX+CD9…aKuœsVvZUPGm|.@M,YQ5uŠQd˜9K`J]qKlFer^hŠah|qƒjpdpyFT\GQLGIDLK2FA1HE<:&UOGG>8WRA_dMj^H"7&/$"*%13,8'-; )8$-;%0"'+4"*3A;+4T5)2%55*+B*=G'Ub.GmG'C8(24kkPÎA[Š;s|\‹›wyˆ¬‚ÖÿãS‡¸®€¢×|¢™a¥£`r™rj˜¡ct©n‹—B{’=…ŠYS`L3?M/0%08(56707B0<,66BDH7DP&GS+¥ r >C,fb$@K)?961(+),,5.,,036E0/0&53%GH-EU)SG-EF2lg4DM25+'%+*DC;:$.?/4@(:T=et/ƒ5¥Y•³Y†¬LršWs˜Rf}Dl†Ic‰W~–R{’[tœNk‹K_zEƒ‡R`~S|’Z†¦Kr–71H%$8"(')&. '$!+$?F6JY1AV-%2(('/%HP:@!, '"*%! $.<RJ]xYh‰Rh†R]s]^sEg{IXf_Uu`Lrcl†Ll7^j=]sCRiDQ_Km‰Ysˆc‹¶]¨KŠ¢FޝhŽÃt±ØwŸ¸q Ã|½Ê]’¦W”¼Iƒ—?h{5`sA`}Lg{@dt/SY-GX0?S+[\-7F21=/,=14IJe?HX"69 &# */->A<U7Mf<J+>L-@K-@J/>J*BP)EM0DK,EO*BS,AW/BU2GT0GV1IZ2C\/JZ-MZ1Ef3Bd5@a4B^6Dg5Cb69^44^3.J/*2)),'$$! | ||
2999 | #!)&$"! (&%('(&'+,#/ +4/#(% "*)%0#.$'$, *#&*#&.&- ,/*&*4#%4#31"5<'=#*2$0-+50&#!$ (',:(!9'!!$!!-$ ")*'# &!+ $/ #7-/5=5&8640'D>89C!<?J.#"%#0&1! %&;'@>N:@D63>% % | ||
3000 | |||
3001 | 83 $D/NQ;W7FDA?- | ||
3002 | |||
3003 | |||
3004 | >#$JB*DT-GU=OVDSYJSaA-D ).' | ||
3005 | #%(;.$5))($,)*1**:&,493-P9KQD=EU6QO,NP0AC`(!:(32R61ABA*9"?8&2<#10!\[.0@4 S83lmZa}aDj:%8!-49+86(7)D>8I!$2<'=k;Wa_uR>a;MbN_qff|i^XN{AQR;KQF5X2.; )5+076=LZlsBmn5Msd*2%9+tKsƒ9W[<:gRicdnxRj’GV\[jF3N@EI^P‘iPpAhzN|ycxg~†nztjsYkkSXLBH?52<9<D1P?0KM+*7)=G.HZ?DH.NOCXqGZfD%0"*(06(3#-/4")>%2#'GH?O**:)-4"'0)9=#&0$@)5/>+gRC–²nŸV‡ŸVu•k]m‚±†¡¯Æ¼ÅP—Ÿ‘•¦›•¶¦†ÐŸŠWc}MRhTUcw_‚e€ fušYJa;LJ)@@&B@K7"?C 87'/9'KL2–}.°¦L…Úk»™e©¥?òµ9l€(Z|9`‡/Og ;H$,/6>"/?&&--N6>B(,7,A7.o_0VY0K]CVZ*J=K?',# 16 , ".&-=')53G_O>XSZ‚`|£dc}Ku‹M~—Q{˜I{ŒOk…OmOpOg„U†œPŸ¤SÉß^ÁßQ¸Üd›Í]€ŽF€’"]W"*18DE.;-5TU$ho4E^0?M%&0*-RP_]*8V,5,7*)4%,!+# #*4AQoSWoSVrAXzGYq<G_DRlA_wGTg`k„`sŽMhƒ?RnBN_Ng‡Y‰`€™kˆ¯r‡±hˆ°l‡¯w‹°€…»{“¸v‚«}q•pXƒbV‚^KuS\€T_{[pƒha€\JiBOf=KS21F2G_6[d$4>/7*>QB[}C\i*S[DK8@26,:K9BQ@J]L, /$.%-&/)3'2-4,4);'5,:,:-7)6,=1>-D/D-D$/B%0E&/D4; 5H 4H#4<'3.!',""'$')% ($.!*!) ! ##"'((,'4,&#'(- +$*,061&D"*-+34*9/132'<-3*. $/ &, +6 15*? 5."& %/ 0)+"(/$-',+/-9"9-1) ""% #'# | ||
3006 | ! 5$+3& !'1-0)"6A&(=0-.*.4+1"& C%?L?L+I=+;W@A; & $$$" | ||
3007 | |||
3008 | (;-) '&+!!,;'B-.##%1$ ;<0D<4?&/-!D9 2 | ||
3009 | =- | ||
3010 | F8>H 7A1)()2-H8 DA0 <@JB%LHMKG?SE=G@H4 | ||
3011 | |||
3012 | |||
3013 | +8,$( # '%5&'8($2*! (2-.(,?250,".2XW>.I(J?'9J-*;$0A4CI;.#1B!(Z4A$(4-#=,!+ &45:!bb1t”)njEM)DQE=ED)@12@D[rI;LQ|^ESt>7T@JY:2Q-++<80E%9BC_`_\ƒPBV&|U#®µT¢²u/‹O%1@MGM`pklknŽG~‘gz{=as/npSYmJ`SSpkhq†znvq£c²cŠ“]BQFIE97A)'/-2324A9<;$=J*5A81D2HM1PZDFdD;H$/ & &+0&)/!,"(A:81KP42I.+;*"0< ,:+>; !05.`JU‰“w{œxpad¢N[q]Us‹[‘²{†j‹b€…ˆ„„Öúyv·O>T?LX<[lNZoRpwcb˜MNrB?nAN|;S‚Dp-ai$:@&žv?¯´käÛ{q•YYu]¸“•Éÿ|Â8Cb?GbIOo3=[0'G>A*6?!-+!6E/CI$23bE2_L4BF9JQ1@B4PF$73"99+&-19 *3-";I6_q3vŠFs“Xy¢NŒ¤S‹¨[Šª_†¯aްQ„¦Wu•M^€L|ži´~Ãü‹ÏÿƒªÙygn}£^޲[Â2†!gs(p€+dl#Vc-k{D<ZB/@AH[/\g$fk0Ht7'=*! +;)(74@'0%'#2/D@AZ:G]M^ƒJt”=Xg>m€Nu–Lf{L]~_hŠWm„S„žN”žY–n‘¶fu™ft¡rr¤qx¨qx‘d[_7_hU~fQfXEWF)<A.F=2PHI`OVoSc|XPtLFQEBW?@\,<B-.;ANh0GO$MW,CSANdFJ_=Tl5Ue/K[+QZ)AP;:RAH\F | ||
3014 | "--'1%"."," + -...( ,#*$)",&'' *"" # &*##""%#.) ( | ||
3015 | $!!((*0!. .&!#*!&,-" $-0(<*8-/3!618<"(E(02%+=&80 .('%%.,217/<(<#-2)%6-%'**$-2!$4,$ %*0&'" | ||
3016 | *!+$"!- &( 1*2!," 4+ 580M8!)<"(" &)'+.%%-40-?<20CB /6%(/2,.. | ||
3017 | (*-&++) " .2CQJNK4T+./$! | ||
3018 | , ?6>GIK,9I44B;KK;=S,-=", #" #"5,19BLR7QG9Qd6:K"6 NDX[(Ta.!@ ""34+;,.$"!'$ 9(5"5-9'?=5MX5=F$2G4%:!(2=I*1' J>&3*""4):5Ef/KU2GD-E:1>+$=$69C::HN.>RS<B819181,;@3+&+ !"D1HS{Z?VJO`1B[^ŽˆV†X9I481GMQhwdMj_Q[g|¡g{¡Nh‡m}‹Wˆ”Kœ²lˆ§dR`Qgxtˆ‡‡‹s~ho:LV3CI)H0/2*5(A=+JK/@K%/;*E8,KR;<\7GJ1$<)(*5(. !*!145%.<$G[,CJ&*: ,148+NA&6);61@;)Œ_&”©O¦k{˜]‡—p’¥Yÿÿ|o‹Sl…Hf„WckgV~]Rcac~”s®¹¿àh›9bv?]ƒK[uAdu\K[V=K>IG98=B5=G>FVEORH]*=BYSxw‡ƒt`Cyg:gT}AY—TkL-P*"8&0".((#)):5)2<;&2*)45'O8;>73HC&G:(43%57*\>J<?4JB&M^+-=3/*41_uC{šQX~JFcR_‡g•ªi¢Ínµp|§i{©ZlIWyGBkYTqi{¦Š”·…u¡doL^}_‚›YNo[W€J\„Iy”R‰”B~‰?Qo>:H(@N0}‹>Sm5,C8&&#'9$-#%5@(2= " %-/DR8Wl:XbT`zLZzJIs`Qt[QrJ?\_a[›aˆª^„µj¯hj—hdŠJPugqšivœRBdA4@2.8;/AME]EGZ0HQ.TZ(DE5LXDHhJSmQLiKcyA_fCfr6kn.QW,;G8E]*5K+9J48H:AM:EUCH^6M^=G]8M_22C<2FI! | ||
3019 | |||
3020 | |||
3021 | |||
3022 | |||
3023 | ' | ||
3024 | ,)-,54.-")'&%-(&!* )"$) $ $$$ %# "#"#"#!"&#!"$##*4%;1'0& '$+!%% !$(&*!"2 +/+91<((@2+2(,7")2-+2$*509.<.8*= #3)"/!-%" #&%&'&/#"0$("&0!+ +*$# "&$&0-& | ||
3025 | |||
3026 | &#% ,(.6'9:(/E3*7(& | ||
3027 | &%&,#$ !'$$ " | ||
3028 | /3,6@)57%8 -&+ ",$,#3/!#. | ||
3029 | + E:SR*_MDOIL62D>52C6+#F4DE 9:-2 | ||
3030 | |||
3031 | '')22+,7#A> -E6->J?6E3+7#$ * =\V2XcG`cIEaA?Y(=J!MP`c6bkKKoUIU>';$:* !&!, | ||
3032 | @-&*=&.L^CMV05G.#=$(01/$#'/ A.*0#5+ $"(""/'.'.?@#8J&BB2?S/DS2NM"eY,ib!6I#.kW[@>9JJN=i471C=a^;X-4F"9>;LgN7S88F*cUdFkP~zN\zj^baaƒuŒ€q”@-GK/:uniWoVtv@3::?8 1"70%BN,M^3GQ*/5'23(3=69W8!90 !)-$-',+; !=F"SX(^@3>a-JH!'4$*-(>60C>%SR.=8&sL)‘™b™¾Ñøt§ÏerœjMg’m—ÿ·ÜT|œ`p¡\RV}I]`H_cW]vmi¥YŸq[hI”¸Bvx>pwC`iAjd/øÈ/vv*\j'a]-9A<Z_:3Ž™Lÿ¼i¥¶^ެZDm;%9-'?+! "*8H8v‚&qˆ64AMAEO wV$‹M5 l+ra/6?&%/<6 H8,JF"1712:6E*1@#4@JJ$HX=>XJe€:zƒ.qƒRˆ®kжhl“Zm‘V`€N_z83Q++C-6LEm]m”sYƒRkŽCB_E`„N†Ÿ=z‹FzˆO`†[‰«W}•Dl.P\$/G6KlOWw+8F#-&#,+'+ +/D $/E5.A51GA@YI1KB(=@*<<7K5.COJ`X\}^\{ejeošSc|JTyH^sN[|SMuGHX-GR)H\-6:>=HPXpE_oAWu@s4Sa9OgBD\HKe\b~enbe‚Ye}>]}7n5Ur1Wc5dt2wo2J]7Qf<JW<?T;=T:>X:AR50:;" | ||
3033 | ")),0143#,3",( .' .(#%'%( ! %%$ & '$" !'$'"% "'!&##! !%#"(!."'"'%#+(7-E$82#4(&,#4!- )$!'%"$$'#$ .&-&"0($/,58:!@> 9H$+D(3=/?"%>' 4&,#*#!$%'"(#++&*(!$/% %1*$ %" % ) | ||
3034 | )&-0 : $()'4) .&- ! 2* .@'3#,'-" | ||
3035 | !1.036F7D,4=09?/AF0/A4)%4SJ#KY-E8-4 | ||
3036 | $ ""/+$8993G@DH6+@78C?-$G/#>S/%@6??04I/:$ 5B1>>6<$/5"3("&-3 ,:=<:<5;/8<1B$, | ||
3037 | $ 5GH?B]PUSI]iQXfIZe;\l>]_M_mV8g[!B>/76%+#! $$3.<*(!!>;92/J@<=JG=O23 76! * | ||
3038 | 0&$5'($'&)!(*/%,3367FW<FU:8F>P_[e~hCk3>M/4J'4-E-FS83TH>D"39,8E:9Y$5:'PK75D80-)4DLK:kyai‡bhfF“—\Œ™XmllDb#4<$GXJ3:a]zgHu07D1./ <>-@@72=B2A2+1**+=&.@0('"-2X1L= 9A*"#?1'DL;+T/>I.¬†<€¯$˜}+g3?Z4I]1\O,|yVy™pWFb–†¨–ÂsŸjh„BBGpS]¢Q…XeZ`lkLlCl|O^mPNmE:V_QMKfoLoŽ}~´Uv•SoˆG[sn§ÇÛl¾Wo‡DhlJ{š(‚z=suu«È}±µ€¡zTy`*@/3;!)*PC26,.;;DKb`.LP81.Sk8ON7dVPŠTu\YyyH]h%P>+/%F2&E@(58$8G!)/(0:'9D*O^,L_-Jc+MjHg•L¥ÊU¨¿i‹²UTrM…œL„›C˜4BR+>#40?PVXqL8SBjBu0^vS…¦\¨ËZy¡JXu]•¹hš¶X|œH=\(#1$"3:0S:N`!RZ+2,6"(%0 ' % '!#*7PL;F.<)$++.,&(/#'1$/=)6@6QjCg„GO]PGl\o]w˜JsTtŒEg~Bk|6F\1I^9R`-4:2ENGYqVe‡DNb[mRm‘>lƒIxˆDexT\xhi^l‰XkŠJ˜Io‡Dc‡D{‘Bf‡Hc~93E?DZAL\0:C2<R<Oa<O^6EJ2 | ||
3039 | |||
3040 | |||
3041 | &'1-+3!'(&.(#4,.0%-#+#$%"(%(&(#%"( (! %!!' !#$$&"#"&!&*#!$$+'+,2%.'/#2-+9*>'6,)/&'+00"&$( !''$!%)%,4157:-B"5:"9= 3D(+D7+;6=9"'H%&;2(1"$7$.!*#+#-%* 1"/ -*)$4#,$'#-"( &-,)3$76 ,+) +$$# " *..*$- &$ !"""##"%&'&#(!&!! '!$%#," '4%36:856$*22%)4-*(66!3')**)*7-6B1E/DC59X38N6/I96775?77E$$:)+ $5:B=> !/,*! +',(+0-33:-.&) %&$-%#$&$(./"$" .)6 L4IS+3B68@5=K+';&%!3)49$-@$9A28E+'51+0%)*,C"BQ;L5;C8%LC=J_7PeL>TQN_O<ZO8^O=DUGL!+"'" *$-,8)9B'+#,$#!)&=*,4_(,=,4<7@T4 3"4, " | ||
3042 | "&# #-&+*8"<DB=-2%#%''! -,)7(E;9?A>BD1@/+1/5>8"3/(*AO(UT1rk@nf>TY'N_2`<.W^!9jADO-4H2:LG,:?PLeffdIvw•—‹j€VnoRz%VkBug"r˜GSU>PQ0>K8B-;>-99'/7#//!6I5>"6$#!1!kE °z9Äê>BS$J5‹r”r"Zc&24&[H.~†~‡pv·p`rJpt0Ug6dsFy_Q^_VPC–’o‰§†«kX€WXx9\gNSiHHVUZvQ`^C—M…„Rc@[x9nGDiM^uNDaWGaTVaNb‡Cm}‹p~TÉ›L¸ºGÉÝW±œc…´_Df‚KNk>UfV\Bbj#WO IGA5(Š‚BÕÉ5]!Š€9¯®L¤©#—y$<J9ol3pmDg[OZ\<mXOXf9XM+JA RK&KI!pW$/8!:@"FN%[\/Te1Xl/Xl4Qk3:VK@enS…p®Sy¡:YxT3KQUcKq….r‚BA /IEf+**0K[[Gd~Rw¨Ze‰`c}ECcUjŒs…¡ba‚>&4!",$"/-GX2Fb,4E3:=A78+1.1')% !&#/5> P\<`ˆ5Ff0Kb.3#&04$,*2$-"+#61?ZKXuKTl:NZ_c„bDcNHtbu—Un‡InŽ9Qk1Mi<b{=co+]eGYo]c~NgƒXeˆbx•Oh‡OWSm‹No|OrŠPu‹W‡¤^–²PboB@j^w™TwHYn;OP9CJFBZ;QZ0AS=IXJLZBTe:! | ||
3043 | |||
3044 | ' '$!(&#'##%#($*,$($%')#&"/),)*$(*'&(#&%#&!)#+!+'%&""!" ''!!!'"'+())+-.-/-1;!G'3,!2! ,&3"8!+%'!!"&'"%$0'/4*6+7):");#'9-/0)*9 '8*5/*,& 0( *-/3*: (.!/$+!%+'*+0'4 1!) /))/876#7:'; %1%/ 0#* ) &'##(##'$&&!"!'(/,61-A'$/"# -6/)0%""#&*!'$% # +%1);.!6B+07$62@3&5>*?&-<&(7%.070:!'84305??$;OA*D,-<3.0(*5*36-.@-(1!-*%>< !A)!$:,3:":)6-8*4'#)!%+3.8.5:4A?K!*; 37"(*"&-" | ||
3045 | E::H-9CI3G=/='8>,490+(/9-9*#3%'2"462.D'50". )0!+1 ;E4:N0K>-EI6;H8'==EBD<JE9Q;3CACM7CO1'L5". 2 FI6A"+6 "(*( $!%5@6GFC*2L"G=/1;%@:"D, | ||
3046 | -&2?!!3&-*,>2!+>.3<3:D2/a'#"7,)D"'0;O0…,"]9!+#-8%'/0 /18#@D&.)O=TY1f[E…v]k~WfyPNYOm}:]lM^jBXJ6:Y*ma*HR.FO1MQ:T^H]ddˆƒo„¤lt^u{ppqFŽ}Y“j¨¶OŸ=.?*9O%49&&1)6*>.#CA->/#"0,#‰~±«,–½Y•†ŽÀ—UY!c¢>‚r Òt„¢Gp"fa6€”he—Rƒˆ^vv?†•O¡›<’—K§ªW¬È;¸»>˜p¾ÿnYˆmOwHF`Qd{Lm|?MO6«¨N‚Ì]]„ur˜cgzG]sO7SNNP<v›9Pg({|6fp6MNG}Q¶¿b¸Ä¤¥Í†Ÿº‚ž£oHoRa`2Zu?CN8RnIMlFO\FZc1NR1‹Šmc~ˆeK–½LRRlRTU]aKLF-KHE_ZHOlAS^9^\?eb9X[0JV)LF/KE1>J-4= CH/ko2`x2:R5*<2>N5#6)1#2?,-@?VdT_{C"D2(10DZKZmSDfE!E#*!(&5,8P>LiLZwHQc>@W5?R=>X\@bZZ|,"0'#"7D1F],GY=H![e,sy%no(J^&Q\*Jk CR"'+-*/.68E:M#[k6m‡B`u=<L3(?+"5$(7%3C!/=%.8$'# ,6!<>.K7FaB,GS5C7-DTMn__‚N\zD[z/I_>>WHe…Er†CMiNVtWNlQIfSY‚\\pEKcT\{I[zQ\|O\yWW~a[‡Lau18JQQƒd|šPb|D[v62@6>RFZo27B.*8;!7B+CD!!" | ||
3047 | |||
3048 | |||
3049 | |||
3050 | ""% | ||
3051 | #$ "#$' (%##)%' #)((&$$$#'$&')&+$*")%0 ,$'+(( ## " )-"**(*,,*2+. 8/"=6!F,M+ 8. :#6)5%6%+&%"##"#!$/"027>-A$-8$05!/4 )7))4!'8!'/ 0 ('/#!"!%,' ),/+3'3&+*1--7-6!/*/./-.19("+")1-&1!2), "/2(/<*6(0/- 2 #"!(&*! %$.%-0!+1*(3)(2#-*%6 -!%,(%"0?# ")#%.(&#-9&->,/;%+<'*93(8.-4"2;!1;!4<6D/-G-!3$+5+/76+:4<4$*U(.+#'%0(&-7)787H/="52,,5.3!0;$4.#-'$,"!**5#==E?-E+'91-1,=/13?3E8'7C/8;+0 +*;'7<72H2;-$3&/8(+2.&+'%1-!("#*%'% 2&04@0@@)OD!=K!D<$6K0/4,*@;(56115'&=85)933718>27H==K:,'!",4*-+)@8,L;@*"(-05/;-4?04U1":'35/860=6'4Q,)A.$&% | ||
3052 | 2'6>')?3+/"9<2,3')L+(! ! +&%$Q?!Ht:($'4-A;Jއ8vžXr$C`-&3*/!)2)$, 7*FP5mn@x~PMŠnm^V‹`=l@WrHIYWciSYoBJW?htPz{A\l7\f5IcB[VAw…h{w‘µfš]Iym[j;lnv{‹£Ëok1R`4-$#'8/ G0$]B$=7I2Ô³j˜Ê[œofys_¢o?C9EVV~qc´‚sƒb_{Ra‚Gj…a_qJd{`²±l”®h‰ºn‹«hb‰zTv’¾Ã¤Ÿ¹ŒÉðŠs–J^wHYu?[oZl–dWkEwŽw]Š_Œ™OEbW8JR7hR0H,:FCqpa«®G±Ðe¡³R¨¸C³Øv¤„ÇÒ”†·s}•|‰šƒ_‚CAgEIdB\[59=:9B:c\>UgEQjHd{f¨‰Jòdžo_JH1›A>S/?5)I3'^F8KQ<T]5@U8X`=EJ+3B,78&HA."3#9C$4G7H`FI[;N[&GR 07#)4>D8B-8$6HEEb5%&:C!$5>@Y=-*#$1/;/;S]1]qEb…<Xs3LQ$EP&3H;3E@Sh+9DAEOHQPBR,CT/@T0bu'Ok<ZqB]vJTk49Q@Ub5Qd/[]BH&:I&O_$Ng+Um;‚ŸP”³R‹®;{*bh"PU6:"-#(3((3 #$ *68S0FQ#&""143MKB\A?PBMo=_y3J\9I`MhJ]jHXoULd?YnTiWh~GfqDCUG<ULPlJQvSiƒKWbFTe<YhAip`}†RWgHDf@OU3ESDOb69D)19$,6-*.." "%! | ||
3053 | |||
3054 | #&'",%! #$ &' %#$ %#'%%$+")! ""$$ ('$$#%" &*+'+&+''"#$+$-(%*$!'%(",*)*!--!+-#/1&N3$O4&V2(N6 31$; 3+-'$.$!0&4"%*$"!#% .!1.;8$<8):;$5<#7@$-9)29 *:!-2.5/5-93454464506)4 2,208-1/64 ;/ =:4<!7;628245*4548;.?)51.16/<%27#59/D$1&)#*(&'!%#4%3;.;(!2) #"#!#"+""',$& #!:?//# $"" $$"( $+$#$#1#%+"?8#0F#$-!($-(2&62+-/%9.!1+14%"=! 1".$22,#%( !/'(&$.65$@8A1,/N+%8!)/,$2(1'"# & $$"9:+.C2'98%/);+1<0><4A5FA=RY-?W+!:#") &*&,83!/-'% # !,+"$/'5!@$/E-@:E1292*:;9E=2<09B0EM)/B"*($(/?24F-6<.-D+*,'2,0.31;-*/-?%: #$)5(#"!!09'*.&0:)2%,=!D5 ,*$%B0#.Z83$)# 4(%8=7 ((+;-%#+"8*#E9";*(#+GG)F[O+ "%&$cy…~SH>JQ<OY!*13: %D"6UG,-V#%.&I5Sd%5X8S-0^<@<A]Z@A?Gs>TXMO]4Q^Oa__f”Vˆ~S†QZ}HEj\UNXw‰ƒl‰f(29'.J;++WDD›œx®¯deˆE,>'")&"&%6%'A:"`83q‹5^{CXG®F¢^*UW3GYL{“]gdL•LnLduVLhJ˜o@ˆª†{V{jEqiUdM†‡PĨo¯vtœ”‚£^£¾J¦¶Cc{IvŠ^sˆGbvE†T‹¬dPe2D^3JS-À°#º—4äïdÜÿˆ²Öˆ›Ø€‰µ~”·rz¢feŠ|Ž…{Îáw†¦upŽMMI-LQ:<]>=T,.C/DM>:RB-D@/6F‘•Ì₇Gw6 ”km -'I8.ES/ED2Pj815.9I7BF%9@#5D&ZT(-409-8(<M4jr,u‚7ˆ•.Vd&?NNV1Ym&->-5+)+"/!"/$*""%'+ ,#'7\_2™C~PhˆGz•EˆŸ;Œš*Li![[-mu,hl(}z-[i3[h+CN&7G)=M3Xk4E\59Y9<TD=P+/92;R<I]BKl;=S2O_-\q:`:RtHb^jeªd†ºZ§ÅJžÃ?‹¡:>*' &*!"%$449S)+)/":K0BO2?Q1GcGav<Sk7ZtK]}PauBUe@C_IMnM|¡QdxK`„A]h1>L6Zk?QbOZ|CNo9LV<A_FGgPNhJM`4BG;P[6O]?Uj:Od$9>&':,?@'($&& | ||
3055 | !( #*%*#'#""!!%'#"&)*## !'&! "! "%$&0%++-'#*'"($$ #&!%&"*')'-/0,&10#73%e/$^9#P=(M0'>-$8$0(-$#()!%!" "!',*,.03$-0!30$55)+4../!,1$+.&1 7-",5"-6&57$0: ,8$(9 *1$5-7408/446!552;!28*25&45$49 76#)6#.0,5=<$4>'09%>4$9;">2#2="?=*73!91-C00*-8)979F$2A,#0'&''"#$3 -3/343**( ")!0/;)39130() /#+(!+&#'#!&%# *&3*&'&"#/0$+"#')!#'%()&*& '& ))* "2)" )%0%2D*"2'"-'2"6&&'**04:/@3C'8I)"5"%0+("! 6*&=-&>I@:J@';/.)#-!.'"'&';*8(11,*5'07-3&$"'=6+NN JZ!+L',6!I6/>U5<J<M$6N+6C9!82%'"-/#.((!+$%)2.#/8%34!:D$, . ##6<!&C4.%6$0006:2#10+):&(&,098=1$GJ44D?:!AL+gd8J$/',0Ib`Co‹BllBRr&+5,,;)/4$".9(#% (*1;<0(:C/5K)IHD5O@=]?AL<281V`iWQX‚¨on…]e}D<lL88Y;KP(2#(2cT)ÄíQŸ¹is¥zh¾i@})^l.28Z+¡‘Tl%’l:©ŸIžÊ3d’3“€Ï—p¤¢s—Q‘O‹¬piNh…sl‰`‹Œ[™¥OŒ¢hƒ½feu‰<Y]1‰CiˆnFV€?WYSW[tU·y—Âs}ÀTs˜e‚ i•šXƒž}WweJ’I:D409<„˜ÄÚ¡ðÿ«Úú£‚¹‡‚¨užic€hR^Y…nV—¹‡Žª«¬¼€Z–KVeC\c7¹°)Šq#‰nfZ)@?&"2 5%,<[#4wCCKckNQoid}6<4 (*+706065<0,7+5#). )2*99&;A/-?!28"+ .?4/PF=UYV}VRp21D&@Q:&=1#.)34$-5%,!(8L%CL/qŒSnœaƒ¢WlU…d¨Za„DvŠ3F\G‡™K“©KU{>OW5W_.KU dc)^f5‰6ut)qp.^\0AQ0Ja"6E(4H8ZnDiu.Hb9k€Anƒ>Mg8SxC=^QNlVP{jYŽq„ÂoœÃ?au"+4A :C$'#%") ':+GV'*%3E22M//H2EaKaƒGar?HiHQuURe@Mi<IdIy˜Vˆ¯Z€–Pt”Nh<Xm=i~<k~DObCAR<DU5K_:CU>G[8Kf1HG29E:`i;]y:tz1Ud&4<-5B($)#+' | ||
3056 | |||
3057 | |||
3058 | |||
3059 | "$ .+(%%#!&%'%&&$(% %"%#% ! "(%*"&!% &$"!$$&"($($((*+-/+%=4#J4#^1$T@ W60C2"=-$:&*')"(##$##+,*-+ '%')*$ +$!-'"2-.*,(#'"'*#,+(,0.5$"1'*'),732;!,9!(1!&0#)0 1-#,/#20(2',3+3!24"00,247"4=)5>);268.8#31$4*/3$-0*7")4&32"/8+8%,4130)/1$-)50;:/=,20-!1, 5462)4-3:4,B%,0)*1$/2'3(+',%$" %'*$',''.0+4+0!+$*,.56.!)1(%$!/)&,2&3"./%:;:94?%E!-016*4AD#6K(#8.9"*:/8"=C2G#.=%,.2+9*(9,04 *?!8$$1' &D64CB7?;6E))?$:"*+&$ #(#--#@C/:@8:$:N6R(3H4,GBAW800.<"*;8)*+#3+301+53!0) #'' '&&2&'"+,0"")2 4,') | ||
3060 | /)80*$-)%+$76/4('1',:'! %$./A</VM/apDPb7<K)DH2HN:;* .$8D9E%3><L4|‡sŒ‡Oy†Ucr"L5˜Š™8Kg!\AB4 "(*)&7>D/:P+!3-).)'13N2.=N&DG2aQ/f§qŒŠjt\ަS‡¦8{s/82HEia3Ž‘”ÅĉU„eERm08<4HJPw3;!00QI}Sj>ruf®Èz}¦x—R©Êk°°oƒur{´ry†‘œžr}UdˆVXzomhq„’Xvjf‹fQŒ\LbOknIr˜b¯•K€’.hr4|ˆMzOqm~¨r„©hœ©^†œkM‡oXp`F`Fos77M<CT-LWmºÎãÄï»ÌÝZyˆVj‘axŠAªNøéq‹²unw‚n„ˆarD4F:A^Rx“rÑ|Êô|Âæ\±63I35.:"$.HK6*1BDB9&@=#-%#&$*!*,!/3,/@B,1]E(6=)3D DK ,6#3"'4&)<4=O>hp75G.IT)+;%3&+&!$ 0)(brL_„QNsX~¤fzTYuea‡^[hCnŒE}‘=v—r™µf“—6Xb;|†BÆÌIÍîX¯ÉF©Y¾ÖMœÄD€¤9jr9EO)2J 4G/LfE|‰6KnE}šOx’AWq6D[7=V5B\?KjCE`WEkqw¥Xv## (, 1>:D*-;!'" %,)@Y':?!.8,,<!.>$1KHKkIM`97R43LLG[@F`@NhSv›j‹ÆlŽÀ]ƒ›Yn€JUiCJYLU{Hm=et<Sd6`s:Wf4FP@Sd?HP2;GA`rAUoLUrETj4JY,6C# !!"'! | ||
3061 | $!&'! """%! $##&$ " #) *&(%' "$'+*#&+'(&&$*") *%)&'(&(*/, A-!\, U8==*8-(7*#;)&8#8*0("'!%'* " $ $#%' - ,(*&/$/'0((&+&*'-$*%%%!'#%#"'$*&4.22%.5)-0%,,,*,+1+!+0),$+,1-.+".1/3 /,"3/'12).2!-4''3''+#-&()!(#)(+21/740%8, ,.-/"0)-0-09."6.",08,234-".3"-1+2'/0&-+!0+*,1&--'./0/0+26,,5/0/4)2538=#:D&.I&*8*(@7 ?I+:G$40.3.$%%$!$- &230!6.#)$.!-3*3.%;05:)1B!+?(00%8A#AW4<K3AF?X">P)<F&3J7DI(WTAb!9D$.:47 7>:N.5+/&+2$8A-:E8)B)0#"'&"7+ AAFM0:B45F+6)(A9&)5 %'1%%*:#4B/*3)@5@J#0A#&3*'.#&%)5=2; +=%#3$&$%% #5&1/2;#16(-4)%&!#*!)#%.%7 11#(#-,76HB%bO/GM@H^RhnUXs4QV+LO44G$WK.B/;%,>*,4(R?*\v[“t®¬x‰¢_™7W€ll‰Ÿg´ÃZ¡ÄI}¬*) '%!'&' -$'$+3uR/Œ‚HœzeŠtZƒzTmf…±r•Ï\™É2x¹H³âY‡§V‰©¬´`‰·5kg"KW")$13:/M<ab,{z=—¬V‘’ ²t’¤}¬±”¤½…²¦f¼_g~dv„jŠc~Ju‚KmwLŒŠQro9iwKµ<Õó6g@v”M†§|ÞòvËS…©_`†dMmV{—\¯i‘¸€•³p™µD–§JœŽ;ÿÿX‡™1|…1do>q†r–®¦»²³Æ©ƒÒ_‚UDâeþ•´°»ÿÝuž¯WhrP@YI$65;0xjV+6N7I•`|‹fzV=V!/5,Lf#`p#4F)*/"&/+%*,-"%"&" B9-0./"<@&LH#=A-XV'CZ+N`5cw JN("4 $0:SjNxŠ<Dg/)""!'",%! !!!,!#,C\\Ka9YoL‡©m‚§Ph‚LoˆFŠFg…KSwSHiT‘iЦGrvI|™i…«w°×†Äåj©Ñq‰«lc“_Ž»Y¤ÉE¡µ-t})N`,F]Mx8Ug>V}Xb‚Q€™>l„:ez4Ph4Mi29Q4/@D0Q\]ƒ;NS(1.'%#+$+.,&5H*:M%6> '/$4$4.!9?1H/(5$%51,F:9I8ChKIocMrqU‡niŸbm@DU34I?GXNRyJbˆQ™P ¸Q…•Fy{<I[:HR9M\Ccq?Wo=K_BGa7>Q(1E '&"&## | ||
3062 | |||
3063 | $ $$'" $# #,.#*.**0%+,+/'))/+/"(0(1%*($'('(#3%<-Z, T7G='/3)*&!'-.(,!9/(+ *$ #!#)/ -&# $%+&***(.$,+*,)" +#.'-+($(%) -"% !(.$ +&$/&.')%'(*%**-%!0(2/--3/5* *)+$3%4(3)"1)9- =,;.;2333$',&(+&1573$0/0-)/&'!,#+*.+,%2/&4-#506,.05'6':,1,/(3*+/+#.,+*;*"4.:-<62886!14&5=)<9"1;/:88-.E)25&45+7G&-F&8: &5/(12'7>*8I--C-302*C&341K>:(9B /P .8$#@1$11:-4?-+<,;229-!9('9529:.8-5E*4B&,A0(?9+88#2)*/%9=9;K<?D7,A"$,"%(2*HE9T,3C; 10->/:F(5E5,)2$!(6!3(+)'1<&8>$:?:/<.#-$ ' 4,$4+(*%#+$0("!%8.JETR#LZ-9E,)5"//" '.6$&,$=$.,9%2$B(+I0DI?O{@2L<=XL;b\YC=9P1@F 5<8P^;)G&>5(>H!RH-XwQ‚r„‰‹`zwsŒueUNZIšnu• –”§j…z8S%0#% &)&,W@ywFw°`NT[M]GR„H21.78[K;d|gfdUCr’m{pWtgx†|sŒynf³ÄWe~|p'€„9…ŽD“r„¸™S†–v€¯o¤™k‹®Š›q’”¶´wœ¢]‹©_ve\‰KJ\Ng…Uq°r¶h»â_¤×yFs€Oe^°PoxJxœŠ•«sv–S…s?§¥C¢Ïo¢Ä‚_¥wY…tŸ¬„ Ós²¼fëÿüÿ{bœ_…ŽXˆ¢i~£‚m–yž¥Ÿhq`J}rz³ÿù“Ñè©ÿÿΙÕt‘—F+I%.-2M&*8@0:-4'.6<7?52B&*1&Rc0.;02<!*'"&1*0!„-‘ \X+2-5(8<!i\-‰’>}‘,;C-4H2 0(&396SFbm'*2,&(4DTj`:O! . &&% $!IN.¬$b^>8-+A:AŠ=byQeƒ`SrYo›SWPo’Ql2{{7oq6ei[xŠW^qKiyXµÅu´Ùs±mdh‚œT[qBi|[u—kn¡eŸÈ[´Í;†H…¢Htƒ<f|AkyTuœZ‚ P{B\u4-G+#.'!!-2';?.F$#6#'$$0)4C#.9" 3&'0&#%$+$!.!2!,%4*$7,*B;C`F>aM?WN>\^e”Can2N^:@]BRo]l‡}Ž±ŠªÁ‰ÝÆu³¼K~}OxpF\]R]zCPh=Ur;Ri4X`.5C+-/*&#,(( | ||
3064 | %#$+ | ||
3065 | !"!!%)-' .2$""" ! "'&$$"*%'&*)-/-0,7!.3826;3<&4>&-;(3!/3+4+-(.()"*#(E&J/=@/:.,4""/!"+((,-)%%-"!#(4!7'B-+0($(-#&% +'+*),%+ ,&-**&*+1)/-*)),*'3(&# !)!#$&&*#*&*'((+%)%'#,%'/ +) 0)...)7(2..-#4*4-1)*'!0)#+(%+'."'&&#$%,%%-,$1%0/!/( 0'/,-+/*6%2,0,1),%1&$:.-- +"-5%('*#5&1-0(5(7-66+;#-1/4)5 01!61#22%,<>=)3B+:423 2->6'1E @7!8D7;7D0/D7=<'BN"<M"&@%,8 09'5D'9H3,L,-3!!5$*$(1+#421(0,;-3G MM%0H,,=-*B18)4*!0 /025;7#)A7&3;'-0&-$%#.)1-#/7-06.0U:()')2'41!=<$D?/7F$1400$))/$,>&18)/75):*2% /$7B A=BN!5?8<!42!5(!3&31;#AA?BK+H7)7*&9&28&?M?:6U!'2)-)3(#,#0( # #"$,2HJ9T'+A$,80\b<7T1!7- "')*81I88?&8K7[_3FeFGbaF{v1dY*L!(6KCDxt_uwpt‡e†WP`+'< $.({[ Žj8Šš^uœw:XCŸK„µSLrTO)‹˜<©´VdnGHX8QTjnl?Ž›J¦±S€tNÅ磇ÜWlqaV€ƒˆT‚€s…zbsWX`eIOs•€cÉ×k¦Ëa•¶~¿Ž‚¡t}®e:kJ.H6q`U—¢d£d˜´|ŽÂ}J2&0(”hÏílÎÏ]†—yt™fTne—±šÆé˜{¢‹‹MZ_QmehœŒe”£’Þÿ¾u€yšWŸÊ‚œÉpr‚iXuVm‘™¬ÐOnyB®³~æÿÿ³Û´ÎÔÍ ‰vRfJFJ!1;4E%(#/0&!(2$8<#CQ"C].!QO$49!,5(1&HHo¡¶o±At„ E5$^J;¢±k£»}‚•X*E-,= %) )(3-8D9!+)7 .GA&MZ@Yb!:>/.31*,;9AD"ELJHf|C`;y,I\A™µAb}[jˆLs–IUnHiƒFPlEVuLˆ›Lz¤aÉðS°ÔN™œG„~J‚–Yo tWw_@QGTtPg‹Qp1OhPk†LazQ_s{®l™Ð\³eg¡Lp–Ly›Wz—ay¤d„¡DUl0&&%&*!'$-$*()!%&#()2>+,6"&*+ ')+ &% -'&>5:O/8L36IA;bREi@:TAWdDk}Umo`}‹]‡‘]…Žrir‚YixLDWF8TLQhCUpAQh5Rh2HY-\6&U5#-;" -) | ||
3066 | "WB)*%.+)%#)#-&-,,"&!/&+%'*-(-'(%&$(+'0*(--././-./3,0,462%892>$5;'5>'08%.6$/920//&/"( # .>-4;*:#'2, '$% !#&$)!-*!)#,'- *&0#;(A-\3RD'66.56!(6!&'*)2+.1)2!102//.,44-(2$0-#0,!*+2,+,-*$))&*'*+,++*%(.%/)/#.&,,#))3'-/!((!,'-) .(!-%/%".)+&2%0,/-0*4-/(!-#0$&#$0%#4)".&5(,%3(3(<(#5,$6+/(*)*'6)%+,0$1-.'(),"..8)5'5*7(!53#3->-41263/ &1/33-!40(7:#6:#B4D6!6M(69#:E)CD(;S,AE-;H&4M*2G62>(><4B *A 2<+;8)6E"9J"3E5?!(3 -))%*".9$L&6+,E@:;F UQ*J+>+6RAR06Q60J?@G(-;F:?N?PCQ&%N(I6()B%1#.2()1$6#87%/>*672+9=*/+%7&"+$.(.2+28%2@,)2*&2"%! K3HT;N->P5CI:?F1NR0?S4 =1,("0&),0,),6-(6(08&&040#?>20=)$&0'-47$=M#B)"$2%)2.F+)ZR#v„Co C33KG8B=#5GI8*.&.#+$6A06C&/.&.9(+ -*)*U;mDd'ZL,1JJXLp{Dyy]f + | ||
3067 | & vL †šL©§_¶±v¯Ìz¥¿.‘§eqªz|On;}¯oRt[v^g¾Yc…:‚¹ch“upŠ€–²²”¤º}ŽºSv•QgzbVj^KilzbH‡G¨¿B¡Ähx’ˆ_—{f|niŽ]f‡b‹ vœž5§±0¥½\Uwiƒ™wTkl0GY-K;#-!1FBM–h‘£‡Íyy£Wh‘JRdn®«Œ¿ÁoÉúŠgBÿÿUÂÌp¯Å‚ÿÿ¸Òò_Œ«€2Tm7UpSrL/U.AJQKi|¼cÿõÝþ¸š½‹Z}Œ5XY@I>2D-58PX&@O'% %&;4+5 '2,<@)*//J806%4>".6 (Mt‚†þØ£µTlƒ)~jgà Á‡|”Q)- $3!+@&8(!!."202=5B<M,P`>€ž5`s0,DM+GY(FM*A3<N./6;4FAH[dR`O_u^ez>bqUkxUUtJ|PB¦¼TÃîa©h¥‚·Õq¦Ì]°ÑMjzJ;RD@T.%5(-8;HmJpŽ1;U>_xEiy<`ƒKtZFpSJjNKgKT~^j•[s—`Š›e}¤Yu•+GP..$'.89C9F&Xj!BQ BK#0*!.)4$2A*%0CVLI@>/-$%-+8%# &/C&.=%0>+6M;@N8Vc>ZwWt˜Xs†V[nXDQX0@T;P\HZNFS;*=54A=8YFXrGl{@amBgx?M,.I./,.8 | ||
3068 | B ?!""%&4 //(*)(/&1++/!*( *+3((.)+#,'!.(2*0(3+1+,0/-+/.1 ,0&+/%- -)224779%7:$0=(33';2#B3?5%14#"1$) $$*-.-7)1$$+$$(&&('###&"/#-$.+3--/%, $),-+'8+J4"EA4Z6;V>-?A*55 534044'- 4/!*6",."11.2!&, *-/.*--./1-/0+*1+%+*10-.,./,0-.40-/,2+0.1/*(.)).-*.&-&2$%'92','!/)2& /)3*0&-%3).&("1! 2&$5%0),("/$!+."++!,%!.((('))* &()'#&1**,2&7,2. 4- 2.7-";-!93:/!4/6,)*8&D1/33-!22"66:8'/9*9<$0A(-@,38/JG+EX)2H-8<%:A!6D"0H':;!8:GB$CN%9K'@S*JS(EJ)?PDHBP%BJ$>I&:G2K66>6.J449>B:?H.Z,3A51<<6@5?=/?G.<G(JK<5Q36H/<M3BG/O:*6-4(. !-7,6F+"=(%%3'"-&/4$.<("94.% $ | ||
3069 | :!.L:;?.>H1IC6>D3.D6--93J).4%:8BB=7..!17'36?="E;$ED2% -5>/X,/,-31 "'"($$01Ld)S398>8I*JN;f}Sz5:[4c[0WtKt„A#r7& "% +!(3-9<.++()473-0%B@I3>H-:()&j4£™J—£m¤»~œ²‘”± k𔓩}mˆcu¤i{a{¤o:`O`]8ZeOoŠBRafZgCXkP”~i–³‰¤Ž¬w“±eŠfªÝS›×B£Ôxƒ²a{¸¢lœ‘µ^šÌ;Œr[rª\TuQYkfjju½Š|°Šk}E[fmep?(h $ 1ss-_hD†Lp¤kBH;x~/Ú¶eÙ¶wãÿs½ÏXÿÿÿŸÿœ ‹¸Ïÿn¢·i=j !#16(>*0%D`9¹Ç”ÅÏóÄÚ¢ÉÚo818:)6>.2B -!1<21%$9*%)*+&+>(/J\4dy&7I#DM*FO,fd!xgeVk{šž¦Å{¡¹D\Sy©Ð “»‘§ÃX¢°/š&qv'FU&*5<:H#T\FP0J!EE9XqIJU5Sa#KT&080EJ*6>*ds:h“*hh HB.0754BBUiE?YDDZAShIUwC¨¾xŠÀy™Ð‹šÜw©Ù]zž_€¤n˜±n¼æx¾â6xx(<K 6:#$#7C:oŠAz•2Pn;9N<;Q<5T5/C*;U.+B.2MH6PK8\[Sw`Krgn’L?_*5M ;N#.*.Ki.>T.>_DNd7N`'3B-:-8"/="3;$1A//&A^I\|4Tj(5F% # $'9%!1!,<)8P5Wr<j…ZuedY`~MI_83D/9C*BM73>9GN)<@+::0<IENhINiDJfE?\I%%# % ) 93,-3,***(6*.!/.,0,,(/'*!,(3*4/508."6/#,7'.%.+--/4,/(/ -#.-7/!6/$94%'7&(()&%.$!*-$%,&#$$+'*-&---</*1#!/%%&+.+#'0#.(%&*(*-7.3)15!.9#(8!+1-3.41872-Z32F>/[0<]>'H>.W>%@D!17(24 /5 23 05".5 )/#00+3..1- 22-2$92#27#51#12 56!09!43"3198!5;"68#5:3;0; 4732#/9 48!86!3:.7 14 (43'*5%#,#+*/*.-0(/.1' //.)!(%$+"'!"&'%# " & (' .(1( ..-+ ,(/*0.&-!(!0+ .22/!7.!8/%3-&=-"83"9/!3-"6&A314(70.03+707-$D97:#<3%7/-4;53=@2-;%21 .9'.9)79$9>'7D-/G28B1>E%EK1>N5=H6<E+?M3<V3=I34J.<J,AB CL*IQ%7X)7=0(>2.4#AA#8;&Cj.6S84F4/C)16<08+G>-6J-2I798 3@%->!3:'7>,Q1#7)#,3#$)1&7+$,((! ')1)#>B'=N6/#$!B3+0)"-31 &%-3;--E:.7#69#4='4>-?;*%<5:-*3X8UH)’‘•›)t“I})42LS*2S:><W%2N';.#TpEKZFRZ?8jS2I>'7f#<A%.,*# !L%&&")8<"42!83-,9!MO#/S9x³J–°s§¨s›’u–}„ˆin‚ps†`ik\{mV>=Kux[CWCALOC`Odq[lrAZmFt„AA[{Oh”‡}k”‹…¯‹Eqoy{Œ´Ê‡—¡‰xŠ{s~am…[µ”U—´t|†i€¨c?j:?S;`mE<cc:I^7MVBSAPmFe%63?462^^N–·Q„©mgbUÊÉ7€“WëÑÿÿ±Ãýåÿîñзÿ{Ÿ–ÚŠuiXeŽv"Z-)$°ÂŸœe|!-805>zs”›o™”¤´UAU6P*5C'73/:/0&%!!&*72$IE5?%.F=SgMg.v9Gi74RT-KcSwh´åid‰wy‰QFH]It|n‡‡´†ˆ¸s0PS9LH&8+3>.5''1*5C=9O&16,IX9\x5*8+7U,>M';F$IU+WQ/WkQKgEXmE‚lEcl0:=1,G62?,5>6Te@euGPxf2TW6Kd7Y[Ek\^ƒCau^„žd¨‚›È„éÿ^»Î1=S!.4,2.Hd_{¬BSq01A(9E'$0(>&>Z$09&+:)$2& +1-?<#8JMfF'<,*'!/%2@ -6#BS7_t3~‹:XlDKf02D&3D'@K':L'>M$08'.6$.2=7;9<M63A!!$ %-!&3#AH%.;@YEXi_m‡[[lJNaDVp2Yf*QW'3D'(626F9eo.YE.@D5:E7%+0,1%1 | ||
3070 | |||
3071 | + F | ||
3072 | A10-!..,-!(2*//,32 22#/./.027.772;%80%51&/4)-1#6-!:4 7/!-3"(.#,)"0)+.#//"*0"-/&%("$+'',+/0!(1""1! 1.'3015)7&'3$), (//5-9$$3%0,)01)9;- 8327&08).9'-:&47!2<49)6289H.([0/L@(a<@gH1NJ6CD8>6'A5$?9(78",8&45$0319 /8"6/69!6:&69&;.":6#58%5=&7<&15*0:!>7'>>)7G(0>%37'3;%9>%9D$:@*0?&26%1>%18)4>(26'9769$39'8:/6-,384>7952#6: 4;!67!0:!25!/4"445= 0:!&/,0.05/ 17#14!+4#6+20 2* 1* 6*,'7*++ -#.&6,!9-8- @5$=8$93';4 94";7%230-"7&9'++3%"=1'@,"@5 29"*17,%62!A3<G26D9&??*98)7C(:7':?)IA/JN/7M(D; 7H&2O+95$@<+6J)CF(BJ/EQ4?J7JJ#MC IH?E 8@&;88;=/K9#4;)2@!8;$3Q-"D</0*,[/4B;:8'9G(=G.4C&&-1.9>(,'*!,( | ||
3073 | @,<B*P49?# )$$0:"37%(4$;=,&-"),%G ^Jw/a<_~Y^‰pg“nz \a•84q:$N06I ?M&>Q!EPad@a’?1P3-<1 :"&# , ' '(5,->!2?34Us635wl3‡ƒ]ž{nž³u›·Š•¯}¤¯y„¿yWhLF`HSXC\aOJT$PWdPo7Gg176.YQIk‚^m‰Kz™x}¤GŽ©F¦}‰•Y– qtƒP˜eY–™s¬ŒH}f—°W=si_dz—Õ|rMÅ¢b®®1¹,]8NH+<P+8B#EJ/LJ<„’[©À=œ¼?¥º=Rk:\W`ŽUÌÆa”µ{Xf?—m†òöӾ႔Æn‹œÆûŠ—¿c¨µg¢d[VE¡®/+](=x@KbcŠAZt'_s-=B?4G952ln‹:JS%JS"+7"'9,,40>R:='705(9B9AW!+2 '3)E0@Vr“<?W5™Ÿ<¢°Xk‘¡i«Oo“is¡5rw:·•[Ÿoe{b~”+‚€1]g/kt6h~.EY!06+(3*+$*4,1;37FDN%el*yy1ƒ@t•:I`8XrC—KyZf{DZm%479G#@M,5@:;Q:1C.1;$)5%05&99/OR<EXATmTWpSer†À訑ÅU/C%5;#,6.>@)@8.>+;H(3J!-74I(Me.;M'NQ KJ/88>&-#(5.-<#))07E%?S+[eAeWh›NWq<Ne09F$&61>R2QW/Yj/GQ#<B"8B(OX%.2&%(!"*)?T6c-8=6=9JbVŸ—Kc]6@M5F\:P\:8K'85(.,.3BMbJUM'5B1LH"++# )" | ||
3074 | )3 *! -U U?"9' :,<04-0-406/:4"=1#2A"19#61!94"?;(@3&4;$.:&16)/54:$57+04'21'32$62#48#/3%07!82%50:7.: 10"/5 +:#*0 -.!/0-5,3 626;$?7%38,:&26&36#.:#-816/;"<5Q;O>.=<-7E)4?*:;+8@$<<'=?"97!I6#Y@"I;/K/3F=0N98IB8t<-QN.JB39B).2*<3$B=!F:(@:#CC'S3%;=%D7*96!F6(?:$BA'D?%F:&A?(D@%B>(?B,8?*8:&@A(AI(?B.AC-8C*;8'D:$<<&8>)68':<!7=&2-(:3#<D%4<&13!6:#->(.=#.;&7;%1>'97#73 77 5:!6>$0>*/9 .81548.8!146:#,8 54/8!:4"45"65!0-5.!6-:1,, 6+!0+$9-$>-)>.%=/"73%90%>."?5 :1#=0 <1(72!4)!&(!/0"64%;48?!=:#<9$@<&3>"74B6!CK(<G'7;#77#78#8@+<;.2=&=81?>'D8":F%;B)>G"?C+BB+HI*@I/ML)FO3OP1J['BR!WG$PG)AX/A=,8F#I5(@<&PBLG#=C(@M+0F4B<8;E--:&!1!%%*%!" %,-% | ||
3075 | |||
3076 | |||
3077 | ,%8=&7@%9E)5)#!!+4),"NH>v§LVNBp9BV6ShC"Q?"/E7@1ML\f(GY5^8E(IN,\X@DU1(;,4)&&# | ||
3078 | ((&4=/<!&8$)JD8zw%„—Sw g{xG”ˆiŒ£‰•zˆ¥An;F.dQ2“Bƒ“Ut‘U`f>hƒJjxGI\(@O7RMUewnc€jIVsQ_wSkm©t“°j_viu‰\‚Hkt‹:oŽV}x8·M¤ºkÂq¤ÊŽ°Ñ’£³‹~¥ljŠ>8b6,/:60a[6p’Z~¥€²Ärÿé†ÿÿX´ò[žô|R¦”dƒpgS@à§sŸÈž‡¤ˆiViiRÜÑÙfœ…ßè„·Òc_„q$/8#*00<Z<*A#'0$6';KEM}B)G,-H!0;F7 =B &)$'3,7#=M9fx2Šˆ5\‚?>8B,5?E[vQ¯Ç›ƒ²f{WH]JAgj‚£]Œ¨Tl€‚‘Àx¼q©Ïuˆ·ƒz±Z,W_?`:_f-FU 4;&4;;(.8>&@Q1~‡Qœ¬V©_Id>KE0X^AFiY¡[|˜EPk8GR!AP&(:,QZ$%;!-"';.<2>3:&9:*7B)9;*9?7FSSOovB\>6E",5,;)?!+=0F&IW/-<2A!3Q0Le9D_'ASCfk+Wc*IR&CS5B /<7@7E%Hc)Xf4>U?<LG*AGYk>9S49A##->:PcBTk?AH6FX,1</EX04@ %*(+,",,5))!#$#9JNpAMY&:D7:IqŒU[e4:G5DO6AK.""("+4+SW6NVKKJ';=7CC,.5 0;+:'&) **$#*.?D&:)Bft(X0"I2(S6&W9&Z:!Q9%S:#N5(U6)W<)NG+O<.S6 P7 W;&H?';@)5>.<9&>>%5>&1=*97(8;):9#3:$4="/8#25#6434 79&3B)38(3:#19(66$C3!D??>"8<%<=!6F=8%,>$+6&,1"4.89$::#<@"8G'<?)E;&H90@F3DC(=@-@;%B?*D=%CB&I<(F6"KJ+MI.]>/EE/L;)C=.NC)PJ1LA6;D38?+=>(LC(EC,;:094-B8%>3'86*@=&:>&58$7B*>I)C9+I;0<=0B6'?8*??)<B)>:*7A+850A<):E,A9+9>'?>&9?(C@(=E(7=&87!C="?F);9'7<!?4$5>'-<%15#66%.5 21!68"8='68)6C(.<,19&/: 253:%4< 3B"2>'1D$3C$6?%4>"6B"-B$*:%+6%+9%7?#5?(8>%2?&/7'1-&4*'94);3*85'<>%77,22(:/#:3%88(E2&C1(D>%5D#;:$5F"1=&95&58$<8$FE<R!AC)8G&:C#7<>D(>E(97$E:OI!MJ'LH#<J)>@)K?%;@.;B2:;0:C1A@(9D05</B@<GH/SQ,L`7R^2CK'CM(KJ#OM-CS)GU9LS7;V2=H2&8 "4,!3'-.%!*1+V!,,,6 " +%)!)&# | ||
3079 | |||
3080 | 0*9='4?)2." "'".%('T5Pg`Ah–5cv,Td?>d)02YJRu*Tn5Hn0=Y"5N3L"QZ.Vd/=d'E/%!, 6616,+wVDT1>)*;37"P6[M%…rg|•oƒˆde„h€™y€št²ß¨és‡£It4“{@Jtuan{jlŽ£PH‘`e|raSAM@fo=IeR]pYQp5QcA=\;@@Vh‡dL€M`g`<`p@GuYkh“ÃpŠ‚_Un‹n~}|™{z·vY€…f‡‚ªcPxVO_36:zj0¡ŸL‚¡IYWMˆ‰‰‰â_µÔ@S^FZ]E[=tCI—DxazG‚w6Tg3@?KS^çÿµy¸xnŒ€‘ƽ°Û˜¢D< 1#$,18 #""-NKK]+7E0;G!??>FTU-;T'$&$%226A/_o:glUA]`UPC—›O»ÐAš¦7f~v˜¾³‰¯rXwGSX8EY?TatŸœes›`Iitm‰z…£{’¼‹§Äk‰/??6[iEq5hw#Mc*<,6;1-":@1JT_‘¢rt¥NZh-=S1Zi7DQ@fŠi…®Nn5@V+/D%/? -9($1++5<J#@LAJ;@%7?:8!8<"3<19K17C&>A'-8(3.@!3D!AR*8I)7F$<J"<R<`n1GT<_l=Zo<w€?Vh,H[.Md%DU+FX*Nl9bt@Vp4I]'3:#1@0I^41<,:@)-(88TeDK\007*0:48G)9C+,1!28)CM*FK"/0(.8%.8!??)!#!%-#==FW+=J,0=Y$6B4<).:1>S3U["C< ';Sj9K[6X]:lb4XF//9+@I+;G.7#9 •;–< š<"ž<!”@#˜;•<$Ÿ@+“E.œ@0¢;&§E+›E4 C<M>©L<§O2ŸV<§X8¢L=ªH6£N7ŸS@¡M<¥O9«I4¦N<QAuK@gE:JA.?C)8B+9B*>A'<B%:E(5B-99*1=(.:&-343!8;!6A*;A&6@&1>&>8'C5!BI+;J0?B+8E&@H+CD'<N#6A+5A#;E ?;%DE*JL)>D(F@5D:+FB/9C1?A1CH)EB/FH'@F(AH-8;%G>%OO.VF4OG5JH,ID.>C*>D/?C.@B/7D.9>(:@$C@*CC+@:09C*;:)=8*>9%S<'=I)4D*6<(AD,DB%;8,7I1:4)8?":?0DD-EC-A?+;<'DD*CG+AC,HC)GG1LE0>I)D@7@>)CH(AH'FJ-BO(<R,GE*=E$6D*=B"7=%<@ ?A%@>!;G'1<&7;*;8)8C$7@'7B%@I(>G.9F(/<+.9'3:!6A%;<&AI'1J&29>; 3C#18#4>'4B&2?(5;#32%36 38#3A%2?%34&88(87#;3%;:*9B'8B'3?+1:'7@,:<&;?*<:#?C <8 :A::+8=+9A,<I-CS+8F*DF$;J+JB2B<,;3+:33S9*BM(V=#OQ*TN(DF#@< 9@#I=?G*AD$KE&CV.Sc4aR3N[4CI1YS6Qb.HV,JJ6DR7JQ6UU6W\)@X#>:G2ET"OKJP:J4'=(/+$"+, +0%-.+$&%!3&" | ||
3081 | (23?7&,K(7F#$ 8"W4R2.^$/4&90TlRz§CC/F[0j•+zo(wœ=a‡5Yv4Sb'0S =PSS#Cb98J34E%.<%".4 4)% 2 /0-A;0>bXekbŒlwW$T‰ a|'p~Jœ°WŒ°h…¸eus[x›QR_bgcTfˆs‹ƒ¥Ð†¸ÊtwÌrUZI@S\BP_DJ.OictMx§fxŠ68uTY_8GMV=Q80J;3A-JW'7C?).6<FN*K;"K-<H96En*7NG:B7PP:ka<P[D?C8PBH@b’HAa3{n1zOŸ¸lŸ¶[[‘<KY3!/5"%0LN+Vh,CP1>]QDU7eS=#P6% %43=AR•2MRBDKT]s~»},BK2C%K<KeNjpv6L„w8Xg,>J&8F&sv3µœ:ˆ*pmIFU_.(1>++9MY]T”ºAàòv¤˜¬¥®Ç„Š®ZwŸs{tbzDVsNMs3s{]„¹jN{XDo9JdFA]oŠ©”ºÛ›·\¡7ÙÎe¡ÈY†žB:E)./>/!(*A8)B9>usby‰Ldt88D0AR9Œ•;Œ–Ol†g„£EOa-8@,.$BGD@,2AI$AS(R[0H\+>L$MM!CK:H"AD%GQ$GY*Q[$=J?F9K$HS0BQ28C"BJ-AR-KaJQe>euDp…EexIoˆKv|?q|;w„?Zm5OcCYtBt‹Iq~@ž®9Ÿª2—5….KK*NKCGAD.=M:;H+;H ?G$AS-IS%18$17;8L9@P('."$'$!)++8)7:6813(* $,(;1BZ(MN./(($-.1JNR}‹N•z,NI+045K?@W?\kD]b?MZ8^]6PX1;I1˜IB˜MEŸSHšSH£RH RK RKšWN›PRšPLŽRN™IOœIL“UGŒHT•ES–GL”MN•RNˆSWNQ‰JNŽFS†BN‚EL‡ALŠEJ…@EŽEG‡FM„ELyEJrBAI=<C?=8H4;E)7E*8F.<B-6@)8F,8C%9?">A">B$AD)@J,9E.,B-59*8?!=D-9@(=;,AF):L,CE+>H+GF19G+9F);A-?K+<J->J.CC4JA+>G)8D/FC,BL,AK,GR,BH3:H+4D&=>$@J,LG.DN2?P5>A+:E.<E.=J,@G)=K+=E*<F$CF%>G*DD*;O,=E-6F)=C+BI'>L4?F3;D)BE,@G+AL*GQ-9A+?I)?I(8L+@M-=M0>N,@K,>V1=T/?M'NK,\P8L\5PJ:@C/<H2@C2@A(H=/=E,BG0;M17I4;;(?O$7N)AH(EM"@L-@@$AE$;M';J*8>(::'>C(<@/=?,66&;;%A;$E<';G&AB*4J/:;)<='AB+AL)CI*;L*=F&=>8G 7?%9G#5B$ED#;P%BG!<F)<M+6K)>>".B*-=%75 35":4;B'CD,8E1EH$;O59O,AI/@F*>F,=F,BQ.DL+<H0=@1DP2EH-ES.T['GW8L[.OY9RO2PH+YC(NN(JR+GH,BI#HL)AH,MZ1LV6gK>P_2Od5`j=YX7Ng6TK,Hb+]^?YgF`oJbg+\m1Xi9F[6<N@>J2;C$<b9?D@=/G=/G=>$=(+($#*!2(1-)(.)" *-(%/6A9,7#*+!@A$:I+$H5010YPeS‹ \z8GmGFM3UV?v<T"?M@`e8g^_Ž:Ab3C[bIcGUd8>}.5D"AL!Pl(ir;]y!BS%IQ+3L4(?>*&6!%$6*1* @>^V"\mAfƒABZDNgMSEX‡nM–©U™y_‘tN[ml|JU]gT`7v‚Kˆ–W_œcbfŽlŽ|AaƒAOQN_U;P<X7W)SpRVcuWnyS}B<PS[~:Vn4YY(Eg01N9&/-*<&;['! "%1.&-(jZPd"[o)0U.:I,MQ(A]15GZcrQˆŒe§g§°r¿ÖošŒAwƒ=l’ZBf @Ul<]|;?b38F43fD;<1;17<G*NS*PQ tn-Xn@BbMVR/975`gœ©A_,‹1¢QP{,O]R/B,(3$FO&iyQle‰¥M{•I\w2\j1^Z'<R(¯š6Êö_©Ð}Ñî£Öèz—³o{£—›·uƒ¡P\xNEbH’LWŒ^BqmHZ_]t5Ui92Y6CRJ~•Œª«šÇŸàÿÚÿÙÂäpšJIJ(UNK>E5WR(4</PRUŠ“X`m29B$X_IFdh]Šiw…Y€«Xx7BM!;;&:E5`b'jc%<M.7F.H\<T]5Qf0GW1@O+FQ.Qb,w~0cp3aq7]}0bs5Te/PiADQ+OP+HO9PY9OcLPaMj‹H_zUcy<VtNqzTt‡ZpƒJK^4RjFVpFUxKnZv`yj†±o¦ÂLzƒ;Nb4[[-MU(AE4QP,TV,IQ*OZ;Zb,NW&AE/9A05?&1:#CI:8 %+*.<'3D+>L"HM33 +*D@^^*SBH=!A77ZLQA^hJ[>'22A+AR/\_Ljqmº @laOVi>JS53@-N2BI6IP4KJ4ON4OR7NO6OM6LT4LT3KN8MO/OT/?P4FP/GM.CP/AP/DO-CL3CP.JQ/GL+AM)AL):K)<K(5L'<M'>O*=K+?M*?G);D+9C05AJ1BK4>Q)<I/?G-9G&7L/5E);B,6D(BA'?E+8M25L21E,;?'6D7A):A(DC%EK&LK2GJ1?R/DF1>J0?F3:I/>L.EM.;I1GE5TO/ES1AK0;H-;H*:I/GJ/?O6?N18R)AI$DL)WU1ET2IT7=T+=M,AH-;O/8I.BJ(<N+9N,4K-6G0?L*@P2AN+CQ,@M2;P+2L00D2:@3?E%DV-:Q-:L2HP'BQ0>X(@L.AS0>R.9P/>K.@O07P0;H*8N.?M0DR@=R3<H2@M,GN0>T.>N.@D,1G,7C+A8-B@&AG&FP,AI0@O+>O0BE0BP.7Q.DI28Q,F>%BF'AU.?M3>I/8S-=@,=I,3B.A6$>;.DA#FN*BB.CI-CR4AJ0>L+<G+AM/7N*6@,=F,?R*@I2?X-@V8ES0?U0DS.E]0FY'CT!=VHR4O$C=#4K*1C$8=16C-2A$8L,:J-:?,B<+=H1AS0ZM&LH*[P*<P3QN2M]8KL2EP8E?4@N5FU,GD1\>0FV,ON+]J.WX.nt4Rg2CO0J]H^U:W`;fm:ZtBQo5bcBWs4_b=gd=SnBdiEwoFXtHMa-Qb&U„4bl@hk)qj>S€8`[-;]5%;$++*1('?-B@+=3C"3C,<03"(3=L'3= .C&+=4.G8:D*FF*=&;8"$)J3]V2|sR_bpœQtr3~t,W}/HhCCa0FX#[U"]Š4]qHVo3@k)3L1H\&NX4JT[[#En3IV2Q`DGD5]Y-R_+HaVY$-)::?,^V@`,7U/=C1Ug>e§cu{Sw…P¹;„£.«cˆ¨zTw^„H{ƒ.„‹Gf‡EvhLLu\bgƒj‡~Zg4ZfJd4JR5VqK0D#CN/1CT,?\;QRRLF;SG<N*4@IKplPmV-?P.Q.'G" G3,(!/("56RUNŽªLi~@;\'W\/|‚B•›=€˜(Nt;@yc95a™ ‹¦‰ÆÉ†Ìäxœ©dt‰Ae~Io•@d„FF^4dg1€Ž?‰›2|†?¬9lg/-T:;JGM^\>ZDXQ1º§Xáè8‰"-676;[„™O¾Úo©¾b‘ >~µER#T@‚y7„€Qˆ•L³¸Q|¬RXzHœJ‚–Jy{G©ß¥n§•Un„ƒ¼ž¬Á ¸Íp¶Åv§jw‰_~ŸJ…›Aoyv‹¦Ycx:c\@[eF9UF8G0ouI|¦w†¼‹ÎŒ€µ³ÕʮߪÑóm³Í@€7zŠ6ti5bg8Z\*nwQŽªa]u;iy3_QSf9JaGDbOUrlg‰WWZ)_U*m[7_a<[g?Yb6CJ)8F:Wa=_s;Yg.U_0c`4Xp=ZzPlˆGw˜L¤EYrDQ^<Vo7ad7so3Z\=YhCctFZhOyTƒ’WƒˆEkrAewM_kVg{BU^.Ri9K\=M_LZpSZt[Wo^^hdeuUaPv‹Ijo@af>`^7cf?jk6`c4V]Cpl6ah1ab*DQ(JX,MQ7DW6Q]3/ ,3'6E7LL7PY-;=:@7<7AY8QS&KS#;@52:4&.B+4.M?"9B0IR?agOLJn[o_M]F:VE6D4>?%;-6#0131*2.7.506/4+608+</?(O .G"+=#-8'1+-'1*0"1'.'1$7';$8)$>)+;&!:,"6+(:+)<+%=/"G8$DT,CP3EO0@L9>J1CE+<M.8E2=B-?I(@M*>O+7O57H6<D+DC"FP'AK.AL.JG,FI'MP5BN5BS6<M4:J1>F16O/AG/DL/BO-SL1@a4EI1@K3=S3>I1AM2?S1?T2<I3=M.?G0BO3HT5FX<NV<9^98J5AE$>N,;I-<J0=P14N22>.;='@G)?M1>M1?K*FQ1?U5=N0?@.?J$<P%;K/:T4;H1CQ&?Y8>Z0HW3<Y3FV5FX5>X3CR3@Y.BV.?X1>M/AQ/<\5DF/4I*=C.?M,DP1KM+=`3;M*;E'>E+FU0=T/=Q09N18H.<J+4F0A<3?L+BJ0AT,>Q0=U0GS.CW+?P0<P,CR*;N,CH(?H,=J/9?/G>*9;/0;1:B-3H3:D/6@'3D/7D)=N+9L.<J7<L.?K23O48I3<K2FM;=Q6>W3CT/LU/C`:EM(MR3PS%BM@E"BC'7I#;=9D%=D(?A-HK'BT1DE5DF5MT4DY,CM=IR3Qd3Wd3OW4H[.OS(CG(HN8SV,CX8QPBVL;OKES^6VM;be4\Z2R];W[F_eE]j6enKQi;hwM[‚LbS8kyKb†T^c9\_1dk>a‚?}yThjET{_SZ<:_D4L'OM-B4>BF#7K-;?(/D.'@''3&&6$-0>0#CE-?;, + 6? 78*4A,7I38H!GHAD#793ivJI„SKD?<_hii\ZkCMT/dc/`j+q5U…Ns€@Eo6*K2A9EX(W8bl2ij0Bf7:F"I`5\T)o‡@eƒ;Kc6y†Kiƒ.yb&hv0[\ECh:5H$TH"‹z9Ž‘N{}DŠeˆ¦Œs˜~W’ƒeŒ\…‘ly£z…—‡cžtB^YLeV8L[M]n-GF4:@usI`p6TjG@M JD*+DKOLa5Jg@9M5IV9'C3/D!'G#5+3-9@#JWLF.DWMC/;BA$MW"hc9iok>^OBE-_h?Ž–]^˜w-RY3D9-56&9%)Hf¢†sÅÉšÊã¢ÎÍž¿Z‹DoMS|Wss7‰Ž\I\{Zp”u‚……›£tœqaq7sŠCO^/CF3uŠV²ÜÅ¢ØÍ_’pL<!H^3bƒ„ˆ ¦j¤}—¨k“¤fš<e€LOk\diezšJq˜f†˜DYj9EVY|Œq‘Éwv²s|¥U§P†ŒYÍê¸çŠ€°“¢èl|ˆN}•\ª¬^§º‡»lU”gC]9lF7R2dm:tŒXž²|»Ó–žÕŸšÏ„¸É˜€¶¥±Ý´ßô–Êëk—º[‹œOŽ”E‘EeiOQYUMI8[XQptJeu7GN3Q[5\fGgfGij?nmDkl=kd7a_=Yg>\Z*US+Qa<evH^m6Xg7`n<Yg>HVCN^KjƒayšUŒ Ccw;dq?tyAwŠH|€=xyHo}Ey…HsUyŠ_”—Yƒ•T“šK|M…‚J8[o9N_1N\@LbFZjGWsBZeTYdK[w^r’TuƒQyxMujEpsPh{Jjn8khFoqEqzCfr5\a0Y_7OS=Y\CT`.OH!??'=K.DZ8@G.1=*/=2VQ/ASAXw@[b2MV)5<(,&,0/]V*K\4fe=KPB>D@KJA5D2+;47<.=C%3/ .!8.$ ,#)6Wa.J0*7&( '5 <8=:">;$8="?=%:A"=>&B;#CE%CK-BP7FK0HN3HP2EL0AW2?K2@I-FO+AR2@K2<O4?N*EG*HM&LR.7T9GK6;P-?G2BL8GO2LP:DV9AO.=K-8J.AF2DK)CU,PL0JP4IP4IP1BM<FH0HX3<U1;J5<C14I(7=,<F-AJ2LJ2LV1<\?<@3?L$AL-6F.:F(FB/:S1AO)@H(>I.@K/CS8JN)AT4DM5HQ1JW-O]-DW2FR0AQ-?Q/AQ)FY,HW2;X4?M0CM-JQ21S96J1:P+DP5AQ1<Q+AP4?U7;R/9M3;G+CG+8Y49;4EH3DS0DV,@R1BO,<S,5L-:F-:L*6I,=H.9E*7A.@>-:L25J3:G,@E%<H,BL-DP3ES2AS1CI-=J/4H/9B)FC+<N*HG'=@&?F';N*?F+9A&>@"4H%/:)B:*8Q(:D.?L,AQ.AP*CT0=O,5J0BQ-IR36[8=J(@N4EU4>T5CS0=X+FS1DR)?U)KW'AS+IT*@a5IJ)>e/OW-RY7T^+Ib4QO8Ge=L`:L\:TI.\Z9Vi0Wf:MS:ZV-OI;LN.TT4KO8KK:SR9ZfGu^4V`=S[DYL>_PF^`9TeOS_;cVH`rPo>`oIYuJ\`F]wSehRc\W_j:EU58]'09!HT?2=BF)DL0CU!4A(;?%>;FC>@OD$Ob@>]6Q 90!65"FL+2C*/L17>1B[?KS2T|?RX`Jm:li1x†X—ÈL…ª>ƒ‹A4b<BNGAV=9TC}h<…’!™ž›+—6“¢1sŠ;Tq/EG!Vb9m[.\o7O]KK`1p|EXqD^SCajCCM9P`>7R"‡e%z’_r™myª[gjl‹ˆvl\Ž¥Dv`QA895YzRnN{j;KTJ<=8F8BT+)L<8G(>M#q€q9\<Qi@pz/mt<:M6FTBc~+@>,mw:@€<0E)$(>E!*%*&&Uk16a:@<0TM8R^Cpt3Zj(xˆFi|Tsjepn9x}1LiQOSf]aD')3@"3>"0?5"„dt]ƒŒ\n‘§’–ƃˆ·i•¿J…™F£ž[²~dv?NdbIWUHfd1IWIaWHOWxiJty1[OP__Š{||Œ—Pùÿ>EI.gbO {vR‰eŽ©rÉÝsž¼JZo5kCHbAœšTÃeeŠEm†0T`TPf[i‚mªÉmœ¼hXw[v“†£¿`d~Uv‰jvŽdl›d¼|°±„ªÅT¥‘?†<‘¦=”›;‡‰Vw¥vYŸ„µ£”´Š —Œ¶˜Üÿ«Ú¸¸â¸Áí»®çƒu“`ˆ©[}•JykBYY2[X3b\DaREˆAqv0WY4`q>uqKŠƒJtF†wO‘’Esr@{z>„B†s4zj:tlGho:guAvƒAby4`n6Zn?N`Qe{[y–]~ŽH€N‘ŠL|†Z“ LyDnP|No‚T“›_Ž¢WzŒg‰£`’Q€‰V„‘Dk{8`j:LV7J[D\nD^~B\xD`n>UegeŒhxŠ`—šWxVoyUrwQo{M}‚Sz~TnsQu~Fms>msCkk@kh>\V9`e3dX/NW7RW5UV+DD%553@O,US@l|JN[>DN3DS"17 +52<F5ES?bj8OU6BO=si,^W'4;+38-7@*,<% 0* @ | ||
3082 | 834='13&,'!*"5N‚%g8&J7:5(6" | ||
3083 | |||
3084 | -@+G@IN$CH)@G1DB.>Q)C@.>H+EE-:G0?J2FG3FO1KS6IY/LZ<QV6FJ2CP+>Q2:G8IK1HM+NT/LV/MT2;U7DL36M*<E1DL0DO1GQ6HY5GT7@Q3=Q/EJ/ET*EP2NQ1RP.L[6=U8AH6AF-EN41M61=448#;?$BI IN"HY*KY,G[0?W?DJ-9F,DC,7N):E+AA'<O-CQ7CO3>P0>P./Q5=E2>N+KJ-DW6:W54L3=G3HK)JY3CZ2@W.KR/K\0G_3<R-7L-;F/9J6:E*5K%;H,EN-:P/6F0+F*F<2=Q-AM+LT)HZ.IO/MV-LZ6BX2LU6K^2Ia1BU/GN,5L18C'>H+HM/<Q.DE*IU.I_/C\,BI)7K,9D';K1AP7>K-9M478099*?9$=M-BE0<Q.>E-7J(8A,;B.FD*=N.GE+<A";T#=A):K.?R+2L-<J05I68G0EH0CI,;I6?W8BO,BU/CU1AP2>L2?N1?T*=X3>O5ET2CU9@S0LY@Cb/Dc:S_.J\>Jh<Ha=L_8Rb9QS;Yh5Tj4SgFVhMMo>Zi;Lc3P_3Nd-Fg5XZ1]`1Yf+cP1H]=QGIPnE]Z6c[<WG?_eC^ZBcY9ZnR^rO^yW\zNcr7afPZfDZ[@f€Fdx5Vb9CJ'JO"IV$MX*^j>\qJSc1fo,^†:dq:]7bq1[uKNV8Eq9<HIT-Hm@Sh5Tw.9Q)451%92+:576.ID1Dd74U>OJ\FYG1FGAM.H`07\*,E$'1$aZY]~jWrc^zV\wOu}NT‰AKi9HnDj~NnƒAfx@\r7€z@Œ’Hz‹;_Ir†@Qa5GR1xŽP‘kpŸ`aYb†`o}nu’Vh‹xjqHl‡>Waf„<CQLAC-CI(8H(5H:7;(.44CBD\Š\34#.M9’¢<šƒ3:*G/)D-)KQo#^U+) )&'47%#"A/C*8L%#0*(-;]`i‰]•Ÿld€[FT\KXg“‚£§I€˜HŽŽF'K^`5EIPVNL5aRPKSCgnB`~h˜›i–ƒ`¶fªÍnãx”’‘V‡QPTCF`1,(% -@1-hv9ÃÄzÔûv×÷tøòrÅè|ÀËuÀås»ÕRÊÐV—mŽ]¾Õo•¬„îÿØólŒRu–N5Y8`jhŒœgˆ¢IWmLAX?c{Z‡–…´Ú¨›Æi]w>q‚ZwŠu ¼FšžR§²EbrOpŽa›†„¯—lž‡§œÀŽ‹¥gW„PQwI]ƒDrˆfjlªÂнßz¶ÍŸ¥~‡’{|„–ftpN^Os‚^ƒ™Z¢ªQ‚z@ŽvAokAgYIptPoyNvD‰•L…N”ŒT€Odf[fsOehL„{U‹U‹K›F‘‹I‹GuuCuqPcnD~–Nq„Bmu?lz[‚’\t“^}†Z™”b{‰[u_‡‡Iˆ…QzƒU€Žb—©e‚˜U~Š[ydu”S„•W|ˆV~†Gvq<gn8fsCnˆIrŒLbƒQuˆWr‰Zn…v‰šqe}uYpoU~|Pqpc†aŒŠ_ˆ‚Rˆ…UŠS{ˆX{Nst@oq@cgCogB[a?il?^h<kl.PW5w€B‰{Enp:Q\6AO3DK-EP)GQ(EM3SWF\_:LP7@RO_qOlp*8;(*)(05/+;+-2 7./7/+9:/;1+:3(5,#Iw"r6&F8=0,>) | ||
3085 | $ "7>4?D CF/@J4CB6FJ1>N2BD2DL/CM3=H/>F1AH4GN.KS1FW5HR;PN<FG3AG3BH0JJ0WP-c[2Tb6D^;EX8GR5GV6KS7LM4NT1QS2[_=QaBAZ8BV4DN6MQ+DY/RK4MP0KM3JS<5K==:2M?,rE0X\0FV4?Q*NJ&NX'_a.En7OQ8D^8GW8QS/@O1GG/4P)E<1:L$CC3IS2QV7K]5EV7JV4MT0KY(OY1EP1KY9RX3?Y-BP.JR2@U3LS0LZ,Q^5A`5ES>BK1IH)HZ'JP)OO&BY(CS+DO,>T*?J$FG#HY0>U.FN2Y\2Gd>GV2UW5Gc5IU5HY1D^<LY3LT-LQ2OS*H[*DZ-IM0QZ2I\0NS/Mb4OQ.D\3DO-AQ+GO(FQ0BL/?I&;C%JA!FQ*<V/IM.@Q)@B)<P%=A*FM(;[0EH/HI-?b2<F'BE)?N-<J3:?$:F-:J(62$2L/:6-=@,9I*CK/@L3=Q6;P2FL.?W2;Q+JP%;G+86*6;-BK3@Z:CM2:O49S8BL8<U>?D7HW:Jc=OW@I]=Yd?IgCOd@D[5LX>JR0QY2Be>Hc.W]?E^BTF1Xa<>S-B^9U_7MnC^h6Wu6PWB^h>\dIV[8fnF`lEY^BnhCWqEQZ:[dQmJjHh;_p.Ql6[gEfs?}˜Pat;vuBh–S\oH\o`l‰N_R`_HtwC›=n€.S‚6^_F\Xr}<K-8)<7L?S\8Dj<PM+GZ"gX9KU/GQ$Y_.0_/P<#M^]o>^m?_u8n„=GV:X~At€JZ}:Sa,kg=€tQjƒKr„A€—l}¥v¡¿jhŸDTsRd~Ioh?ˆ™Uxªzg€ml‚H‰Jz—mIxcsƒlh‰z:Tq0AKO\eWY3^^-jj7OZ13G-7<-RV%\s+XmCGn&KK$Ugt?7=U$%!-*-*$!33 +%%*(##(=68o^‚‡A^N2DETo8KYlpƒš<hyfjvVy)JM6DK24b91F;VE@Ui<‚ŠBœR ¬„¸Ò‹Ï勨tl†{LW’zjQbW1SF99'_X$~l8¨Àc±Õ´£ë½Ly²G„¨+O{7T‚O}|q€œž³ž„©\u}g¯Ì¯Ãu‰›§¦ÊŸ¬Ý“«O2@ =<TrŽV>Q]jŠKxIgfjœv£Æ±{`:=PGJ]Y™€Íîx‰±q~£Cv†P‚‡W`xZqu\u„vyœmGiK`v5Op0Vp;Z~:SqK‚œ—œÏ”£Çu¸Ábަa…œM‰—=bsB’fŒªgŽžw{ŽW”ZvjIgmFH_<WhFenSx‚b}‘Y„c}ˆO|zQ…FpsD‰}Y–‹_¨—c¦›a ‘S–ŽR†ExƒIx„Ao~N€^” QjwWvŒ`f„X—¨`¶©]s}T€‰`’œQ’RŽW…”Zx„U^vPdyOupSXpMg|VƒKsyMy~Js†Zy™Zyœ\p‹ITz\s•zªfs‰w™–r—•\wUzySnmWhp\y|`x}`{Y‡f‡d‰—b‹žY„ŒN|ƒJsuLssDeoSn|KpvUyƒQtƒa…‚ŸQ_j;Uc;al<mr@xp5X^+A@/:?3EO/>A-9JH?UOK_.:>') '*')</!#,$ | ||
3086 | |||
3087 | 9=0@/*>9'>:-97/310F 'tf1"@2;+(6# 2=3A:#<;,=@1F:0>L*=I5<F2AF/>D1<B1<B/DA-EL'NQ6RQ5NV;PL:PK2JG6PL6SP/–W0j5bu;G_@FO9HM7HT<DZ8LQ3FP4FO7KT<J[<HQ>VO1X_/OU0KO4NK0SL.WP/PS8LZ:GE.ND*bH(TZ7BTGEL7FK3RY,]X>SbAJS;>T6<L1QI2KO+LO7LR+LC/FM%@B/TC0RM5G]8JY=G]-HY4ET2GU2JX-WS5Pe);h<NL6T]*O^?ER/AR2BX6;U6GK4IP)M`-O`6@_5SW4Fj;NZ6?\25M1DD%QM)V`0Ie3:R,PL+Mp<N[8W])Sl:Ih2P`4Y`7Ui/Pa3Hd3CU3UU9Ve7Db3AW7OU8IH2VU1_i3St=La/I_/JZ5Xb3Qf4N^5Pd+Ui.J`1Ld0^\(Pk3Q_&PW)GP.@Z(M^/M[)Lk/La1[f2Lq8Qe2KX1@Y*?F(@C$7I(AH$IO(BP'JN#D^(>R-5F(7F)9G)8N-1G/??+;S7AK+=M!=P%TL-MT3@Y-?M+BN$AP0OX&LY.I]5DP6EG4GZ7EY?PW:H]6LW6Nb3Sd1Rb8TY6Vi?Me8NW4L[9EV?XP/FW-[G=WU3FFFRM9MQ4NH:W\7RV;eKA`b<XO8PLCR`BVY4gV;hlUagHoZef=yz5xyFm‚Ux‡RdP`{[rp>w‰K`U[uJg|Bh{Ko~P˜X”Pi—Xe…]†œN_šP{(]8d‚FŽIv™?ni*LV;yyCkzVEg>€‰4[—'f{(gŒEl…B{’:Nw=LtE}„6jŽ0Wa?[m@cw9r~Gj‘Xk}O‹…B£X °\m–nwtdOƒTe„MxmIeƒgc†^ckUa‹b[‘bP_xg–fW yJaTWp,_2>d8RgGXvZK_Q5T>T\(HZ.8OFnJ;l—H%`;88?+Q=J>,2#"#&;78CB]"1T1C4C -/ %<.:7-=D"@A@,A&*.60&')%FMMC*N\K£ŽC;c(LI/2X.22 U_:Xs8k‘dY|zy¢€š¡‰‡®„‡ž[CZB0:<,=o18X;e5fo3˜¦Y§Òy¤ËŒ^—“8\"'#%,"&.2-lU>DEqJkZibXŒ¨|¹ß€—h`jb¦pH]f`nbAUxEJP0”‘W£bxWTpbDbRO`iWmD7C+6<<vne¤»¨åÿƒ²ÞWXbE^kIGg5Yl9oL¢°s±¿CޤT}’/Od5\zF_ƒA{‡q‰²‡¯Yƒ§j²ZŒ«Pz¡J’£XÎØrÀËd·¼n¤¬Y}—n¾Ê_~™GX_)eoGÁR©³Y•ªc§²g²¿\™¢Wª£c®Q¦¤cˆ‡h”f›’e˜ŒWšYœŒR…‡P}‹Hw~V‰¢j‡šZ€—S€Yt„Yx‘„¬lšŸW‘˜^‘že¥±[‰—e•°QkƒHc}?x‰Jx€Bnw>clJx‰Pw…IoZ‰ža”hn†`q’FlˆQg„||¤o|ˆfsƒ{‹˜^YŒOvxPksZqZr{Yn{\…n‹i”m…›g†£Wv…O‚~QwzLb{XgxUu€fuŠizˆhk}‰f„beuAO_LVt\p’j£S~9QM&1:/BL$7C)3=23C30A78<&, &0#!<--, <=;H>.>>+:A19<2:6/A#'`^*"=157+61-&-,!( 4<?AA#=C(?A+B?4=I.AF0=L2=C.<B1BA.=I0?L)EG.LS.K]8IZBTT@MV8QR@ZZ4XP6dT9PZ9G`>IU>RO9RZ3N\:F_9NS<GV0NN6PZ4EW:NI:_X-Zl6K_ANV7LQ4UK0T`0R^>KaALX6OM1JP.VN<NREIR6AO1OO)VK5MZ<H`>5S99I0KJ+=U'FO4VY+S_0VU0QL3GY0L[3OZ6A\79P.2L2:G';J%NL'T[-Od1M\?MW7:f1TP5H[5\P/Fj+BT5YO-Od1LS6Q\0Fe;QX4Pg9Pd:JY@FS/IT HX,W\9\kEWi@Qh$Nd6b\5Sq<Nh:KeAPY.bs5Ru=Td<Md8=[4KK3EW?TY9FZ9QX1XP5S_3PS9[S?ac4Ec5Q[0H_7Ma7Pb:G^8c]>Mp>GW3n[2OuIKi8Ng?di;Qp:Gg/H]4J_5^rDis8JpAbf;J}?Fe<X`4Ld.D^(YW+Ac.JR.G[1Pc3Ib3?W)GZ+OS*Gb0TU,IX(AM&@R.<N'JL(=Y*EN2E_9DV0BY.HR)CT7DSDTt@Id9CN:XV3fi7Gx7NZ>Fg4OX3E^8Vd>Wo>\dDGjAG`9H^;J`2Ok6Ok>Oc5V=Mj7QO$OU.EY+KK/GN1FS/JPHRE+RO4SK/TN3PP3Zk@ZXDWiPi]HhlJ^mR_`F^}dcwW‡Ql†KcqSJyPKV;WkD_„N_†Tg}dk”plYwbrx]qP}–]V€~B…ƒSŠž`€¶Wƒ:³Eš ]”¦MŽ¡;|‹eu€TuAq›G`’NN|Ifh;VJ]e\Ol=[w;_o1x’AŽ’OxµDl’cQ€\JwtbhupT`xE`xUNnK~tMdhPjVQmaHaTOR8C_j*<L?H.UoL8FZ@J6BE4HIA(B2/?,(DF+?7&h:SfÀ‚IF $ ')BM,Og0In6ii1Ja#*/&24$'(9%2+7&7K0(8((*&(#35&A[!HC=\xQXllBU3QL9]p(>@%Zj9ˆŒHSn>I^:aXMxvb‡Ìgn“dfhFt™'0-" VF<œžc¢Ê‰‡©’a¢#.A/&.656C>a\3{hUBM267/av_£³‹‚µ‰”¯_U…kY’ˆh{Ab‘EXq>C[-@WLf‘rb‡cOwN;N8@X0rgHƒ™Hsˆ-BS,S[FhXµá¤g ‰ƒ>—ŽF’Ÿ,^^7•“\bn™^‰¶‡ª”ެgg}5i{:F[=gr`]ueYoI†Xg™_n¢Y•¥[¨¾h¬Ñ“×ÿ¢àÿ†§Xf„[c‰sT’§S£Ÿh‹§pެ}¢¼q©¸|£Æv¤·lŸ¢y·už«aŠ˜až—`šŽT’’Xƒ]„{U†Oq‹Z¦§ošºk‘¥v»Ïl·º[‘œS…V€e‡¡p–©iškpžq€›v•e¡PQ‡š]‚œQzˆJ}Y‚•c¢§d‘Ÿgk}‘dnZw‡Xu’VpŽ`jŽj~]nou€‰~¹²g‚¨TIszOpKixIk~b}ˆhŒŽ`xŒkˆ˜lœ¤Zt‰U‚†QrsKjuN]|\wŽq|—e€šVZhbhbixHadB]h^]unŽszˆCQQ(@G2IU-8@'.=.9A+9;/,5'."2<"9%!2 A.>?">J/<G39G88@2:;+C)(O#Y& ?*.;(3=<(=E13G)29!,/,,:)>43H<D,9J,>D1?D15K,8I2=G)?G/=F.OD*EU1=X4HI3QP.MT4GR:OG=QS9KSDMS:jM=ZQ8WM>UY=YU7TW5RV4E^?HR=LQ5VT5UM4JZ2GS>CT7OS4J];MU@JU9LS4MX5MY9T^<Ie@GZ>PT2W[6SZ5W[6Ti9C]:AR2QT-F`<F\=C\5HM0MZ'D`0MW6Ca1EW:K[6S^9Cf:KR2PZ4Kh9NU1Cc/?U(EO%IY#Ma-Ra4Og8Pb1Hc7YT1Km/Qe,Lk;N`8TZ)Sq>I`6Fb4Q^8R`0Oj?O]9XtASg?T]8Q^9Zd6Sq:XoARk=Wd?Rf=NbCHhDQ`DPi4Sc8OsBP\CPdBNk8dd3ut8U€DWfD^l3Vh?^g<Te;mr;_|@[tA^p-[a;a`0\g4W\?Lh1JZBNK6][5JdWZ\3Oh6`]5RuE^[9[x5Fd1Oa5[kBDmKHT3N]DOl@L^<V`AOc;Ol>\dAQn7`c9Xv6Yt<Sc9_x4Zo;am<Ji:Qb<G\3QV4Ce-Aa-FQ5ST/Fa5C[2M]1Q^8La8ef3Uf8Ti9Rg1Cz2_\;UzSPk8PjCHa:RV7Ph5XjATr@JsDXf4Yn?^u>_u9Qu9E^8U`>Um<K]8`_8JY9R[,G\1NZ1Kb,_^+\m/el3t„3c…9Ru7`dCqe9_‚BUgHYl?[uCfuTj…HtpRv†^{‡Ik˜Bh1cf<„‘GaŒ<YiJg{Nƒ€Kj¨QpƒM^{UbqIpycf‡dk†bt–v†‰s¨fˆ”dƒ›`’¯vÁs‹Q¶\žº]ˆ [†€>W’Sjh[}‘l…|U{‘Mk—H–FsŽUaK[ŽW@gMKb;ER4_jG`m_oxi[ˆIA]B^YQ]wzCk0J9.€‰;… BI«3)>"EQzSP¢2}«J}±;L\ ):"3!'$*%)"),)W# | ||
3088 | |||
3089 | ECO;[R+(.5EM2DVNk66=#$)&, F.Dd7< KHJRFE?;[i/q€9Vo-h}9EH3Ši6„‘H‹ŸeŽœ2¨Àe“Íw³LVˆ=kvLV‚`pˆcxq<UgG~o[q-an–~Q¾ì’‚džs„g¡MgŽnzЉ3‘“-Š—2Kb*4F<.:R:3"b[-dvG ›u”¬iscZr=CQ:@ZI=RQafF>g-CQ,9I:iwC@T3hx+fy.^aX{•W@C4SI+xˆ:QRTN‚e<H;sVœºÌ€v™>Xa`Q_:T_Y@LsOYe˜Q{…Ev3LYES`GiyP^ui—:«Zr…s“¬y“ÁºÜÿµàÿ §ÊTk6kjOu—Pn˜ ÌŽ¿ÁcŸjª®qŸ©w›¶x•«l³l¤ªr£¢lŸh‘¢k«n•¢]‚šSyGj}J‡}¿Ü”§×†’¬ˆ¨É¦Ïü‹±Òd’–cn“gƒ¡qn”oˆ«^ЦepT|•f‘³j’ª]‰™m•£`‹™[§^„©tœ³ut›huŠ_{‰TguT^qSp~Ss•]{˜c{ZwŠ]}ƒh€†gˆ¡b„˜Mu‡KuŽN˜Qƒœd§p©·Zz‚a{™lš_a‡šT„‹PswEpUo’gf“em“VˆƒMaxWYsRepM`oS_s\Xp\UdF:G2V_5Rf0LQ!4;(>G.IG(?>-1%8@56& /<,;D#@E06E09E/;E/>@)D-"D K"@$%7$'B8)HH0>H4>G49I&>?CBLH@J%>M,ED&GI+AG*@E,@G*ND)AO.>F*HE0FP.GS<SJ0YR0YZ2IZ<TM:PP1HP8PN>\H6QT5UU:VU;ZX=Y[9_\>KgIJS>OK1IT3PR7PZ3=T6AK2MK0KJ+DS3GT0JT5AU6AS6LV2OU8TX9W]5H[5QX=H^6H_7@\:=P7IR-AW6FS6F]2NS.HX)LX5VS4Y\3VZ5Wa/Qp<Yc:Lf5NZ0I^3K\4Kf8J[1`Y-Rg-Qe7Qi=Li3M]6Pb6\j8Ww=RqAWcBIg9dg4Tu@YjBAi9JZ5D^1G^G^Z0Mv:KcAQaDMe5Re5Rg4Pn;U]>Zk6Wu?Le<Ph1H^1oX:W‚1Or>IfDX^7Vi5tg;j‡BQ‡YekKU€8`q<No?IlEGT7c^A>t@PUDIsAYX=am8IkDL];cf8tz<lŠ6Hr>E^/i`Biv7Q~IYj;KaLWT>Ux/Hj=eg9O6LV<YG,XV1Dh;I^5X`9\q>zd@QpAQhEZiENuB]e>cxJP~?^kKYx8V]6ug0O;VS5PX)V`.Rb?Se3OU.Nc6Jb9Zi9M]?Rb;Tv?Qf6Z_-[a=Rm@_|EXp9[a1^|B]jBY{C\o>[l8Zr>SqCdrAfyITr:ay7an;[|@PrAQc5Zp3Wo6Kf6Yn6V{>jrA\xG_nOdˆ_cyPe„Alt>eXOj<Xh;gh:gq>S}a[wKp€WRxV]~^^|P_El‹U€šQ€‹7vŠD€™dª˜av¾S„‡H{¡T޳P©NŸN‚¡e’¦R¶v–¢j›g–š^w yˆ°qвa}ªs”¯g”»i§ÀƒŸ´G¯¼l‡¯R¢px—]~—V—›Sw¶Y†žF‚–)±Jfª7o~FEÐ>WL>VnfLM0MU;(B]=UKQ\0RcCbq'ULX&!"1=.7…ªf6]Z;:V<RL/M'&4(4#*28#2(& | ||
3090 | ! | ||
3091 | !8 &&<=50,".D57FN`CmŠ6+D$!%4&(8..3DeG=:FhmAV_32>;G;LtgRžRŽŒH’»eoaw|u™qŒœogi„bm†Ga–RCV9;APŠg¡àXz…XVjLv‡LžÃ{Šª°¢ãp~¡b‹–j¬R£S‘²qžÎ€\Žq7H.AP+CPGI!LMFOW>‰™†gˆ™NtPUˆ™1AS,Q\/jlKkh*@IptD}›Kz„7bpVnƒE=TB\YPHF'{s?ZfB[W7>F-LQ4iƒn|Œwˆ ‡„—MNk0MH+OK7O]At†Rl‰hŒ–m“«Fho7HZ4HZ?ENLcZo‘`b{V®³ct”rŒº©Æ¥›Ðc„–F]rTadެ—·°®Å¢™½‹žÀŒ›·}žªp¡«dÅÂ|¶Ó€Édž²¸x¦±v¦yŽœk˜Z†¤a‹ªe ½‹§¡¥„±w¹œ–Ï© ׂ¨»nžY{š\z”rž³_‹gŸ«T…£c”²n Êp¤¸i¡¯v ²fªb…ªr¦Àg¬Tr~U‘W|“HjxN}ŽSe~[z‘g|“amŒfˆ•VyŒd†˜`‚žVsŒb£r ºx¶lo”„‚®jŒ¬U}—g‹›_˜q†¡fˆªa€žOsŒWi„Se{UUn]ƒSpQ]rV]{VM]OYoPc|R~;R\Crx@XbGZf7TT/HG4GP/HR(RZ"8>>3&< C4 | ||
3092 | <>!BC-AI.@J.7I+=E-=4&=":9"7C4FH(GI,CK0AJ1LJ)NH*IH,QK0P]3VQ2LM-PN3SH0VU0XW-H]0LQ8HP2RV/V[4`W<^\8_W:QZ=SX@TT4LW<TK:PY1_Y8Ra@P^?M_BIW<RM9G[EPP9TX1M^4LX9J`6BZ<GR/NS)E`,NV1PW.?^4AT6ES2RU+P]-PZ1V[0Jc9QW;Fh3K\<?\7JQ0E[,BY4?P0CT*DU(@Z-=S.GO+T^.Nc5ah8`uKThGHf@?[4H]<CW6LY1<Y1BQ1G]-K_9Fc6B^<HZ/G`/Hc:Rd:IgBC^:PY:Rd7FtCKb;N`:I`2Ic*Aa:VU-Gn7B]@T_7Em:MZ3Nc/Gb@Eb/H]:@bIE[<S`3DcAN`3eo9YyMBwIVd>YtAZn5Q}QZkOdw0nŒ@_‘RXƒDfo=_‹5go3LvBEY.Rc3^f=Ms<_iCO}AYf5Sp@PjHKuESd<fm8atAYvG_l6To?vv4R8U]8ZW(`NSyA]g>cj9apC]q0co>Zƒ?kn4lxL]{;Zi:WvCOj>ToC[‚NWn<ooJb~=Qu;^sSOq=Sd@dqB]@Pp>S\8ak8fz4qw8U@J^1Zc@Rp9Ko<Xo2^nFZ~=fsO`v?VtNTkDapFh„Md|BZtGX„SmŠDd“RX~Gf„HkyDb’J_k@Vo;_o@dw6Nc>b~4OtGKl;Z{Tak8NyHQk@IfJei@O~LgzCKd<se>gzB]{J^=pƒHQLXh8jCP‰XdwGh‚XiyXg‡^‚‡]‰‘a‹Ç p€XŠ¡]’¤n~ŽnsÀc‡›_„¤|~–rwŸvr©m‰ c’Át£¿u޲k¬iš°_±}”³}š¼{аo“ǬÂpãx•¿Z£»m„»ˆ¬´—Îe‚£m›fˆ¿_‘¿…s‘D„šVšFŽ:u†"u{&MY*/CL`j&XFk;f{!>K15Mf@W-Yu80W'DF/,B)27 6XBC+Vj.5J',"#) !.%>*2(108 -"%H:,73,A1)$GP:FP[QB eUK€"*3)JS4T^'alLx‚L„…,|”,‰—MmŒtƒµ‚’—}ÉZ^`KNkRIJQvNPbS†rr¤[}‹;Vb'gfh`’qGEAj|A‘XyœpdŽ[Wb^…vSµm¹Ü€¯®eÉ瀮ç~ošIw™9Rg5V]?jy?eg=Ys8Gb[5JB/@/(?PVƒk’HnŽLz‘g‡—a‚‹,g]^qY{|‡ž{„¦fr‰7TxI2F2LOHQ^;G_:BX,PUA³¥KƒŒRj†U?LQ[S/Š›@fpP]|Jjva•›b´ÆpNiW=E5JU3=I,?C,W[DtŠ>jtPk~l]iPp†^t_rŽd^€ITn6CTMJ\jw‡ƒŠ§’Ž’r‰‹ª¶ˆÁÚz¬½v¼Ë¿ÓªÅÙ±°Å¢«»}¿Æj˜§p¡´tŸ¾e‡‘p½{бm‡žl~•h‹k„˜|v£’…¹r†¥pX…šr®Çz©¶l˜³gz˜]x—v¬É¶Ñw©µs©nš¸n›³w¬¹®Èd~˜\s‡J\tFYoKn}Mq}TŽY}WrŠe~“Vu‹`‚žXz›X~™qœ¸‰‡¤uw—dfzo~š~—º`z›`y—^x–e‚¥t€¬ks]}Œ[v‹VyF\bPanIR_OaqTv{QXmJgrM[{`l€NLX\zHT^@KUDMZ7AF3Q`7I]Pv”>r{?,& | ||
3093 | B E9:E%@A.AE.AG.DI/EE-?:'91#0BF3CL+GJ(EM-II0NO/OL0MR1WQ3Z[6WP<SN=MM<QL8WX6RV=Fc?S\APb7N`?N_8PS=P[?OZ;ZY?cXEOV;SU<QR7U[5XZ9[^DX\BYY>SX:IP<OS<SV9Tc5B^=BS;SW3O`4Ab2>Y-EW2HO2JY+I\3L]3KZ.V[-Tc0Oc5Q_:Rg;I]=Fc3B_8CY5LP-R^)G^4E[2CR,LU,G],DY3JP&EX.@X4PS8Q`@OcDIc?C]5O_2B`,FT.HZ3S]*kg-[~5@j;E^4LT2Od*A_:HZ0P\7?]5P](Qj8Gb>K]1R[6Nk2Ca6H^4N\+Jf4Fb=FZ(E[=T_2\l.No:Og-M\4UW6Ke0K]4Fb7;a3O\4MiFZk>On=gf/[}AjfDc@d=[‰IVqU_qLr‡GT’DanHH}IKc:Wq5Kh>PsBMr>WtAb{>]rBr6Hw?e]7a‚6^ŽHZnCYy1gmAg~5U|PbqCLxH]p6oŽOi‚DlŽF`™FLoKjk=`‰F\€Fn„Qg”NlƒGj”Ma‹BZ‚:w‚5X„Kp};WwL`iJ\c7Wg:pm1rr@f„>ax8ju7j…EUmH_€JUyQIg<Pg1al6Ro;Pc1ul4xSpŒ?j†Lt‡@v9oŠ=~ˆCj“HX‚LlsD]|SVwWPzMluEr…N{…YlƒEw˜Djv>y‰Hf€HKm8az=d€=Ow:]p4aw?gy8W}5^oA]‚?XoIyLt…:c‡XRvDY}LLnAfyPcy7`}Ah}Vx…@r<ky8ZQŒ•OxVrjp†DvšeŠ¥stšXjŒ[jT}ŠVrjj„Mj~Vu…Xv—~›vy¸nt‹l‰§qˆ k}¬nˆ”€sžjš®|³©x´ß…˜qµ{‘Æy‰Àr™©‡• z«°k”®n€«k‚›^` hÄv{˜{“ƒsžnm‘Ih’({™Zo¢?—–`‘´dm7Š5Q€7RvYCf(C?!JU!\CMM'Gu,7AA3Q,=F+792/;2C$bc0_y%=N))>$"3%1QA%Xi=iy*7C.?"A@,_W<}Šbm?3<mL¤„/GY>UL:ˆ¬\mrkŠ¢lrŽo[mzœda†h^vil‰HYuIa†At³…bhE› pD`UY`p`xLVrUdhO¡D³YUwv?aQf|UAa9`po… y–¼{𤔙µ’nsoZš›`‹°Au”?WoLc‡QrŠNBg4Rk(;B.C 075BLKns^Š¡S„yir–\ZyFLi9R_8@WvluwTER0id'rw9‚™:w.Z`.vs8€‹msnVcvOªKs—W)EI$3AG[Bq‰b`pb\b}F[-Y[0§§H—£1=I-APIZj<Š—Mƒ Dž<€P‹£W{§_sŠM•´>[m,UaC†’i|–k’£V€Œ_§´…Ê܀ªÄ†®Å~Ä’ȼ‘¬³›§¼œÎÜ“±Ã‘¸è–¾Ûv¼ß„Šªiƒšbƒ–_h…bt‡cw‰ge‡hg‡ja€\u•o†–§œ»r‡«J˜o’𴇋³o‰©|ޤw‚£v—À‡–®t€Ž\|Eh;iwBszKŽ¢Qw‡]|X€—[ˆ“Nwƒ\l€]o”dЧu ¸x‰²d„–PtŠVsŽu…¥isŽZzŸnŒi‡ªq| eo…_wŽYlƒfwNxŠ>l|A]oT‚Ÿi’žaq…Xw…F[sSHX@JNM]bFlj:]bDbm:QO>e‚LezjƒœlŽªN * | ||
3094 | < >4C>'5@09:)G>(CA/DE,?:04!#$&4>'AG)HE,DJ)HC)MC+HJ1WF4TJ3TH7^I<VN8QI=JL6DT:IL;AR;JN?EW4@U=?Q8FJ:JU7EX7OP8\X;XZ9GMDJJ4MQ/VR2iR9]V5\S?WZ8OS8KZ4PX3TY2CX;HX4GQ)WR3Gg5RX9FY0FW1EW/EW2@W-GO3LY.WX2O^:RY8Zj9Pe@Nc6Da3GQ0GV+Nd,=e1=V7?P#>T(NO0Md7NY/K]1N_7H_.L[/Fh7M]9Ke,Dc8M]/Uc1Nc4Qe/Xl<HpAGbIKU/Ma+F`1T^4M`6Rb2Md6Oe.N^2OU2V`2[k7\t>ArBUR3hg7bz6Wn7Sk6TY2Pf,\i7Tr@Pl7Hg0RR/]f6T{4Jj;CS.R`*Jl8^c7Sw@js6b}DX{JIsHIjGZpN^wWXrGLtFXgHXnA_t@[p?^q6Oj>Go3M`<Mf<Vg;kr@T‚@N|X\k<mrAFI_^IYq?`}Fn€Gf„V\€:OlEWn9_yGl|KPŽM[dBSu>vr3‹GUŠAW|CI‡LfjDa€E[zINzAPr=`tG\„>Z…Vky8rŠD\€=d{:nNm„Uaw?{~B}ŠA}Š?Zˆ7Nn@]l;]r/f‚9P†?Tn6ad6\vNe{Iv{Me…QsxOq£OZ‰L^ƒUm|HV†Gip;eF]B]j3hrHw…IqˆQqˆVS€Pj{TiŒPYƒCYp>m{<m’<p‚?q‰Ml‹LfJ{•Aj›Jl”<h”Ba†Rc‚Pb€4^w?Uk5vƒ6p‡Nf†DHsBbKЇSd‘OY}Au|Q^VewRt‹J—^š_„ƒUx¡Ue™Ht„PvƒL]ŽFt{9s—FnŽ\w—Qj§tjƒDs…Yy¡Wƒ†bi„Sj^†™f¡ s–Ì v–sŠ´mŸw›°vŸÓn¹Ôs¡Í…ÔÙ•¬Ög·ÿs˜ÅzĘ´Y¢ÃY“µiĨJ°ÐR¯Z [§¨‚¢Ævt¦bˆªjx¦Vƒ¨Q§ÀQ–Ù7©ÛSŸ©_“Á5¾È^¢Ì*£°A .t}u’*u‹+˜¾5{šT@WWl\,P{.vM ‹¬ui1\eJT]Lq](`i)OM+œ¤IŒ¯q}œpqš?\rdÖ¸“ÊÒ5ˆ¬I’mŠ´Z]¡bCTJUx?clKvx<yw@\€^YyQ€¾Rc{I²Y˜ªv Ÿ3‰œAn—mH[T˜™[Szq]ecSv3E?2n“Vw‹1 ©Z—ÀUµ_‚šYˆŸ^“¯V}Ÿ\›¸ijzjjŽZj‹=›N¿îa¤òFGXJ8T&FTqy*œ°3…”e€W•¿^NlEj|>WŠ8Pj6Kc/GLPddLF† I|™\yµi’¼Ks‘TŠ¥kYˆQgxH„•VžÌ_v30AADewJŸ¹pau:bx>y„=‰£Z«½‚¸Ú€Â×< ¯<j{M £f¡¿a‡›f¦²d®ºnz§€¦g„šn‰¥F`†Mz„]|…^sijˆ_¦¯„´Ï®¼‰”½~µÙ}¶åy–¸eˆ¸|…´Œ…°‰¡ly´¦æ•“Æx{²k¡ÉƒìÒXZrWs‡q}šTnˆUm„La~Ud€ZœT[||z˜uZs¦m¨nymq‘mšn|’hhƒllŽk\}^`zTjƒWq—Ho‹Iu“QŠg—¨cŠ¡g‹Ÿ[s”_¢UbmQm‰a{u€³w™¿q“»]œWfƒgv“Wc‚[mšrˆ°†¹iŠ\v‘`{”[a{V_cˆœ\™Ux•crŸ~}”TVyWJoDf‡@MZ7GP;N[O_aErƒ[r”_ƒ…FgXt–px—sˆj# | ||
3095 | 1D+53%$5)(,'6*%35#34*:0)0$!!';B=!O?&NG(CG-H;3E9,^<3lD.cI8[O;VM8PP9RH1FT9DK6GN3QJ2EV0?R:>R3@J.9I(CI-AG+=P,;P29J86J2AJ+]P/kV1\T4NT=LS=FU6GR7N[1Y[4NZ:AZ3>U0LJ.S^,T`9Ve4Hd4BT1:U);N/CP)FX+K\/Za6G]5ZZ5Fc6OcGDc4QV8N].Ba0BR4NT+B]&C[,BV)GV1OX2Mb3Kc1Mc6I]3Ha9E\9B\->_6<[0L\,\b7Qs<FdCI]8M^6PZ*Rf3G`<Kc/O_8Jl0Rj:^g7Ze:Uh1Rr8clCt…JN‘OhZ5nr<T‚GKnEFk8Rk:ar/hw<qyOZG]tC^n5Wv3^w8UnAPg4Pd3Zn1Sn9\k8a=^wMX|SZyGQm:Yh/Xu=b|H]s;^o9bx;ax<„‚B_œMNzB]s?Kx<Je:Yf4Sz9dq:`xH`z9Zm9g|EUv4\oDhx8fD†Ff•KW€HSu>fv>_†J~~K{Ÿ?\—>mu6sƒQV‰OYs:QˆK^‚+k}JZ…Ajz>YŠ;]ƒ2Rq9hwFM‰>UtAf‰GbJYyDgwKUDdlDs›he“di[jHn„:iIZ†F_~HWy4Qy7Z}I_v9Z{BirUi˜Is‹^s„Mk‡CUs=Pr9cu8_Cf‚Jf<gu6pAe‰R†šF[œTfy%yˆFeI‚“>ƒžDjzEuƒHožGt‚Io”An—Pp‰SnŽG€ˆ@…¡I†·DrªY†Ÿ8wƒH€˜J‡–@s‹Im‡@`Š7w…A”¦Mt¶Bu†BhKv@{¥^”HŒ¤i…˜Rq¥€zE¡§U¥R†¥T‚ªLk£H™‘QÊLcˆMŠ”Du¢E„˜Up¢\j—h“NrŠYqœw˜Ÿ‡›¯ex}sŸXr‹q}„£Ï—Æ‘“¶žƒ ‘ºá°”³„ƒ©}•‘®~ž×w£È‘—윤¹l˜²u„Ïy™¤”žWoœtšU„¤‚…§xŒ£}~¢˜¬¼„š½•¬Ñ‚“½ ¢á±Ï˜ŸÍ‚‘c‹Q™™×Ès‹¼SÑÊ[Öôy¸Ñ^Àí‚´ÏrÃÿW¤ÒG£±G £T©N€£|·³f‘’Fœžl„œK°¯{˜Ÿž“Áváà–Æju{S}Œ-Œ¿Rb4dcOThM…“B„Eq•SctLq ^~–kGUwVwZfWgˆW<Vq~‰<‚ŽN€¿M]|4„…[´³z€š`”‘isŠÎ]k_°Ífc{^– veŒE‡H¥ËuЧj‘yF\f.M2CV8=T5{cŸÍ{™X‹°dz¥hTjLDcO\~Sp–A}—F…¢A“œa‰œ‘v¨]w›GXzEcs]d‚bfšnf€4kzZ}©Zc\EY:BRq9[uYVo^s“;}“NqŠaЧ‡‚Òå’ŠÁ}FXRNPK†™}¿åx¹ÜˆÔÿšïÿ˜¿ßš„{¢€y’R§¿kš©n›°`‹œTw“^™¸}Ÿ·|©Ât«}‹Âg€lt›BNsFkwR`‡\`@JfW`ƒm]‚Wr˜dµÁ}žvgy?`tZl€ao‰Sf€O†šT[€U_|K_wTc‡hb†N`ykuž\hOo“hf‡gjŽO_JWxFVuB^qIVnSj†Y}¤Yv“[ˆr˜¼pºh‡©\~–a‰›Zz‹H}•ayšq–¤x’Áˆ•Àp€›PQd[tUm„Oa‰`§pz¢qz”iže|“SfwHgVp’w‡¨_€ši€œtkŽGQkARbOj†Mem3>F6V^<@QGj…\eˆnoƒF_‚Yg‰ptdq”c | ||
3096 | / &&&#%"$()$#9$+!!/<1D6!CA(<D->80?;#E8.^=(XK/LN@OIA@N6GL1HM4FH?RL4XM.HT2FM9@J(DF*?E(C<$?G&>P/=L*9L.:G-NK#eM&XT1TP??T<EM:BZ5>V3KN.JV0>W2HQ8FU4IO'KV)O`5R_=Bd?HQ4EW/BQ1;R(?U+GT*QU-Oa4LY5H\3H^?IU4D^5AX6E\9EW/I^0H`1IZ1LY,B[1eT1F}4J`7Ua<Vk.Ml5;f3DV,Ea.B^/FX+N`-Pi=Kg>R^-^m:lh7a‚=M}GLg?C[;M`-Vh0Mp@Rc;Jt<Ma>Pl6_rKKlRagDY{?JsW@bA<W3LV4Ni3]c=guBY~PUnEa{BX|IWvFYwMel;^w@O~8arF^{5YyFUrI^rH^wDezFn„>nŠIc@^|@U{LotK|ŒEl˜Kp†rfNe|B^BPo2[u7fk>R<\lD[€DiwD]‚>f{KWo8Uo8PnA^oDouPMGLiHVi4RlM_zFZ†QOwPSmA^pKmgP_‚;WsCWl3bl?fˆKsŽ?qMbšE^…>P€;RtDo9e‚>n}I\}IqˆA \g;f‹Iiƒ\fzBY‰Oa‚JT{Lc{Fb‚>`…@f{;X4by?r‹;x—7|Pp‰PpŒLV‰MOwAZt=h…8eˆKt‡Kl…?d€=ŠzBv¡Jw“KŒ¦\}§DsƒBm’^~’K¨^ˆ›C¹G|£Qg¬YŠ‘H‘«S}°IŸDržSv„M}š]p˜Tz´V‚²SpœJ~Ÿg¤XšPkŒSgƒ?s¢f†©†_Jf…RqŠHh’So‹Gr‡^l…On‡J„œKsV‡¢[s Kj[r‰V’ž]fšŒŸ¬R˜·TÅii¢jr˜X„–]qŒV~“[zPkœT†¨Y…¼[Œ’U˜ŸM“¾S™Ìw±³‚p§h ¢J’¥{Áf}ªY—ªl^ µ{¤»w”ÑœÕe|¡ky²{•«eŒ—d†®W¹T“°`ˆ±[€©S³T¦¬pž£Œ•·Ÿ¨ÑaŒ•¤Ç‹ÀÀ‡”²\‹›P–¸i¥Ó™—«u¬Ã‡ÎÔ®¬úŸÌ‘žj·ÁІ¶w©Ð¦§Éy—ºj¦ÉZ®Ù£¦»_´³fÚõsÌY Çr‘©¥{¨no”N¨XЏlÂÓq¶»b˜°Ox™bpbužT¦¤Lt€Wœ_um:mnA]v=œ¯h}¨1jxeWƒg˜•a…–LŒº~j‘ƒ„¤yGym„uFb‚\WqP`n€•B«®^uŸSŠ`•´†Œ^muDWx3KZ"KO/qˆ8f…T`flš¥X†žTh€Fm…JLq1W~_ŸZ`‚bvž^€¢p|†ÑOk’]bPSt;aoFhy=QbA]jLcoZQk>py-ki9YtG_qF„Ÿ?bxGt’Tb„^‰rzœr¥µ¬y¢Nac0«K ŠÑüʳ尛ÃÉ ßǢƬÑêzh|apŽn£²ª…¯ƒÍèiЦW”i‹ŸoÅÎs¢Ug€WW}AYsLBa7Nfdˆ›Mˆ—T€‹8IjEOhVe€YmŒWpREa<[tJe…HTp:XnFbzTd‚Ba|LqŠLZ|Qj~DOcH_ySzœPp†P`uNt„<jxA’A{Cu‘E|‰H…—Y‚©b…´c¥¿dƒªf†¥f˜¼o†žUk…Xj€Px›\}”h|žk¢p‚ªqx“OhyPn‹S`Kr”Wy—`u‹co¢g޹yŒQgzIa„cƒ¨m€že|†`k€WCb>UlAjwKPhIWb7;=5j~3Yk=cƒK^vWHXElqGcq\_vZTkS | ||
3097 | #6"-"'/&:-75"0:'16%55!83#G<&[C(WI8MA8>H2<C5BD*FG0KG2OS/BT6>K6BA*LB'JG(O<(AL&>G-<J*?L(HI+HM#SQ%DX1OS7FV6QN0MV.DY4BO+@Q(=R2GM1BS%HW/EP1QZ4G]7CX9?V7>R.OO+C])ET+UW(H]&F[:OZ2M],I_9G]2H_6IY0N[0FY,QY2@]1BX6MV0G\,v_0\“:WsDTm;Zm5Qt:Vj@Jx3W_/Ge)HT-?_(O^4Lc9Tb,bj@au>OzJSePVl0Jm4Jb.Ng;Pk@Io?Jc:Y_5Qr:Kf?gg?c{@ko>j‡MS€LPk/l\*d€/l{>g…;lJi„Bez8XxHTu>Yc=jr;n€?\Œ;hpBj|9Z…JhsFcˆ@W‚N_vGg~Ne–URƒQVqBTvDduEu~Oy [eZf~TV„LV{@LoDsj8_y>cAcsA^p;bs@ZrDanBczB\h2kn;Ty5ew;`L^l1Vx7\k=Zn7Zu8To;^l8f€9eo:~‘H}ˆGl„HV:Up?kw?‡†[s¢^[™GXvAbv5Hs/UkEdqFX…GCkªZP}f^uB[ˆ?Z{KSƒF]ƒC]}Bhˆ>g‚?_“XrˆCn‡Jˆœ8m“E…´SŸ©\e˜LoxEfŠCY9U|9h‚A‰DpKlƒKc›Bd}>tfbVc ^r”\X…NjvDf¦gg¥a‡‘]™ijÑpvž]w¢Dz¡Xz’Q}²Wx¦`tŽS’—V|²Nu„O‚žZtl…šYÄd{~g„ºSy—MŠ¢[l—Z|‹EuPo™AiˆMyƒOm§NnNwCv†Ye±Ve…ZjŽWxŠ>Y†@}‡Ly•J‹y]~“_’w}¬‹¯ff¦SpNu–O…Dx Sq¦gŽ£y{—\o¡_¢_’Ö…‘¿tyŸYn‡Jƒ¦^¬qt [‹™h‚¥cŽ©g‰³w™šr£jvŽD–¶p£ÀVÁÖV”°rƒ»w¤¸o–Ût¥½U‡³R|•Zº[Ìb¢Ø{ŸÁe²æz²à‘¶×|§áf×o£Ø•™®av§slš|‰«“¨Ó•ÜhµË€ _{²…vš‚šc½ŠÇƒ•©qšÇ‰Ö£ž¬”œÍŽ´Ì‰”¼p£¨\¤ÂYªg¬ÈpÐÚ´îÿ•³ÕiŽªi¤Üd«Ò^£Ïy›µWv»c¸±c~¡XÐæF±Áa§“b˜¾Vƒ‘Aª®p^dlQaiSƒ·YPd-YqMXa=w’>|}B‰]t—”x£So¢`xœ|–³[†‘Fn‹C™©du£D~‘L‘žQ} N³cšÈi™Æ`·ILS5p>œ§hyDzKk„\`—R`nOeŒGxŒJ©A¢¹W[};Vp?r‘?Xn<PtCtŸZqN¢R} Qn„XgyEiwA]†Nhˆ]L]J”xz•Ls~Oœ¨s›fŽœ«°â}€‰x—¤‚…§€‹ª‰šZ›³hr™w—´m‚ €Þù¯±ßWŽ«g€˜e„›pq‘RTh9P^5Te7L^3\m[•¤x‘¡OrPUg8Kc@oyJ[zU}…C\]5Le<Vi7Pg@Tb?@W=Oc@MhQNp@F^HXrAK],dxI©R{’Ml{>oIŠSŸ¡e©Â`´Û\œ·_±¸[¡R©m–Ãj€£c€¦f޶ƒ£Ãc˜ªP€•cy”ln•aj~C[qQb€Yg‚Xm…Zt’VayM_``Œci_bŠ…¢ÇŒ½ÍSt‰Ic‚e’®ns—]w‹R†‡E\b@Y_OZlKSc><L0>Q?ZxIeGp‡Af|?Q^EUYBLYE\cEPcN 4#+!&#.0)03+4#+3!3-.991&S2Z<+S=4D@5A>5D6&FB'HA*IS(EL=LF.M@#EG'GF,OH(GI+>H1OF,IJ*II)BK,GK,LQ/CY7GN-KO1IQ.FZ3CR09K,<J(AK(CW&OU1@\1NQ1XV.Ge8IT9HN.JQ&M]0Lf/Ka,Fe,G\5FZ+[[5S`:Xf6Oi5Pb6V\3Bg.H`9J_-L_/I\*V_0fm9J‹IHrFJf@Qc;Tf7Vt?St=Zq=Nt3Gd3K[+O](]l1Ys4Rs?WeC[jFax9^{7UxATo9`v=Vr;Sg<Hc5O_7^p9\mGXv3dzMg?YŒSPzTQn6Jm/\h@m}Ki“E`ŠNa„V_{OauOOuEEu9cf8wt?X‰SUjEeuB@|Ij_=VyIOp?IuDpqBe’AZƒTVqB[y3_zDiƒIg{Va‰RizNk„GJz;ee6ix3hP\ŠHcqDiwA`x=|v@W6Xq>`h?eCMHVb.RnAYj;Ys<irDQrDal=PŠATg=Uu?`yAeqIt–T|]}™Mm—EfAhPQcš\R„;em6JyFel3P€5vsGhz:\—aPwDWs1j~Bcx8[n<^ƒ>xƒFk~@[„Jmq<bzFi‰LZ}UcŠ[v€RZbtj¥?sœ`euIW‡=as/ˆDo”XwŠOf’Z[’LŠD“¤Xj¤Pc’DuDj9h‘Lw–Sv‹Gv“PxŸkƒ”J‘¢IÂa…ÃI™œVxžW„ Ks–Ln¤eg›Li€Hˆ™Vz•O‡±‡r™W‰£v¶Ne«_|¤Y‚©Mpš>zºa}¡QP‰˜O~˜O^ŒI‹œX‚¸l”¯Dr²M†¡U’DxŒR «lÍG‚˜L ¯Vy¤_“£U”·Wz¨J—®Q} Y„´S–½a˜´W°ÐJºRšb›n¥cŠ P‚‘Aš–XqI€—Uµ\z”SƒŸ^ƒ¤l€“TŒœZsL‘›`Ž˜ek–„ uvœc}–f‘²~†Ã‰—q—¶Dv°m•ÎŽƒÉwœ¼r—у®Öª™É‹°Ú©ÔlÇÖkŸ¡k‰½f©ÄM¤¨O“¾€žÇ™œË|šSnM©×E„žSeŠ\ºr†¿k¦¿xz¢z½kŒÄ’³{“°x˜Äe˜±sÆS“¸¸ë’ÄæÄ¹á‰»æxàÿ˜¢ÆzŽÀyºÔwÏílƈ¸¤W–³‡«¾yukZ{ˆ¦b§Ì€Y†Edn?ƒC‚yX‰‹A†y=zdK{¤p g^yg¤t¨ghzFpnVa{…d‡†qˆX|“‹y˜^™»c¥mª¦dn‹`£ºnbnm‰–YœºE|¦dl“oTdMyfh…WO|Bˆ¨=s‘Oi‹_}lmœ|Pu=OfAV€g?q:AbEw—`z—Rš´t¤Rp‰Pb~Hb„?SsFpˆEuŽGt— J{”s…™……Ÿeq‡rj‰ok”qtªÅwœ½ge‡hPtl¥qx tj|tÖã×¹Îgv‹csku~P|’RŽ<ŒA‡¢Ax~CTjMQhn]]VFQKoyMk{TvSgzak…act5HX4CT.EO9AM7:D,=D7m~<I[-GX=VjR §nÿÿ¿ÿÿŒ¾½P{PŠRw”a‹y³Ýn§Åx‘µ€»¼m‡šq´¼kœpš[}’`mˆ†·—»j”Yo…^m‘V_}=ZnEk‡Ks†Txˆ]ZwRetGXoKYuNO~NXw|¯˜ ¼pv‰Io…g˜•^nrc¥]zqAJT<<E>I\>GW68FCn{PjzUr}Rd‰Si‡F`vEWhG[k>R`>R]J +!* !% #"*%(&+#/*&+/2-@3L7'K9/BC2CB7B<,B?$=B'AH)OF5?O-AB,8F'BB,@N)?@2D=-P>,LG0HN3FG.>M.AJ6>V6EI1GO.FV4CV2OS,PZ3QP*GY)KX/G`.:Z0RO1Z\)Il;GY3HU.MX-MW1S_2Sh5Im6WX9Mj*Va-[o1dk<[o;[l7Lj5Kc:H[4k^*\{1Vr4af0er8MCWfANm6[h8Ys<iu?a2dFUƒDQuBSk.Xc5qq0_‹LU}Idt>^|=_‚C[„MRsVGq?`h?S€DLj=Wm>Fq1fi7XyA[n=T}?gn>R‰ActCT;Jw:Ua2_~BlŽNd’^d|T]ƒK\yBgxJ]„>Rw2go:cwHUuDVk=^yAWu1NkE?l4Q`4^j/rŠVZ|NSyDXq3RrMj|?_‰En}Jm}:OSQaIbr2XxF_{G`nJbw?Yp>bn?Qw;]qRPs7Wf;l„=fzGY}7Sl2Ql8_o1U}@PpFrm1\Ž=Wy=co4Z‚:^vBW~Cl{Nn‹ie†ZX…UV~M`zD\~inl=R‡6Sr8_p1WHcs/jzAjŠAS‚.Pq5Ws>_…DWoEoq<`t@sPN‰Pjq8n~IZ‰BolIZCiqFm Zº´@vÜ~zˆDg€D”AX‹@n‰Na®uXCn‡ei}O†šDh¥‚p”S–Id–Eq¥W`Š<o‹Hm–[|ˆL]G—ŽOv½gÀ~r¡g|¢h^o\s›Ll‡H}¯ZifNh’EnEŽ©Y«œY¤ÈL¨«d—¸p„¹n|”Oˆ«d†¦T½g}–HŽžYy†a›Í€Ž¨L|¬_†–l”‘\}ªy½X™ÂVƒ¸U‰d‡§l~™L‘\‘¤\}£d°a‡®Y€¡j‘œZ•¦\t[‹™b{µzƒŒk¢Ôc‹Í[„¶Y§®h¬^²´kz›T}¬\}‹Lu”Lˆ¦or¨W‹ªH„SªNs¤[z§]“Sc‹G—K”µV²¾Z£¥_§N‡•i‚§^‹œh„´Kz–\u¨|q™«Çv£Âq‘~¾šËl™Øu±Î|Æe¿lšÎwÆÒ…¡Ç_žÑX†Ö“®^¾Ê`Æé†¢»sƒ¾yƒ«[€”]¤fŒ¡w~¡\ËËšÛ…±•žÈx¯„¼ù‹Ú„ËòšÚÿ¤§×xàþ|±Ôž½õ¡Êÿ‹Äÿ¢Ë†ºëqˆ³Hs|A†¨a«ÉŠÕôM§äU¢¯Už[™¢r¼ãf²ÔŽ«]ŸµY‚œKš³„z‹W±Fq†FrwOmAo‹v}¯hYrYw£\~”^‚ŠX ¹dfxDj~P|–_~Ÿ`c‘?qˆJyŸo‰§UarNX’IeHrŠHbˆcRvIPg>Tb;CT@T_6Wz=bx^c”\ˆ·cc…kh’]„¤N‚®LeGbˆfy_‡›]zšXk±Ìq‰³pzœX€œVjŽf¡y†«É¯Ñs|œLg~Rm„}” QxŒŠíÿ²Ät’URgLbmR|ŠZ`}kn{R\nWsP•Cdt3Sg5jmBVqXVmKZgF=QIBQLXh7NV0O\8hl-=N5L_1Z^/@UNt‹Eº°Q‘f¢Âº°ÑÿÿÿئºqÁÀcϺR€‹Qofˆ°r}Ÿlz—lx”rs•’–·~|‰ab~Yi|Rrcu‚wyœp„¢Kd{PUsTTnCa{@[sHe…KVnIJ\?Mb:Jf5MjE]~L‡§i‹±~{¡nq”[v˜Tn„UgvVYjNMU@HS1IS/GX2BY07FO`axˆRd{M[sK[rH\uJbsDWtJarA\aJ %*&#""#"$&&'((+,---3:2C;$:D-B>3L?-?D!:B*A?%O?*8[,><1:?$<D*<L,EC3GE)UJ-PQ/IP5=J4>G1IH+DZ3CM.MH)LX3IU2OT-QW.SY.M]1Ma6F^6E]0OQ1I])N`@G^:RY.Q_/N]-Kd4\`1Zm<Sh7`j:gr6^t>^nBaq<gqCYw=Pi?K`3d\&iy;d|Aoy=X†E\vJVp<Ql<\h5exGO‡J[g<`‚D]qGQsGHi8Y_0ql.g‰Me|Qi}L_ŠGR€PWn@^|ITzCUt8Qv;]p5ft;[€?kw7^‚Imt>}‰4k“D\‡Iap<b€Mk‚?f~9j…B`yB[K\€Sl{Cb~IuC‚«Tj›Xj?r<k…Mk…Hƒ’@cœOZ~@j{8^„3[x4]p5gyFh{Agƒ?[yE}6„ÅV|^^‰Fe[ay>w†2k”Nv‡HQ‘Ihy7nŒDp‚D[y?lw9Qš@nu>i;x}Uc™>‚‡B{Ÿ=e4aw9`„?i‚:s“VbŠ?bŠ?\tH\…C`‚EWy;erL^uBc€CTx7Šj8dÀRd{3q€Ec†:u‰;py9\4cx9wŒDs‡=g‹4x4fš=vz2Y~.wz<jIrŽRc–@}‚Bn‡Oh‡<|šJ¢8˜«Q€£c{–€gO]sFo‚Pg¤Ydy;dIaŠ<d„4ix7gˆFq„C^>nFX‚Y[rIm’Q]“EfyCj‹7‰EnˆBs•f†ˆP˜]h†D˜€>|¯WrŒ4q‘\l”@q8n‘^m…FqŽEu•gn‰]gœun³ty“\p UrÂ`¤¥† Î^’Òd\r3nlZu„Yˆ¿pz©N–ª\˜ËˆŸVižZyŠ\¨ `„³Oz£Q¡®WpžR›¢Z©Ëg‹ßpy—S}J|¡V|©Pp’N¨[w¤Dz’[§{€²\„™o{²a‰Ñh“ P£gd–Fy˜Cœ†P€Vf€V§t¶h^~GbnF £V ¤X¨šI°¬os¶d€•ewT™py³[†’Wˆ°co¤Uy’[‚N¢k{¥bÙs|¼d…Áp˜Æw‡¿|‹ˆ›»‹–çˆÄ£Ø…¿Æ{¹X¡Ê{¶å¤Í›²ùo±ÎdÆ]ºÒY™ªSš¸T”´]•®–z£st—[‡¦h”Ïqƒ¯v£x¡Ø‰É³£ÆŸÂ𳉷„o•€ˆ½”¤»´h•É€ºèZ§§VƒÁq£´ƒ”Á ²Þ„±ÙwŸËd|ph„i—¢yâg‹©q›´]Š»|›°Rš¼^˜¶Tz«W‰‘Is‡p¡ÁXm“<Y‚a…_Š´Ylg~’eˆDlLi‰Z`’Kp•GgR]mabp„KOu6t~L_RGk:MW:ap>]vHw“Dd4?`6Wl=qŠN€¢]t©Lq‘[©È}‰¸^i•Mp“Vm–sz¬u‹±f¬{|ªou—d‚´dX„Uh_†q‡§ г’ƒ³\|°`XtQd‡cx¤–k“½DjY^}Us“<XnY~™NWi6BR<Yk@]]o«yÇÞv×Ý]½§JMVD<XEIa:5N/@,:P7Ri/@RHl{cºÃV §A`q2gva÷öÁÿÿ§ÀvÃÂŽš£äÞ÷»ÿ÷¡°Â¦ëásnˆV¦¨\”£StˆJ_~OUnUavm`€xt”Sk}Ju}OmpT_sT_€r„Ui…IQn9CP@E_=@Q>BaK}‚8cm:Ul5o}4VqEOod{¢{¯sx—Ql”U`ŠVgSo‡IdtC^l0L]6G\6Rf,AP3GKSf{am‰TWaOakHYqK\sPk‚?UuRc‚Op…> "()*"" #+"''($%'((/0.54.64?9)F<-PA)AJ,:D;5@(9?#7F'2>/3@%<A#@F'GI/GM%SM-\N0SU;FQ3KG0RX,[Z2Vg4ZW9[]2Mc5Ld1HW3RZ4VZ8Qc9VZ=RY:O[7D_5VW;Wa2]a5am6[g6Rh8Wd5Kj6[[<hf5oq=e}=qvCe=r{KgHZ}N_j9Or8]h7S{JTj<cmM[yIUo=Lk=ch5pAk–Ye|N^†F[wLQuINpK[g1is/fK^ŒURzU[L]„R`yDs“IR•WOuLXuBTv5c|AW‹BTGVxGduAe„GXˆXazNhx:t}AY—JQnYopH^9`wQvu>m?gŒVi†AaŒ^j‡f]ŒU^~LnKv˜Kv”MXšh_|Ro|?a‘\fDz†;pF|›S…¡Uq§SžFqšXi¤je]w“J–Kt¸Dj¢Xh~J]‡^b€At~Fn’[I„Q\mCS|Hbk8m•OpžJ\OpIZ_xQ¨ZbŽDcH^ˆLp‡pl~?WBa}A{‚5oEA‘¢A|’AoŒQ…8©YgœDW}>awVG}<og>^‹Qv‡@vŒP]˜\z‚It“Hg—S~OvGlš=pšV`“L_yJv€@vUw˜Gd‰Hg¢a{\v oi’Hv‰Re‰;d„Gz†Xd˜Vc†Q_x:‚C_˜D`‚A›¡K†¸Pœ¸F‚·HYŒ@fƒEn‹@p‘0€}Kw‹A„N—HgžGwhkS}Š?ŒºU¸·Y~¯Qs?dŒ<i@‰‘KpŽH\‹;n’Ci}AjŠHX„JjƒJ{‚Kt“S—Êli¥Mm‹HmŠF~‹;d¨PuˆFr£`xžh½qe‚Co›FŒ|Xs°ev†T›±_l™N~ª`˜¡{£¯¤Ð]ˆ¼r·ËXÃåUpÙS ªmt¡\|”D¥Q\›V‡‘Gw¦T†²S€°^›bv½E~’E{˜Dt«J˜¢?}¦Qˆ¼a~›D‹9¡©l‡Ãz®¬~޹y„·j••H” ZŠ¢Rx\t¦LŠÏ]v©K}™L¸K«\„‘UޱzuÀiˆcqž^x“UoŽX†¬Wu¢kˆ›^~´| ¸ŸŒ¨q¶pˆÁ‰’µk‰¼”¦ÃŠ»f¦„ž©`†¤e«eަa†X¤NÀq«Í€°ÝK±Êx Ý~’¹`než¨ƒ§Ìd³Nž¶{t«s|ºje™ft€|h€u’V‡¾{±Êj’Ƈ§ÒŠ®Óv‡±^†©O} ƒˆÊ}¡»m°ÝsÌæl¤Át…¹q‡¼dŠ b—·jºäqâÿ›Ì_“¶H¹jƒ±Ut’S…¦T–®^azG€“d“IcN…žCy“M{·`lŽMn?cuWa|QXr9`sAlŠL[‡DkyaOqAo{3hGdzWz›`”¬b´áms¤v–³s{ay’Wn—Y†¨o„¹sh“u ¼NdŠWZƒC@`4C\O[ad„ea_b‰Vn“Om†H€ Vn^eƒOqzKœ¬f•Lˆ•^—°sr™=qˆD^‹9KYPsˆ¶ÙøÇëé®™®ZTs2a{8n€7HX2Zj"HO-^eAŽ“J‡¥»ˆ„ Y—œHŒ’¶õÿ®Ì²Ïè¨ÎÛš°¾§ÀÒÔÌà³w„—š˜eYWOpzjª”IYf8JR8P[@izCW_MbrQt„IswMol@\lBWjY[rSSq?S_,7I*2H-3E1APGdyEQ_5DWGIlCj{>Pm`|™v‘©]\…P€¢Jv†St`‰¤Zt~AEN3CU3FW>T^*;D.CPIGdaX~TVnEYsF_nN\mSXpFUwSs‡Tg: | ||
3098 | |||
3099 | |||
3100 | $(%& #&((("'($$'())1*1!,-!<. D:#J<%;H)7E48<%>=&EB"=G'6B%F@+EF&IF2MN3RJ.NS-YR6JY9FV1MX/[U8ypA\dBm`Fd{6GwFIW@UV3R[3Wg:]d<W_/YY;Th<gX4bm5\c=_j;Yi<Si:j`:Sv7[]<de1cp?k~>c|HP|E[|Z[zTLwd_jFcmNYv>Yo=MlB[g8_m>ZwAUp=Uh@Qv9^sHV~SRtTIn@Yk:StIIn5Th;PqGdzIQƒDIrH]lHb{G`‡@S‡S^tIY~=?u<F`<Jn?_pAwˆBo—CeŽFlŽNW‚@hkBfŒKc”Vn‡S…‘Dv£ItŸZ`™PdP```ƒRX}TPrEjoCl‰H\Œ=lTTQxƒ[t”Ij›=cƒPZ|EeCt“Skš`hŒP…Vr¢Vg’bo†[lIxB…«Vkž]ƒXy´X_’Mk?ˆDk©NO€T`h0\‰Ro‚@j‘Gd‹LkyO‚=f®[lŒ:Q{EbhKaDj•I\…Db{M„Sj‘Ct›7f’\v…?ƪzŸÜly¢U~•RoœS‘]w¹NdŠ<dKb…<R…Bcq9rŠUd“X‰M§ Uq›Gl~E…ƒX†…Oy Jf„Sk‡9‘IŒN—µTƒºKp QtB`’HjVw¤\€˜Zn–@kx6Q‡Tq€;i©@fwHz~_j9l@‰™ku¸sr¡}dˆNnŸBŠ?uŒI}ŒEpIzŸVk–Qw jk‘;nœRz†8y“f€ˆje„u_„Go|Eu’Ou†ClŽUwHfœG\‚>j?q‚;|„@²L|–O|bv‘Nh‰Flˆ@ŠœJÆ\j§A†¤[žFŒ¥i¡¢C™°X‹K€ TŸNr©c`–Jo˜Pš…r‘^›ÆŒš©b˜‰¤¯ƒ—’¶\±¡Y{·FŠŽFx¬@Ÿ¨B‡ U˜¹`{“XfIˆ¯b˜³J…£Sy¨VužMn®TqŠH‰¿U|šP—U}¥]y‹N„ `zŒc“V~«O}©R…¥Od—Q|]y—Xt”Tv¥y‚Ÿ^€ªPžñvišUk‡Gg˜SjPv‘K–®o}™P|—Zo—Rm‰j‰œTv˜[w®Zj…O³c~£Z€¢g†¤Mwšf’™X±£u–«{m¦e¬D¢¸n¿y†©©o¨Õm›¶ˆ¬ÊXÂÉq„£q‰ÁsŒ l|žNg•W]n?oŽ?”Ho›K¦¨L¤¶¶ò}ÀÁš·â‘©fo“O¦²_©Õn¿ÎÁ¦•“®j¡c}œW‘¨]}¤e£·~ÃÝž¬Ño¦ÚkšÊ\˜¿^w±W”Ÿp‘³k•PsOnˆhknD‰™Zy›\RuIYwC\xBh„Fr–B{™M„±H‡šHpšJu¤TŒGq’Rh’gˆ°Z•È}œÓlv¬q_’`_{ir‘U¤dН^‡¬t_…][…_œ³^YwAQl-H^'G[Dcu@lDd†B|™Nf’UrŠYb|Iq—S¥Oh‹lН¢¸}©ab{fyHbyCl‡:[p8[tƒo˜‘µ d”\‰›S¤Ã\q™;py:`qF‚P•¤c˜–cw‰mk‰\_‡o–ž~ž¤‰wˆ °•¢¸É¡¼—¢¸ž‹ £¨osigƒpN‘cJ€rm²†d“–Iy‘?|‰G{ŽJs}EtP€†O~}Oqo<`mCu‡BYg;D^6CW.AP!4D";J)L];H^FN\1EL8PpJr‘;azCKpn|£W…Ÿc€©d]vDVrXbƒUQb4?O)>V7X`AVe-[\*FT5K^AMp^k†MwˆH\yMSkPdo@cgQTjRYx>(( #02!1'2)!# #)%% !'&%%%#!#'%.-*4&/4+93!87!38(4=-<<(=<(<=$AK,@I3FB$PF+JL1RO7RJ0PQ-]O4I[8IU:LN1OP3p[8[d:hfNZw=TnQYd@cd1Xb.Xd6Te>Gg:KY9M^;_^2Yi;We@Lb;Pd;Sc4ec4\y:bd=^q<WwAktA^|MRsNFjSck<MvDNj@blAewBgr>`{H[r=bq8RxBnqAf†A\‚ERr?Xp@Ww@HwCab9Vv<Yp8`l;W<\DBuFGZGOb5gw=]ƒ:ZHV{:WxHHl6^a4f„0f†;YDdŽXbTp…[_ƒKkvAe‹>k‰NšMs^X•Ux„qe¬Z_„IvƒAtŽSd‚G[xAˆs<x¦Oz‹J~˜H^›dxxDz›I~™^o‹Qu“B\~Mny;e”Kt]h¦^W‘_y|Yœ¤In°dªŽOzµ^‘¢aœ¢P®Ð\£ÃZi¬P“›Q‹¼^m¢]Lƒ?kr?k@x‰HxNgKX„UQ~ZawFkv?–=£DoŒL`†F@p™Ds‡JÚAsã`z‚NcjžŸ™a¼ž_{Öu ›dŒãy{ºebŠYc|6m‰9b“5n‰;mJf‘D†\t—’z’S…”HjˆOi“sc‚MŽG‘J—¸[gVq…]š—W|ž@f‹FŒ«E–£Eš³JdÆW‚Œ=ˆš=µ9“R–.´DÇUw‡B{žI}Žfk§GŠ‚>©Sˆ¤X¹d}“Ie¦a~˜d‚Os¯J„Bk˜Hs–Sh’Fx–Gp‡E^@n‡C{³\všKc…Hf€?Ž®Sw‰;} :|—Jw›Rok‚«SpšL{·d_‹Jrƒ9r›Y~®z|ª^sQl¨bƒ¥]¥dcˆhu¢gp™T¤¬j…Ðt—™Q¥RŸªT‘ªˆ—½R‚¡X¡Nz¬UcˆAƒ[™ªO޶s–µOoªBš·R†¥[‡ˆh¨O…œ>qŽMyœnœ½P£¥PzžD”®SvžRµéul?‡šKu S…™Q{˜Sj—A…šL{¡C{®X|^oIp‡NާTm¤L`B|’L°»YVƒ}t‹Kš±Mt˜K`~B`Ln‹gƒ‰P|’Nl D‚šAv‰Vp˜Ol™Pt’@^˜SmNl‰Er]hŒG{šT|¨kaƒ\bEtœZ–«v™Êyޏ`¾`—´o—·h—±}•ݦŸÌi¯Ço¢Ëj–»\š¹Gv5Š‘Q˜Æc´îpΙ§Òo€©lÄÊy¬p»ÖR¥³`Ôq‹¾†´ÐzÉ|ºÐgªã…•Â`’¡L†¡`”±Z…³z„¦‚Æv–´v¾ã‘ŸÑ¯ÐdœÐ‚›Ì~˜Ú‡³Ø]êÿl£¹YÈn¤ÍUŠA}9z“@ƒœHˆ°b•·p¾êÀøms™XŒ¯W“·cx—J}ªNyšY`•e`mei‚Fm…?d€K~¡d‚©ovšZqˆ9l‡Wƒ_Su7Ld0K`)Na?UnFuLw˜Wu£as–FgVc~Yp‰[[ƒg¨c„¦Š˜¶¥¸sy‰M\{LnˆPf•Mk7aƒNv—„ªlx£Yƒ¨u|¡z™Çr¡ÆFp‰O€‹hw–nvX}J‚’Gt„[~“m{†`V|Yn}fŒŠp^yo}xqrSuyu“Ž\£xN˜mY•{f†ƒ‹n~nœ¶`•‰ZŠPzsUvyNjyK]t?]rMrqOp~;Xi4Gb/DW+1I3X}N…NryDBZGPZ>Pwo¬Ëf«ÃP‰¦p³Ìg‘¨Yj†X_xF_rEe{5IY'=\"C^7[n@XoBj8Zm>l{D_xYq˜ez•PayAPwHYpEJT>OYHXsJ40 -$&"#!%*9&5+1/0$"#!$()(#%&$'$&)&)#,"-4&36(:$20":778 .;$.9&4;'0@!2:#AA*:F+>?)SF,ZS.ON<KO3LQ3RL.V[0K_:ST2SR+_\-d\2Y`@[c?b`Cik7r~;_s?SoBIg?Ch7F[8K\3YV0Tj5Xi>Qc7Lj7Vc.T`6Zi7]lDZsCZj=fzEgvDYzKRtE`j5c<Q}EYn8[r2ftA`†Jm‚Dr}HY‰;tuCjESˆZXyBcx>S}E_xHau2[v=js@d>S~LdnK`ƒ:[~=]x1bz<_xIEvPSa8_n?Xr?_u5lˆEfƒNWUlvO„‚Ll¥Wk‰MkˆFh•FyY¤¥RcÄŠs_ƒŠK¨T~œkt™?XŠSh{CŠtb†¡F†œR`žjX‚PgxNjGi†EyŒSg‚FtC_ˆ`|~2k„H^KzŽMŒ‘IŸ O{«dkš^…’L~©x`¡ifmk‰_`•jV}rswHW°l^{qm‡Alƒ\y‰G†Fj¨J{‡Ms«RTƒAlv:‰‰:s¡A‡™ay¨VNŠGms<ljd”X¹~U™ã®w¦btaz›_rEc›h]“|‡Ii‘†{}an”IŠ=sƒHXˆQ‡˜G†§RŠž[qŸAx†Nf‰QtŒNt™_”Y”ŸH— Vq‡[š¨_P‡h‚xJ —PwߢL…¹Q”žYªá¨ÂuŽÃMˆªhnipLl£uy’rj¡ze•kcub_”S^uQ]”P„žvƒ¢]g¦k€˜iƒ‘Gc¥Kt—\•™vv¾Sr“Os•In—SpŸSe‚Aa£TlŠH`ŽTŒ¬UšJˆ¤A—W©Tu¥[“£`ž•G«T…“UfVfŠXw—CƒB™¦Zq£Up‘Fšª>´I‚‘GpNx‘OƒžEv”>p[¸»v”Z}šV«OfÀb˜™‚©©O‚¤YtiŒ›DŽ—C› Y‚›u‰¬bm N”¨Sc‹™Mˆ—M©¢b|œNy¥O¦]£s…¬BebmS¶Í”²W»Z€´S‘\r˜O™J|§V€žSpšNq’S_„7tžDx¹tjµak?v–]¡Ê m›?nŒSe˜ip…ec|=g©DbD„¬Z}¸WkPˆ£N‹¡Hi“Pb†Iz“MjˆE\=]ŽFiˆQgƒ?t¢Od~Kw“Cg—Pn—Xz£g†£k‚®iŒ²gˆ¶h„³kq i|°h”³tƒ®y©n}žUp¡h{£O™¾o|¢i𯄱~ŸÆj¹Ènô˜™Çn¤½š˜Ènµk¨Ó`¾Ô„´Þw—Á•˜Çy£\†¦t… f~ŸošÇx»Ôj«É~“Ñs‹³€š¿b{•|…ºpŒ·i‚°j…¬†™·‡¡x—àŠ€°t ¬j¥Ëj†³g‹²iÀØ‘¤÷‚޻І·vÂ_}ŸpžÄxs¥Sx¡Zu¡Ou›QƒªLzJm’Tw–N€Vr—Tf‚Wb…J^~W[„[b“da‡.Np/F^/Ww@RlN~±\`ˆag’[ˆ¦_’¨Gy‘Ue…N`wMlg~¥q‡«|†¶znSg‹J~SpNj”C^ƒEeXmŒR[|TkŽVlŠbs¤q„ª]¨¼ZRz”PoL^LjŒNn…Hj“WkŠMW7`yOj‹RvŠOla{Lq}i~‰\–†[xX“Œ`¤›s¡¨no†l®™diŠdf|OrY‹O‚ˆM~QszVt…I\p?_}]µÁ<`i5Hf\UqY<K:1:95I:9T™´ò·êÿ˜Éç›Ë킼Îe]˜e‚ž^»?U]!Gh._w>q…GjŒIbw>j{M\„NbtRhƒV^†Nq„Kn”HoxCFKAO^LOdX,!4#3#/$1'/+3/2-++")"##!$!'"+/$).%,&&6$368:;=!19)M2"MM7H08=3=8$8?8=&78&6<%:;%8<%AB'DF)AH,QG+TQ/ZYA]X=bV7h]1d_1Tr?\\AJg4[^;d`3ag=Uh;ce=hp7_yEjsE_{JfjER~<HkCY[2\^.`v5[o;Zc8Qf5@i:TY3ad2Wu<^eCdu<oD^}EVrWZvEjy@bƒ?[yEPoCSi0jd:lˆF`‡Kj{Tg†Kg}Ii}EYQ]uB^y@q€@˜lOˆu<u„Sl{Gc‚M_iXxq<g„D~pFh†<gsFSpJ]b@Be4TS3Te:Ur4hnGfHP…_ŠIv—LZ”jhx[‚‰G|œPd¢d„ŠQq©r^”Xc~Z]oUa‚gqŽSs‘laˆCz~?h¤[u†fh^_;Œ|0‰‘JxK‹“MjšSvyAq‡S¸‡?±\ˆLtŒ[‡ŽBe³[fduˆQ‘™N‚±^e‚iw†BiŠO~‡Uk–NYEZuCk|?y‡<eˆ[„˜Pk¢]€“d}af¥a„{RiŽAv}KgugŒL“]|—[l‹DgF„’Anˆ=§p^¦mt…G…–J~‹R~gpLr„>iMˆ†J‚¤`¶šRe»lc‰]ˆ‹;dŽf}‡Tw“cx‹?œ©HmÁX{IŒ‘Hr’N‹šU””XjÐspzLyJ—’[™Õx€€T·o—Qtmo¸z{•{„žd®¿^_¬T\}Mg‡<v¢Mi–Rc”4nƒDX§Pn‡A ¨On”Ul‰^f©^{³Y–_c…G™Pq¶xu¦I•Ov–I|³O|u<f~PiŽ?kxIwŒKœr„b“O|«`s“Y‘’\»õ›Â{–»UlŸT]‹:~™L²Zn›Ln¥fˆ£Hšr‰·]‚ÀMo¤U«GwGtˆA¥Ct¸m„ŽRФQxœs{œr†—B™˜u| qšž?¾QŽ©]¨Q¨¥N¯¼R‚žKs›Or¶K{‘N€†Jœ®l£X†”Pªf‘«VqšY‘©I¬±7¶sz”[›bƒªT~§AwDy‰Qƒ¹P‚˜O‹˜AiŽD‡‘<•Mj”[hœXn}C|‘NŠ¥Tu=Ž•KkWaŒU~=dŽaqŠ?fŠT{²Mˆ°bžcx‘W~ KnŠ@`‡Ou’Jj—Cp—?‡¤?}¥MŠšKz“Dm”Sf’Lb‡CwN}£X‰·gƒ±fq˜bŒ¾\}ªP|±Uƒ¨lˆ´Z‰¨blœPi’It§Tršd•²S„³k~¯c”Âx±{ƒžn™Ëh…¦e–´i¢Çt‘¼zš½ŒÒ|¤¿r{¼o†»U“¥i¬æcб^±Ûm¹r‘¾v™Èo–º`¬m޶_Éi~£]¶eˆ°vyc˜»m’¾hj’M’¨pµÃ{”Èe€£b…§{…°wh‡Nq‘Su–XušTr boQa‹Mx—Lz¥Rv™RгWŸX}P‚›Zf‡HeGwˆDby7a|DVyEr“<Qw(Cc,Ha:[uHf‰We‘Kg‹L„¨fy _€¬Xg—P”¥X£Nu›[„¦^r“Yo“Ji‰Gi‰Nk”^w•Cm”Io—?mˆD`~@qLw™TRLf„dˆ¥pk“Nt“Gd‡Mdƒ@r•Hm†F[@Os;Ln0IiOVzI]ASwI]†EWyJd…]y[`\lˆftŽ~†‰nŠ•YgujzT`kN`gVt~JOh`YnN`|Qi‰N]„C[sA]„}m˜r¥O“™E\f8KW'AF':O6I`y{¨Ê¼óËÃïÁÃ៹ᓻ؀…žjz¡tq¦OXt=xŠBg†T|H[|FKc?Ys96Y=>Y:AY?B\FQkIWƒOf‘JhrFhr>amH+$3&3+:*F/!8;"?7)35!//!.3/+*)2$<%08*;#D-S@6N!28271 D5BECJ1H=-TF+MH'HR+FK5GE7JE)MF)FI-IB(>D&7B&7<(?;&DA"RH%SI'LY.NT5XY4_Z4bg=Xk@ThHYcHRs:UbE`g8bk<Nw<Sc?\d8`s?dlAWvFcqC\~DarNen?hw;k{;ZzGgc:`p8Mp@{[0l},aw@Vv?[p;Vp;UjG_mOip>v{Fs‘Pf‡GWN[j4vl*m‚C_vFq{DgtIyZq“HbŠNnv@i}EyxAqp=^wE\}`XoBRmZGc>Y`:cgGytHˆ}Df‰UftAWk?@p:HQ/Kc+Ol3vo?[~;rqOY€?eu>Y‡W^vMn~6f“TwŒSzœkm©pgŽ`swG@u“C{ŒIx TW‰^`l=]{La~T^TbzS“o5u™Tg‡c‚€QŸal˜V}šUÍ„F³¡‹¦\› dx²JŒc—–I‰©YƒšKn»bflk‚>wƒO}…LrŠ[i‹Nl:y“A”•G¨´[€°Vfª`R‹Wbv]—‘Yt¶P‘†Px½NnˆTzŒNw•Qo–Wt•G‚ƒTXž>nLk‘Jt‘N…‡Eš‘Pµì€ªãtj¡z‰yI€ŽVtFy‘^œŠNd¤Žov<vŠFœWk«\‘’Tz§v‚”f~•|š§J¢¬O•¸fe±Uއ\oŸoœM~†Rƒ©U¡x©t¥œroä~ixB_’H~ƒ7•±R—¾\‘›^…µB[†?pzHv‘^f[ˆ‡C£Wo‘8q~I{}Hd›Bd|N‡š^•É`yªHŒ·h[£žxŒ]t®Z~”ctŠXo‹Fw¥D‡£Dm˜=bh7—”G‹µNž¬Ty–`lœRƒ Im‰}oŸku˜df—LmŒYsŽEz©[dGq“Jn¢E~™Dzbgœw€ªCŒU‹•V„ªL}™R€ŠMy˜TkWu—Im™Rk”SƒM„²Pz©a}¦v±œYy¢[z£Z‘¸b‹Àf¡§HŸ—zˆÇT|•Kf¶Y‚S€ Ml§ZjˆIs¢F~˜Q£·x—£U…•Rž´N‹Âat—XµTuž@m“qkŒMm•Nc“]yˆM‡´Nx˜UpŸ>]…>m…LsŸ|¦IoŽU}ŸR‚¥CŠ•^l™Ik€HnŠFaEy_{¢f^Ul›YeŒFoˆ@¤ºTk¶Xt icŽSu˜KŽ«^xŽUYœWd‘:a‡9sGÇ]r¨b~\b’LyŸwpŸ[|¼Yp—Sm›`‚¢_rŸHoŽKlœRy¢IˆŸbz¯lxªQ©W€›M•Äa~ºf|¬_°¾sœÌu‘¯o~®wvŸq‹°vs£V}¥]‰³o³s‘Èd“¯Š—Án‰»x‡ºs—Îw¥ËV’»by§o€°\x Vi•R}ŸG{£ds”Wt˜Mºu’É“²by¦Nz£f½Uˆ§P€«\z¡Yƒ«Wj¢BzœTk’Fk”MkHe‰Rm–[d‘K€šUqŽHg…;nJ€ªGg‡Akƒ:eŠ<hMm˜8c|*`~3h:_~B^€>\ƒEa‹Ti˜Zm™YqœOpœf›®Ln‰KcŠNu”Jj”Dp‘GkŠL~¦bˆ°V©Ua•EdˆPu•O‚¤Sl‘O^€;aƒOe‹[eŠJc‹MZ…Lf‚=W€FPiAJg/Ii,B_,=`<Qv<Lp=^v:Ny;Gg<OnQOqF?YBMqXrˆ\RlXUiMGZOi}L\pITlQbuF`sIZjESmHOrK[y;Of5PpQSrXW‚q§Z_xHo‚;vw0]xX˜¬f|¨¥Á³‘¸¥”²Ÿ–œ˜Â‘°k„¢Yn‘Ng“c©T\€WezALf8GQA_q.C^8cz1Xf*AX4H_<QnUk“`ƒ SpoFhv5J9XAJJ$J=.JD-?D-CC5LB(JM(ER&ED)=@":6K3"BJ!8Q2H?%QP#Fe1LXCRT+]T(Rc/A\<V:4mH+RW4WK?VO.`Q6Ta0V[7`^4bS0QV2=S60C(;8'J;"V?%lJ,\a4Zh6[k2h`8vk:]‹FghR_l@OpFKjJ\W;bs7UxA\mD]m4Wt9Tg<Gq:]`CRq;XrG`t?g{Kn~CaWhuFow;q{Dy|;}DaœSW{R]tGcp5lyDgŠF\‚<n|FqŠO_P]…UQr>sp=n‚C^~PatAXmBgtOR€NklQb{C„xHÇ„F`¢DRhRQkAGd=<W9JS/Me+_\;ah6‹uHc“PLuOHa5IW5`Y-X}']{;jv;_}<‚yGa Yiz9T‡Gjm=nŒ=_›UY‰L^vTw~Kt‹FeU}€M—§S_¦c_‘UuyZb€<goHhFW‚MipGŠ6p£lf‹<p…Ai…ablLdƒQ}‹Mx‘eVƒ„ayª`‘¥Zwž^w˜e™•xr®Qyv;€–It–N‹‹IŽ˜Vw¢_ov?~“^”›\—¬lv¸ˆ]]¥Wp{/u‰IgŠg]‚AxŽPŒ[p§Yx’Wm’]”™Gi½LU‡`w7‡ŸV„Ft‘Mˆ›mŒœ`¿Šw¦pvt;„–PŒ‹FdX QŠÃk€™8±ŽHpÁ\i”^€„=…X}°\š‘g¯½g~¹‰_¢€yvr~¨F€¬h{”Q`‹I†ŒNˆ’]†”Iœ˜^§´oÀ>†‘Nq¥6g™‚žq¶a{Ù‹t†\y©EnAi†Ks…Oˆ¢nx¤Nq5\‡6~o_O‰Lf€Br›_Œ«si˜g]‡Df„Bnœe†GyQk£da—BkšZ~šRfžDŽ‹L‰½[w´ai¦Gp®\\“O^ƒ>_¡Ne…Lu‘Oky6›’?{fzžZs‘Ec¡Z˜ŽL“õ^›ªNs¨mm¯Y¸`ƒ–Zƒ”Q‹›7|¿No¡IÅÐTi¾O€‚Ov›Eˆšf¼T†žGžÊl{°t†MyŸ`ŒÃ¨xÃ^gšZ›“bw•Ng‰]€“Iw–J{˜Kr¤5‚—OršKs¢Vo™\i“Zv”Xw˜_€˜E•—Z†ª]z§Ejœ@~¢Hv¬Yg“H·¾m„»^_–\@‚•Bh‘Nt•Ph”H°Q~®Xo“KrFsŽ<‰¨F|—H¢¦Rw“Ll‰<n–AnˆO—AµdI{Ch‘:tF€«hnŒOhœ@kšMeBšOŒe€²T`£Z]{AgP_ˆRkŠP{Ux HsŽT‚¨Mj‡Oq‘Mo¡WlˆVf”Mc’LŠ£Xp•Ss¡qx²Uc“Ve”™‚¯nx¸f§Wƒ«Rqœ\t—Wp’U€µ^ Âj§½h}¤g•»Š³b}©_”µ’ŠÀއÂpw¤\ˆ¦_©tuŸTЏk|±p«l„º[sŸmu£kxœa‚«Qy›alŸVt`v£Vz¦\o˜XxžKŸYxŸNhIp•Mk—N_“G_„Gs˜^{£Ds™KtžJsŠOm“Nm“Lk—A]‚Jr–Ql˜CmOkŽJv‡?s”Mn“DeEsŽMp’KZ„MnNl•]m“TeŠFa‰Of’Gk‘Rr™Ol›Zqj~¥Lj‹CiŠUƒ¡^yVb‰LVxF^ˆNYˆNdBZuCPxCiˆ=Pn4Gh0De.Zu4Xo5Rq5Xw:\}<Y}5Lr2Lm6Ll6DS/@X0LhL]‚aI‹2[_EizUWt@fx?d‰FeUbrB[qInDVk5Up8[l8Zp?^†T~“WoŽm®Ïy¨²Pzkq¤f|¥…žÄ…užmiŒ^q ‰’¹Œ‹¼†•¹V{™PkŽgf\kˆWgwASqBZbC]wBZtSk’Qny0Nb)C\:Fbfmއ£±s…†Xv{5VP6\\3OZ7SI?LI9LD7GM8MZ/VU1Wa4\\4_Q3VM/VP0LS+@Y=KS2YW-Jh3UV?eY/hf8Zo@SXEbM8nY*\Y9[fE_^3j`2Zl;fhFge7vcAef?]d@DR6JC.VB$lI&vZ/qn;dI_tLalDkp?ZJ]lTQf<[mGUo>tW>f|6ZwNosEV‚:Ur@Tf8Kl:]c;Uq/Rh@eo:juC[}CjvWZ{P^z@NtCl\Ck{F]…Q_rWcvEU{@^uOfyGa…CXxH\sJjyNe†MYHXrDiuI~DhŽImqDyq@q‚FhpFr}>rpKhwEz…Ud€WQl:Wd5Fe7BU"KS)Rh4Th0SgF`r7UlB]j0Xo6qg2VŠCNrCSh@]|A}„Dl¤J`…QK{RPh4\m;_ƒFd}=b‚<p9u”KmžL~M|³PU•o^kAuw4m‹HeŠGgS~EPˆCjuFb‰_r„KuW^‰LƒtGl‡Bs…Ew„Oq€Lv‘H|ŽH‚ŸO‚¬xz•_«•O’ã‹u¬s®fRœglyB}’b§[˜Pp£]eU˜N‹±kw¦aœG‚°H—ºI_ŽQ];m|(s‰Xg[y…Oo~Rº¿?r²z“…Gx¢B…žaƒ¦]«\Œ–O{¶hjŒaqƒK}œK“ŒL’×aO®_‘b9z¹n±pư`fᣉ’Po“Gˆ¡g™Äui´dx¥m”®ƒ„ n“³:Œ©lƒ¨c—˜dˆ¶M•J‰µj“«aÏÉNiÞ€|•‰zš\{U{‘L£L‹o„¤h`±Iˆ˜_cJ]RmEr¦Q‡O…Žg‡L¢›A†•Ad<l‡GV„PwƒIi0`™>†›Q¬DpŠGdŽEZz<pŠNrœWz£Bs®Qœ¥fzÈ[j†Gk™bi‚FV†>^rPdŽ>a‚Ey‚=xƒG~“^y_w£Ll¥Z…•7°ÿÚ¢¬Sw÷Vn˜MqÆao4ƒ…CgšRmŠ\m†Iˆ”i~°™Š4z«e‡ÐCˆªˆk˜Jeªh•xh˜If‡Gs¥]Žif®Y…W~J›Ž9†ÃE¸ÓRi¨Qu uz‹PWh§O®JlšCˆŸHgŽL|„I¬—Zi™\oF€®Fl•Oj¡d´htŒ^^‹KjŽMo¢Mj‡G‚§>r˜E{˜NoˆMzŒLs™JzœPy™ez›]g’Cj”Hp{;€«:a„9`Ap‰Km‘_[†HnEp„Ij<W‹A„?|šIm—DtšEiwƒŸ]mX^’Dv“:m<n†7u˜C_‡Dp–Og™ClšYuœPw¯C”MzžFn—BH€¦_y¡Gp–Qt›Rx¡D|šLx£`€ N·tl¤Zz Jƒ´ZoŽM~¶cŒ½ŠÈÿ°…ÔR{¤TtNzŸMy¯q“Ëx·f}¬\g•YU‰Wh™Sv—^vRt™]g’co˜Pq“To’Xf“^a‡TkC`xSy¤V\}Vj‘Lv›T^ƒP^ƒHl…Ks“CZ{D^|C[xCa†N`‚Iq‰Pe‹F^A]|IiˆKa†;W{<m‹TiCa„Di‹Lm’Ro›P_„B´¢EcJ`‡9Y|CqˆGb‰Hb|Lb„AnŒFiRa‡Uw™Hj‰Ae‘\gŒNa„Gn‘TvœYn’U]‰<`?Y}?Z{<Vt4Us<_~?\{Bg}:Zt1^s;h‡I_|;Vu=Rz?W|9Wz4Eq.Tx8^u,L])Ra.N\=WxZl‹\j“Qo…Fp…O\yC\€H~¦^’£Rm€GgxIXtD^t8Vg?Uh9b{`¨Ð|ÎÒp“°Œ±Â™¨k‡¤Mg…Zs”zv—hq–Vu‹\¨›¿“’¾“§Ë]u•Na€R]€W_‡WbvIWvLfvKa@[~SN„\Mi9@Y0EZCOo^X{‡t–€r}n‚‡GO\ASW9^Y7`S?^T5cX9Z_9T]3UM1bX5eb;oZ8YY5U^;QW2J^3I\3aS,Nd0TQ>`Z6_j@_dKcbC]f7ag8vi=b}EXi?mY:^s;^fFkg;qd:eiCepE\aAdc6j^1q[/h`5hnCX€M\jUXuKck?gpHQyKR^DUi9Mn;f[?as2otPv|@]‰JWrO^c9Wm9Zj9[n6XrATl7^w9_lEqiCk‚Db‡QNfGc_6Tm4avHUqC]nAll=cs<iqBZŠBSqFXqDSq1RmGiyJe|BruCj‡@fˆUkvOjxK…qIb…=\sMamJ`m<r~G^~RQoBVa6bf8\u3`k3`v3_|-VlBdf.cv8Js7Kb<ck3\{JK‚Bec/W„>ln9gŽPY†SeBh‚1hŠ8a€:Z{=f‚;€„Bb”NoƒIeŒO_ŠTt€Pn@i‚Jt‡Lf•Gp„WrE_‡Oax@U†6v€>}–HtMsšDpŒLuwD‡‚F¼¢UßÓU„åk“`{ŠZo…Xg•Mq’„‹ˆd‚§[e•aˆŒDo›Wo\s˜jgŒLp‹G˜ŒE’ÀsžÀt|ª`„§vÕ¾WwßkdJf¢?[x?^pQ]g9^€R‚„Dh‹me}E¤dmo“[k€Us{\i|WdœYsoD_ˆC^qCh“b_Žg ”2Œ×j¦¤Ty–Me’ƒ}G¬fËPv¦bt§rXF‰U†”u‡¶i˜d`a~g=x§Rr•ns…h„Ã[z‰C ±‰‘ÎWº®c‰¦fp¯YŒHœOƒ¥NÍmŒ¢Fy¬R¤I€™Rh—Cš§M¢½e|™TŒ¬sg |uš[`¬Hw5v‘4gz=quEp“Ms†ZŒ³?©[Ž”3}AušH…¢T„¡L…¶bj¯nŠ¡;‚>‰´A]§Ej‰-h†IV€AlGh|3`˜K…“B‚¥`dœUržH}¢ ž¢ms®‚hEfˆ_›@|©IpµTj–=r›?_ƒCd€Ys„9jšfžº}ƒ–Wi‘hW„^wx:†˜VŽ H€®ev¦TͬYŒÉLÿ»Tr˜_“ºx©{o‰Uo¦CkŒ>a„Gu—QvWr‡El¥_sžHƒ L—§b“´Pu¤KrœoŒ—Fq”LyŽfj°FeŒ;wEbO`‰:r‰[vNˆ—Zb†Hr‹Q[˜Jh’ba‚Co‡EhOoAaz?_‰QhIx˜>bƒ@v˜E_7‚‹Du>pDf‰<e~oƒ¥pr–V‹¡XvNr¢\€R€¬Jt—V{¤SršMl”SgšGwJeŠ?a€7oFgƒKi™K{¢SrŸTy˜Zƒ¡O‡šKp—Pq¡Kw—RZ…Gl˜O]u•Ow¡Jt¦\r”Gx¢K€ S| UxžŠªæXqYc”Q“¶X…¢Ux¨`qšLlLh…=\~5sŠEj…B’e|£E^†AmMu T‡¨D[}Dd|F`‚HkKp•Pg‚<iŠFiˆLWƒ=[w<rJ€—VY|.ly<Z~7x•LîìKhGsŒ<^|7f}<k—E|›Dgˆ9mI]:_€C^ƒE_Ak‡F[~7r‡L_Š>Pu6Pv9[wEWƒ>^}:]…>X{K[‡KcƒD]ƒEg‰Pq¡OcB_Aa‰Nc‡HdƒJmŽC`HiˆCZ{:X}8_z?a}=Vz;m„B`5\z>d€CXv3Nh3Kj3Jp6Nt-Fe6T};g€Blw1eu:]l9kNe‹J_}Ph|BlOctAgŠW…|w—YŒ˜G|ƒB||Axu>es8a{P˜º–ØüÒáý˜½Î•uoHh[i—Wr–Uofeˆ\v˜a…¦z™Ã¬Áᑌ£uo™Zd†KQEj‘Xp”Vz”HPoM`}C_…2T>KOgl-G`:KfHd„b€’nu‰gJ]gQcML]F`R<le/rg;pp@`nHdgDZk?Yd8YX8gZ3en6ed?Sg<VaANf1S[6]_5Ma2SQ=VX9Te@gc@jd7fo7btCioAb{GPnEc\<bt6k`B{f;uiAZlBbmKYe:``;cm?ik?ez@[qQQtHcdB^z@asGRd?_j>TsGWn@cp>cq@`s>izIp€B^{QXnP`i7bc6Zx=[l:]u@=sCJb;S[0Tk1Zr<Z|SrqCqz:\}>]wMUlARpCmk9lƒ8^{NmuDWvLQo>Ml1U`4ah<b|=mtLezEpTaDg}cf~?`ƒIUjLck=VhA_pDf|LVyIjf6†x9fšN_~HRx3AxD_n?\4T}?=vE<b1D_0me:UŒ<Yv6^{6Vz7]{Aa‚Ch~;bŠ:]‹CX|Fa}<h…;c‹Ic‡UoEe•FhQ]„@R}EkrJh‚A‡RsŸWa“X\‡]q€R^‰H‚y@ˆ =sž]bŠPn}QŸpD°n—”T¦²ytŪ€ƒfŒ‘_€˜Xj”RR…¶c…¥i_Œ\h…=…ŠW£M¡«WÀodÁ^d•Q]‰`pŒY}•\¢cŸLZ¶pŽyO€Œ6¥P…¿S|{Yu¥8v¢7V}„S–I†¤eƒŸ_e]‘…@wE—œPl‘<vHz…=w‘A\•Ex†<{—{€¢f‡’nl²Il˜@vH|Ìw^™Wb…Y‡†Sb¢Bµ’^ær”µm|˜`ŸP™dÁTŒ±D—d“ª[w»d j{ŒTo„i{ŽV…™BnÂk…ˆCt_c°ryŸlˆ“^•Sœ‹O˜=yštv¾nž’LlÂkiœXlªQj|)xƒ8TŽ@hq6””E‘¤Ow¸suŒZ£¨Ov¥QxJqRƒÁ|n“U`¥\ňLj—]_]hgh‘;t…@p®;s…9®Mm‰C|¨=z°^’”=i›Djˆ3tLgDf€?e§Hx•CuXn‚IrKl›Ng“FoŒ6q”Cd’Qn„S|–Vs¡=oœExœFz§ly«^‚¬Vy—O†žu€~c·Tqœ\a[hŸTm…:_‘f}–Lyˆ/‰¨Tw¤;Èé9z“C~ªTv‹U{U¡©u} Mk¦]¢«Fm¬<lˆDpªWx ?{M–³Gu«Hl™M`’@t™RhŒ?m|AgEi„@]ƒ9m~DZ™DcxDk€>j9c‹:y–[mŠ<|ŸQt‰Bqx?z–Kw‚>a”6s™Cm‡Mo˜Qg–NNxAfŒJr£Wi˜VoQpœIi£MWt?b|8@‡£D^€AcK…šVs¡KœZ~ÃXkœZk‡\mŒJj‚Io‹EaFs¡Ad|@f‡Q„Ut™P†¥Mp˜Nˆ’O{V’QzŸR¨±’‚®KžH†ªW”ÄOj‘Es–C|¤Ez–@|Š;t‘DvœG“¥ix¤TšI‹ÃKªW”¥W„’Ds•B‡£OpIxR‰JlxB–?pƒ;dw9zzD€‰Pˆš<m{Nt<u€‹ÿÿíÂïBkƒMi†@qŠ>k|Cs“Ld‡Dd‹C\}5^{F[=^€7Xy=[;s’<a4Tr-W4Rv<Vz8^8^~5Z{:Y{8]~Bm‘F`ŽQWƒIT~@d>`A\s>Z…Ha…LbM]y:QtAq<_vBWw>ZwAd†J^<V}:_s4Tt4Ss(@a-Pn3Ru0\o3Qs<l‡Io†Lx„@y‹GvIq‘FoE††F}ˆ@aw=iwVr‰o„c–›Q•P¬’VŒK‡’J~™c˜Ë±©Ø¸Ù§°Ëtj‚9\z5g“P_ALqCNzTZmd—~ƒµ¶•Æ‹x˜J\xS[sI\†Ug–{šÀ~•¬TcuBc{;_y9U€Ba€Qb†B]„IVubl–uˆ¢po†PTeFFO<R]AgV5io9huCf}JjhLdmD[r@EpCU_=i\4am:MiEQjHX_=\e2]`=Zc6Kl@L`=UV2U\6]]=m]7mh<UqCMfHRhAN`@]d9Uh3o]@lmAYgONeEZa>SX1Q`;m]:_|Cc~RqpPW{NWo@Ym=OwJGbGYb<Qx<SnI^r:[vGj|Qh}PiuMZxTXmI^m:kf6ivErvD]€BNpAQd8]k'^{5dq;etFexDm}Eq…QkyP\†A^vG_t@a;S€P`k?SqCQp7Xk2m`+a€2]uBZcEjq=\‰LWy>cr_V{A^nOZxCRq:QmOjc9s…=YˆMho;a{;jƒar|S^ŠHXwKQq<Ot7UlEIvIAi0L^.ig%]ŠDIwHWj5T{2_z?w†7a›Hl†Tk†SX’Cev@a‡?^yD‚Cƒ›UlžGpOw’Nc™M“}@iT…ŽU‰¥_l“]~Jf‘@^CkFs`X•\ˆ}EzžG’tO·Z…×kx¤b|‰qŽ}C¤ŒUŠ‹XˆWk‡Uk—`‡†Tà™S¹Æ`w³g«–VŠÏ~x¨{…eh“LPl8MT.{r;`’Q|b6Yšf@eHbZEŽšIž¯hX¯r_uP‚€` ¥Yr˜no‚h†•X€™Wr~J›ŸNb§qŠ{?x©T‘al²rg…djtg\Hm…Kj]¸ŒU—ªrœ¶Es’R± Qš¶syº>xˆJ^‘K½”MÿÁ¶Ç†Ö„k–Ur‰]x£‰|£~lS^[„nX±¦Y±¹]À˜=¢FvŽER¢b—|7Š»]v½Kf”OŒK¾f—˜\šÃy…@q¡VuEm‹exŠQ„ ]f‹Ee”FQ’W_~2cšLyŒOt”L„©ex½jr¥gq”by¡`Ž•`i•F¨šU ?ž—XçEƒ³P²¸]‚æUs¦m‘-ÙfdŸM‡Vcbu\˜™GtŠ=wŒ:r…GmŸHj†Qz¢T~“FX}<tŒUa…]i>sœQs§@[…G†“Jp’Pi‡Ye‹KÊËOm¡Pw“X…ÄX›QbŸZ“Ž8~‡7Š:e—Gt Je‰?Ry>ƒGn›B¨Âa•¨Uåþ×»ËKŸC}£Ds¤GqœP~¬px“?xžMl‡Si’=‰ºh„¯[aœL€¡rƒ¢M R{Sb“La€>gŠHh‚@]?\~<g”<z–=p‚?j€:‡“HT’:d’Md=g•Ed‹<m–@qHw‡BmŒJm—H~>n‰RtAeŠ1Z…<jˆFfœDh‰Dn‰Re˜OX€2e6g˜?s‹Hd“<e‰DaCbƒGr]lŒE‚§ACvEe=d€Q]HbJƒ©F“¡Ao‘Uu“J¥¬fu“OkšU~Ÿ^‡›_†˜Qs˜Z…f~¦jm›`m™ew«L’^w[x¨Mg`t’[¯O”¾pîýsÃo¢Æm”Â}”Ædž”YˆK‚¢b§O©c›ÁR˜U¤£WxŽO’’F™ MŸZƒK—ƒBƒvC‡wW®°ÿÿÿ“ž‘Qz€?xyLŽŠO…ŠKŽIŽ>„‘<s…@hƒ;h|2yŒ<|•=oŽWi’:f~4f„4lƒ6r‰=i€9`8_|Be‰@{œG~›h²CY|4Y|A`‡;b†=\8V{=^ƒBd‡F_}=b„>d…B`y<Z>hƒ>]„@Yy2Xw7Wy4c2Z{(Qo1`ƒ2[w7p~7d‚=w…Jm~Iq‰Jm‚DpyG}„TªŽY‰‡MoDe€B•O—©_›–f¥—Ty|T‘`ž™W“ e’¼ƒ©À’¤Å€Œ¬~wŸ_kˆ<ˆ¥(<^)'D2L#U‚1RJOgic€tii]C_…AX{NkƒUbw_ƒzV|Wdu:Kq5Ps:EkCHc;JkHa€ZiŒ]_m]‚[MoNew@ZR,cnIX`?ed;fmFdyJ_`Gdl<[q=`p@akBk]7vg:dqFdgA`d?Ze5rb?Yo7\jEQY>UW/U[2^a8V_9\a<WpBIbDU]6G`/Sb8Wa3Z`3Sk8^_OQe@ffCkn1gwBvsEnDiz``wIVR`sKYq?SpARdHaa5gp6[†G\p?SI]oKzzFk|H\wParDlu=v~7qrAiƒFrOŠvJ£’@SÌN[{Tdl<]iD_oB\t=n~IuzBqLj…Rf‚RnC\€PjwL_†;ex?b|A†l7}”FjRfwHcn6j€Kh€HY‡SQyAim?U}AWkBVhAfl7e{@\‰SkzDj}=[{Y}rDX”ZPtPFtHSb>Wq6Gs<Gg8]_/iu%VƒMT|Mat.b€4a…@jŠBZUx‡L}—Lb•Pv‚Mc”:pƒKXŒFcQqƒF†ˆFw¥U{ŸXp‘Ml›M~†en™\cyf€{Jj–UcJd…E]sIZ{Ha|@ox?ƒH…žT«µ’n¤ÑdͦKºÙ|ËX‡ŽN‰Œ\‡§IŒŽHŠ—[öŽwmÈœ~ˆLsžh|œm“—Eˆ¤^œ¥;‹«;’¥=«ªQ€ \nšYv{@rŽ oŽC®™x¾\~š=ªŠ?’Çjz‘}‹¹J¥®`£±g\šT|‚M…´v’–]sœ^eœN†Lv¢F‰‘Co…E]zK_wXp~TŠƒ|®q“Sx„S” |z–ƒwEq´a~6ƒ¤|œ¥}…¯„v˜a{.}ªN{šLi|A€•4…¯D£QxœJ|“H£¡N} hc–Qk–4j—oXŽ\sCt|;€ŸOh•2Š‘K•£gœ°V…«F³Xk’Ab]nIƒ’Ck™Fe†?g…Ah<~ˆ[x‡Tºgi‘N‡=a¨Oq—K{£^’Ni¤hsšJ{¬g›ZŽ—w•à y†M’QjÈ~„C¨K·¸@‚ Q“Lx¦JušFhƒA€ˆbs‡7zLfƒE\Š5s‰M]~<c|/n•Qj”cd~?|xDtŽ;p{;…ŸE¿«‰¢øœ}‰4oˆWjI‚ b|žIvŽdŠ I˜Om…Lo‡;{3¡©cl“=uœM¡®txƆt±rrUjš`w£CiOuŽIi˜S³Å†^ªE©WMbz¨[q„Fs¢Sƒn›±XŒHpCx’?„…Gt’C{@f/pBxJ~•Fnœ4m’NY~=Z{Ff}5h†>]…5c„KtŒIs•Go–Dp‡RxŸRqš@w”Ia@V5g†@_‰<p”G`=_†AdŒ>v›J~«Xt–Ma9kŠ@]Œ5`?w¤MqŒ=mƒUw˜SwŒDsŒ6}¯Js£<X|:`^–·…sªWs•Qr¤hšLd…?d]Ž\~\p—^ªmu©V[‰S‚U³Q‰¨soœc–éY_™9V‚W|©_†§l±Ñ°‚§h—Å‚m¡p~ªkw‘RušWi”[sV‰«t¢`|œf‹žeŒ§b“–\œ¥en‰XÁ°[ÜÔ…¼Ë[ª–VŸš“½µÐIJk«–L†—Q£¥[ƒ’W‹œp•ŒFh{^mxKˆƒA€†I’¡g’®FuL~‚Cm€C{†B‡JŒ;ax=e}Cs<|›b‚ª\z¤ie‰G_=U€<^ƒ;l‹Er=i†7^~FpIh‡Cw˜OiŒ<lŠ>`…;cˆ?f†5d†7d‹5g„:Z€8^~3Y}:i<f†?]‡Gh‡OxŽAZt?hHt‰HxˆGžc‡–Z¢¨V£¨NŠ™TŸ©}°Â_‹£^{†Vƒ“W¤ÀwËäq¸Îs¥Ë‡”·t–·o˜Xg}5Vz%<V/G5MQs3@b@XiHVjP\wHIhBfPgNLgIInKLcB=YKLjDl‹Kv‘?p‰:^y,La:>hUV€W`yPLfGRaKIiLBQ"jgBbcEbm@gtDatKhrFep<Wi?pl>`i@nd>…c9n‚IqtRZtB\pCfjBY|8^nPWd@Qa8g_6nj9cz=WqGXlAWh>Z\@T^2Xi=Pf4Q`9SkAzdC\}8]|Rj{@lNz†M~’Ql‡WV„RK}QIaKXl;Gs@Vj@fh2ow9m‰GeEl„KfGp|?]†QdvQtxDtHs‰N_‚J[ƒR€rTjR²“SgÍrb‰‹[>ngDk…;cŒHTƒPtiAs‹DV†[bs_kƒH[yVdwLv{Dv”H`“Rt{D~“Ic’\yy[hŒFrƒLkŒIh…ZX„U_n;i{D^‚@`~Am†?f‡GbˆSZ€H]w>RyRfr=qJ\•`RJWiEMw1Ao?g]4|6v›5“žTc´Wƒƒ@ƒ§Hw¥ShžYSNcyCw?jcn„Hh”Jm‘R[FY€Cp„O{“Ph¤U}Šp¥Nq¦XY[k{MpŒ>xDZTO|ZKpA`o1h‹CkƒG’…=£Qƒª]Œ qm¡{rŠh—·™Ÿ¹|Í¥œk¬¦Z·»[‘Âg™¢bÛŽP¸©‚‰K‹>t¦Z¦q^”»\‹Ár„—lpªq•¤y”½”§¸gi¿]VqŸmŸ;¶r¢iexK|•‡w{\œUqÀsv}\n„[i“@xŠ]{›a¥]€¬K•bŽ˜Ph°\t’j•Zj™Hˆm8»ŸA†·x{m‡ªbs‰Xä†Kªÿx`ŒV\XMq…Rqi®¤ts‰`drRz“MhŠac—P‚›Ypœoj¢Sn—bMIg…Wxµn‰°Ok›Cp„>mŠD–8”8ŒŠFz¦P«U‰W«Ís~¶c¬W|™UjxQuŸDt¤`k¦O‘’Yt—<s”Bl¢MY‰V]ƒOa‡8j’9€’[`Dg~IUƒCbŒUhQŒˆWo“[”¸f¶dt•Aj£Of‘Yk˜>z–Q}¼¦ržhl¤Ov¡Pn¢ac…=n{B|ŒF¦nŒŸ@qšPk‡FT‰Azz:p†Gk˜Hw}=|Ž;{“H‚’H|¢Qt’`•ňdŒ@]‡Ekˆ>x„JrˆJ_–BwˆLŽ«Yƒ¬Kœ«PŒ·`’™[€†U‡‹P]}Tc†c|‹VyˆC\ŽGn_KyFa„?mŒ?v¤X¥Uˆ£Z_‡F]{Pt¨Km—HhG±gpžFgžLc…K…’OtƒPz”FxŸRz“IwHcIržGw•?v8Uy;k~;f˜?^…9e‡?y”NiŽDn Gp°A€¨Wd˜RsW|•<cŽ;a>nŒ3q—Da{=`‰Cc˜G`…He‚Wd–K[ƒ?t•LW”7k†>¹O{V~°L¢ZjšO‚™\hXhŠOgCi”IŒ©Uj‚IbŽLoKZƒO_’@ZˆAu\ˆ½Si TqV`ƒHjBhZi›h^ˆ^zc½ìu¤ËX¹Ny«Ux¢[‹¹v§ÄiÈ[§Hk—^q‘c޲RY}Mc”[©bw“YršWo’\âõŽúÿ‰çÿ¥Äï ÿÿêËõ°±Ù¤n”Ÿtµ½y”£tޤ`t˜]‚¦d}’aœžcÁžV–šDj‚L©›]“›a±¶‘™¤H—‡YŸŽO‘€^³•_¤”VˆŠN|<s‚JZJs‹bt—Ql\d‰;^†9hˆCt“Bt“Eg†@bA]AgƒLj™ZÂÜV˜·@uŒG^‰?^„<n‰AhCo“Cv‹>Z€<dˆ7Y{Dlˆ?\<X~Bk‡Gs‰Bd|>VzBl‡MŠ•S†Ÿ_¼»b—›v¥¥m¤\s‡zr~k´«[Ç¡l»Ú¤ÛÿºçÿªÝÿ£×ü‹¶Íz“»ws”w˜ZL]0;U"Ea!Ha'=V(@[7KdDWpDW]AV_?bpJ_{VXt<?_9Sg;Yx=LhHa„Viˆ`e‹Sa‡Vj}>Ug6Xv@]…Rb‡Eh|Kk|Nd~Piw2rYAsiDY„LUwTXmR\hJYm?]nAXnDYjAkeJyv=j‹PnmWYuJfvPnAoŒI\ˆYMtCXfEh`9mt2d€K\[`hFdr@]gAVl@OiALm1Rf>Pl9e`;V„2X~TUwFZpMkuLj†MlŠU_|YauVSyA_f?Zz;byFix9i‡Df€Of}X•…T}°PgŸgVU^nOuqGgNo†]S‰UWw`ziCSŸOe„d„…VgŸ…OƒLkj@Zƒ6V}RXyLesFq€B`‚]osTk‚GU‡VooPi;a„Xg‡Xd…MwŠH€—O•šUvbhš\Y…Rz{U]•Lk‚IiŽGr’If‘_x‹L€“P}Ÿ[Q”RWpL‚}?\¤HbƒZcŠV\…NXuAJx8`gE`z5`„HuŒT…›_d®kkŠ[w’Hh¤{`”l\…SX€Cqv5g–N`†Qa‡Q~Wi¢ZQ„PetIgDh†\QŒQZlKLxbVqgxpF‡…4jTp‡Mc‡L^zAmn6ª’Ao«a¬“PÒkwšƒiœ[_YqzSuŽdv–|j™b_ƒH\yHYypW‡zjmkŠp…e›¥_¯…g‚¿f½™MžÅU®®ki±s\†Yit9ô™X˜ÿx¨ny–E’p‹Àh”X®»No_¯ŒEtÃHx‹bk›bf†J‘x:¢„FZ MˆjOv¡Lo“sŠšU±Òv‡dn•X—žDp†^‚“C™«mx¸Šf„U…’VžD¬§F»Ø³™Ã–ƒ˜;qK{ˆC‹§P’ŽQp‰P‚¤FZ ^v‡Ax¦H‡œJ†•Ia„DX†=bn(h}?sŒU_’bwPm–B‘ƒH £]¯MzœN¡L‰¨S‡£K‘SoZuƒCk“EeƒDvŸNg†D…K¤bn‡@o TcK‚®C„œ9`°@yz?¥Uo‚8„—8j£:x‹G…–IpZ€¥b\™uz†Fw¦Ge‹GvLIp×j}›_…™Oˆ¦Zn˜ar©J‡ƒ9…8”Yma‚‹TgBh|@wy;¤?lŒG‚Ctža ¬N”«X…¼X~Ar³Zj”F†A[‰;p‚<f”JW~KQs:rƒ:£ºU‡Ê\žÄ‚»cy¨H‹©He”=x±4[uPer9wšDs¨?dŒ?_|E^†>w‹Ob“_}}P_Ea…6h‹;^’:n†<mµpt„Ng{BlŒFq S|GsŽLaEXƒ@eJ]y9gžYV‰J†œOv6‚•?lžKg„9©@ySu‚AkIq¤Tz˜lmŠ@s¢E•©Tw™5q‰<v—EX‡<j‘B_ƒ>Oz<d‡@oŠCmB`‡:q…Bh˜=uR^“zh…Ql¨Vr™`W{>‚XnšDlŽC_ˆ?o›dsœM¯§Gv;•°~ÅL¡?…¥JaL\‚Nƒ¦H«Z‰¦Dx¨]†´Md’Jkž?SuKs£z²ˆu«l}Ÿ^zž_k‡¯w¦Ãpn©Tx ;ˆœe˜Åmqš=hˆOx›cƒšo ½eo’a¬®±Æ·«|t¥€”º¶°Ç©ž½b¬Âk‚¢nwžktŠ\p–TfŠCmWe‡T”žb¤¤bm£LpR©¯idƒ¢ŽŒ¡Z½¡m•¢i² qÀ©o¥Ÿe¸›[¹©Q=fw=nˆL…˜\v•Rz’Hu“F}›NgGvD{’?tBc};`C~¦ëÿ¶äèLqEx“Fi‚N‚˜Iu?u”Dv„D–>hƒAx„>Hl‚5wˆE‚•EƒŽRvB^z=x“Nƒ_|Ÿ‹Çw–¦^~rVMeFl|Oy‡nµªw±¼ƒ‰ ¢•²¡€¢‹„¯°x…¸n|ŸahxZRfE>U+:N7J*:R=GgOm‚t’Ÿ|¡u†‹^g{iq€XWpT[qMj†c—\bqTcpYg‹on~UWpOOmSVl@>P?LnI]w[d„Wj‚`|Ÿc¡e}ŒCc]CyhAcŒGY€eQdPM_AP^=hbC\s=YtIgiJfw=e‡XegTe~G_yMh~JkxKgRVzQQdB\i2[e4awKTsQKiNng?oy=VƒEWdIOh8QjBJj=PZ8Jk2WgONd<Rc=Vb7\iCdnFenMXuEZsK`nAjx=i†Dm…NoˆM`|NLvTm`P˜†H_xQ…o`iM}t@y’ObˆXXy[rtXhy8Y†RVxb|x9[VPz]m`@n‚<T‰VNrGYj>[s?luF~~C|£PO¤gjiNbƒ:]xSjCa‹bnwH‰–N‡®`rª~e—adˆRt‰FxšJ\’Y_vQ\„PT„hlzHz‹Rpžh]‹m\~[\~7WMU‡UbuJ[ˆG`{HRs?rm6eEm…LgŠN˜‡R‘´iU {`zA[ƒLhŒTcŒR`DS‡@fp@S“DWsFgz9hRQŠMLnJXjA`|Gh{Hd{3gƒ>h€=o€D›zKl¢XrxGkI“ŒM…ˆIx’Cq†jŠGuš~ƒ™ob¦Nk‚Fc‰G~‰NuŸil•Kk‹HWx9Tn<s(€œGˆ¡:¬K¦Úrœ™b±½|±°w“ bq`orbo8g¡HwX½à¥°Ó”n¬t’–K˜z‰±gžºBqÄr’}F…·ˆ}¤_tEV…9mc.wdLŒÂŒsªUrLc™TQžWpÅk~Tz˜K“MlˆUd§tXnqœ{Np¼grXv–`žœjš¯nú¹t}ícj¤@ŠFœG†{`^ž\^uTtDbuCs‚=n¾Ywu@ŒHp‘?‹”C…¡Fª§CrÊMo•Mk˜:tŒK]šghyN£V¦–S¾¯iz•Qf’Eb„;i€St›5l¦J€§Ye£G…™k|¨Kx‘OQ•;dG_®gt‹QЧ9\¯Qaz:oˆWi‡S{¶O\žN]‡;h…Ev O‚„3{\Ž˜Gr¤?¢9hšur”Fv–JuŒP}§<¤µO”Ühº³D²Åa”®U{ÐFsš@o”P~˜?•K~~_ŽšGtH†ºb§wŸ£Py¤N‘ºožGØØLp°9y‹In—=^„3`Š6i‰Duž`o»oqœ]z›_|U{žR„°@t‘]o¨8_ƒ6a—Yn¡Vn™K€–D~šKhRzŽ9f–Bmˆ<k‡:ƒˆBd†8f‰8n’OkB‡˜=V‚;TR[ƒPe†?^‚HS}3Z†J_‡9eKfvD_ŠWV†bd›KX„ZW†W}–vd•GaƒN`„@mŠZeNe~AY~Ny£c£XwšEh†E^9TzAa€6V„.bˆ@jƒCyF]„@m…=e‚@y¤`_FW~Kr˜Q`Ai4z™O]R„˜Eo•Pz›Q‚¦`…±Pz¿V}°g‚¢wxX\}MWv9u™N|¨c¨Ä}n¡rxŸYžµU±OgO^Ž;}ŸW‰©VbƒBg‚U{¦I‰¾emŠn”µm_€?[„@r‹a\ƒpd„[³¾ah˜Y„”|“¿‚¨N‡h•³kõÿ}çÿY®ÍdjŽi˜n•´qoœW€¤P`?`ˆ=_<Z|AZ@h…Pp[[{Bi‰Xyš[€ ^h‰`Œ’c²«pž¥a¬¥t¶r¨®jŸŸ}’¡i™R{ƒP—”S•Ux—Zu—Og‚SmŽPm|KsŽIs†Ew’Pqˆ<g‰CnÄí±Š\bGgŒKh]Ф\¿bЍQ‚HoŠFz’P†˜Mš›V° M–TˆœP›X¥¢[ž¨_šªR•–P‡Šq§©d“h©±J’Xªž_“{˶”åÕz–±}ÅÈfx’Lx‘Z€TsˆL[{Tnt3<S0@S*AZ5@$2H;HiV<bRz d¤e†qRnPk[XeOHaY]€tj[O]S;Y]]…hrƒNKeG^iDQj<LW;MlLKhKN_LKhid‹pk—dZlNOmI_\Fcn@Tx_aeTbn=il:rq8d‡>ZˆT€uJ\“Ce|WgkGk€B[‚QczL€rEnLX|KNdLLf8Od5Rl?JlCUgFel8g{8SˆOSoLQd:Sr@JeAP_5Hc4Q]8Sa/P_=HZ0KX5Qb;Me<Fa;Of<kk3m{=e„Mj}[q†DhxRRyLTeC{h3`¤VQ|jdhCWy:J{PWfPanJr€A}€Ev”Sh–^fŒNLƒJSrYTn;VzAUSSoGdq9jˆBo„Er‰H‚”SL«qjoPzˆ6Tœ^XrJe€XjKt[€¬`[ªpOfbkF\}<o€S_•aX„VWwU_tJR€8iz=l‡\NŽh@ohIn8Ts5Sw3lr9[„CVvGbu<y2x£PZ™UV|Q†rEw®Vj¢™c„Ad‹G^z@svCf“[\’^h‚Ca•Oo„Kr9`‰IZ~IZuNYq+o}1†ŸAnQp”GkŠZ‚VpšXp›^t‹LYNZyD^rEmNp„Oy–Mv‡Yt™_X“`QxQp/fœH€M‘®\i«Qy:f‘8j€6hŸd½[kÜ~r†ŠŒew[‚œ^¢YŠÏ^c…;Ir:ˆj5†¬Ko™€ ±¯‚— Y‰ª_^·cÜŠNqØ…¦¥efªyŠ}Hw§bk‰¹.gŒ?¥<• e‘§Vf’aŒ9q–Eq|Xfƒ<uE`šK‘yCv©Yu})‡}3q‹XT|Fji9p’H–£h±¼O†ÂŒz¨]ˆš:l‘qŠjAjŠ?k~5w|>l•Tp|Xd“ha}.}‹8|«_‹Ÿ;r›P™·Tq§ai¢IhœUbN^…Cwz8iŠNªŒL»_Y—\cŽ?ežJrRnŸPkŸV\7b|[[<kŒM}²eN–YQƒ>hŒOd@w’YhOg‘4pŒBbu6p“Ji‹Ekª8~„6zŠFmv8¬Jk‹JoW—¿s†¥\½]‰ª\i§IŽ¢FÖcd˜qr‹dhŸt¤›SÑÿÕ…ÈR^•g~¬Y†‘ZxµLkŒBœ^|¬i{•Uh®Qo“H_’¤M ”š—Ǫa³Kp†J]”;uŠCc‡2f¤;mTd…J}—Kt–S§N“§O¦@y¹PožEp Cc†Fa±=lˆJz§GzŽH{˜FmQbŽ9d€Eu‹N€C_„>XtFWŒ?t…GYŽ1V‡=Pz4m‚7f˜9ƒ¢8]”4X€>bx5aƒBm›FMx2[JKq.…—DcƒHZ‰A]„;}˜On„JgžGjƒ<‹¦6‘µYj“Rkœ=s=m ?Z€7Uw3i‚Ah†FiŒedŽ>]ˆ?±¼lq¦8Z‰?Vw7hƒ2n‘Kdt9kV‹¾\|¢>pŸjr¬X“§a¯Ô{®×_|¤B]E}¡]fŒ>^Š?u Bo‹Pf”pk›h‡˜R›½S…©ƒp–@Nw<Yu8‰°_p˜dg—DOuFršX‹±p{¢T…¬Uf…=e~9On;Yu6YcEVqx~ \fŒbšl€œB‡”Ifdo££ˆ¨£b”‡d}s®Èƒ±_{W‹¬^m”He>_„8U|8]ˆ?S|Ai‘A\€>S{Em’He‡I^‚<i[—be‡œh}’jt’]uŽVt“X‡›]€˜VŒ¤eŽžUo‹Tl‰Ab~BXrEq~Mp„MqŒQ…™TmHu’J…–eË¿‹¥IvŒ@lNŒ©Zˆ¢n•°kª_§VtS¤»Y—¨e¢«k…–bž¥Wƒ›`µj§µuº¯oo}g¡h|ºÃn¡Å—ÿÿíòv®‘f§~Ÿ·¯Ï×™Úè·ÍÔp“¤S†_|•NalBS`Ihy>j~9i‰7f}.DR%@K5=V3+?E%;W0QkB[J>MH<`V\uEmyC[uPYqB]o8_pRŠ¢ev…JQiLTe=>W<E[;Vk@]t@Yh5@UG?\VEkFH\<OeKMdCZ_?Rp>ZiF\h@ekEqwBjˆL`ŒZmzWR„I[l]hgBV|DVqY^jGƒiBlx9Rn>HbJAa<K[4Nc7Md=Pk:Tt8sl8[ˆKReXP`=fe<Yr:amAVh9`_9`m4Xr<Sk>b`8Xg2Oc:Le=O`8Wg=iw<_|PosYb†JeuWYxOLrFRm2byBPqP[e9Mr;WhBbi9zv:‡Fo™N…iO ^[t`Ty?frHR‚9]pG^vFgg?a=pWtK]†S^{MSƒUZpRyx8]”_TwSt}Ga˜GT‰[ewWJƒQGiWSe;\k?TtJ_tQX{S\pCjpA[†:WuDUKouR[PP}ATx.[p5g‚:bŠAZ‚QRk;”u;’µ[^¨u}L_Š4C‚MmdIQŽH:vMtY/jŽ8J‘iViabt;U€LOqPhu<vˆWp‘O[[az@nƒ<wŒYpœWmRn’caD~{[w Zo}^pŽJj…FiŒD}3›¨Jx®UŒšdz·Qd”To…;c/‰Qj®nšƒC]´_vI‡©RhŸXwyC~Ÿ7¢}fTkI©l‹·ab³K]hyŒr€yE~‡8•R}L£;z§nv›lp˜Yo—\wŽIޝ–’œgŸj¡¯5x£`–A¢Ï„€Ô™’Iº¿`Þ}¥dh ;{Cz‚W|}GˆŸ9ž€AŒ—R€†VR€ŠJ•’O™…@——:z“>ˆi>—ªs€m¨L‡rUX—Tj.†¥UnuTrr;š‹Bm“El9f£P„~Bq£Wgz¿l†°`f™fv†G\|7RŒ0cp<m@gBn›<{Z]€NU‰Ai†At<bU‚ŠF|ŽGn›JbM‚8ItMlAuQ}§]z\o¢V§_h¦^v’7n€5r@y’I€IŠÔ]~¬B޼j”¿G…²Vs¯V ¬J“Ÿ_§Û\t¥\k¦Re•ck˜Eˆ™?¢²Nz¬N™Âݽքƒ¹2n]sD‡«av³H~¤Npªiš±\qLŠ©Hƒ«U—W]ŸD„‘ni¦Wn™=‚›Dkt=W‚A^Ch„Tl§Ao¨C¢ž?¦S§LŒ¤az¬v³¡k~–G_Š=p˜K`ƒA€—Ws“Kt¢P}ŒCn›Aj}?t•VoˆOrGwˆN_—Fcu2X‡8x9u’9q€<f5n‰d[—Lc„=fžTbŽ;c¡R_„7Vu0Iq+p€S‚²Gc‚Cb€<oE„†Hh„DxšClKzªi^ˆ:Qw>^ƒAk—SV†9o†C¬¸emˆK{’UI°Huºe†À_XxDW€1`‚DzIp‹HdŒMl¦ni`rˆNi“Fh•hi“hÅ~бe¤ºLz“klš?n‡;f‘FtRgŒLhšMk‹zc‘acPLyBVy4l†Cbˆ]U‰JS}CvŽ5Ee:Nq@Ky>s‰M‹ My–MX}2Md6s?sŠ?qŠU]v?XbLy„[œFWj+V]?HZLMg8ˆŠc€‰|lˆZc…S™YlA]…LU~@X|4X~CLq7R~A[~4T}6hˆCfA\8k‚Jj‡KnŒXs•Tr‰Km„DdD_ƒVob„¤O‡¢_‰¢Yn•Eq<_v6e;–Mv‡J}™YvRa~IqŠK~ ]Ÿ»y’šIq‰Dt‰Q”_¥¸w™¨t¡¶k†©VƒŽUm]€¦pŒ¨Ss’]}—QwŽR‡¦l¦zÁ´_•‹_ª¶\i€t•o°£ÝüÙÁæu©žn’Ÿr†§™ ½¼ÌèÃʵ‡„Žbw•_]WpšU¡³S‘¢h¤Ç‚ëÿöüf¢©9Vc2TX&CM!3E'Pk;bt>f‚)KhI^yOwƒDQfIUvH…’ExœTiŽ]\qL_uK\o;Z^1=RF\oLVrDWs/Lb1RnC[Ot”DUcMSf?ab@]h:TuEOkAUgC\mAd{OZ‚PUxSMmST`OZb:Ej:H]PUdAa_=Yo5EjARb9Ii7Ha4Ea1RV,Oi4Uk@^j9Xr@YjWbd>qi0]‚:^tOSjBk`A_€<PMZcFed<Rs:Dh>CY9OZ3Sf:ek9ZtF[kR`vMXoS[jJSj@La<Re7Hg7Dd??d6KZ4Xc5dp9p‚QPƒVMsiTsKYsMP„<XuDY{5PsISlKcj;d„E]„N]jFXxK^oH^y>RqCZt6[zMk|J_—@H‡N9`TMR@Og4BmB5Y5]R,ZxAY€H_kHQ{:kiDa…6f~EN„A_mGy|@d—LPŠJ\|?`Fa‰BmNaŠ?n†6g’If†e]ŠGo€E`Get0O‡D_uBg*Mš=[mUKt6P_*\qGW}HL}2Ts=`vVW‚AJrJPj8ooKl•Siikšmq˜J€•E‡«[{£bqœ=—Yr³j“ŽRœ®hÂ…™¥Zz£pq—ep’Ul”A[M~„SuG˜¡Pa›M’‡P„®^h•XrŽTyˆNu™PxŸB|;©Àiƒ®su›Bœ˜7Ÿ²G¤Ùj‹]¢¢V¬¨U~©O¥ŽHQr¨mÁ‘H–ÛToŸrYVro\}•`kš`y‰a†™a‘¡[†Çn—ŽÒÇe¶UxšVuj=„y>‰«‡“‚_š‰d§Ž_·Üb‚´g¤‹Iv¹_ÍŠ`ÈÛd§ÅZ¡‡Q—Bÿ¼X³Ø`š´^ª£P›´ÇLw¬T—ShŠ8q†@hƒ<uz@t¡Ps‹S•O¦Ln¢a~ƒ<nŠRn…-„š*q’?}”c‚‡7q¥BSƒA`@‡˜4l–^q‚6…|Hi–I…’LTŠH`ƒ;pxAƒ‡Lv¤[j”Bs¬[rž@s…Hl”H’¦bq¬`ƒ¡P‰¡Nyº@ÄÉO‹ÓcÆ·b¿ÿ±™øgj¦`~°qy™[žÉSyŸIj‰K\©N^‹JsHz l™žk¥Q…Óomg`˜Gy‹:e Qm¦]y‘@|•UlªXj‡B“H~ Wy©Ps±Rt†Kv²]}‘@Œ”Qf|2f³9d…<`…;zŽSp®np¡f}šdœ`zÎvÄÇc»Q…›Ws‘;h•>oˆ9f”P|W•R}œUrQb—@…„CiPrŠ4€ P{Ã_f™Krš7}—OhC{§:“Êb\ƒ7K‡Jn”IaƒBhƒ_eD]‡9r›>Z‘5d‘Ko“TbŠJx Ar˜K®É„¶ãUfˆ_€›=k†F“Il‚>s;v–<€¡@‰§F^{Ya“O’@hLÃ~u‰Sr›T}•Eh9¬>a€GW};l>]ŒA‡ŸE}•T~˜@Š«=gKl`Œ˜lz©‚€§Z…¦Hw˜VV{8nŽ]}–BdŽCU‰Mg’Cs‘Bq ?j…O]yD[}3`8Nm6j‹Y[‡(St*WvVcyfbx_[|KHk>Ym6{V¢¬eÞèb–½C^{FV^>WgJm.<P$4I Ce6KvFm{Q{—UiE\P\P€‹=Yr;Y{9a†4Jq0W~5Pu>‡¦Cn;Mm@a‚9`Bi‰JdŽJoLv’E_€=Zz;Pr<cˆ[ޤ[q›^€œb~¢]}žF{Ba‰EvNnIvXp‰8QqBt“Rh‡Z|œiˆ˜IuA{†MŒcŸ¶ˆ§ºo•¯qŒY†‰IxŒQ| h|šVr—Ns•NwS’¹iŒ¦rª½ƒÎÓ}ÄÉv£¢k–¼[„®†¹¨¿éÖä…¯Ãk£»q€œ…—¤€aZ[HXmJe}išÀ‡¦Ô“¿Ær}°Ö½ïàßó£±Öw³Á=PY/GU)AP5SqHfŠNXCa‰DbPf…CO^BPmO`ˆQoQwŒRXpKLYH]dE`i6;R>J]NeyUz•E{“Bd€[uœq‹¥a]u>_pBOtHYkIV€EWlKZlDRxBUnCYlGiqM_}G`yPaoBdc:N~BLhCW]9Tk8QdCVc?Nq9CnG@d7RV-Nl/Id5Mc=^^=Kd>`\@Zl7UlDPfIOdFec8V{9DwVMW>Me2PiANiJYd<Zk7Lr?VhD@g<XPNXg;]qKfiG`n@Jf<Nd8Ye.Hp><c:I\1W`-Or7PmGTuPNnK]o;[z8`yGTƒ6XyCUvAPqPVn4es>KKXe;f:s”@u’Ki‘IU‹M`vDbwEG„Y>e[<T6TV'^|%L=Ki6Pc%Nn6cl>^p9SxA[m:a|>TyBQoEPqCod7U„=lv_rŠEf”K[ŠDsˆPq›Ld“J—‚If»Q^‹N\L[€OVsGN„Dkp8q‰3]”M—}6`Ÿ>XGrp<ˆ—JRJ\p7nt<x“=[GRp4[n4G‡AVsVh…_u‰>m”I†V€·`]ŽWm6}˜gv¤ls©t|¨q šhnÈjj‘\s„K–™E{¸VwŽ<y›W‡¨FišhxBy–XtœdYœR}ƒ>‰¬Jˆ¹wn±Q€˜E´mq®u†”\œ²vÁl¨k‚X{˜\†¼{ U‰°t†UÈ¢A“Õ°½¥[¥Âo °Ož½N¢Â^“ÖI¡¦O‘¥_Œ¯uŠR´›l ÕˆËÙŒ•Ég˜£L¡˜KˆŸTŒ—P—Œ\¦et‘b¢‘J€Ço”›Fפ‚¢Üžµ•e“ÍP«½rŠÑ¯v‚n|›a»»Š¬Äz¬Z›RX]˜=aªGd|5À†=~ña€Bn•\Œ¦Yp’?†–M«Jw®P£Ž8”œD…¸^y˜HZ˜Da~5s|^–žWPmÝZ……F~®I}‚=e–H‡²4r¥C‚§ZvžW„—^m«BrŒ@iœT}•Me Hz‘Di‡Vh†R|‡AŸdna•ƒ_«§{ˆž|žškºÇcl¬K•¤s‚Àfm¬G`‡Br›Ge‰GvƒHƒ“I|‘Oƒ¸•q´n€UaŒ6gˆLW`X‚C†ŒMw¹deŽ5j8g‹Mpanƒ_eC‘±H}¸UpŒCd‚3nŒOf/“7€”:n˜M|¡>z–;x±MŽqõÿ׺Ø~j¤Oe£Qu©Kmˆ:d{<r‚Kl~JlnRp»En•NuŒLyªTkSs—Qm“<sŽN¥l’¾gy–C}›`k€=Yy4O|=]ŒHmˆ9]›DR>m—N•Ur™Dy¬Qq™@v®Yn“K™b…Ïzy¥Q~¢o^‡Ax¢\‘¦Fe†@e‚P}ƒ[ªjr–@Ž‘9”žYxžBi¡Kt¡LŒ¾W¥½|޹;m’Xj¡Go”6œN†¤BˆªOvŸQˆž]|¨_`—K}¹LgŒ`n˜Ud–^r›WgOl‡<gƒM|¢k|ºRUwDi‚_x°Vh‹Jq–HxŸD©Cl’AYw5¬ÉGt›CV“@SqFr›Q_yBdw>^s9_k8gkQ~…•ËóÓïÿšn‡<Lp,E]:ZkT‡®04H.D&CY/HUA^xKrR§HwOa}<Fa3KtBQp>c<b€FX{@r™kf‹N\…4Ml:X|@\…Xe‡Oq”SjORvATv5Y~7i‹SkJl‘K\†Vl‡]p£Sd’Rb|MhŠIpŠM‚›[q‘>]zLªcˆ£Nvš\{“Af…Bt–U•§p‹±b£b}—Qy‡[rƒI‹‡P ¤aª´XrŒO•^¯Ð{Àé‹©Ìn ƒ˜±‚¢¯l‘›ss—^–½€²Ï’ÃóÄ×ÿ›°Ô|Ÿ±Zpš\y’\ZhFZk9m}F‚Ž^w©“™É”¿m‹®™³Ô±¡¿¡¯z’»X\j3IW/B[06MDHfO]qWv–iˆ§]’±Zˆ¥Wƒ£JiƒLo‰T]kCft>o\C[ZNjj:Vf:<UL\q‡²lŠ aƒ“\lmt‘`f…H]‡KQvMSiHUq@VcJTjFCyIQ_HWj>dsDrˆMd‹`bTevNSMdkJlfAL~:XaHSh?PkAMpFVb8[_+Ru0Lm@L`<Sa3>g5SJ8H_2KU>@W>IN8l^0sy=_†UVpIMo6c\<_p?vmHi‡@^UZpLPn@TWB`g7nwFihG\ŠH^wC\f;gv=Z~DNlJKp8Ti0Ns8RiBKq:doAd{?N€@XoS_z>a‚SKuDUkRUzG_s7gwH^w=m~;ŒIo¥ep˜]w„YU”XAtRCaHPV<Za-[o.^‚-V|HPr6ed+œ> ªHhdiS_y@‡o7Ž™Fp²Wd†Khu?Yv:\vFwˆG„ad¦McŽbW€7\tBq€@j–[jŒRb†MV{;ns9W†:f|5{‚8q¡Wp”C^yZ¢}B€·_X¨hZya_u<^‰LS{NOyXMk?rq4]Š1R:vm7|¥Oƒ¤;l’[t…L\˜mb‘It•Z‚™Pg§fw„;~‘Hh¬qh€JfƒE{Lš›oƒÆq‘´fu¸Utˆ_™¨UŠ´b{§P‚”Xv±A‡œ^ˆžcwphŠD‹‘X§qƒ›I‘¬O±vg•w¡•]œ¢d‹Ûf”–y¹Ázh¶i“z[†²‰¡”US¯smif¡j«¼m›±h‡¦] ˜dRª_†NBŒ¢KŸbŠšcŠ›„Œ½Z¡™_†Ç^xJœF޽w†—Yt\Œ€k{ŠRž¦T‚ [‘Ðs¶—t‚ár£³‹}¢C±’@ŒÉ_²~pt”qr…Wq¬N{¢Pm£nƒ3¢‡MŒ¥Ÿ•›LyO˜¢@n—B‚šA}“X€Œ£d~˜hz¬Z¤I¢‰Bm€0j7x“Cx±zh¾wE„’H{–<g‘Tm«w›‰\s£IމUrC„ŸJ€ŒQ ®D|©W•”Kˆ¿PƒG¨ [ÿÿd†ÿr‰‘I~Ï_z¡nžÃf‘¨Lƒ¬stŸ_i›[¡’_Ä–VóG›cµžGž»9}—Ku‘Lnˆeªbd–\]šGvByãf–™En•;_Xe~<aˆGgDo;g9µØZºéR×ek?g•;yŽ7ž¯@¦ÔlpœQl‘Ov[‹žVnŒ’VìÕÙ²sˆºV…¦GgŸUjŠA™–;\EW|8VzFjŒD„¨pjŠEZˆDl‹RŸ–Hh‡It¨Vq¦O†˜o™ž\lƒEmL‰Pn£9i9\‡;v~EpGg‰3yG[D_„_]–[˜¯xŸÚhv=Ú×m\Kp“Bv•E^}0r—>ŠL‚<€Š@†¼~”£YŸ³ps§„•£kŠŸCg„Hv‘\„žZpŒ_c†^ŽL‡¼Po€Dhix›\‚ˆH‡žN{–Z˜Rn§Er”SvœMbGc‡CfˆMkG`†F…JµÒ˜¶ÒqÆó]ÁÛi¡Ð`qªG†ªc‘·d‡¤Qs˜E…ŸV¡Ñ›ˆÊYc•AUi@‹f`zAiŠLsƒLh}@Wg:brSd…†yˆw}™Ar›$8E-C7aydn•+C](Qf3o‰;l†Ag{Jy”]p†SQm3]u3MtAƒ˜Ie‹St™b‚¥>h†[~›Om†LpŒK…˜Gy“MmŒ@cMw˜<b6a‹>l„=o†QžO˜½e‰¥T˜NiŠIZ:_†HjŠDW‚KtŽOy–JcŠd¦v¬o®P~šPpŒJ„¬^ƒ•[qO„›\w–JjIsŽ]— [²xµk¬Uƒªeƒ«¢Þÿ„y¦k„«p•°o•¥YuJtœ\«ƒ’®xˆ¶’¥Ê–‰¶{‡¤Rj“b©Óh¸Íd¿Ãe¥¹n±³Pˆ”‘•Áš¤Ä‹³Ý¯×õ¨¶ktf¡`oŒQ~–Hey;]m0BT9:UMPidg…jZ‚f‚ª[e‹N`wH\~_}ˆW”•]‚‚BO`PivZŒ£?h}Qjˆs{œ€‚‘~‹šo…k|Ÿge…J[…T[pTQiMed?ctA\gCYrOioLe„<[‹Ke‚Ra€UO…SWpXWfFqjAq}@T…NXjFIj<Ta:bl9_u;Qm4Ko=Q^7Va7bh;Qe8NL4A_/AO9KH8NO0Lc.e^3h|Gd|JenIfd;bxBlqPw‹Or“Yt‚KkuKeiDhl<oyEm~EZŒH[}KTu>mqCm‰G_ˆV]{JM€;Re:Kf6Ri5lm7b†3O~TXmJWk;OrHcaHgqCMMkpFv„?VC[wDp~Bcœ[Q…e]xI`zNl…Sl…:M„=]c7Tu9\p5f{<Z}5do9ˆz<“¯cq¼‚mnw‹J††Fˆ¢Yn¬u^zbiuI‘w>~¦Lu§N™`]»caWO3Kb9ga2o„?pŠJt‘H{’NvTu•L‡‘Ht˜h€šM”œSf¬Q¢ˆ>†ÈˆlŸ…RˆXfr3W‚LL{AWl6Zr5Yv6XqGe@fšC—L‡¸S€¥haœVa…@r€<TŽEQuE€uZ~‡>m›T“[tšPa„<y„@‚Lš qu¯g““Y„±\ˆ¶VŒ¯s‹ªc–³h„±[“£P‹¨V¦¯Z‡ Xˆ¥W€®aŽžw„«L¢¥TŸ½mg©Gfh:šˆE…—V‹šdIŸeŸa:]’\jlUIŠTnZ!ªŽB»Áw¡ÑnÇjˆ©Nbšksw.¢h¶Q‰²iwœDl“Qˆ™]¬œ‚›·hž¶Sª·rž¨L—¨P˜¡K ©b—¾S¬Êd‡¼h¬½…‚œŸjQ`P«W˜¬xkˆY…tQ‰—I_©ShˆM“‹I‰£D›®E¥Àlºâo{‰Of¦Og}Fž…L–§^v}IŒ‚]±‹Q¹¬epQŒVŽxm±GkvIizIm–bat<zr:t ]j{F[¥V‚€=qir±Ee‘<jŒL޲^€¿e…™D޲ewž|‚ˆMƒŸVzÄŸÿËÝ{¼ž„—kz¨CŠ•d†’n^\s’8d–C¢?u§oiŒs~Ÿ‚pŸV{˜{–œNx²Ou Kr†ai§CjD—™G‚£fkArFo–@zŽ>‚°C‹˜<™>g¡D›–^»à¹Àm€.pQ§±=–Ävƒž¿Z–°rg?s™WiY’šI–Ä„n³S€‰a¯U™©HŽšQ·âmy‚LdžIa:€ˆCv—L]‚=[ƒ0Vu.r‘Sm”>b‘EbR‰‰H|Ÿd_‚<yQn›^h„JlA€^r…Cv—G}£I—¬Ow±:_.p™DsšK]™T†–DªõË“¤EdPx¢O–Dw?t•\…ŒQ‘Ÿ\x‘J…¥iwšhŒ¨VxX€¤dwŽ>¢ÇXŽÄdpŽBi<p†Ns˜^h†Goœ@e“Pf€M€ V~•Nh‰Xo”JgˆRyžRtœA¤[k“D€šWgˆ@”g{¢‚‘±‰–¾¬cžtd–ZpŽ=x™Vb‹ll–y„°Sq’j…¯txª[mŽHU…@w§UyS€¢R¢nŒ`h‰E|žClS~¬XY|GZ|ARa&Wtj„Hb‹CŠ–\¬ÀWušma‚Ok‘Zv›xƒ›HPg3]vM’UPs\Yxd®ynžYUwK`^x“\etSpŽl‡Ÿbc‰Km‰Y¦Xk˜MqNn†Mi†O«axšnƒŸ`—¨Kd†P^J~œYL¤KyœWcIj‘e’±Yj•evŸU~—]Œ©V®Y|¬P}—LzœWfŒCkRdŠTq[{˜et“j›¼Yq‘Li†z—Ç{–·l¼l¢¾\x¡Wˆ¥P‹¤^†§Yo•Ut˜\‚œj| b†Nz–q¼éŸÒ혔»–ˆ´›Áˆ§ºy‘„‰Ÿ„}˜¦Œ¼‡sYs£„Ñ特×mm™inŽNQk1B['?Z:NdM_z=D`[®X~šCbL`i¯~¸‹’¬oœl‰Ÿu‰X_z]g€w}•yy‘yp—|†«˜·yKrBGmKOcGZa=jk9AdŠRW‰]exRo}IeŒY]e^zSVPVnLYi<no;X‡HRoRUfRDp9Ub<\d.X}:Mk<MlBLd7N^4bc7go8vf9Y<NbHSO6`Y1We4VhAbsDypF{‹IvŒIv“Vy…Ut•Ta\hzTkzNu‰NyˆUdŠWpWk‹RdŒLb€Gj}FuƒI[’U[vUR|AYl<[s/\vB_v9dtAXvUVqDSp6OkDhc>lƒ?W•YjqTx†Cq W|ŽSpŒF]“\p{ZlŒI|D¸”S‡×O`°whzRY?Tl:kq@a6c‚EwGƒUX¯jP}b_u;y=užkV…VmgU~{>V?Šznp©iyœm`’o`|Tm|0X€Aep,{7}“Qr’NX€B„ˆT‹”H†¡Tz¯ylW€€Yt˜PNS,qADM>Yj5s|0]ŸLRoIur2m’@q˜:hŠ>Rz:f}E€”<©Ww£\^˜\gƒGpŽ@[†Bn}@i‚>‡D]™p}zI€£EhŸVl†F¹…B¶ÐplÇb‘Fr¤T~–_uYx˜Z‘LŒ®g‰U–O˜¨\¥²‡¢«UtÄb}šW”¡J§¿Kœ¦iº¥cjÑN¥xPªc·›PTªkMd-kMD®‡$¥¬z“ŸP{ÃH›f°‡–Õnž®`Îm~ŠDƒˆ/Á¯VŽÓ‹˜µJФKt›?“¨W‰ªm€›]µŒYŸÅf‡¤Zž OŒš`…ÌŠ”`œr¡U‚¬_©§AtÌdŠ}9j˜…|’Pl†HY†QaˆQd“D’W´u±™]ŸÚˆÞ¶†`³ppx>eœ;†uD…‰mŸŽ;pžY†™Wœ¤dlšw’’Ay¤U†’hé”M¨éJ€ÀX™³R…©7\Ÿ]rP_©mfƒ=g„OS†XdAy‡9™šWnÏ€i¼Pš^~—dl˜B™žbi¼k†ƒBš¾¦}šPx¯\¦©M Ls¯G™¶Bb¦7wŽGœ°VœÃVaÅFVzFqB ¹ey³VpšYs¢?p¢Gn†If•Na™Ošº`sµ@‚«Y}’K‰ÅYxž‡ŠyIžƒ£Õv£wj–[}™e‰®I‘ÛtÅežµW‹Þšn²k{ŸOÚÿdaÁGªQŠšhtˆKb“R|”Ešk—¬mu¨”•£H|¸J€ Ay—RŸ£s©¼_Vž@Yr*“¥H—H–Hl„:”µPƒªNz«`lˆ=a{KŠ¢V„´Jm‘F}OŒ°Q{£X¢gl…_]ŒD`?o–=P~,}ŠV}škn¥`Vˆ9Š´W¦Qx—DyQ‡ŒQ’¬a”®YƒŸQf˜Z‡’XlM™`‡Èn‚º¢³kkœEs‰K~ŽYk†Iq¦Bz’Er©Py›QޱM” dnˆYt’R|œJv¤XÅjo—cVr–jn‹Djƒ]„Qy«gpŒ`d‹=a=_ˆ;g‡FgŒF‚–\†¹ff`qZpžWf“@k‚Dj”Dd‚Em’i‚®fz¦Kb€D‡žYt¥AsŠOp4k€Wd‹2X-O}9t„Nnˆ]^gcsˆR‚ŸN¥·gš¶gm„I|?m‡Nz›bZu5EYI_„][ŽMY|?bNv“_„¤MzXc…@U}D]€VŒ§^z JYƒ?eˆAjR‚™Ww’gƒ¡^r…Q[}Ib‚WyšYnŽRcŒ]e…ScˆJmŽZ|›Uj‰P²Wp‹[’¯{³Ï€¹áx¤ÆO€£Su˜EhŽIi“JxŸYj“Naf†¸]b‰=bƒOr£f©o´jwRfcÄ^ŸZ¥S†¤N~™O{›VŒb—«_Ÿ«e‰¶ˆ…¦kcrdf‚eu˜|žgc~m“´jˆ—_h…QpŽPo¢™‘ϯ¸àyoƒN[w>G`4Qo3Xz7WpANa6XvYˆav™TtŒZ’¯€œÃ…•ÂŒ€œ†bˆw]xdYuLVuMRpgsŒtu“op‘„¡Ä|†žjEaAC^<Z\2is1tˆ>ˆ–Mu cX”kk|al‡J|ŠWhœe^ˆa^{SgpTOt>dkJNnMQrLVc<Dn9\`F\e3ar>ewGRsB_e=`t4bj:osE˜zJfÃ]um`z?jcBo=t…Ke“MŽ€L¯Pƒ[z g‚–Y–bv`d“XtyJ—Ue–^[‡iguSlyJl†Rq‚TdŽPgIq‰QX‡YftJm~<]…9_SfxIl~M]„Ge{NU€=Yw=[q1Vw9RuN\kVpwBkŒQb“WU†Y]sU`€>fCw{B¸šVuÝcY¢‡Z{LfuGX{<dxJU;OzAox@iŠA€^_¨Te~Q~‡:Ž”Ri˜\fsNso@fˆNa€O[}PkuJv…bkŠKƒEcˆAot8}‡8?wfz’[nKmˆG‹“QŽ´†[¦itG~™CgSb†OKs0_l"YŠ@Nx:XjB€w5yQdžcmP‚ŒCoªBn™Fe“FsP€œP‰£HG›Eve?i‡7ƒˆ7t§PpšQz}D«M‹¯d¤±HcÊYs‚‰žŠŒ¡¼eƒ·[m™Tž›G°±O†©QŒŒ[ ŒH½ÊNwÀp™Sm¡ju‹]”ŽSÛ¼R£ïkȤf™Èx‰˜}¦©m¡³qœ¼\dħ…zJš²Lt†Ur‘d‰“z‹LqyW…™a˜¤~¸¨\¬h†‘Y‚–N”›Lï´zôk¦_¥–Y²Mžfz—N”£CÊtxÃlŒ™LŽ£VÉgªQЬN§Q…±a¦ÕnžÃ€Š²i|¯am¢@„†-v9{Ÿ8ˆšG—K¢‘_‚œ`t—}“‘Dq“h‰;yŸO‚j:´ŸMмT†Wf’O‰¢LqWr…F˜Nz®NßÏdÇýñœî—ŽÅmƒ´€v¯MŽ”Sx¼ty•KaŠ/`x5i†5n~?~|FˆšcgŸT§SÁj…œA€§g{®f¥ÅNs¨E{€Lz]£»mˆ¶o é˜s«]t«]zœD“ÈU\®Zmƒ]t PŽˆBÕÞŽÿsëÙg¯Øs‚£Qƒ—E€µG”–RÌ¿l§¼„ÄÊN½ÁSàÐt«é}¤øÄÆOŸÕ’»^‡ª8‰[ƒÆapÊ‚s¤O¹Yv®M§›\a˜Zˆ·¡|¬k~³Y™^•ž<†®N¦N…EÙhz¯Ey•qm…„u«ReG…‚I½«wšIy},‘ªižÈ„«Ã—ÇXŽÖ¡ëÿlŽ»X¤¯E|·F~iœ¬s³J‘¢j·o Ê|W…Pv‡Az˜GxBaŠJ\‚0w‡Uk•Aa“=a„7x–Zƒ–ižLfGi‡MŽ™U‡ÍuŒ¥^~–[ì]y X¸^{Ÿ^޳h“Îh}OpC{•Sw]«TuR}¤V}—[ˆ±e~¦\mŠA_‰E©Èdš½Vˆ›jxNs›x„¬Ur•Ch“R{«Y°G RhŒe[~LdŠLb…QfAZT†‘\_‡KbˆHy™PX…7a9kŽC\CzŸWs•_x¤]}”;~¢P€§LhŠHgƒ>„˜V|¢Lœ²L[Œ2j|~w—FpƒO‘¯V‚¸i»m¸|k’JqUyŠWWoGnŽ=Me6YsAt•Ak‚>^~HzŠk{fn‡R]{6Vx<_x<V~e®]q‘Gw—Iw˜dŽWr…Nh„Wt…F]xAl†X{˜Sr–MT‚FTyLwšM}žYqœJoFa†a‰ d‹©ƒ‹§u^‰kt“X…±jŸÄ_‘©JŠ®l¦Âak‘A]‰Hc‹PQ>oCk—V„¥d‰«i{›Kv’e}¢dgˆP~—U¨c˜ÆY¥Ðm¹ÚjŸ¼j„¢iš²Y€¤A]}J}•W’°e{“Ug‚n€¢u{‘I];^zD__r’„~²oiŠ7^‚2`€6x•H‹Dcy8A_6W~Rp˜X_{ITyc„½†¨Ì‡¯sŠŸXFZK:X9@d=euDZjSa~\_„b{Ÿx¿s”¨[VjDRf7cl9i{5`ŠBe‡\l‰ck™kn‰dJIdk`fWcˆb]vReoKcrHa{TVlFXhE`d5Rt<b`Aah5j‚C[IPpD`d=ir<fyEtwI¡Ii¿br“ŠVˆRikNpy9q„MoŒb•†U÷S˜£i€—{{–U‚Œc“ˆ`Œ£l—[}¬Yr™h`’b^xIen=cyK{{J]’TeyR^„LR{ImlNh}:\’KSzPSnH_mGWrCrL\ž>U€`X_5Vq<ds?\~F€t?œŒDh½hMŒd{dEg•CŠƒJt˜E•bƒ¥o~«{p‘U‰‡>d¢Qu‡h€B‰‹Ot¦C{—Gy™^f›Zd‚^\‚<sxCb‹XhzY{€2hŠW]ŠO^~JSu:awDwu=ŒKa©Uo…\{If‰E}†W~…V„ŠXMSrwLOŠinwP\•AtuDh›Y—†Cy±WT”PouCaˆ<g3t—5‰Wƒ®l©X}„_w`v¡fW“EqvL€‘L‰®`r¡\r‡:w”mWˆKqwH}‘ApšQz‹K‘j®ujŸ€Hƒ`qlBœ¦kž¼‹˜¼†¥¶l÷Îrÿ’H‰·L©ªnŠ¥²›»|j«Aj€:;®’X™ºu¬±^ˆÂp• Gƒ°PĘr–°f«—a‚°LØ£a”ÿ€t¤_w‰:mpJ7…«Pœ}I×´J´ày™¿P¨³H¾žRÿÔpÂÿö¬ßеºZ†¶m™ªA”Íg¨dšœ\s³_‚—I‹¥^ŠªRu®^Ù³H¶ó[´S…§c€lv‚Y”©T§PŒBkŽRz‚Ds˜T]x[Œ…AŽŠU„°R´“Wo›SHЏy9h\¬¬j‹ªYy‹A¤©>w‡Iy:h†D¼dá´¿ŸÎÿªN˜o^„\m–n]˜]]ƒ_„²aZ™px’2–7W…=}˜>‚›Kež`—~1i‘i†¢M{´l¥¤[³ãmx¬Mc˜<r|<i™tržPl³^v©O `ƒ¿IÓdTr7v9uŠOŠ~<Á¬h“õÀŽ¢`‘àO~§k‹´lnÇac‘Qs‡hw«h}³¿½Ñ‘—ܨ~´£h™cÔÝ™ÝêÙ’¾w–¯Ss Tcœ^ˆŽ<_–Sy xxL{§Fo«E~™\e™Ns„Rt™DnUvž`ª¯Vy°Iv½‰´‹s¦Pk’>q…Wk¡@“ vŸwz˜E”¨=¢Äz¿œŽ•µf†ÇxdŽ^¨¾‡¿‰~´goŒJgHŸ¡w€¡VrŽMŒ¯x—Í{†²Q‡¥W{Q}¢R{ž@m˜AŠAm¬NiŠAp„Co–R|ÌZ…ºh{±Dp…E} `~Âh‘ Y°qq¬|z—DržQw¥O‹˜WŽ©v´ju¥]r‡PŽSŸÉnf”L–bw¥Xp‘Rˆ™Hr¤Mo@¥yŽÄqkˆ\ˆ§dx²Zg…[mFmŒCo–L‚h‚šWyBnDeFeƒHt•MPx7`R]}4^u4iƒPa‰9t”AV|=j‹@w›PhX„ªXmœNf‘Vv—fx˜Js•Fxl§Âˆs¥ca„5cwPn…OmYwš\y¡Gk”K’œ_j‹^‹°]T|H_rJzŸHn‡<b„<j‰]|§Ti‚?dUsˆUiƒAaz5f}=er:lSt˜PYzMrX Y…žar˜Cc…S„œK{‘R}žb¤e_„CP{9a|BwŽNaŽMp‘G`‚7]|R¤\i’ZoYvJ_}WlŒg°Œ‹\¨sŽº``‰:_…5g=Vy>eCi—U|Ÿk~«jxš[\‚]n˜T„¥Ir”Ivžl«ÜŒÇï‡Æá‚ªÆd‘µhœ¾`Š©Ds˜UŒ¦j¯ZdƒD`tRIfUUr@o•D}—8`v>_Ve‰Q[…;oFp›O}©]x¤L\{9Uo6cGgŽG]}Io_Œ·ƒ“¹puž^hŠ?Je9gŒ=ZtKWkH[nLRsPuŽ[~›`t”n|—eQwSLeAMl=_p@o{Dd‡Mt‰U–\d aN‘e_oYcl;j{HmtIXyRslJw†Ft|EoJmgI\rEemH^m9jvJ^rGTtL]b@ef6swElG“}J]¥VW‰}TnLycH‡@kšN{‹]–‰S† ]sˆ`ayd[wLfS‰“[•–eŠœof™sgˆku€Yd“Rg}QZM_uIpxHr}Lb‹Vd„Uz~Am E`]TyQLp?Wj:bm0‡}?c§GRx€kd:{l;sPYYexM’‚;lªnQ“ŠdoLr‚=q‡SZ•X€z[}žY„¡qh•i‰Kr“Z^„ckB™P€½dx¬vo‘ZsˆVg€@lMwz2W€HYnC]m8dzNc{=v…Dk:_Œ:nˆ0YIj|iktRw{<`†NTƒSZf?Š]TmPH…E`kA\8VvKœ}%‹«Fq¢\imu‘g^`q}2½ Nâch£iÕb»ñtˆ¸o{¨D|o“M‰»I„µ^sjf—efsO~ƒQŽJ™B~¤M}žYm¬_††ChŽ[…‡ImšB‘5—ÐMÆ™ƒ©ˆ‡¨\y©z•œ„‰ªdqžJnqYA•UrW7k‹pˆ9¡Jz¯h” k±°eªÏ…ŒÃƒŽ¬c§NŸ½‚œ®s«¨€²ÂgÀå°ŒãO~žR—K{l¬”L¤ËvŸ¼“¡ÉªüÍóÿ§”ÿ¬·Âd©àº™Õ{‹°b~³d–ªQƒ¤„w¦VŸ›BuÇws¥HaŽEyŸQ}‰OʹSôÿó‘ÿ»a¦^d†9°¢Q|º_‚ˆUŽ Qoµb•’Qn¡Xj“LŸ‘C|Ñ\i‡`m›Sn‘]z˜bŠ|Uœ¼t‡ƒwh¹O€‹PŸ_€šGZ™HqCŸ‡JÉTaŸÄk|?ÌÔ¡k¼„;xŽ?i‘;a†8ƒ›?q¯h˜¬[_MXv-|ŸAy„D„V‚®P|—_}ˆSv‘Qx«Q¥z¿¢ê¾s :dŸ<q“Kg1O€«D”Í[…±e|ag¢8.šžOv”<”¯c—˜{œÙ€³³t—Y…Ã\Œqš¡Uzœ_}•j«©ƒ®Þ“‚Ë[]’Fvš7ˆªff‰™|F ‡‡Š¢xl‡C…—bs•F‘¶R•©fx°gM„Qk‚=d}BsšPtŒPqžH”Fx™[r¬yh¢P“¸a‹¯So“JˆŸAk¯U§ Zx«bªd½qo¸ot«‹”·{™àxµKp cpžHtšR€£P¥ÌIš²O„¶VuŠEyœZ‹±v…Êhgª[r™M¥W„“_…šD~‰`y¤G~›Mƒ®LsœIbBn‰h‰•Mw—U¬Ûku›PpˆNˆ°i޳kl’|j}W±Éjˆ¤i›Ýfl‘dV”Dk—P„šU|£e‡š>‚¯V‡ŸXÜìk“¾grQ‚ ]ž¼jªãqv“@zKyZyMi‘Dp“\oŒJt `eTx¢at›JiGk“UvŠL[z3f@fEh„K…³M|šE—¡]¢=_ƒFs”J~›RršP„ŸLn£Ow¦Qk”Qu”a‚œgfˆ`QcGt†D€Nx“Ts‘Xs’Mh4T…M®¿aOtGJp4\m<zVŒ˜HQyAY;m„cy¤c€¦Ko“Kˆ©W{’QZy9YoIdƒBwXšHmŠDc„Z‡®^y¢`sN€•Rx’PmŠRtVa‚PSu@Py.Y{<lŠKkGs“B|§K_ˆJu‘St‘_…±hpGg‘Kv™]p”cw–dy•b¤Xw–G{–OpŽEd=_†Pm•Yu‘Yƒ¯Zi•B^„Cb„aŒ¦RxŸLt›dƒ®•¢Í“Éw’sŸÇ‰Ôïy·Ìb¦ÄdšºiŒ²W‡–Iƒ—P„ŠB…‘L}Ÿ_™½XªP~¢Fw˜EhˆFhƒ?[„Pm—Ty“Ie~>q‹AnˆDe~AQqTk—`·o}©h‹ªQ]~=^…V„¦[_vKOkBLoEToa„blŒLhxPlZWrNak7Yu6Uw9jq?s€Ep‘[q’ce“jT‹kPrZep<bq7hsEfƒQluWj{Dn}Pw‚PcyOhkEpyIh>guRnlCfqFbhBjh5e{EdM„zUw‘MT‹e\iR…o@ž•H`©be…ty‚NtŠ^{‡_`„XVoQe\>foGv}b|~an“rl^sNqM^‚[Wy^MsLLh=O`@YsPsmPz…@}’\”k}Ÿ_n™T[„KipBm|;{ŒNb–cctKSj7QjUgrPl”Mn‡Ai€PcŒpe„Psy>‰Kq´`{ŽY~”B˜d{¬Zv‰Wx†Sf—T]DVz;]Ws~ikŽQv’Lg9zƒPp—@‘Zn“KsxJt‹Bw“>U—Zfx6x‚Tg‘He€PhnNty@W‹DtuM…‹P{‰H¨…Bo¹Y[[x~2UI^u:Sv,MgGbna]ˆE|rP~Yg¨7y„Mx¢~w’eÈ—@ËêˆÝª~Ÿqv«]k™^v‘Y]–\fx`j„H|~C´¢G©Öb‚»iv¬_zb|ž[‡U}¶ln’HY~rhrA”—e›ºis´vt–YkŸ[‘šT–ŸYž´€r°‚{=Œ™4¼Z¿¯S¨×sn´pž…Oœ·[›µc·w£’`޲eŽŸ[’i| P‡mâ¨pðÿ˜îÿ›Œïw¡ºVޝ`Ú§fßÿ ‰ù¡ë¡žÿÇÿפ¿ÿ¨õLj¿‰~µYƒ¦Pu»_„”_ËÈW€õM‚§g“ Pˆ±J›½:©È\†ÒNÆø†wÔ‹x¢o§¿H£ª_z¶}·ºCqØ[c…O››Jxµd˜ŸC‡ÉU]”ƒŽIŽºI…¥M„I¹Mu½}¬±pŸÙˆ|©O`¢sZ|Dm‰LnšLwN³ujLr<—F‰à’›¥Wƒ¡a‚ÃrqŸgrŸV†«E‹®_m”Ev•W„Édwƒ^˜HŒ¦^›ªV‹›^ޤW”“d»?spH‚§„q‘Ep‘I“¨C¦ºq{´z†±iŠÏqN‰Ck{<gx:v”V¬½t¯°p”À`{Ž\®ÏuŸÓig¿z¢±e”½SŸ»J¦Èf’€ª„|¤ƒ¹Yp€\‚¤^tšP{®drm<g:†Ir—G•ŸKu¢mªZc—V_t7hŽ<z£D“œHiŽBa˜]–\ŒÑoq§M\œK]†o™§c|¯Go•Rv’Er¡PŠ˜Pp¬i~‹aÊ}€³Hb™V¸n}§€w§aйX€¿K{œKœÔ‚£´t·bœ¸ZÈ÷bxŸW”²f™³DŒ¯Rm“TžR•¥dyi¼óp˜ªYl£hd?xœCž´^¯_}œCl™j¢S‡¢Y‚¶dgeŠ”Ll}C¥’®É|‘¢|n•Op“ApJ”ºcx‹P»e–¹Oˆg¢ä“—¹z©Y¢ÆnŒÉbx©uiŒJv‚c…˜QŸ¯Z’±Xk”OxŸ>g‡C_€7_ŠXk—Mg…ErŽ[‰–Tg’8n‘Yc~?vŒMVxao•^m—lqŒ[r@q‘DavPvšJx–Mа^iEf“LiC‘ViŒKmD™”Uo’HtZm‡WTvOœ@k‚TŒ°e©>du+UfK”Ws…S|š?j‚ATsFg`iŒNrŽNuSf†fb6Vo4i‚Hu’T^€FlŽCbDgŠOeViLv”Qbƒ?r–GmŒZk‘1Y€2Xƒ5[F…›R{T~žJlLa{Ezša Wj†Ug‡Ju[t•NeDj‡LmŒd…¨`kˆEnU]€F`€Dh‹L^ƒLOvGlœ_v¢K•:Z~Zj”Wm™S‚£UxŸ`q˜r‘«pƒ—dƒ³†¥Î†ˆ¡i‘º¬Õp È`’°U¥¼kš]‹”\u¯Ø{ŽÀg“²\‹ªSŒ¦Kp4[y@iKn˜Fh‰R‘¤O„¢M|”?y’N‰®]ƒ³i„¶wÇók•¬L}¬eŒ°Xcw;SrF[wLvbz‘Zc|JaqRewJgxMwB‘ƒAp˜P`Ž`diTmxXNŠhRdYPiVCdR\aB`h5nn?^ŠK_}UurQr€L‰ƒM†V‹UˆRiŸ]t{\jxDkyG^tGƒxDf“DhYiO~wD^]V|]tg?d‡BT†i[f`Tj:exCŽxQ‚Yw‹dguLgsBxvJ„Jf¯erdiŽJR„PYkVWvO\kFPh=<b8OP7[i4d=\uNcVj„\e…_l‚UlHm<ŠvEzœW|RbŒEgvDju7pŒEnTw…Is“Zo•c‰‰N¢©YŠÃr’±ƒŒœGv›Tl…ZswX}@‰¸`x°hIUCdDkS+{„;¦šM‰½W‚ždªV†—h|ŸQ‚ŽV… X‡°ks§\q„Ja€LeƒJr†G]„Mzs:Lb–@€oB¨¡^Š»tb¦poyWa>ŸxAµÊPfÎUx…K`‰FUŠI‚pC ŸDhÖk¢}]ažO±„CÎ×`«ÿ|¹Ï·‘ÔŒ†¹U†¤l¤\…¦R¥b{šU‚V¤¨L“Æ|¬˜v¥a¦J°¶N¤³bˆÈ{ehqFˆ>¦®7³¸xܦt†Wk‡\¤9r·H…S§¤pš´iš´Ii¬X†’e±¨u˜³~‘‡Lž•\¶°`¦Ÿoνb°¦S¯‹X˜œU³¨b‰žX ™TÆÚuÕãÂÔê»—ÿwѺh¹ûu¯²Â¦Û¯±²S‹À“a c¹¦˜ŸÛ©yɨ‡3½H—OÓ²Géÿ~ˆÿîs‹\‚ŠD˜½^Ьuu²dm¤mq†D‰¬d}›J}M‚u¢—S“Æoµ¤q—FkžXo~asž\o°zsƒK‰?pºjswQ}—\v¥hq‰`uŸR£Ä’zœkqŽMjŠ1l¢=‘C›¥Gm²Y†™1dD^ˆ@‡‰}ÖX…¯ivŸi‚žYŠ‹F€”^“š€xŒUŒ”j߯Zª@”¼]u›P©ƒPæÞ”Ýk“§a‘¼p”Š>€Ÿ]mÒj}¥Y‰›cˆ´bœ—OƒÆg¬¼jp†Dcs3a},ˆ¤Gt”lz‘Nmžmƒ€L›ÂŠŒZ”SªÿŸÖ¨ÆÈû‹zÁiñÙÀÈÿv—Æ]y¾{X‰9h†hlSj…ds8b„7W}<•°]ÃÎSƒßxv™^]œatx;~¤Gp›en”e]=‰œSv±TŽ´[«¼i|²T·Eƒ‰P‡QÍþXy¤X€«P{ºLÓWm–Bm”_€µ‰}~Kq•Q^q?—šF|hwÉw~¬a‡¬uehjŽU¯x•¸z´Ä]–º_¬ük™Úu–Ï|’Èh—ºb|°hd’[ˆ¥io…A`>—¶Hz˜a€¬QŒ Pq«R¸m{ªl‘XqtDWyS€QnžUuœyy–Zs¡Tu”Z~˜T±ÑŠÏa‹£q€Á’€®\‚¤r’Åny«k¶z“Ã_y¡Iz¡L‰—U·]“»mžÆue‹Fn”Hj…4rGp•Hx¡U{”K®R˜ºn¯QœJfA™³hÊBÝ×›äEl€Kl–H^†HvEw“Gn•]pŸZs“NmŠMu=q‰[všZ}¡b§À_~›Uj‹Tg}@k‚?eHfŽJ†¤kƒ«_„£E€”IXvAŸ\Ÿ·xi‹=\{7[Ik‡Ce‚Qo‘Mb†La‰BlŠEm–Tm…H`ˆE^‚M`‰?\Ae†Lc‘G}œQ]†?q™Zk—[žD`‚A[€:i†K|›iŽ]ŒOZUwŽQˆ o{¢Wu”PzŸR¬^£Oe=YH„¢^¡lŒ°Kx—?v™CiLp‹@`ƒ4d„D]ˆb¨YbŠ8KsMdŠIdŒIg’Ry¤]”«Y†™^nU}¡o‹µb§b¢¶v»lŽÆu‰°r ¶o«Yf‚\‚¡y™Ãx¾pž¿hƒ±\‹±Ty‘HcOЬd³Ò^ »p¡ÐyÄÞv¯Êd•³QxšTw¯f‰º‘Çø³Ó`—Âlš¿R{›>s”Gh”bvŸY^yNHaH=OIGXEN{<]fDdrIi‡XTŠlavbepBQ{RIeVRaFYl=VsAWoA`oD_xFiqW‚eOgCm…Zz‡P~\„—cqŸkr‹jz€Q„ˆOh—P~Ž^t‘Ch–c\ˆXksHY‡Q=vfWZ?Om6LkJaW=lo0V~<†iF{Pƒ›zj—`d†YpvR„CrŸi|”r\‘WSz_bkAa|@dlPZo@Rm=md5\ƒ/bwDXw5P{CMtE^iFdu>qxLn~A{qA‹‹NzžX|’Ts†OpŒCP‚ObrLwzM~’^†’bh–OkŒ`qad¤~{€Po‹Z~zHš‰G‡¡J‘gŽ·rc«r‚zWbŒ,n}?ŒEl Xl˜xt“]m—a˜ŽZn²X†SnµkkaxE”£Oc®Va‰[r}J,ƒ¬Su—Z—‡Dœ·P¸}b zn~@Z†O‡uA•¶U|Çg•WeˆRkŠM”Em§[UŠfb€Vh}J–>•ºtuÂx”—d§²|Èv‡e•¯Wo¸g~mœœL‚®o‡¢TŒ¶fx¼bx”gu–L›Ÿ]™Â|‹´q‰’sz›S„®\{¡U‡–†™·|c¾gsuHwlHrZ¥…C‹P™š[мxn›q˜‰C·¥d¾ÃdÁÆ_³d£»l±´r³¹¥Éml¶˜mv•Lœ†av¯V®}K˜Ë”¬ŸÀê¦¥Ž±žjËÊŽ§Ðhq—p=„zb`?›Œ:®´ —vÚi¥l©¶ñþy‚ÿ®V›vUwD{†AµŸ]gäih}d|‰3“ .©ÎeˆÃ²q¬h‘I »CŽçŠk‹‚]ƒWcu@w‰Ti©Nn¨]}}P—–7”ºXqŸ\‚¼UrV‹ˆP——DІE–½e€¾bºFbŸks›?pƒa‹©^}¶ghŒv~¡LŒ¤A“¨f¶©Y–½G„¤9o©LŽ›Tœ²L…œ|™¸`Í«y}®R˜¸„²ölÁY€‡U‡˜i¦¶w¢T¿œG‡·[ƒ¸a££Z|¢B°šM˼a¬w’“[u£lƒ‘7¡ AŒÂ_‚’Pn•Xx†E[ˆJ…ƒOh–G¡“GÂÀ©—·V|²ŒªÅy’Ó›¡è Š£…¦åu¤–Hç³Qg„Ar‹GsF§Kg‚H€ ypƒ‚w•m„UyŠTYz?kžTd™6q“BaŠA‰†RTŠCn’?ˆ³pŽ¿Y¿pyËS©h¨¾pŠËVl©_w‚^ÿãš±õ\g‡Ed†W†¢YBt4`f'y¤aˆ´p¥±„}¦Rb‘Lh‘QpŸK‚štÆs–µpŠœj¬Ì†šÛmž±[„Áh€±”ƒ³dm˜<q—QšÃq{¤`›w¶ay‹ppN{£Er¨wš§O‘½Y•³_¥Du®^s‡Ow¤A‡ ^w“sgŠLke…£ko ]b‰eWu>ƒ¬SiXq ^„³Wqšh„°jfNƒ¬V}•k~žktš^£t~š=Rv4t‰R€’Xh•Qq¥L€²dk•\¤¾ÀíqŸÈi·Öd€©š¢ÐxÓÞÕŒÆVx”S€ŸN‰ Y“ÀH¥f¥½bƒ¢Vбf˜Ê[m’N†¢Nm™SФo|œgo„M¥KmŠ@{…L}H“Jw†]gŽf„™b” Mf‹Q£»hrŒvuS…šB`„<k€Nw˜Fm‡G„˜R…ŸMq–Ki‚Jb|?f€IX|:f…BpKU{?[‡KlŽNZ†KfŽQp–WVvKRtEaˆAX{Pk…h}Ÿu›±KgX}Ž^€¢hgYr—f|£g›°ym”k…Kw•Wyœ[l–e‹°]»ZŠºX—·_t¡Gf†9Xu=Wa€ Kc†=Pn?v’HjDp™X޲sŸº]¡I]}NeŒ_¢dˆ‘¿ÐszŸfŒ«_xjržb‹µg¯d Ãz©Îv–Æ„§Üq¤¼o¸Í_}šQ•i¬Ô‡Çú‡°Îx«ÓŒ°Û|“´dq—IlŽCm›_…³„¶ï†³àrªÔk€©Uq¡R{—Ri‹bh†KI^8;D/5;1;=2VƒC`kS_nJjjFS‡H\u^`rCjoF\K_pFrtE[…JG|RV^Dbd3mhH…qAi’Id†hcuQowN…S…‘\n¥pkˆi{„Wr™V‰Šj~—J_ bl{irHbƒGXˆbdcImq0_„Cjf:fu6bxE`jFf{;n^w‚XaŠYXqTdsElT`œdaƒ]q€]Š{@}‘GyˆRwLh‹EkFu†@]‹VayIh„ImƒI[ƒEbtFoq?nxDjyDc…Crƒ`uŒQx„SwŽP=š_OYRfn4k€G†R[§[c}\l{;†W‹†S„‚O~L‘—ZŒ«t‹˜x‚ wP©flgr‡2r“nŠ—Cc§SN~d_l>‚‚Ir–Uo›Qj\‘“cv³X‰Z~½Pi–†–{V¨–J“Ny¡d—–V‘ÁW›Äs£À`VÄ‹fr@X‡QhuDk‹DP‡^]dKz};mžExDlX[~MstD|ƒ<n’>ˆŒ[kœez†O„›S€‘bežcyŒap–f~‹[”¢T€·d~§kƒ¥Q~¢dm•L}G¢ž\v¿t›™c‰j| Eƒ™a~ª\¡L®d„™\£¥I¡˜LвOÜ«Lµø‰‹Âe~¨`žYŠ£M³›f®Ðd×Ó–”ò¡£«ˆƒÈf“a~¢œ‹|p’¦M”°w£»ZÕ½[–ÂQˆµY‘´hyI ªO–¢ju¡Œ—Šº¯m‰·I„¥6¯¢xŸ‚ÑÞ:‡Æ…ƒÆ^«®XƒÉ€b¤¸tDbœPŠ’6°˜` ²|‡›H’¢7c¤R}heuŸcŒša{¶_wœun€–|Ls™9ˆœD¡¼?¦®N{µV”„N|›?…š[zœh dˆ x~¬R‹©hˆÕa‹ gz–h‰Š>ÓžFiµb‰†2‡ª^‘V¢=›—\¯Æ\µæ[ªo€»‡‘Cz¢Iu§|z¡o…‘1ŽÏ|—¾pŠx‡_“ÑÙƒëk‡TšYw’y–«Oº”Q{§‡»¨ešÂ`ŠL¥ÎZ±ÎjwZ‰Y¯ºoŒŒDm˜L’“Yo‰ItE™Bip8“0n‡E|=ÿOnÙ{pŽTŸH˜Nz†Lxª\ƒ³z¦oêÊ“†”[‹ L|“Dr„QduT^‰F²ËY« }p¤€j|Lˆ‹7Œ§D]ª#«¬Enž3€{?v‚-›¢B‹®h˜Â`t’KsŸg¸Õ”¬Š„×e†™Sˆ;ÀóÿÈà¿Â·R‚ÍS[€Fm(¤ÕDŽªayšItnz‰Sn‰Ksˆ4ˆ’CnŠBpšf~¨~q¤I€Žp›É‚‹³g ¹~‡Æc„‘Sy¤C–´Sz«s‹§T€ŸE_sAªRˆ“@r˜X„œU‹™n†Žg†¥Ve‹dx‘Uh€@¥`h‹`—BqN’a›Øa]†nu‚L›¶Q€¨Py Gy°S|¬co•O{¥Ur’Cs™[fP{¡Yx f~¤T†˜Ml†FËN¸Tv“@œ`Š£_„£Xг‚޼ƒiRu‘a’¶h—·rÊç¶aŠHo”LqzF†¬Sw¤VŸÂ†Ázr˜dy z˜¸Œšo‘¦Šž°išº`«^z–S¶Õv“ºQ¯ÆTo˜P™½Un‹Km‹Fœ£k©¿\”²U›¯YbKp”Xg†M`ƒJh…]dŒN`†Hl‹bƒ§QiIbƒBbJdyCh<ZAbR\<m„GSxSƒ©Vrž^f…DWxEmŠ9c>\qAi‘Wjši}¡_‡¦_g‹_³V{šX§esšc»kf‘XhOe‡Sf‹Ea‹M…¨V~Ÿf“¼w¥À\eƒGr”B\‚5Z{Hz Pg‡;^|CcT…”E{›_—»v”¬Yh„<Qn<i[~Ÿ^z¡ˆ‡¨p„£Y|•L_…HgŒQt’e‹ªx…r{¥vˆ¯~’¸€š¼u¥Ðr•e²|Ú˜§Ó…™¼i·~—ÍjºX‡ž?c†@Y„Vf“l›Ë®Ñ±Öb…¥Ps¥]‘<4LJTZ=LT1QW/_J(PD&h…I\vGrjH‡s@m¤GmŠ`_D€jCo•Me‹^\x[KpM3sKAPA\K+Wl:msKuMe”`R}[UqDzb<uJnkk‚uk{Qv|Q˜‰a{§Od¥na}ms}Ry{Qa†YdwQr@mˆKptEj}H{qJrƒ?\Fj}HƒpGbŒNZs_jp<n…M_‹X`rZemCzrCbQ}…az‹MkŒ`lŠWyˆG\YgxUZ‰=]~SUgJmg>|x9p‹DfŠMiu@ƒO}˜C‹”Qn•OJlh`>}ƒ(m˜G]ŽQSyROpSJh9v\FmSx~KnIYwvxq®Œhn•iiŽkzˆMj™:rŒXx‘BciZx_Vh<av9n|?_qOdf;~E…›O‘£`¨ª`xÀg~˜]å7¾{z¨v–‘O€É\u—b›_„͇h’]w‡=eŸCe{EiFS„AVw:v;Œ¢[o¡Q|ƒHŽBކ@tD¢ŽJe¦br‚=|K{¢InTU„Czz>ŽžW†œdšœEkµT~…JvˆGo—OpsCŸ–IŒµx–¥d‡ q¨LpªI~‘O…›Cg«YnŽ\«ZŒÈ^¥¢’¥ky°pÔ«u•än¦«_бj”Oí°wÁ䋎²˜pœp’qš¨dެJ¢¬m‹Ìr޼\€µV©ÃsoÆ¡Ž^‡ÈiÓªY³Ùk–§dO’W:i2eW-[n›GoxX¨™fv¾f°€g‚ÎV™MVuN\fEq€%mhG{‹A‰\œ¶žO‹l„kCk™sw…<N–shp@NzB^l6ah5‚{-‹žT†¯H¬vÈœ¬©“ªày²¾c‰Û`wwYs°^¼fižh’Z‹Ítƒ¢ay‡S©²XÀ[w™d„“>‚“oŒ–EÂtIˆ¤H~ƒh‹“c_U±•œêX†•M‹ƒL¡Lz¬W‘Žr‹Y†µN…«:pU´¦WeªFº€:Œà[ÄÖP²™Em–Zœ—G¯ÚŒ~ÇG“©}Ÿv¢x¦Z„žr‡¡Aƒ˜Dh§]u‹DlŒ-»É\j†,ŽŸ[{§Vx™@Ò˜M¡î€{6•žRwÉiŽ£5„_¾A‡”Z¤Ò{‡‹ix„Bq‹`x™JTz/zˆEs›“®‘DÆÿˆ‘8¨º`©¹]SžHui=‹”D‡°Go¾]‘Xo„QnZs—H›hˆnS_…`W|ityW^ŸhRbQ¢’›×y‘b™ L}—ƒµÃ°¹ìhsœGq€<޳M_ˆ8w¡@{ŸM{£:p¥?v‰U‹½Y¥Á[Š¥c©c—¼m˜ºb´á^”ÌV‰•Tš´l’®f‡¬meŸE´Ì{{¿\Ÿ¨p•¾tw—Ntˆgr¨hzAlƒMe}Cjˆgi«?h‘[sZ|¾^fžK^z<všL·bs¦S¹T”ªasŽZ”¦b„±V ÊYq•Zf‘Lg…McŒ]o„U” W“ªNЇ¯oo“XrTiOx¡cƒ´g€ªX’ºW°[u£Lo_”»‰m‰EX@WjDE\Ke“Gw¦eˆ¤OŒ¨WjŒEiRx‡`r—bºhz˜kŠRl—k˜ºq†°s‰±`†©bv¦UmŽD™°[s’†®Ñxªs… Xk…Ql…MlŠR‚§MkšKt˜GOy>fƒQuŒKiŒI\~CX}Qd†EnƒLrˆGdzDe;Xs:[€Hn–g|–`cDdƒLWIKs5[I‡ Mi—Ys¡]bfdŽEo¤jg\i‹Wƒc}¦gn IpPd‚=]SfŽX{ c›Àj‰«v†¤UdˆX‹gx’L‚£j²ÐZx›L|—M•Qz‘^z™Z‡´o’¸Nh‡8`~K}£j~¤Vo”lqžfn`{•>e…<Y‚JpŽU†šd†ŸRl‰]f†_r“d„¥l—¼q«f~¥vƒ°s…²{—Îq‘º|³Ýr³á{¶Ý[t—Q{—Mi…^|›tŠ®oz—Rl–Uz¨hš¯/1:1:G:VfHqwGcQ0NH*`nA]GsvNxyDqˆSh€^azbgvQiuOH\;a^QT4Ki3U_=fa/X‚8XuO…uFx’U`”hkxTa}?P€KSt]Z]]YhJ~qG‘‹K…³[„›{c™rc`dpD[mPMqE``>fvAlxDqŠLQ“JfŸYXƒe`d@[xAWpOLi9OmGliHjO}~JwBiTnwXcŒNge€}Qi‰KR€SedG‡<u„GVrItf>ux?c‹E_€Vin=y†Gr‘=z|\_Y\~fue4z5i¡ZkŠ_zzAUˆ?iiLnp2hƒ;~R[ªEK|e[f@~yA¡”V…¢h^¬O`O{zIj¡Bxˆb€sL~€JpZjŒMouB‹‡3ˆµ>°¥Y¦Óf®Í€œÆt¹Ëˆ¾¸nÂÜ€½ÜŒ½ÐsxÞps\‚E{©Vc r‘’Hy°V™•R–´IW²]hsQw‚-f“U`„BzzSŸC}žWz–^¥“T~»ešŒH«]’I‡R’®ClžX“Zh’|–‘X°ki–N—‚Hu¾M~‰I„žN‡O\¯b›‹xŠ»g€ ‹…œi~¤k~šUŽXšªG‹±u¥£xšËfx£Š´o:˜Ú}s¯m“Šb•š^ùŸ^¶ÿ‹Ç³£©h«¹UjÊeÐ…Z·á]йdÚ©L¸ývŸâŒž¾{€³rm˜^˜™V†¥‘’œ[Œ¤lo’7ˆtY¯?¨pL¸°M§ÇJ‘Ép»§I›Ôm¤¹c©hu‰4®‡@¶¯YeW³}A¾àX^Àt†r%†œCx}Ri¤Q| 8j{CQy0ƒn8ǯSƒÉuƒ¨“q|k©”n¹Ú‡ˆ¥’…¤dv¤~{q5t”IªŠMoh”µC~äUu”hd3r¤er´cx™BƒDŠY™µY¨¶T³Â¤‹¢@’™Z`~Q‡˜?³¾[¤s‘šUŠ¡Ik‰:¥UwŽC¤œS€Æ_bˆ;Ž‹G‰¯su¾G£ÕªÄùűÿ’²¾E¡ÿgà…ƒ§}}›bÏjl˜C§®CuJµp„ L…¦^„ºMo•Q™sGmxY€Œ\ªY„žhª°X¡™rvŠ8¢‰†ƒ§`YpœQÈÀpˆ·[}¢y«\Š‹>˜ C‚ D|¤>}ŸV–¬bÍ»‚‘ØÊ–©oÂøtÄóruŽ?ƒ“LŸŸU‘°‘”ål’ÅIÔz}©h–¦fq—J„”Ph°cb—BlPhxEm†)†šg‘¡…U~_„™_±Ë„«ô}¥±…ƒ¥\Ÿ–H”™i‡®8xŒO‘±V|TaƒU›E£®€¤¸ÛêÊãaãì§Ù¯»ŒÃðˆ›åcšÓw‰av¬hj„G‰¡ov™g‹£ay’tt‹Q{@o…M|›KvŸNk‡FrŽAy¦`i„Fw‡OjŽZhQz¦U{¤fŠ\j¢^v¡ax©flGš¤{‘´mŸ¾„¤É[‰¥Ly”`|¦U}«Yb„N™ºsƒ¯js¤[i~Fe‰^i“W^‹rsœ_`†Q©}j”l˜¯Wwj¢Äw Ép€¨=q‹1—“O•²E¬Àf¢Äy¸×k™²Q”F…‹Zœ™Tžmn˜W¨Æo€£m‘»pa‚T}š\|¦rœÅižVŽ·S~¦]}¡or˜m½Úki›OqŽLb†FgŒ~µÎl¶U›;rŒVo•JrKR~2Mu?V=p’JiŒMz‚DYƒ=d„=TwH\…]mFr’G{žLc;_=aŠLnœK[Jm”IZ|Gy¡@oš[`~?g‹S`‰d´aŠ·Uo’Q[ƒ@l”UtŽH{m½{¨Æz¨²Up‘]vŽgbŠbr›Ž‰³lu v²Ïh¤[™]‚žQu”f‚£WjH|‰Nf…`ŸYz™\|žUf„Ts”SzšGy’Nu[tŒh¨WeFc„NiZ{¤f–ºeаesŠUi•m•½†°Ú‡¡Èгæ‘ÈáošÆa‘¿Mv–NnˆfЍX™?FlTw¢xœÁ=ag+LgGs”MN`;BN0?D.eg>gz@a{ORrJdcKfhG[€TO‚OJbHVdVY]K`i/Xt1hpBvx>XKXn[rqFŒPz™ev–\iŒVE‰cBXO\F2Yf;‚o?y8k]b~uYrhbkZ[IhjAn{7qPk‘D~Vx’V{_y‘dm”m]…yaiBTy<fgI]p5U|Azj=VŽ;gvSxn;r‘[}€c`˜Zdw`nvAlƒB[yTcg;ym;¢Hk™e|yWr„FnyKk~T~}9X[Xn?cFržQm’bgŠ@…}?fœQ[|Sbz6ZJwlC{@——NÑ®V‡íw`¯‚x;–~2‹£a¥·t‚ždW VŒx?Á H|Çw›”cšªL¹Ãp™ß„¹{–¡U¡²\ˉ{§q—¥fš´nÌÅ~¸ñ£™ä˜Á«ôÍ›¶ì¤•À•˜°q£Âuоv´³XÂb¶›m¯és¤Õ|ºbq•Tx‡Iq‘?›‘J¢°KŠ¿l™g®D±†ªnkš[e…K†Aº¼J”Í‹‘§[†¶\y¢Nz”yf`s|=n–D|™W›¯LmÂ…]}}tnD{›E’j¶Mg¤e”‰jÌœg±ûž²ÍŠÎËr§ÿtŽ»“£¡OÅ䜷îxpÍgº†F¯ÑzÙ‡éΜ˜öœ~Ât¯p¹ªeÿ¸p©ÿÀÐagÈ¢w{Q–ŠY~¨W›Dt¨\`~Y¯vP™±}’£e‘Áyƒ—WªO¥º‚±Àzu׌Ž][‘–zŠ~šps”Cy›?‰¤a¼§s¹ëds¥¥|ŒW‚¢<¼ÅbÇ”¶R¼µeÁó–xÎXa~3³z?w¯a‹X›¯Q…Åuhœu’‘S›j}‹f£‡J‹¬\ŸÉxs¦Wq›v¡€‘‰D”ˆ>†šcu–_†¥S——E—¼\¡¬M˜ [²½lŒ¼’Àn‚ªB©¬P¥ÒrÁx›¨O‘¾z‡»bÇZ·½j¼Â_ÔýŨç’v¤T«¢Gʤ[šäWqˈw¹ƒ³c°Ë…ƒÆx‹ºU‹¤SºÌŒ™¿_†–l”ªqˆŠ[–Zt—R¦Ž™c†ƒ<|x6†•sx§c¬M¦¥^‘—`{µIˆ¸Y|…^m‡@ň?äx·Æ™„ÎPvžRj—9°ŠD‡¶l¡³gŸÝp™¾Ž}˜c…€Y‚ªuyÏŸl‘|¼R¥ÔY»ìt·»a ꫘ŸsŒåz…šU£¸y™¬t|™R|„NnªFSŠK}šv¤ÉN¡ÌB»ÖjœßRÑv¶c›£j¨Ãƒ—LÃׄy›Sœ²b…¤NžÙy„ÍkxŠQ¡ [£É§Ïk°¸–²Ô¬ËÌÏŒ²Z§¿i“©£±„‹•€sŠG‚µVš’M{aƒBŽ™gˆ¾Y‘«ChŸRo†P}™We›M˜J^pGœ¤o~¬K`‹DhIi~J€›e²¯fo³|Ÿ¸J—×_}¢TvšCx’\¡q›®˜À€\™Xy—MªU„žnl‘;Œ²vx Rk•PtŠbiNŒ°LWF]zC`…OºfrŠn“¾tz©]¹x Ë«ÔvšÀK™Y¬ÏjµÒË蟤ƙ¹j¤µlv•Qƒ—R˜ f¢·a˜³… ¹o†•TvN‘W¤a“™W}–`x—Xƒ¥s’µb…¡kžvy RmŽKbˆEXxS\„“ÃÕŒv Hpco’?VOs3`‚CmŽOj’Ks–I^€8Xr@{˜>^BYx>QoE^Ak‡SdDi’Sz”Ui„;\„Gh‰@_„Cj‘Kf†Ie?kŽKu‘c€§mйWX}EmWgšT‹¶Rx•Vr }†®{x™o{ŸWdˆAf„TzU]ŠS€™xžÍmy’Y‚ qЧZx”]q…MjŒYz—H_zRdˆWkZz–XvŽSp’Wv˜b}—TwG`{Xa†E\~Fv¡L¥f“¼„¨Ì\gŠXh‰CdŽht™‡®}|†ŸÍ˜ÂꂨÆu±Ñw½âp±Ñj¿Ó`¥½m±ÕO§\˜½t¯ÚY‚©B~šLo™I^z1Ul9Yo<hc<Xx=XsNbbQrlF€z?ržQa”\V{T`fP}g<]…<goG^oQ^lJRkI^fV^}@m}GzKk›\nˆdi‰clpOkk5`}<˜vEmŠ5d„^YqPWcJfe7Y†DktLf‡A|qT;HYZilxA^ŒXm[‹œ_o«y[|RF|Mf\?„~0cšPƒtRU–Kkn\x.™ˆ`”¡bkfqhr{>u{EŒ|Cp‡I\|Jup<h‡W‚e|œSV‹M]•NruYa†D†z@‚…T¢ec¼ck…PuŠIRzQsj7_†6vxEŒF™¤Xƒ¹e†¬†q¬‡nŠR…=x±o•yœO‘µp³f•¦ex©Œ’ |›°Sµ´~ÄןˆéºŒ™…}¤`x¥‚’œ]s±kf–c”ˆ[sºp“›s˜yb‹j{ˆpË…r¦äv‘±ž[«”Yzefzgz‚L«¬umÕ|ZŠŠzzt—›D®µi¦Íj{Ñu“s¯f´±`‘鈊Àwo£f‹ŠMp¨H ‘k³ÈmÐŽŒ´|{ix‰`ާ]|aŠ=–®H ·N^§bzyFƒƒAm“<h”zr‰]`’IÀm?šÈo¤Æ–¨±‚Æ„¹–°«€“ÉŠ™º‚ÉijÑpœ‘BÔÑe‡ÿ—³…“±¼¦“ב•|Ÿ¯„¾ºqÔ¬Çwzȧy§e\¢eu{]zTl‰d_ƒ6yƒ;˜l}mÄ”V®Ú{𽆦Èp¶ÌW¶Øyn°S``S|„2‚7§¸e««a¨N…®Bžq•‘x±ÓFd¶‰™‹T‹×“k”Q xŰˆ°Ë‡¸Jt¡=ƒœa¦—[®…ÌotªH‚@v|X¶—9i´5ˆ‘C…Cx‘Q„¦3†¼t}‹<¹Œ@†àz‚™Sˆ_a…[—–N{Ág‹WrgIŒ‹z–Ò~‘Ëw¨u}o›©hƒÉ‡‹²Y‡U«h|‡„ÿésµç¼w°V…—RpÐfo‚œNyK‚u%q–9ƒm˜¶Ho£i‰¡z¬¦„~“†a˜KL‡’RŸ•]p–N°•b¨ëR‚ªRo›7”ˆ>ÏgŸ S¸L¬¦P²ª]Ÿ÷€i¬Rl“P…„f›‹c”̆Áªg›²SšÈ}‹fŠŽc}c„¨Ÿ²p„²[pÏKv Fl¬P^o5pšoo„ao¨e†¥‹¥½‡²\n¯š{M˜¦l…°pw¥pzŸPc–>lžN¨Uˆ»wx¤zŒÆ¡c¥TŠqŽ“X†‘f›°Q‰Q²ÿ”—„F¶½x¥ÑdÞik‘YtžN–j‚’XvŒm}–]Çj} cœm~™j‰T†¢cp IgŽQ|“^u‹RrE¤_y§U²Ïu™µbz©Yn‰?¢_z»`‹ lR~8ž±‹›Êa”¢Ww•I¢ÓUz•N‡¹Ž_…OqŽhÅn“°k~šJ–©_œÚy†¿táÑtªÁKÉÇ‚ƒ¾]l¡IXuO—c–µt±Z®U}¤Nv‚Z–«;§Sn˜M}“`‹®\}žls™f|£`q—y«rv i‹¶[š¿vÚÿ¢y w„²n˜À•µàˆ}«H‘¤_Ÿ®aŸ²d¡´q´o\‰H‚s±²e–¯a¢´n‘²XµbÌßz|§me“Jg“dr”Gg’In€;\s5ZlGj„ˆ¥»[`…M_5`x<}žEoŽJ`ˆEp’Lf‹N{’>h€Tq”=]w>b†8Ns3Ln8e‚Im”Qb‰HVƒJmŠOu”AcŠJo‘FuŸSm‘Bs–XwšQg’]n‹qz›^xž@g†V¢g‰°QjDn•ZsŸ_¥g‡¬\p™FlXyI~“Xo‰w£Èwwšaƒ•]q‰W]‚Tc‚Lk€\z–SN|StŽNf‰VqŠJ_}Pr”Tw‘Ks‰C[v>Tw<[€Lk’a|¥u‰·}¦LfŒJo—Oz’W™XeQsœ{‰±˜žÍ…Šªm—ª~ŸÇ|ŸÄ†Æ~”´v£Ë{¬ÑwŸÊy¡Ïk™Ïfœ¼bm–^›²Dw‘Fg…O^p9^r:nrLcqFy€=ˆ‰GwœYr¡pmbm„^€QJQWjd[e9Yi>bfBeBlDjUg€G_ŠNsV}‰P…‹UƒMz’Q„ƒToŒDi‡_asQnkEs‚BX‹Rmn\q‹G\ŠS-oMA;NJTOd=s`G„‡<Y«vnq_e„DWzGju6uˆPƒ{[s RkŠdKƒJiS—›SoÇuŠsgnMvF…yBx…Pp„^p}Kn{C~U{•V‡‹is¢_bQ‡yS„ŸGo¨n†oN –N’³ww©emX{ŠS‚ŠJo˜TSšd\vFi~Dwˆ[[“VrT“‹E§¶R¢ÌgйnŠ«l´kh¯Œ‹†y~œlz•be—Yi‚W–…z~¿“€•€Œ¨W¦[•£a®Z†©ZUo½az†a¤ŒL}È]d—Y‡€4w¤el‘ŽD‚\?XRvW3‘Ž2ÁÂTcïu`oj}w9{Jp”g†Œk»¦vÛØm°÷˜½Ú„Ý«‚§ˆš˜w{ºio¨ˆz‰f¡“\nË“‚Ž`_–XZ{Pj‚J{€NÎ U›¸q„Ħ•y£¹dÃ`rŸkœ–Nï¨Aú„‚O³aÅÛ…‘àŸ€¶_z‹s¥˜H”Á`¸´hžèeˆ°ÎŽe¹¨t‰þ¨´¥W³çŠn½—”“W~½‰œš|fŸŽ}g§…U¦»dg¹ruuBˆ 3|–9KˆArb0˜¨M–£a»ÇM€Â†‚©N˜©w©«y•¡_€œfœ‘M¯G¨˜‚y¶—‘Zµ€•·pˆ‹c}™v›‡g}›}‚¨V›·K_ŽTy•Hž[ª¥€¹Ïh®vtµkc‹<ƒŒq¡g|Î…ŸpC†ô?Ö uhÉÝ€˜F…^™¶LpÓPv¡\†KžÌXsW…ÂF—ˆO}®R‚âKf½G¨¨By°_®UŒºzR¬†z~j“¼‹r¤Pw®pj—Sk…[”‰{ЧJOÂ~ynf}•qw§I~µF~‘v®Ü6{¨:j‘8ßµ•©ÿm®«i˜S†»F‡’J””Nwv=„—Dk|?ª´XqËF‰¨C¤”iƒÂ\X„<ÍœXÐÿµÉÒg²ÿ}˜Tœ½op”d¦ªx{£X“EaŒ…cš»mÓ«N`Ä_m¢7 |F³ÏM}¤fs©aszs„E†EV†@jEa†Iey.~•]n¥b«¨f¶½_«pn¥Fu–V]Fn¥Nr¬Spz8„ŽQœ•Yk„V…’^ÿº…ðÿ›°™@~™X¤ƒˆ´f©m{¤y—K‡…b›—‹r¸vn•Q|•H¯Wy´^€®U‡¦ZlœO©¬P·øa¥gЦl€”Hp9j”D}B§;ŸV‰¥\y—o{¥m˜Æ‰§·j|™b Å\d‰L|“EvU‘¤‚œ]€du¡gjQiHvŠ=n”J^‹T‚{|¤†ŸÍšw¤q‡¥mªÆ»† Y£´~´W¥à\€°T|£mp“[‚¡my‘Y€°YW{apƒe{˜_Ê{›Èm¤Öe†·[i‚SžQdŠI‚®h’µdœÙw‘¸…²›¿èh}œm|žwˆ£{ðÿ õÿ‡ÙõŠÜøs¦|˜±Wbz<®·fÇã}©fˆ¤nµÝ‡‹³“½}¬¿vvžY|¡X‰¯dƒ«Ni:e‚7d{Ah’_s”l—¸GlŽ>i=\…DoKT|B_ŒLc‡DNv?]‚]}¦J{’>Z‚=z Hrž=i‹Ex‰K]€DkI‹¬h©ÌdfDl…Rh™_h‰Iy—Z{ WxžSm–Psœc|¢LmKg‹]wšTp¤Ro—b‡ªi—´j…©ep“LmX§YsŽKbXe”k„ªgx˜]†žJbˆL_~It‘Ux•Yyžj}“UhŠGl\¶T—d”²gœ¾WzŽE`t8e}?X~Jp“Xv—]j“[lScˆV‚›cƒ^{œLd}Kg[w›{ºqsœh¢g–³w•ºlxez›k¦…š»x“ºo—¯iµpž\xšt€©RjŒG[{<anFnrCy‡I[QnvQy|HnUrnrŸcu‹_i’[V…YbeSld7\v<aiCj=jwRqwTp{Fj‰Qj…XmU{N|Vˆ…btXkS^|StpN‡x?eŸPNgil_ZFA„O3_@?;-bM€r*l|=w…No™Vƒ…[~˜Hq–lkWcFzsGŠšMY¥mMmctc>\Œ>W†fiqPvH}€O‡†Dt‘V`ŠdL„SVbAcX6cn>osZo‚\ƒ‚MŠœWq²až|†O”–P™n¦vz¬yR™eacKN€UJo\Og7Dh1b[Apy8\‹Pw;`œÅy›Â‘†Éªt¯hŠk‹„YZŸ_y€X€S–Qr¨P^œlcvfq„U”[i´q‚_«_šºe…Á\in¿v\•¿eXŸndbGdzD^xGNmSm`3¦–6…ÐW§mhŸu™Š[µUf]Z|Mb~;~wBn©‡Œ¢›®ŠlÁ~‹„]~«^™V†·S¡[¬~ƒº|¬ŒfgÏxLnV¤g#›¹^½¦PŒµ` ±r¾Çe–¦gp¶ˆk“‚°pFÊãyÜ•¹³rš¿|x¿ˆŽ„œt¢²GÒL{¿whq“’I…›c{¯UY‹MŒtb ³jÊ~Wvh\j2u1}“T\~`—t)xš<ˆ _p¡[ŽiAêÂX†ëgY‘>ªj0€¥V¨¬Zv§…–k¢nm‡Yy˜L˜ˆZ{¢TZeˆnGˆ–o„Ÿ[Œža•¦MV¶{uo5b…TmpKzƒJ’µ?j™V\‚I†‰5c—Mn>ñy’ŸI¢¢GpšHu4„@XT„[)êѬjÐTvŽA²|FpìjFcŒtv¡]v QoG‚·mvPŸ¯S»sƒ¦i|©Y¦³x€’t“[\†Yz{B´’>ÑlšTÈU|—=c€Ox5À¥Z^ÿ¬ ?v“EYZQ€LœUt—R[t{ƒ˜S´›MxŒ–¡…?³’U€‘aižM‚ªPz@ižl‡y:«ª[Çĉ‚¢T‹at¹w‚°F‚˜N¼ÿ˘–[ŒãÎŒŽv…ŽF®—C¼Ãޡߙa“l™^v¾XŒ¤T€›V’¹€‡£ež¨M“ºnšG{ivP¥•U¡Ou’Go¤?ˆ¡JZ¤:wOš jË¥‚©Ðmµkˆ¿nŽ´I” JmžG~‡J‹‹9£œVÇä^¦F‹”^¼¨x˜ðÆ{‘}ƒ˜Tw|k‰©€•¨pŒ˜W‡±f‹”W‹»S€žYЦN‹›T»¼dµÀ`³e Ðy—»b‚°]©³s‚¿}zŽHƒ›Cƒ«Hz›@|–CŽ˜`—YÅŠ¨x~œMaŒB¢j‰¨nw¢a½ÙŠS}©Yïôušèvåÿ—æz¿éR|‘@·Ñb¯Ï[„£Wz˜I|T…©p—mªÕi‹³Xš¸^s“rz£bš¬‘ŠÐƒr®Mx˜BqŒb„¹bc•Ev—\}¯K~ L{¯elŽb{ŽeЬsh›`‡ŸR”¯bk‹Ay¢Pq‘b•ªfnw^q‰W}h °]°ËU£·ŠÀ®…ºnœ›¥|ž·Ut¢OŠªQl’ul¥l£^«Ä}޾’³py¢lƒ¬q”²^€tЏ[Œ¥SV|/\u@i|BfŽP}©n¬f–ÆgÖóZ€£H…¡>Qp<cŠBd‹@iƒ:RxFxœX•NTxVËݨÄÑey’`k†Uv”Ex›^’®†¡ÈzžCZQW}@bYƒ¢Zz–e“ºa²Ég„µOwšYs•La‡K`…Noœ\r–nªf}¥dm•hz—]q†TzŸk•ªKx“C^ƒVt›cx“Z†§dˆ£EkˆIrQq–_ž³l€Ÿ]yžNfm«q‡n¤ˆŸºj¤EnƒElMq’b¥¹g‹®a†Jm‘Wo›^œhr•cŽT‚›NwV{—jާ\~ g„˜h†¦av‰P[gSk|Wg‡qgr~®n‡§e€œ`—\™l»o Á_ž´KZz@iuL_ˆUW‚MphMl…@n|UyT„•^t”]ba`~\uhB}v;l’H\€S^hK]gB^rIcuE_‚D^tQczNwpGwtC‹vNuW}wQJ„†Hƒ†Ijœdb‚i^vDZw>JwIE_8]]$rd$mŠ8\ŠKgx]yC~ŒKw«]™mu‘_aU€|L”Ž=l¨q|„gc9N{N_\Fyn.cG`yIt~[†ƒWs€^]ŠYkeDkb+Zo>Qi?Oc=w^?ªŒP޶rˆ©z‚›[•Wp›k†c„©dR±vRgOOp;wg;d7_€>w=€›4n™b‰G¤R}®[œ•l¿–›Ò›œ£v…³^£cz‘JŒžZ§¤S[×rI€tjY0—|5‹¹[_³‹²mP¶¼axÖ^qficzDgVm€d€H{¥Nn–WfžJxƒ)ˆ<~¬mr—u€i¼—HgÌŒ€l\§–;dÏO‡oC[›Ng}S|{Bc¤‚–~U|±Še¢ßh©¡i—§y°ª[‚Íe–[_ˆF¿x0ÿÌPÇ÷yÞ¹p¨ñ~¾Åk»m„oo¨‚¡Šv½žZpµ¥…~EÆ‹eÅ~X‚dvk<Ž^’¢NÓÍkˆì‘g¤`˜™S›°dy¹pošEu‹K¯¶[‘ßmÁwx°R®¢xtœ^•‘7€–t{’F`|W†‚9É€e´úÍ¥Õg·ª@¨©f°{JŠ«‚´Rs«mœE¶±]ƒ–\•ˆHŽŒY†‰a¨C³X¬œ±Œ—™mŠIb‚N«>³T¤¸]x¦[n™d€¦Už¨ep¦P‹Šbf¦R¤nz™~uŸ=·˜XX Wit‰”fe ݃˜c¡»…¢ß·³Xq;•=‡©Hr R“¤G{»T… Wwtl†“o¨¤Nx²iŒ¬L‚¥Yv”o‰¡B|›Jv|`rY¥ˆd›š>d§8‡”:²™Lvã×´†OÀÂ…¢¶gw>eb^Aer2ˆ9ÿÓ…ÿÿgÑåe¿æ]©ìrsÀR”ž`}±eTyDu‚<ÿˆSl¹vpT}‹Lƒ˜;j†ËÄ“»ê¤w¢W€žƒ…¶gˆ¸mþáx˜Õy†”£FšÍqy¯[|›SФJlZ˜Ž… ¼‡™”Rw¤fv•R|²?Š–R…¬R‰§_q”Nn˜M]‚6WzCjqO“|ÒØl‹¾eƒžhwŽd–±hÀÖZRLYI<qwH®³Ê®¾t›¡[Ê銔Òbz P–Q™•Gs›XqvM„‘[‰p›¯R}¦Q|¡QvžVŠ©^šaœ¬‹“²|}Äg‰›{ Èrj¶tœxoLÚÃwˆ»Ar‹R€—TiHy¡V–žmi¨V_~F]{2„¡e‰Yf{E©¾¨ª^–Òj‘ĽSŠd_|‹¿ÉŽÌìËÂØ©¿ý¸ÃæÍÞÿ]f‚T“ªWˆ k}šl™Èw€ªt‹ÂqŽ dy¨K”™Çzi—Tu¦Rc{U–¾[i’Fr–a–«h”Ânm‡Fw–U°Y©rk”MŒ¦j¢¹kdŽGmŒCk’V‡Yr™Od;}e´Ì‘ƒ£šËÕ£džo‘³L°È‹Áõ¨Ã晉¹a»Òj’¿b€ªk±s†ªlƒªdŠª`|–W|£^r•WXuVjLe‚5a€@oŽS”ÀUcŽ\ž¸f‡²uгyfŠRdOc‡=s„Ur‹F[y9sŽN–¶Ya}@bƒH„ †¦µcw™TƒŸ_®½_o™bs“j’«“ª7jŠ?W…=pPwžQ‘¶itšj~¢l›½Zc‘Wl•Eb‡@`”J|§hª^£c‡·bhWn”Wu›QiŒ[ƒ£_p‰Ic~Ku”Wv—b†{†žM]vBf…Sdh~Ÿ\n”`z›U]ƒbf‘dh—ci•y™cyšUmŠIn\…¦‚‘°nrž~Ž´_v•Up^uŒ]‰ªa…šgžÀSsŠSq˜ZwŒ[t‚]‚•aФNVn;MeNsˆWiˆcsšx¬ÒŠ’«pš¯h•¯eŒŸm}Ÿuªw…±^Nt=m]Jj€Ap‹[„Og˜LT…[VoMokJˆƒNsš[nƒ]dpDcsEtzE]ˆZWmReb:no9VuDSo@YaCTm>kn:rm5|nEz–P—^{O] dvtYkƒVh[ytDp‹?V‘Sej>_‚0jvA[†LLPUfIhe9ƒtAuœc‹u›c€¦f‹“gˆ–N€ m…—ly¦Phœ^^„Cnp;\‘G[rH‡vTšL¤“Zvµek˜d…rDŠM[™OauPpr8‚…Xp‘\kŒuˆg¨UuŸh}˜W‡ R¨okZh|Oj:h…WxFx–TfœP\jc†WN”\^lVŽyD–»b’Å™—¤|¥Ïzƒ×wz£ko`“ŸTRÌpotabt#x=–ªmsÁ‚xXœU‡µˆg ~vy=_8pQ³“BÍ`£u¬dlÂgw”Cp=R‰gwqd†“AžŸf|¶mŒŒQœ N”°n»šXnÃbŒyRYšE†hQ«¢Dg›ŠY|P_tB“{e¤Y†›|…§]s`s—8Ië‹Gè¦M¶[ªµ”§Ã¡¼“ …v”j{nEdwO“|ZŒœRšz>Òªu–ìŽô§D‚䎟Ÿy¾xw®„‹”Xi†K‹{?‹»qh¬n~|J´›7¥â‚ÀÙr“Ï”©½[r»Zy‰\ˆ˜Oº£Q¼fnIw“Wˆo—™wâ¦v€Òl¸~XOÍœ“d;¯§‘ˆ†F±•CuWatPg}8²‡A¥©qP¨UrBi”gyP‘£T‘›LºÃu…·yŒˆ\†P\Ž@²zA‚鎉™©€¦JfRr‹F‰•oƒµg‘¯wo®\†„?\˜W—~CzÄy€Œd›Çp°¹fyÆdRŠY~}g–ŒR™¶x”¹m‰ÞNt|K•¯_¦˜[f‘shªZu…X|Dƒ¢O¿¡nuãg“Tj†Bª^‡°…‘Eš’4’ÀЉŒOǾ‹ÏŒƒ°Jiu^€}7v{@É}žªÑ¶‘¢þº¹{—“zhº…p~TŽ}LŒ8†Œ?Ÿ—T°„¢¿B©¯>—ã€qUæä¨÷¾ÁY‹›L…“Z±”Œ´‚§zƒ€K¢¼oœÊic“”«Sªq¨7—»d„œ~•[Œ’i}²‚É—…®er°\ž–Mf“Oj‹?m…?„‘D¸½O~ÚTúÛ”˜¾z”ÃU‹ªX’ŒR¤«uŽ™O‡¬4–ŸKžÑzÜÒ˜²Þ^޵«²¿¬ë]¨W”¯T˜³`yªH¦Éd†ÆBÁÓ‹¡ÊVZ‹5›R‡Z±¸w¡Þ`žÁvŸå’r¤`£®{šÌ[‚ S‹i©ŸjÉl‘—_š›M„¬JsœOh§^‡¯dOu6e‹M‡™X™¸a_‘8”ŸŠš©}›Ú`q¹u›ºZФ@x«iÏØ²¢¸|ëÿ¶Äü ÔžŸ¼`yªr“dfktœel‘k}¡lrsh}«kq¨puŸ]‡ª^…žU“É]ƒ§nŠŸSÄÐX‡»•„Îco›Gh€at`˜¹pižGft¨Äsˆ@z…K}¡Tz¥rh˜@gŒU®b€Žkg”Pyˆ|†´g’Çt™³_ˆ©n“±Œ½•mSu¦€þÿ«ÝÿeœºBO~E~˜Ll™c„¤XŽ¥Mt–CaŠ@j‘Tt–N„¨Kvžrr•geŠWp”WxŸTx£_x›X\}MkEiŒGj•>oƒBiZnœQWy4j’Mp—Uu“]˜·Y‰µp‹ªT{›Sq…Pw–_\{5kŠJ\„Gp‰Iu [йe¤T‘µj“½Tr”Lb†G€¤ežÄi‹½u]p•a}£dh’C\‹Y…¦RnY}™Pg†@e€Xx‹]Ÿb’œbp<^zCg†G^†VqLi‡TlŽMg‰NjRe…Nch¬d‘¨ZhKW†Ujœm‰bs¡o¥\qJb„NwžoÇp‘ªjºaާi Òt ½\~•Z Ëd¢¾[’ªJ„žbž§Tl†]}œ{—À”²}™Â{¶Êj†©Ut•_t“au‘X<t<aSCff6ZO^€X_QMƒY8hGMS2‚c2`ŠH`bQqMKl?\\8ShDPdJ`Y:`o3SwERfDak9\t=evDcv5mt9v–M£Š^z—Kh™u‡xZ‡‰Do—`|„Y}›Rm™ce„Tg‚OepP^„EHyTU`@Ze1oh4n‡S}†bm˜Z[ro{iwŒ\ˆ˜_Š ]›¤\аh‚§h‚‰QY˜Qs}OŠŒA…¦`“‡`“°pq³ƒŽzY’£[w±v|‹}t†D]xhnrB“‹\e«Y~ŠZ©†X²¿d€Ão¤’e‰¹hh¡vj‚Kk‡L‰ƒDh›RŒŠX~T‡«FM°lbfLY…6nŒH†ŒVvœVx£rPžhhrZs‹\‰’^~«Wl”Zc‘1h€LXƒLqvb”\™¦bqteŠdVvIrl;\L™{@ŒÁh“«†¤Ã]„©x¤XZ€@`uVnp@h‡6•ˆPY²gk}_b‡It†y“W£…‚mn€HçnHÊ8x“¬^yA`tA°}*¤~Ì¥Sžñn•mz’LcŒiš~TsªUÚjDÅZf³f¤€T{®[€ŒE”…Z ŠD¥MÅÑj¹Ïo ¸f¨ŠzžÔu]¤±qG§¼x£³‰¤É“»ož±Ms¥e¯‘Y‹×\«¢[™äŒ€–n´¯„“É…•œo©N‡¨C¨²[°Î‹‘Š^f9’‰/ƾS´_I~}rc"‚SŠ˜K–˜FqZn…J^•K[j2T7…+N™io\°F£¿Y‘EœKš°H¶Ö—}ѧj‡b¦H—º £O™´nˆ˜LgwZ¨GkµK}‹C”pd”vƒ jf›=g…[p¡3‚†j|ÂN€¸jªlÝ»k˜\~†3~b¤šZzÉrT~^f8ÔÒxâ~‹Éh U—ÄQ‚»Y†¡BiˆHoŒiš[V’>op?||C¢¯dŸ¥k³W¹h±šorxw›—m’]–‰R«ÊU—ÅrÍsf½cu©…¬¨k¼¾F̰iÿŽNÿÿ_ÿë…|¬nicއ8€r–’p–ºdc™dÆ}¹†{¦Vl›D}¨T‹‹_¤\a’AˆšGg”W—¨pÔQt’k|¨lnÌÂ[€b[¥k£”X„¸O‰‘O«i}»dh©@‘“PhŽEtœVž›A—À^šÀd¦·”˜Œ¬Ñm©År±Æw¬Úˆ¡ÒŽx¤_¥»i—Äq Ù|ªÆs‚¡q|µC‡Ÿ^‰’od“Mš†[o«ti‡]k^t©g•¸¦¾±˜†¢?ˆTžÆm…¢o ¾zŸe²©¥‹¨I{¨ˆ·t€¦]fŠXušx€ [wŽP…{gPey?^|=TyE…5p‚Z‰V€«ut¥T‡že’·b¢Æ†ªjz‚j”¹¶Ÿ¨ãÉ̘§Å¥§Ì~™hžÈdu£e Èiˆ¤U~wf’Gf•7csGVzcq›Nu’nŸ¤l½¹eÿÿ®ÿÿÝÿÿÿÿÿ~rc T…”R°ØW‘¯b^~>m†Tn˜aX6b€KbˆInˆm]†BGqARtIi’IkˆRˆ—cº¾{d…k‚•uq–X€–[‘¿kŽ·Jm›f¤»Ãªé‘±k|§=•¯K‡¡T–¨\“³cŽ¢\ƒ¡M}I„§dl\g†HYƒ:c‚AZIsœYq“dtŸ[\wMWv=^y\o‘Fw“L‰¬Zk~G|’L`ŽS‚¥f‘´^†²m¤¹Oƒœd°LŽžaƒžDvŠ:]w6gˆRjŽU}¡iš«dtš]g•uw¢O^zGbŠM¥mžÎx›Éuw›Nj‹Ns˜Pv¨Ux›_nbw¢\|ŸX‚ŸOeˆM]|Q}£p„©k‡¤I`~JmˆCsŒPpŽLg„CXx@i’U}§Uv”N´hœÀo~©Wp‹Je€Mz®f…]j“_o›YgŒS~”Rnx“»ŒµÓ_w˜\‚±€‘¼‹²Ëq§»k Äp˜½k¯j„´w{–Uƒ‰Zšk†§hmŒoŒ³—²În™°\€šWy˜a‡¤SCmDI[ESX1GrAGfMC[?Md<Ta;\d0af&dx=]ybTlOOf=L[2Ja:RZ4af1\v9PxHWgEZp4bkA~pBj‚;bHz{NŠO|‘Pvnt€\‚SjŒ^l„jŒƒUq[X‹m]lbffDe‚KR„UciHZp3nl9rC[PZoPRuUXj@vy1“‹@›ŸZžµg ¸sœ¼yŒ¡on¤p–…\z¯JŒyŒ“e„ªn±€Ž–m£l‘˜uq©†i‚R`|[bvC’€G{¦V{•jœ„C²›`~Í‘™}‘¬Xt¼ƒt…`p†Zt…Pc“O…}V“¯GƒÁc_ªŠj|LaAŒ~Jx©E_–\bu[Wt;{oDuv5nM_“HryQƒ–?Nœ[]r:mr)l“OŽV…™ZІW§?„®ay¤K€—R‚£Jf¡wuL’ƒu\œˆc¢¸d³`ˆ®RlžPWŠCtz2rˆ>~†Lœ‘G¥¨tΡ‰žÊgÚ¢M’ÈZÀ„häL®³T‚ŸP¦ŽBÕµ]¾ëªx¡‡b˜AU„ItfQ“N—b:…ªN[ši§‚^”ºMs²p’‰`Í…RÓôv›ý¶Ç‡‡îû™’ÿ£±zªÄsÁÐO§é´ÇoŠÕyq³u—ŒpvàN‰£Uz¥„—©`®³ƒá™q¢X‹mf—`qo/ƒš=˜°z®»ŽˆÃu¤E€‡NÂÀg¥Ó‰cµWZj3„rBÚ¡cŒÒ|ƒtq˜[€zF]Ž.]t8Rx&VrIf^?w®R†p–d€£hužpr±U~–p[}=pe:‚`rˆI¦xJ_µ`^kL€zHtnz„:d‰?f‚F‘Pd¨[mz?~—N‰A‚Ls®uy—o¥£L¥QhžXY‹=Yp¤\g”9r“@²¦esÄŸ`ŒX®±`blt{Vg˜YfˆBtEz¢Ajj2ih/‰„Q•§K¹¬e¿”?ª¾u—–a‹¯tš°^²E ´h„¦}ƒyEÿg]|GŸ‹NÿÍYÿùŠÿÿÄÿÊzÿÿôÇÎÃÿÿØŠÎm“ÿ…†Ù¤ÔIo±ndžAu“nr“sfZ]@qelJŠf†œ\ޝet«h“«€„†U¿}®—lÌ_^ˆ5x3‘¨D•è‚Rl7Ž[‚Âdrœ_uµuitDy@|ŒP¡•\ªÙ€£d©¥T€°|tŸiŸx¥Ê„œ²t‡Ëc¯Á[j¯{“ar¯qv§Vn–\±T›«cžUw„Lj‘=y†[€œOm•qj;œ¯v„·e†¡S‰¤d€¼yÅz~¥]š³ˆ‘Ô‰`¯epœ_•‡P†šQš¸U‹´F—ÀX€¡[t©;d˜Fe‚7[hLrD€ƒXžµa“Ÿj²Ñyœkƒ³r~”¶ä~m¡ar[x£rV~Z”®`PpZtz ‚‰Áo~ŽnŠ{r˜Yvg‹·Fg€BX„J~¯H‘Nh”PlšR`„Wÿÿõÿÿÿÿÿÿÿÿÿ¢YXn[f}ar£c¬Ðtr•=q¡Oc}>[p<XˆDXq@gN†§?iŽ.Vx>|®GxˆZx•Ey›neŠOt”LcTxŒFv˜l«p…¬d»Š‘ªg³Ùex c£¯…¤¥\Š¢fh}In_Œ¤gi‹Xp‰Mi‘Rf“C\‚:Wu<yŒRd†L]„[u›FZ‚=Mh<\|R¢·yc“Y| RXyI_‰>iQ¡Åzz±]ˆ…ޫбÄgˆ¨oŸ`Ž£Fk‡8Oz?e‡To‡V¢²frŽIe…I{ GS|Hg‚Gh‘d‘¸h|gl e|™B\}Kq—X‚´Tp‘Zj˜d Ìg˜¼a¸]€ B]‚L|n‡¤b`†IaŠT£Yt’KfVbHfƒBw™a¤e{™dŽ´nyœXcˆWh“Sf‹Oh“V[„OZxPsRaŠ\}¦]–¹vº—¢Êv‹°a{’fy”v”ªz‹²u—½j’¢jˆžXi†[tŽ_pdš²b•¨\™¬r¥´y¡¿x’§c‘¡Uƒ–dˆ©jWb<FiAOh:Le8Ud@Gi3Lb7`f5tp0sˆB_†W^qXQlF^h?Yn<bgEdt:Zt4QrMPfARc=[p6gjAŒwG‚Gy¤a}]™…PXwf`„_[w]\jGdoa„oIe”VX‚oTfWV].PnD\qMhsBol@Žo<g§Nm‚[uzHPCmlLi}-z}BŽ…[ŸŸh¡¶w~ÂŒ‡js–se”k^Oy}l–žRˆ¶wk±ƒ†‰k†ž]¢¥o…½t}“hs™ZqPˆMš’L§¥m‰¬ctždh“zŠ…wŽ¥[m®{W€pYgJin=`€B‚D{Ešœqv²jw‰Yy–Ui”ZfŽUt…[m‘NW€@rrU¥ŒA¬´]Ép˜®cªÅS‡Óhг^¤¦KnÂqW~]‚;™¥W³¸d¦Ôƒm¶~„Y{¡RL“eqcKŽ>”QÙ•XÍç}Ø£¯r§sGsOmf1x‡>PŠTtn?„\ÿ¤f£ï”£¡xz»Š¡YŒ™n´Šd‚Y°›Ko²`{†hœ‚x’¬Tu¡@Š|<„~8~ŽDÒ‡EÓù¹u¤œz•Q‘¢]…‚q²¬O˜×£ƒÓÐY|n„|SQš½PcY‰l‘¶‚|¯«–YaÚ˜‚€X”Oo©QqžT—F\š:tyP’es¯cMSna5¼‘3˜Ëw„Èk“Ÿ`—«u¢i«Ò|WÆPf†Q{‡p^?|}I’µJÀÏѳ׌à†ÁšH§zpÊc¡‹3„¨Zx4j}F‚H’ÇY“žX•ªA[©c€Pv×E}u<Ê•G–ÿ£¤Fy©ozšH}œP™€|Áeis5¥¶Bˆ·w{˜Nb´[gtG‹IpŸXޤM†›4s×e¥HwLZ€4UxKq‰jž/º¯;rÑuu™ekXÚƒk¯]lŸ6m~AžTvÌ\pš__~9ju5µ“b‡’i‡[‰ŠG—²…• TpšSœKˆxx£Rf]O…A}¯_”kÙ‹aªÿ³³ÿÿã¹Ø¼}θeqƒ\…“¦xh{‡[—aŠÂŽP‹]U_K`o?h§GbŽFct<ºHp˜PX²i”†G‹Èx P—TÈÁceÕ‚e¦Vmqr‰E»¥<I™šlÉ”;§ÿyŒŸ’ŠÒV°ÅojÄjŠ9ˆS¨œbˆæ|›´]®¦[³ý•Ïi›ªI£“mš²hÑÒb¯¶š|Æ_j‘U®Û[”©Rwž?q®Jwi]oŸY~…Lq£Cu¬Tl¥qy•Kd—Ouˆgx¨cy±gz³Y’¸_°UŠÅnªyJvS^ƒ]‚¥|™´e€®a™¾~•¾q~£lo³p„š`q‹W~I§Õor“HƒJ€zM‘t X{¥^Ÿ®g€§[p‹_lsgˆD¹¿m¾Vr±Tb£d•¸I‰T“Àfjšcs”Z‡˜pc‹Al’XkŽ`‡£i®ÅX…©nh¢Y‚¯N²DpŠYéí¥xƒë¿ÝÿŒ›Ÿw“Z]z5sFn—WŠºz¢®U}¨Kc‹?\‚4eˆ8fyEWt>qmt˜X~¡Go™Fš–J˜ \š³Iƒ”Y{¤F}‡Yˆ™SkG{«czm‡gŠ—cŒ¥l‰¤R¨[ލZ¢²e”¹Jl…Yo‰R|VpžQ†›d¸Äy¸\jŠE^{YqŒLVwJl…WmŠA^€4m€Y¾Äsi‹daƒ:`wS‘TYU”±aޏttœY|•|¦wtœ[‚žWn‘Bj‹N®¶T}•JYrK_NbŠBaYƒ£b~“I€¤Ln—h”´t…¢VfŽWv™LY‚Eyk‘ÀVl›Mjd}¢t‘¼„ªÎ}†°La‚Msc…™Ri‰Jyd ¥eŒ¤TsI\…PiŠ[h„Um‰Uq\mœP~™HY†E]„Tn’UhFWwGj†Fl‰Gn‰X{žd´j€¤fu˜_|¯_‡–Po“a‘¡h‰Ÿr“°i~…XrƒKi{Nk’Xy“f‡Ÿf~šf™oŒ«tz˜c}šc•§d{‘f}›j\^2Tf;WhI`jEhvDXzD[zGhp@pƒBnJiŒ`Xu^XoIaoHgˆ:kLRƒGKkNRhKLa:Qb;bg8jt@ˆ{HŽ˜P‹©ds¯q‰ŠZž‹Y…§g„gq{X_q@p<…’Ni–^sybgrHRg?ShF[k=]l>h?¹kA~Âh—›››L]½cˆ{]x’4‡Zz§Qk]€ƒbXn`mXmgOX‚RziG€†= ›Pµ^~¥z€˜h†›^§©wƒÀgˆxŠ“^•¥K`¨Uh‡bŒ…\w¥el¤zbŒkWxMwvJd‚]r…pwx?}†AjCzŒK{—LŒ—\c§fi€V~ˆLŠ•]£Tw¢[ˆ‘^ySt“P¦‹7—ȹz›º„zÉy‡¦q‰®~‰¸`X’qVn\nj*x„<—bÂáizÕ³½ŽQ—Ùmœ—lôQ©¿W«n–ƒE~§l¢š‹y¬o¢k€•Ts–DQ…>B|6hl&±|(׺\ŒÊ’–k“½W†}@\†T€mQ³H¤ÝUr ¶zGÄÈT–Èw¤‡„ƒ}=Yn‘m†‰QlÁtmx’T„I†O|°b‰˜±u†©„C¤=a`TXr5ig8zyN£mv¬kc”sp{J‡>T…Ozp6o¨Kjbw<uŸOŒ•S®;px1š8•©|‘¢{©hn¢\hKwxV|”|{Oª‚a–®v‰«CŸ¢U˜´…º¿wÆ¡œ¹^ÝËs°¾†r«fžtRvÆdŒ\’F”Ÿs»pt‰w“xRöÒFúÿ~¦ÿ|h¥Wl…„…ªcާU|ªV‡Q¥ÎGÕÅZkªJLmelh9zŠ`—®pu•F„ŸV‚‹J‹¾lO‘KeaA‡ŠF¿ÃJTƒ=lm7e0]…6osI‡“\oH“¡Až¥T“ vq¶„‰¢psCPŠP|=i¢5g…F–I™œTx|H§Ž?‹ŒL¥¢g¢Á€Òow™?azOQ}2Zr:ˆœOiŽS`m>ir¼j|zƒ•_bwNpnM§b•逈Qg¶Sd}J{ŠeR3†Y*|›)§éTZ…YW‡9ttL„’6†¬]ŒªV¥Y£åwñÿ®ÿÿ£á{šÁwp§Rp¡>}œ]s‰Nb¦qy‡dr¯wƒ¯P¦³~£È›‘©K„›UÉÞ“’J§œz¥Ì^v^•‹‡º{‹¿{¤¶Œ¯ÿ…p›…ƒ˜‚pˆ]ƒC̵…K}mi”d‰¸X‹ÈJƒ‚Kp—Ew“Ej’Fv‚Gf£TŒeƒPr•L¦¿m¬Ú…lœSr Y‰¹XH‰2}‹Em˜ap^xoVgP{‡PxŒf„ËbyŠM¯Ö»vžHª¦ÅÊx~ªdާV¸ÇUš¥P‡”^vœRv•]… Haz<aŠ=‡¢{r”\Š•S_s8œž~‰Œ°u‰³P¦e~²TZ;q’Km›[z°g…¬‚sb…œR¡ÄYœÁ`a‡N¥¢Ÿ¿é[dxT‚Ÿb˜©cc€DbtRo˜[v¦m‘Q•T‹·QsŽBj”Cn<šJr“CqšS‡¤Wp Q¼ÅLkZ·lˆªW¡Ol‹^}“P_‚@_Žek‹N`…Zv‹X|™e{™P°Ð„¡op“ak”Sk‡EhFs’`f”[ZyvWuƒXsih~Vd‚CRs;Os<`yhzž?Nn:r€\Š‘R‡°XSw;X|e~¢N`ƒEf’KqZPv^«º\®u†¯X‚§W]„Sms¡ÅŠ™¿@V>Vx:nŒS€ŸTa|]_ƒ[fŒQl’\sœe]‚Mn‘Yvœ^qVv¡wy¦Uq£VpŽNj^pŸtx¥p‚¢Nd‰On–cˆ£O\‡Rn‘`o’_‰§l—V~¡QŠPrŠY‚™Nl…KlQ}ŽGU€Pm‘K]yF\@]{Ol‹ElIh|Oj‘VmSr˜TsTv[v‘QmŠ]|œ^“m‚œ^‚’Jh{P†ŽQp`~Ÿ^—Z„iŠšbp‰Uc€Ua†[}•Pl‘[y–]M]1UR0Oc<WbC`rEm}MR‰T[nOdwDhzNe{VYx^TvMcfHbx@i‹GGˆMChN`U?Pt.IaAg[;ik6esIk~R„ˆ]o©f’n”Rs®gy€}|€QLЦPi£fgsgmQ„n>qyO]xPboCtk=Šn<¬p>ˆªXu¡–}Zr¡ns…eŠ‹J—šao¾qJ‰kZ`Pyf4f…Jba>^r9s@zœF”•g…µcg£yfƒmw~SŽX…žk¸•l› cŠª^n²tpbd‚BQ‹R|hR[›PQ|Slm;~8^›SŠwE˜¤X°eƒ•V€œj}™W•˜eƒªWŒ®Kt¯nd‹^tƒh—–T€²Wƒ™rŸ–F¯Ï|–Ìv„¾|œ¥f³°h‰¼_ ªYzÅpcS‰x4Ö¨:Ýó^‚ù¤Š¶Ñ§V€åžœ–¨Ë»Xå³Ä±g„ÎhpšjvF‹}Q™¤Vƒ°i—¡re¥B‡€9hE—ƒ*Ò—v³åº™´r©c\–^ju7¢‹Cªºn޵‚–™ZפaŸìµ•¢y‡¢Y§‚N©¢yÄÉ^ð‡¸¿IŸ¨oǧ;¢êZ|¦__pCx‰H‹¶KAnXS#nv0–…7•µ_t†SXˆGmoCa–NB‰·bc”Xg€]X…gvh;¶·€½Qy£bŒ¦Ww]–—]}¼Q®hj˜7ºž>ˆè]už]‡eˆ¸I¤ˆ¥¸ƒt™Zg“tcu€º¢@Ý©‰Öÿ‘oån‡g…ââP•먶^}˜Lo‹VM„Dc€EÏ®4æò€ÿÿåªÿØ¥‰ÉËbÎõp¦Òs°¹jÿÿióÿÄâÿ†eË«t‰2a,r„-eŠSJtHr^Tk€DpR|tU{·d…{AµÄp‰Ó‚f«XTw>_y,š…B_jRf3wiQ—Ãg¤¥hº·yZ}Rœšet gwˆC‰}MŽ›Nž˜jQt\ytM©¥U¼¿`¤´mx²]ceIµ’6™Sa†*bm.šžWd¨€ƒ—:Y DŽt=‰Œm¨RîÙ²‹çX~¼‚Dr*\x^hªH|[~µ\t~?qu~‚¶–Qn8§5z•LÝ—X½Ë^¾Õ†Óÿ©Þ£¬µ×ÿäÅæÐuÀll•V‡¹tedˆ–7pB‹B¡¸Q¦·n™jˆâ €‡eqzf©Š™‡…D¢X•Áƒ”QÍû…Š»D®áw—Ö…Ô’š¶Xg~?j˜8…=d±P§Ár‹ÁP¡ÆdªˆKÏÙvºîX¹ÛX|Þo’¬Dƒ±R™Áe›²S‘ÑMÈbª’†ÍÿĬÜoo°OfadZ’=œŽ{„¹tgŽ5™±`²áKr…F’¶T€«nxšM‡©R‡mžª‹¨{z‰[d^[ŸŽœ®q ¼{¥Ïqcœ@o¡cyš^x”Bs’^ SY†OŽžKš`pvmz m±ùrr—~‡¥tn‘Bƒ£V†›Z`ŒX|¯ZtR˜£^v’y›´mY„Hˆ„sœ¯”d}@ƒ¶Îw€µKš¯cx§\yŠ=d{Q‡›ih‹bc‰Q\„JŠžarNiˆIeƒMd•Esˆk‘ž`|[ ¹sŒ²d†§\~œRsœQ|˜E…¡OgƒLcGrŽY€‘P_Ll~Xe[º^c‚EdŽ[{®Y„«cd†Mb‚3Ku1VtEd|>YsAnƒCw—7]|Yx˜<S{8¢¥h“±m…°J{Ÿ:ayNYv@Ry<aPJq;c€d„ v‘´–Á_~žfiLX[†¹¶½Ùƒw•?\}KZY[vCTv/Ei=MtF\zRZAV€Ga‚HQyMMmScŠYn™a”¹ly§TV„EkŽQa‡^}¨Lh‘Kb†T_…@SxU™XoƒW…˜kz’cx—Yt’OuŸl¢¿d¡EczQrŠGhTz›Voy>a‚CZVlŽFw—Okƒ=e‡LawLfXg…X€ªV|›FU€Ks•Go˜`|•e‰£W…¢_Ž®WlŒYi•_…™Xx”p›²_qNp”Ha€\o…Rm‹aƒ\S`<S[8C`9O[=`[4`uCGtLRgN[c<an?SxIPiMKlK`aCnv6r‚L`”TXƒYztHt‰=VvQngAzu0d†Ba‰Ss|Cn…Cf†ef†SuŠa„za…uF£•Jl¶YO‰i[Ufa7wt=§nC–‚IÀzQʇF׃VõyYܧ`‡²—p—jc€epYƒQ€¡V]ªuIzbXZDam+jp5q}EtŽB“E{”Rk˜reŒi^‡bfw]j{BmˆG„]l b~_lŠ`l“x‡Nv•UF”Vd^G^†;tsKw…7Š¡Nt±[Œˆ^”Mk®p‰‚f€Ÿsm¨`’a²¯Y¦ÃxŒ¸“±_w›Qv–Oz„P~’`›X£Á{ÂÈ||ꟈŸr££\°É}…Êf“šh‹¢e‘¤TϳN²ô¡^¸©Y^…‚o?ˆ¡s…•oÿ—T–ÿ¯•WzŠzn“piƒV‡y7k“Rp|WU™kXq`rc0R<‰m=± c¤¸“mº†–‡Q–Öc_Ÿ†KtJ¨]Q»ÁO¿Ól†´u«QtÅM“t^h;цMáïf¢ÿ•ÇšrÂbp¡Óœ@Çÿ|¿Ù…‚½Dr¨@b‰U^vGg["`w2§‡Tí‚Á¹º¿@aÀIMr8t%r¨Td‚bLk=ifK<v:JZ#{‚„m’^P”XÄvS²ö\ˆÝƒr¼oTx@yu.–µ“¦¹léH†åfa‹dR8R{<{l-ƒEFŽNEe2¿|b„ÄŸ°<½˜YwåÉnQÀžT\¹z³‡V{À^ÿ¾cíÿéîÿÈ‘ÿÝf”aNrD…tX”»™“vXíõ·ÿÿÿ¡ÿþ—³m‰ÄnM•IdhL\v>Ln0|b_ÕqVqQNƒ:mb7m4¥¤`o¥‡|“Uz{;lÀSu•<†”i‰—De†1³§ms´wk{Ÿ²™LèÓcz¹X™±bk¢^}–?t«€¤U¢«B¼ðkêW½ÌvÆpoq`šYÔ×fÊÿUay9†ŽT€°ia½obeIyŠF¥`\LJ|r~|žuÎu¡z8ÍåDÿÿÿÿ¾ÁÿœgC[m;—“^s°\nYBy³W™ˆ=€™›xu[³oq“¹g±œ¯œÏ`‰?`nD{ŒEmŒS`…`bj+…¤=´‡¬ØpsÌIˆ¢zz‚>w‚:€ªqŽ~Ff”LkuV–ÀM¡«—™»dƒ²‹‚¹`еq¼zr²Nu7”žI¿²fµ©ÿÿÈšÇNµäÂÐݱ¾à¸«Ç½[‡©¸wy°W¥©‹Âÿ¥¥Ù¨¸å¼¡v¸¿Á€´tjˆFºÛk¤àUª±y²âih‘GwSz±‡‚¹Ym…`t®S€ÈZ„°h™ÃC¡³e‡¡jƒ™T†¬=„¨TxS˜¥xŒ«wqXl‰J±µY‚kx¦]}ˆCtŠB°ª}Ãtwš[† kÆÿ¸ÏY¼Ú`•¬nºu°Ë}kRxxb“HgŒm£kn•R]€9b|VcŒcw›9‡^Œ²tw“]¥´€jž:_‡Hv”Oq‚Qt“D†¬cl>jIŽŸN|¡D_‚@dƒJd~Me’;kyS{ jwœ]‚©bˆ•Qq‘Mv˜Uh•KLr:X}9}‘OXr@j…5^H‘¤ž½W”³f|›_[[b‰^t›Fe{;]r@]|=ZDf„QcˆL`Xz¡tœµKSx:eŒue“s|Il†f…”?n‚CYz1=a:GkJX€`hŽ{ƒ ~…¢v•¡oŸHt”Vc‰ly˜ƒ¦er“W†˜[k{Dt…GVx;axBZn:Um@]u@izBYy@Oo>UwWv–bw›n ^u“K‚QoUj•XgI`…La„8W€Rx›_^{B`}X•X„£gŽ®e•´~¤µdr˜PuR|•Pn‹Pe‡Wq‰Ga…QhKbSj]tŒF^‚@]Mg‰M[ƒh˜¹n†¡Kf”_š±Qw”[y›eƒ¥{•´wžµa•Lj–i‘ _po“ªgŽ«`«ÃJeRk}NeˆjŸe[gBOiAHh8MTBYX/Zp7OeHNiDVZ;Ph6Im=M_?P`<]c?Uo:qfAwŒMq†ds’aw‘VoŽ[jŠX}yEp‹T\WauOnl=mmL‘‚Jj›SddrO”F^ª`KrpnYAme+`†>¨nC¸y:ª{YotXXd[¥DKªUaˆƒTloBnoS]J^t?kwLU“^TpRup@…~2 –F§ªU†Æj^¼mX|chqWƒVx†Rs€QwnEn‹Trcl’[do[nILvRxb>m‘SXqjkKu‚8~‘NÃ’G‘Ísˆ•rpŒ`^ŠUkyRpHŽWe°]r…W•“G•¦l³¦xl¦wm‚Ua’S¦x;˜¼Z²°l¶¹^ªÔ…l׎‡„J»Çn䘤±s‚¼ax¢^žMlãlRs†–X;€ª7‰—h§š_©±c±¤c{šq¥dsÉyw}Q‰’4Š¢RgŸ=mŠG_sOh8YI|}<~ŸAh’Š©›n§Ú‹™¸–qU«Hˆ|*ͬQšð¿¡¿]Â|i‹càŸAÛð\rïd§sˆ½›Ÿ® n·nŒ‘9†µIg¦„utn’Ub†Kt†9q€C‡‹Q´¶DÀÄQÂàsÆçƒ”û©a´²KqWpm l’Aiƒ7lƒ>_7YtG[h$g{$¡”M³Æ„ì¨QíÿÇ€ÿ»“‹itK{›>YŠKy~[l´u{Y”•K†Æ[‰†Pš¥EXžy]i:Um2º'Òýƒví–™XàÖˆÿ½U¤„‘‰I‚¢y¢¼fÓÕtÌÆztƒb™TYd-|–1Q‡vP'¢‰DØÝÍšÿëb€‹v”@^?]?SuVB`*@R)ˆ‡a|šS[zF±g-yÔj€˜€ƒ°6 M³ƒš›|kÝ?¦ŸO„½€–£t——P¹”©–K›m¡¡‰‰°–y¨Vbš@£IФU™l|‰e‡ÆptÌ“Ãh‚ÂŽ„Ìc†³c“ººˆ¾Ži–_²‹4a©SbAvµ7¡CmžC¦{vmy9®ˆL¡Ðtyžgÿà”ÿÿÿäÿúÜÿ׳»RƒšXe’_ųD «l‚€Ko’“]EYudƒ§VgzK€P´¼qdˆPÌÆypp>‘ cƒ–cy”?‚„j¡¼c…²{~›f—¬O©§_«\ƒ³s©€>v Zqx:œ˜zÜÅ„ŠÛx’§T˜{v\›^tµn¬Z‰žT ¶²`¡RXlc]pt¦se{F]Žzp“_ha‚¢c̆€Œq«Á¬ä°psSk‘pd”^…©p~¼D«ÇÆj‡{¯ÚqÂÛ‘{—oÑUh‰?w·SlŠI€»`{©v‡jŒË¶{€–e’¸—¶ey†_™‘:®Ÿ}k—^¬ÅTx–F¡¶œ‡·{«ªTŸ_x«]~…ju¹dkƒ_›ª€ŸÄ¦šÈ†Š|vŠeqƒIb”Pe†Ne}c]ˆ>y‘J’¢i|“F_w=`yDhyNˆ¬Qcx\d…S}©Jy›eƒ¥ViGxžAs‚Tb†Kƒ“Wi~Gx¤Ev“gsyDhˆF\‚BlŒDi‡CSk8d„Wf€Ps“^zžRs•Vk“VY‰L\yCe‰Av˜VUq4j{Fq•S{—osŽ|š¶v£¦ZdyCc€W]uDZm9hwFVp9`rFfyPcAjŽQeˆc¥»i^{2UzAW{bs”Dlsa[y9B_>Gb'E`+Jb1Gh7[{Zn]…©mr•jKfCLbCi„_e‰P`‚Tz“pXmR`vTh|J\uDa{Mfw7l€FuGl{PyŠ[|ŒMezKd„[d„Xe†TiŠXkˆVp“`{›`¨Zx›^‚§V‰®X‡¢Oc~6[vKr‡gŒ¬l¯v•ªp^yKg‚[mŒjŠLdGuŠRv‘T~œXiƒH\{AV{L]vHo–Ov Jg„Th‹tª¾wœ[—®s{ž\v“Tm‹\o™|“³˜¸g“¬Y‹ª{‘§bŽ™`„ o„¢nœ«Ne€MtKm_`[\qEPf@Qe>[]?Sm4IjCQR;E]5L_6[Z5Kx?ReERT8Rb7G[3LSCSd;oaMo‡]i‡fXŠU_z[neImq?O•\Nv[J`4fZ3Žo;|˜K`’kfwPbz?r€Ta„UdkF‡d.b•>q„U\{=UmMWbH6iATI.Wg#JiHGYFN_KT^?\l?wo=n‹M[ˆbfyJ‚Cl§T¢Šc‹·yXµ˜PraSg:ciCbK»†SŒ—Tbšs\‰]hmTRxV:bG:[9M,ƒ0Q—r~eSŸ™Ež´g·v˜©‡©zŽŸfiŸZWsKPt;YmAIqQk8{‹1}‘Y{ƒEP€qbcCN…C‹q0¾«B¨â–«¯nŠÆ[£ŠdrPc†aËzGŠõŠŠ¬˜Ão®r¤ˆPƒº^OŠsk_>¨}1˜¨k° m”ÖgÖ–jžËm†ŽhmŒ^ƒ]£¨C—Âms¶mi‰Lª{_oÎPwƒHrš7^‰9‚{<’–9ͯƒ|ÆdoŽc‰‡x€¥P_œ{„–yÛ©dÅöš|Öž‡S°ÂxdÇœX‰Voo/e—Hb“Rn‹[€”0t @x”IfœFÞ{SoÄg›¢MkÔrwnheo\hbC_c„V©·oi©d“‚1çœJÇÿ~ŸÃP¡bv`‡yM¢4^¾GhlA§QÁ¯ž–í³·±qxÓ ˜QvÓjd3s}4oˆOš”m}¬rL…Pžc?YµQcg8_€.£–9ÒÓ€rÞÔ]“:¥€Y·È¨Ä§pbœZ—ˆLzÆS„gW[•ricV„u7X¡kVl=`vKP}?sz-œ¤\”Ào¡p€›G‘rGœœ]cx=—“X\×= ƒ!Š·šˆšV{>HT^n3š’nïrÍÿ’’Õz¶{£^Ž—U†ÀivŸc¥ŒMŒºlˆ©V‚›RŸbc°2a{JÀ?q¤l•†I‡ÛoŠ•c–®s¦Mž¥@Œ Cz™p ŽK§œg‹}2´î€{ˆt„z7žÔ§—‘Žíb}‚:’yF¥‹Jƒ²|T‰@·o½ã§¤å³ÒǨ͚·ŠubŸmw~-fpqc—ŒI_vWˆƒO’v=|œgyxFw‘Df¥etƒbš®›\?ŠŠPލ`—›W°—Jª¸kz“VryG…§|“I²Pïʑ¦Mšÿƒn¥?…~\ÚõˆlÅeŒ´[–šT}šc´¯c¬Ø_d•M€cX£T6O'\jAMdd¤Zdƒ3¶1c‡:˜ÂRa‚?Œµg|”Ur¡]«Ã™Œ³ar—D|«Iz¥Lw¥R€“O„§X¤í u¨~s”Mm koxC›¸všá‡o‹c„©V„¢q‹˜yUpWMl4gOe‹“…fyC¢ºufyT€O¯ÕšŸs©Ê`ˆ¶\‰µ_‰—c”«^~J“¹U¨^’Ÿo–Âf”·f±[Ì[ƒ›]¢Vn”Ad{Oz”Er„M™©mzYl‚8kŒ;„¯[—ªe£¿V`Ž<kJq›k‚›kc‰Js”GfzQi…Cf‰Ko•CoF¥SpŽ:lˆGpŠ?jBTs3jw@Tx7azCt–ZnRv™\`†A`…;d|FeˆVtŒQr‚3R|G|–V}šSqŸYx’W€žObvFgx<Tu5Od>y†LSn6]{ImU{™Sh•TgNtƒ_\€BnŒ>WoU€‰Cct@Vr<Om6K\/Wo7Nh3Qn2x›Xy˜nÃê}–ÉKVj8<Q-?XORrBYvLh}RgrKivLdgF€yS‡xQ{‘i†kŒ’`‰d£•yº‘`•„WpvPkjMqO†Ž`‹©c{¤Yhgžj„¢cw¤ps™^{¡Rs¨U“«V~tŸ¼|¡Äw†žF]vDn‚Tiˆm“Kh}LoˆTv|U}™]{•X„™?PqDf€[§Û“äÿoš¾u°Ætªw˜³o¦_s„Lf‹Jh‚OmŒdy–|šË~§Çlƒ¨n’ž_ƒ^]u˜n”£M|”P€†ImNc€JPf6[c8eh8esBLD;[KGE<L\-Yj7Yk9Pt@NiROR8SR7C_:?[8IN0O[-h^<VnM=rQ?_KeH4ih1GŠKLdJRe1Tc.bl3rc:o\m‡Za”L„wJr J_‚QrvAkDW’`[rHnr>X‚:X|?af7gm(S„BXg;\u;g~9V@HoFLdNs_S‘‹S|¢[b¢]‚n]uŽFZ’yVz[Th3Mi:gR2±w8‹K†¨~y«ba“\EpN<Z=^S(c_ ek6[{VsvgtK}eq•‡’“}£Yˆ¨sU lxe\mt<Mq?G]9§\$\‰-ZqkRk:\`Hƒo=R›WX^I‡m3ˆ”xc™rq…YU‘Zlp>oƒK—‡Bµns²›T›jR}:•i4k§Gjzhai@Žn)u—d¼‹e½ä£þÉÑÿ‘Ú£oX„}IÁžBÒêv×¼ˆ©d¹¯ZgÝ¥t{YŸ«\¤º~~±\•K˜p½ÉX—×mɯf‰Ü[ßZ¥ùv£Ý‰@Åt‹Rb¤¿IÃån˜ÙšÆÉ:žë_eÀ˜{ˆ2d›HU|/k`7…oGx—Y}”Zƒp£ÆP²ŸkŸ¨mŠ^…;c8~1Å´h˜è€wŽ^§tFy̬Mrc†lfX™WfXEž…I\³oZ}1jo*v€x|°‰ž¬w’·›™¦ri©z]‚Kzr/nšTw•EVŸmF]QyŒ$s½[h|8t«6¦‰,sÅ‹§}s…Õahžfprjquk[mNƒ„Ww€IiªX~~F€·W_Ž1wf:lnEiw;R‘AH\Da\4|³d¸ªX„ÀrV–OTu6Nu,<t+—_: Δ{™P]|Ou\BØ“j‚ïgz¢W©T¤b¦Ÿpœ”wn®[®ˆ\•Ýou p~}Xš‘;’¦l„¯shŸSVuEazT^r2nUŒ²³g¼[~zX°²O…¸b®¿Áh‚¡S}³h…¤_{Šd™Š?ߦŒ¢Tz‘GµŽÑnú´àÿ›ÙÚ•ÌedžYVs#{Ž&¹¥jÑò›ÂaX•deÉaYa)c…,Xˆbsx;_¦TZˆD‰xEv…ge{hmOp5h³g\m.i„QKxU‡˜`™L„¸aš~h§¶ ÂtuvfzŠUbs:okPnWw=KXB^Gfy;åäÈ~àŽdz<¤‹uw”C¡¸ƒwœo\Œ®_m¢RLi~HoLx±[l•Bn¢W¨DWo¼Fv`|Up¯_³x~É{s‡MqpNqUsP‚—]ć‘„}µu“š^y•n~®RKh4U}Xe‰INqBŒL¹Ãd|šHyŠSoŒ4€”7ÔÇN†ªl•›N[l_›·”£³h¨×”ŒŸd¦¢^pD¤¡tŸkv®[ǰdŠ zªv°Ðz{·_„³€Êcb~F·±^X€Wv«^k{Ej”el•Nk‰[l€Rž§f}§SŒµis‘P‰¨Q_<a}J¥©YeM{–Hq‹Lv‰[„¤NªS€ši‡¬Ufˆ=PsAbKt–>^„D_‚EsAc}YgŽVf‰Qc…C`tTbˆMmŠKq‘Rk„FgDpŽS~’d~™WŠ]c>a€Ed‡DUt6g|Aa†T{™LfGlUs—KsŠPf…MwQ„¡Tm‹Dw„S‡¡Rr|Hk‰ISi1]nGmŠAT|9wœR…°s‡¢p|—”cGZl6U\,?P4`iLdvbpoMƒmE•„M§’U«•S‰xR±a{tİ{—ŸwœªŒ©§wƒ^ŠyV|mLnlY€€²½¤ÊÖfzš]j’i|©l޳atŽVv’\~ªŠ¥Àk{¤v¤Œ¹vq@lTwHg‡ZrŠKsŠQx[~’NuS]_€‹AWwPt–}¾ôÌÞÿ¡ÁêÔú…©º}”ºry Om‰W~œN{œPuX~Œk‰¥—»r†›`‚•\|“Il‰\q˜f}¡TsŽLj‹MkˆPo’Uef6_n0_g;]|DUnKRcKJY>Xd2Ru2Uj>Oc9PcH]e>af5Lt?BdCKV6A[/NQ8[]/>xHKTIW[+_u-[wDO{INj;Wn4Yf6q_1v;…Sx¶dw—k}Xi™ke‰XYƒPVpEof?›w5k°Lh‘n~qC|”Cn¡VcwV[w>wx?fŽP]W\rAŽc=“•D†¡o|”p»nUz‚DZˆ_]q]d,h–?ws;vŒE€…EuŽuayªmU„gqj@Š}1f“H†vM‘œD€»ot•`rˆW|}YbOYqEpaVaˆn[t][q<WhHl^?fe0Y9^oU[u7cq@Yy@:y`>N>iLdv>RŠM‘h9‚•Og¡R‚vF]ž]FvF<cRuQAp’?„‡M®¦NeËxUz]~g)rŽQ‡šJ‘˜`б†Ÿ¬†»´x™k¥€X’¹N¦É†Œ¼‘˜¦nŒÁty±–|†Rk‰Mr|D…cŸ“F–®g´¤lÐÒ“¥Ø£Ãȡӕ_¹‹tvv£]¡œ[ún°Í—‡—šŒ w`£\‚`’®Lˆ›~¤^wˆo˜6¨—V—¾Y¦FʽwÄ»„š¾‚{Ut‚F©–4wÔy’b› ~sÀI¨—8{Í]q¨O…ŒCž„Kÿç9ìÿ¥TÉiJhG^q*a{4c3YyUˆ‚f–k©£Ž}·ˆU_ˆa0u´g§ŸFƒ²_‘§NŠIrClœ4iƒWp kPq@[u7LfHVcJRa(D^DyX*m±>RuCYv-P|+zuI^žDc€=…xEObWTp+`d$wœ@Ÿv8[Ðr‚^/]~'«‡(VÊgZ\Sˆfw‹l‡b•ßWpÌ3x……µšTlPp¡X|š@u¥,†•A‡¯=jLmŒ=T'¯a7yžL£}““BP€9`w6U~4xd(i KuuYg¯E–šk¦õĉ³‹ßÁ¤m¸|ƒ™jiªN¿Š6‘Æ|ªZkqk½»d›ÿŠp•g”‚G”Ÿ¨·¥ox”“ Xk’0]ŒHÒ¶<Àí—Žï†Éº0~¾•FsH_o6x•/[‚I•QX‚9˜ª`²i”‘[¸åbwÓVH{=^o>y‚TV‡Qq’WgŠ:QnJ†yPŠÈoa7²ƒVd?^Š5¡H½“3uŽ5tv4¢•DwžP«Ÿ‚¡õOލJæÕ_‡„LL€E`f9dŠ]kcbƒOe‰8—µiº±w¹Á€ÊXv‹€g‘qŠ˜X–ä–cCz˜Gq¤OjL›¼œÁneˆ;dsBm”T»l¤©i…¤L„…=¡l‡ªMß§ftÂBx 5g•UfŠLˆ‚Ty„x—Lv¦Gsu¢§³„—À„dR{†L—¹b–³chh‡³dš¤|{ªP§°\ÇÍau»f‘•q¦¾fšºw’¬¨™Ì`n¢]œž‡xªTf|Gh‚NY:e‡LxRy™Nbz?ZsAp•cu‹[~¢Q ½m…Em‰@qˆD“–_—°U„¤RwŠNz‘buœdw–YiYušLa…Ahƒ?¡»X”³Zb‚Oy›RxˆEtŠEYy<_{Br‹Igp=^vJq€Hn‚R|œVˆœVuŠ^ƒŠU„œ_VwJSu4WyF`‡E}“IŠ£T–]”°Uc‚D^xYˆŸb‰§W¦cuYjŒZsOn’^‡ Ym’[x[q„<q’mƒ¡j©Ê‹È먬Ìt”»Of€McKTn6Rf1Z[7]nMsuZ¡sT¶‹L¨„V…˜b€˜UªžcɰcرY¢›uÀ£…ÁÍ›°Ér—|o…^’wU´|gÌ“’ôƤþԋ¬e‘¤mœ¸wŒ¯eŒ³f†³e~©£½b‡›bެn–®{‘UsŠUd}D`yI–awˆUz p³¶`§Kh…QtGn‘W}‘x¦ÕÅ뤱à¬ÇóŸ°Á|вf~Sƒ˜c«b†¢^}“\|Žcz—gnŒX_…Tr‘^{§\“®]Ьp†›PqP›PyUz™f_jA_nB_nJbtFusJg‚DTyI^lJ?{?N\CQ\0Ma9`n<bz9DEMbJD[3VP4\^1`c2Es6WaN\k4rl1r~<]ŒH_wE]r:nd;{z5i‘Ew…Yo”\{šsz˜aW“YMwaOtHSj4ke(ˆƒ0`§^rŠ‚–tNŠ£R…£u€”vj{LczPntO„„W^ŠORxRftGâyQÿŒSÿŒZwdOd†[ffJ‹q9}¡Qn•\r‰\umFmU^pPwpI¦‡a¹¢[¬Ók‡»‰°Šo¦ÄfyΛ”wj›˜Ws®es|TvsD€@“Ft„Y_L_v=_oDef4bo@YmF‹h=«šMÄp|¦qq‡Mnv5ehEˆwQ‹žKšO»e©¡pt©mlxEyr8zŠ8O„A{d\µŸXªÊ‚{¾Ž“†IНC„žb ›Wj¶\ˆyg—€Mp”^•‚Q€¶F} qz‹_‰U¤ŠG¡rb_BBk³Aw†5©\lÄQ^}^„ƒHO§hPgYgm>8xZbc+d†-e9DqDQWÒÌM¤ôt~Ë}©‹^£ÏLd¨o¤˜>Ò±R˜ïx½·pŽÁ¦˜»WÇŽT§²bœ¬~šœeò?Œè“’–z™im‰auˆ[i•^\Žccf8–l?·”IyØs‰™‚µNsH[n+|ƒCR“;LHBŽY5w™j®q>Îð›pîIu6“m<’¶^~²®l©g‹›w®˜UâÞa¶ÿº|®~4qˆFI€FMP!z†,y†3LvX?a)GS>[Ieƒ](y¹UStF}ŽL~´]`ª4¡€D“³_sÒiuŠ+}„[±|ZÄÛ œÇ]‡DpˆJWo9soCh”u^b?|—8f¸zlŽ/‡ªS˜±T±Ef@rvO‡t;‡†XuŽ2³T Á>’‹ŠŒm_ÇZaw)ŒÌEe“4P•Dff-cƒB¤š\f†j´”GW‚X‰{C…²Ÿqœa[—]QjhLs'›tH‰È³} f¹6lŠD]iKeX/™TtuKª^ìÂu¿ÿºÄÒ³–¡T\‘ZTg3[|D‡±2]`,ww^KcDnzCyggxˆ7Z‰f™¢Uk·ZRx1VsAHYDd aVR.eb2˜ jƒ‘lƒuH\@†G”‰F´àŒmÂ@“’Dn›5t—BQŠ=lL.“’±ŸV~Õh¨aŸÏ‚ÅD`y8c‹Ej„Ldš5gpBÙ¨YáÿÌzºhnMr‘E_t<yŽ\iŸCx™_jGpœ9yªW±Þsƒ«V¨L‘»M¯³_–’t•ˆb‹8s„X”¡`‡Šnv”[†XšµR‹¶w™·h|‡TŸtb”Bb}>œ–€{¤\½BY‹[s|g’‡|¤[Šªaq™xˆ¶b|«v‘‰~ ´Y¢¦mЧTx‹j^yr~ƒi^}lt›ZoŠM‚‘QYy7{is”?h‘9}P‰–UŸHhŒDŒ P–»Uc„Rž§ri†JT€H}Ty m•Tn£O–´aj—Iy R®ce„QkOŽ¡]ºÕ…ˆÃz”·d}ViˆFg~My‘Pb~FqCw„czELm<{“MYrUp‰Xq™\y†Qz•`{ LgŒ>D]0\wCUw=†žSxŠg’Ÿ]všPg}ErLs„]Š“Z[{Mr‡Im—Wu—`s—AeŠT|«^„ŸW¡XžTbŒz›·´“É’£³s—·hn‘K† G—ko™G®Å~ÔùlŽˆV¨€d»ŽSy”8aŒ=ЪcÓµríÆˆÿÆjɳc²¯pŰ»‚À^žh‡’|™‘£žï³·Þ§°ã°€Ã¯o¨“k•›l©}µÒ„½Ú”½~Íʯj‹ªs¨yŽªVnG’Š\†šdv…[z“˜g‰š[wN‚LŒŒ[yi”½ŠžÔµåœÝš§Ãi|¦aˆ¼i‚žn…ž`bƒY¥q¯Åm¥VdƒGr‘Od[°‰¨Î€¼x“²]yšYwUlŽbŸkcxI_u<etHozOs{GlvQV†QX{RBlCFXACW,[V.}f1w:_‘Lc}VZs?`d<^s7Yu<`sHT{F\f8nj6ty:^€P]qHaiCkmD}?~ˆNm“`m”Wr•\lŒ]T‡^=nVD^<Vf#„m!]™0TˆWby^ku=„L‡ŽdˆŒpvZrŠYƒF…¡ZrŠbwXÕ‘Kÿ›NÿRÿzTTRV{IpV=|~C‚’V˜Ÿ_{˜_izI}xHkœLsjD‘ˆJ™”_s®†U€Šnj]”ŽXŽ©’nŽše—™c¥žu—¦K £e‡ bVŠP\kG\m;E[QKX6YH.ni4„<§ŸK¡Ä‡œ»‡‚¬ƒ\uU`b8±d:ˆ¤J°šq~Î…Ÿ~‘k—†`‡S€ [xˆZ‰›Rˆ9H¥jroZ’™a‘°U{œonŽY^ƒjŒoJ“‹M„ŒZp¡TxšIN–k™XJt€@Šc…´i¸¢>£ÚkÒÅ€¢ö“Ù³„„÷|˜†k£K\†?WuNMq3S~?ƒc'…„Bnˆ?eƒTk‹Vˆ—Vq¥¨£c ËÔ¼oχx¸QŒ’_ˆ¨`¨ sÐ͇¢çŒÖÌ€›Ö“¡Äy¸·cÊÍQgä°}U‡¨s{«pM“sOnEt{D{Qf‘PxfF‡‘mX?TwNzc,j“@‚r=zŸz[†[{x1Ï©Aÿ€UÈ¥hdJg”d‚z,m¢h’“<Z Pe6cZy>‘yfoļa‰Oˆƒ[ˆ´jVŸ`M”.X_2N_%?h3GX"PY)om)jz)auD‰W‡²f”ÍnŸs‰¸z†Œ5¬ä˜˜Ùyt“Uq“IƒC˜®g}¦£Ÿ•bw¿iTo9Es1@a6¾`"ŒÝLV—=z+“AYºRZz_y„pdn@„ŠLtsYx“5‘ˆ`m´°ƒv>ž¨QɉЧI©zÒ{t¢kV~9pƒ8n†@a§[ŸœG\|Tkh5…¤TreNMuDUk*r_Mª™T|Ÿ‰ŠÏcš—oƒpH‰n5•¡^h kmcJ¿hŒ¡Z‚Ù¦x`fœ]\_2ƒ[s¥put1OuBbj)Wp._€;gn;gxB~‚j†”dXz0]o>P\$vœ†ÆÈ@}ž<€žgx‹a¸™es‘?‹D£t5Šbx•ƒš›{®ÚŽwÀ]L£NQg,£wsÃSZ^P–zA…¾]eªiyÇJV‰=l‘7Kt7qx$ìÒbªæÊo’N’¢dV€9]~AvŽM¾n¤Ul´h“t ?ˆ®†¯ S©›^ºÌuµÁƒŒ¸Wj”Z’štˆ»]s‰Xœ”vŸ¦m»re‚sñÀó°àcŽªpšÅ¤u°u¦Îj‰”]ˆX„²c‡¡ef‚Wf†Q®Ï]’R‹”_e¥FjŠ=œ²^”Ð’¯n˜O–—Y|‘Q¡Š_·¶L˜®ox~I¬¼MWw5zŠOn†g’®W‹¨[|‘e„e|še„¨ÊYu7^xJarJl}DªÉvƒ¡_Ç^U]}Vrk‰©ƒ©²pl‡Jg[‚ƒ_¥»’ÀЊ‚¡m‰©Xq‹HŠJ|‹K‡›\f€QXmf”¬Jc~CbwRx‡TtšT\o@^€O»Ø}sUv”HlˆRÌèdf‘W¡´mƒ·W–“h¥ÅXޱQào®ÑŠ–ÇY€QzT~©es”PhŽP [k“[„”[Z‚iŒ¥cŠœQn–]hbY|Ku¡XcY²SŠ®yu˜T¢È·®ÓuwgU–ta…Al}8ŒoN©\¯•g¼°˜ÝÑÎÖvÝÀf¸³r¸«‹Äéžêÿ¸Û…¤ÛНÀ´ÿÚªÿÆªÖ©š¿ ‚¸´‰Ño²šŒáÞØÌŸØÞŸàÚ† `v’[y”€§Às¾Àk¦¦PpŒ[… ]l|Wu•]tUˆŸ_˜—VƒŠRj‚h–¼v£Ï²ç–³Ñ°Ñr–d¡fv”aw’L[…]Фˆ›¸|›Ãg~˜U„£Nu˜Wy¡~©“¶xµfuŒVq˜Oj…bt™w_xK]vJ_rEfrNUrNzbIn„JN‘aG`OL[@GU,OZ4hc*y|<ršVh‹`kqPk|IZ~INnRV]?Up=QqB]a1ii4Y|FXoGicDYs:oxBŒ€GŽ\q§b[—ZWrXXzPLnMLgH^h8~r&[™:dxdg{EH€If_Dr{F|xW_Uuw^“ƒJ„¯d‡žd’ Xÿ£_ÿžlÿfJÿr8gSN\\7sZ5|v5~’TgŸecŠ[Y‚Thu:]„ARb8ygGyLŒYw›UF–Tl^@puG|Sxe€‚P‘T…›Wši¯™gmÎeSk~[,gi?vc:g„2y|@¢ˆCtÃm•|y«~n”vzuJ^‘E¢iHŶ;×ò–æ§sÂ’i˜jpsR¡Or³iŠ_ƒ°ji™dF‚NRk?ˆo2w¤S\”r]cMe7u„I†–H”[P¤d[gBOnG]i'feAkk2`bŒ†G‡¸|Фr›«{~¢Œt§uƒ‘g{®|t–cz\y X€£Ro‡<k?y¡MŠy>M™>QcLci=¦{F—Ë›ÿ¯wvÜ®x–=t@¥‰D²f¡œs¶±róµàÿ¢Ãå–„æpJ˜jˆkW–T€ŠJi™eŠh¤¢@¬Ã|t¿kh„^”—+dËR;sRF_*yr|y]JuB[i@np8s™*²¢NrѧMŠuFh={m$‹‹Tjošg_¼‹Lc=j]6i’U®JÇäv½Þ~vÔo¨dT»‚jsmgh,Fi5yp!y«c…+fˆ-iz0p2fvE€vKÉÈk€Ìg~Ÿn€še¦¡dƒÒr„‚R{Ãa€[7{Ô~u£nh5Œ†Jdw;±|4¯™Vëó>ÿØ`ŠBu…-†³›jsP©´JhÅPyn>šSq¢]~š`¡“K™¦;€}Z¡¨~| {†»qjR‘·n…°{aidi@€|Oq‰Kž–Y`‘BdiGKi?Uh*rsMgŽRe‹5jŒUat7s…Slm5«„JÁã~m¢K“[«FVxYœ?‹”^f{Zp‰DkrM¡}X•¶[¯¥X£·gh£7‚§O~„F‘{1Š’5¤¨X˜ÿixy@\”GŠ3e„Ou‰jƒ„fˆŒHÅŒ†lŠ:~‘vyLŽ—E’œVd‹Aq†i”_y´fˆ‰\vF—ËFÿö®V²§]})¢z_y¯fTƒ3“g…š\o Sd•C±·kÄñ¢n•Gb}<ŽÅZ}Åbq‹B‚›T‡”XƒˆSWv5w‡X„™clŸS…‰h¯¢¾ÙTu|ƒ —VwGÿÔ‘¸Çh›–TæÐa™¦€r…Zy¯@•‹sy”Šxš]‰•bœµZ§pLz‡n€Œcg„Lt¯e•¸Y–Á`x¦5™¸I†œ_¬O±ú“s±W p‘²…°t}ˆ@™fŸfŒ®t„ªLs€tE„£TbŠC‰dÎÀyuŠC“¡U¢´Lw¡E•°u—¨Y¡ÆM^nEuŒjœ®r®É„ºnOn1\Ao‘F™žsk‹ju…N‚¡J}‰H´€v˜f±È–Öÿ–¬Áf «i¤ÊgyUcy;dFo†Q•³[„µRsŸJWs=mT—¬}ªÅ‹z [j’S›µºÃðµp¢i’´t”¸ax•j¿ÔŽÃÙ‘¤Èž·×wŸ´k’½–Øò¨œËcz”Kwžda‰b©ÂMƒ¨=XtMƒ£V‡ NbzJyœ`¯gª¾Wn‚Vƒ—_“šV…“H\oŽŒt”£[˜In|<Zk6WLKqaX‰ŒaŠu³´„²¸{Ô¹í·ewˆbŽª ©Ú¿ïÿ·Úþ“»Ô¶ðòÊàó§ÿÈ–¥º¨©°Åiz£{ˆ§”¢Ö©ò즷µv†¤fЍe‰—s¨¹¡Ïé}¨´W~q¾¼b†§MŠ£]˜g„f”œ\‡ŠKo“k¥Äm»~™Í“Ê’ž½y|›J[ƒ\¨ZpOp˜bˆ¨r‡«lw¢ij’[z‘Uz–QmŠWp{޼|¡Â^|£Q|›Vz•Ys‹d_nESzG\lLojHfrEmV}‡D[˜^Gw`MW<PW+bb1jt5ev=\{MeeWclDU~K^tKZfCPa<L\6Oh5Wc2dh+\{;VzLjgD_p6jt@v9sŒQd‚cR{aQtXNtOhgLXpDPnDTc/Gm9SYLKj9]lIzm>ˆŠB}’Vr’cr~_kGy^„™]¶žQÿ¬bÿ¨]ÿjNÿr'TNhp8gy7ˆuBœT¦xb›o_Wg>j€2`p9jk?Šw5†—Q{ŸXl l‡{Tr„?nO}L ŽJ›©X¡j––cˆg`©m…zqjˆ9UsCs^B`…Ak‚ep“AT•w€lZŠMžªj—¬CW«itQã=·Û¯Šâªo´€d‘ox‚DŸ‰Ef³r‘nlgŽPos`a‚FU†<‰s0n’J…I|sD‹‰=Œ…P‚ [‰¢}g¢rl}G‡-u¹lv}F]z4Rt7<h+IdIWZ1‡dFf“\ˆO‚¥Jaš\¤tY©ÅbÉÔ~ë‹b¥PM‚5ÔvMFèm-QW:G$g`j{8a‡Ixm>±‘’ÎMz‘P‘vFpšT˜ˆQǸW¸¾£ÀäÁ‰ÞÒu°Qv†šy3޹yO£_™cG`¥T7blO>=hdn“c´¿[m¿œa]Nwv6ibWN"]…'P„;ju=_Ž5[y8yRgwSs{(“~3w“T‚}Xs•@DŠfXj0XxQ_p>ä†9Òÿƒ´î¤i¯AsGXR8]_8ce7lh:Z|'_´=kiL„?g|dg„?dJ3tn,‰{Hq‘ªeƒ^xR«ª^s·‘SW2X]0•‰M{Û…m‡AÚ”cx圙i—òTűMÎ骟õØ^˜G†ŠC‘¿T±ÑGŒßކ‹‚¿¡P¤µGjÍgKp0„d6tŽ[ˆ®„lšZdiD’Æ^‚Ïjuªfƒ©smª<„’2 •BÛ•xnr IWg+ztDdlJˆ:ž¿Po‡J„ª``^‡T‰6l€LgYj„•]š¿zcœMhn;jl:ch.’¿\‰‡IËÛKÅ©¤¤]˜y˜p¤l¡¡fƒ™Aa½MÀÄU°·|ž¸y•ÈKp‚=Zt1i}4`t0tƒKtPlƒS¸¯v`As~Mf–Sw€Xs’SGj<_z:|˜g‚ŠCe‹FevŠ‚–hx£1™sµtlšB•»In§pVp3Qt.CmHypM}ŠUˆc½´_ ½k¢ÇWQ~—Vk=ayLcz8iH‚ªY`}>š–M¥ª^¤©`rˆZ‰‡M„»e‚ƒN~‡q›³\{£_Œ–~vQ’ P‹–Pš¬Th—AfnA–«±Éh|±?p’Qwb„«SWj;vµp€€o”r‡£ucgˆ¡mmIt’ac†Y”›ÁÎh€˜V•žc–±k‰œY…§MeuD•¨Sy’>jŠf±Òd¥Ý?g…S`yVryUªÂ|áÿz“Ê\`‚I€—b®ÕŒˆ¦|¢haŒ9eyD ªXžÄao?b}Aw‘g…”ZŸRr‰aZy]†¡€Žµƒ‹®x}¤t} U`E˜§[e‹Lx‘_„¦czžsr“N‹«h¨lp›edO]}Te q˜UnMh‡VpšSœm‚¯tÂÝvƒ¬fˆ³ps•j—´{¹ä—ªàVx™_¬Ñ|»æ‡¡Ìm´ã‘} G™¤X€ªW„¼ìux _hpS€}SspL„…Y‰¢R}XŸm•²~Åe½I N{€LsjW§•j ³pŠš}Š¥™¥Ï¬P`zC]‡j†³ŽÄ® Ó…ƒ””µ¢ŸÄ¢ÌÒ‘¨Êi}šfx™]g”V×ã°œ¼Œ¼i†j˜¼q€ u¦º¡Ë銜»y˜ºŠ Át°Ðs•µaz”k¡±}¸¿o‡¤S‚«m…¥[}§o™Ã„¼|˜¿dc‰AWƒf€©Yp’Xn“hºm|ª^w’Xu•M\|NyˆEc‡Sm‡v¿z Ék”²[ƒœNp•]u•]ygGmJq€VœsHnŠIlw]d|Q`zVO|QJdIcb5bz5ezRcsPAPbPJ\p-\sEkgGXn4LoCO^BQc2_k6_r5L†@VmQb_>fp9qr?t€>bTdxZ^KiuUOzYYmWRf7KnHOe?M_,V]9jd.|…>iŽI€ˆV“ŽO‘q kg·l|‹^Š—R¶©Qÿ™Zÿ«Yÿ|uÿk,´WHp;ƒ…ML–¹dmu\†rqnSt…>‚‹Ht„Hy|G|ˆ:ŒNf€PŠwVƒ”M‹‡Sr‹[‰K€—Jj™nƒva¢–ed¾zt|h§AoŒGm`Q`r8]h1`vK’r7Ϧa¯²`œ¡nx¨mµ“N¬¿ƒ»fw²b¡€Œ¤€¬p“±t‰·Nh•moƒ_´ƒKs”=„ƒ[d˜EcˆWy3—>›š`±·q¤É_²™d–«^Ÿ]q¾wL‡Rƒp<\œ†^{fd€?€y.YœARi)IV#`+Ê¡FgâxmtT£ˆEà¹zÁý~×ëžÅü™¡ãƒ‘¸f~¡H,›hSE&o"„6š@¢¼c®¦W}¯Sª•oŒ›Pm™g‰Vs‹;s•]c‹g¦‰CÂˬ‰ç—¨°bgÀF”uV‰Ýž^ŒTbq4t}3£-}›Up¬/`šXS‘@Ap2‰S$XªmX…/‡€5“D¦°l†¿’e–_Kq=vR0kuC…•?b…Dt’RvmJb`Yj-„mDlÀNÿ“FäÿöØå¸^¿Ž6qP/V#y?Ë`cµlŠy2]´sfz-_rI˜ŒDw›T¢©FÄ«UwtT^‹Soe2ž|H€šJ˜»r‹©^QtK{i8¶¯„¦ý{ŸÀRª ©³Ú‚šÉž«è~W€€si˜O{œ;uQ{ɘt«]pˆ7’RjœudŒV`€A®p4`”„e`|e‰VƒN4i•R™‘Ta¦=Šle£“jWºÙº¶Ï³³¨_–Ê‚ÍÄQÏG‹w1ák~Òž¡w;…WšU¢cáèe…·~ŠS–®;‰ŸG‘‡dbˆSa|9Fv7AB1]Ug|Gn‹T~˜Vk”Za€:^oE¬¶mœ¯}q³lWAVvA‹Ò‘®qz“>nÀLo¥I‡˜Mޱi|—K[p/ž™…{€CuE•nxŒG|˜j’rU½¹Mzª]y]ˆ°mhz.s“{‚§\j}Tp™qÍÔd¶Ð\—VUl/js5^h+eš%|¤NwŒ^’še¼Ó‘¦·ox—5uCnƒW~y7¤ŸNªŒW–L«½\°˜Wž™s{Lyˆ@…Ÿ\z²Ov~E‘šA“·T•Ђz¥f“½f‡—m¦©l®³t“²U|‚I«bš¸o½t{˜e„«En–bp˜=n˜RmEA^/p‚F¹iŠ´Ju³X_yMk…Zp•fx›b¤§{Øó]„œfŽu€‰zŠ•TxP†£z“ºe¥ºXщÿÿϾÊzwI…¨AuxÈÚÕ¯Õ™Jm@d‡Vc|[_…Md{H¥Ïk‚“U±ˆÖìg†xo‚r»²Ž•¾itšEƒJc|<s’cvšRx›Z~¡WŠžAq†R_[®Pq–Wqˆie‹Vyƒ]muºÕŸÑú‰Úhs¤I`™VZ„Y¨Ë’ÃæVEoBq”l Ä£´Ô}Œª_¨Ìy†®p’¹‘¼ó²°ßsx’_„´™y¨†µÛ™Âò©ªÕn|¹b«Ð‰ªÛ‹®ß}„¤KkaQ™šTž_§Ã‡’µr{šqЍvŠ®y™Ç“ Îm—·k¤Îe™±z«Áƒv’fw›c€³—xš}zœoµTu›Yu›]jŠm‹®€¾×mˆ¡i‡š„–®‹—°UlD`Lsœb”|¤°Ž±¢Že‘šW‘Ÿix€£•ŸÑ©Ô튬ŀ°×‹µØÇl™¹|¤¿¯Øx¯j…«f„¢R iˆ½ˆ–ѳÎi‚©Nk“P^†_˜”Ut’l¤´n•°Yvšbv¦Nd…Q€—EhDgŽp˜¼|ªi„©aˆžOf\uŸ\rc2x€8i†\{€b`„P\p_OkKh]Jh}@d{Pr~GmƒHm†akqWG‚ZY\F]g)bjBwk<Vx?WmLf`@ts7cŽI€yIQ”P\m\ke1gŠ=gzOe…EL€JbgLXCJpQPZOpbSX‚;QvPZi:oy1w~7xŒEe’P[|WqrSvƒ6“„a“©u‚µ•–˜w§Z´¹sÿnÿFÿ‚wÿe7¼X;yf5…KˆŒYŠ•m¨‚†”mŠ—Q…«U‡–^ƒW…ƒNz£N•WrU•‚OjF‡ˆTœ„Uˆ¦az~’lŒ‘Sœ°[˜°q£œ{“¸X…“fw€aŒ€Hš†O†Ÿa¥ƒO™°hªžqǦx}ª~w‚\vRœ˜i¦«o³»vsŸ]™QœËoxµvJyzz5Ÿ›8‹’Oj®sd”MlM‘†5••KºŸXw¬{¢dšc‡•bx£^’œj]¸X”CT}2’x5zÃI™ŸJ^µsUnAhK&fg<cv:Gv‹[aDXxCgal‘i‡˜{O““Hgf~jQZˆhSz>Œt!K¢X`\5wX2øEÅç\šÛƒpˆejxFj…N©ˆ=‹ØZ|•q{–H½¥W—Û¸º‹Ó{‚®|®§Bÿß=±ÿÊ‹ÓX†–_§”L±Ûƒl jZ“Yq0_{?Rm'¨w+ˆÆ?t¥M[£¼–‰¼Q~RXJ<M|5’a/—©N€—uiUo{;b‡K[€HZz&ƒ|AY€=Ny–bhcey-Ê·7}ùgE*n‡-rV”Ak¥bct>]}-vxEq‹ªÊy¨~z|K9Vjc"‹q6œ¥T¨ÎYp²VUzO‰rAo—q¶[Ìð¦}ÃË•“¡ÓœŸþŒ>^3Vff~Hm‡REdPŸm;Ù»snÿhTƒ<`x-€,´éˆŽÒ€Oe@©~;›³kfIž7ì3zÃO^jNon1¢¨M—Ç`|±µ°†Ï¿•¨óŸ°°³”ñ¾È¸¦‰¾yBzÓyž˜Óé»´¿³±³SÖ£M¬Å|³–Ds°\p™cdˆ9\Š8d^,el7£6ЧdŒ¡dV†Ay‰6¬µ@–ŠEjez€[…¯‡”»Œo¬UqqX“–W›ƒf¡cXxK[y<Z~GWv6—f‹Dibj‘‰U¥Âi}N’¦n ”`“¤oœ?Ktbr;†‘Qh›4…AS‚J׌¶ Ê¥sšP¾¼aޝX‹ŸCÎÕ™†¹rÌpEg9 ‰p›jX>t|p”˜WͪW§ŽC‚xD¡³X怤§o¬uZ{qBê±U¥ŒkŒ™j±I’·_¨–]}»d‡·h„™Xj H»Ñx©ì’pŠDPI_h`d…bb„Mš™j{ˆNv”U•Ë=~“F‘S†NiRzŽp‚©k†¡G„ŒLdŽ^msLuv¨Õ…Ú¢žÅizŸDhvL£sš§\‘Vˆ¢}¿ÍwšË„˜µŠ¡°”ÝÂtz |JhE`ng¨k‡¬Zz¢He”OfRœp§Xs’]”´{¥¼ehž(xƒ7™˜lo—fx¨R_xC_zCz›€uœsu‘T}Œdo‘IjzBgxEw‚Uœ±kž²alDvœS}®Tdˆg_Œec‘an’f‡ª^x¡exÜävg‚FUsr†§±³ç•s˜DŒ³lq™]†±ˆ´ët“‰c<\ƒDp gv˜—НœÄ…·Ð„œÄœƒ¢|t—eŽp† Y²¿Š»ì‰¥Úu\}g’^p’i]†flŽž´}ƒ¤n‘¯…‰®dxt€™]…¦‰Ž³x•XZeuŒjy¥]cŒMW}Mi”v޾}’³PVsKbnW`TaŽFhŠNs–h¹¿„›kq£p”Àc¡´g¯·k™Áoœ»’ɽÍñŽÁ}˜Ù±Úõ˜ Ë€•©o|¥x…²–±jmœ`j‡Spl~¨‚¥¶|”¸yµc€™ZЧlƒ¡Xp–p‰¨cx–Yp£lÀi†®^¦T˜¯R`‡fx™\xŒ_x™a|“Kd|Tv‘XmX0|v:k€NY†`WsVhjIjpEyJz’SqŒhgŠ`f|Tb{bWn_Iq\R[Dn]-o~:a~APLOfPWd8qg4L‹EWl]RuFwcTx„2Z‘XbrVkpA`wBZmI_{EclEmZ=lx?U{E_gX]xAVr>jo;i|IqzNg‡NoF_‚>juOwx@t’k€j‰˜YÓsÿ\ÿw4ÿ…Sÿh?òX5yS0]|<xuR‘~U¼iš³c•³k‡¼zŒ¤a‰ªgx—^p”]ˆ‰On¨dqŒg|ƒ@}‘R‰†H—¦`}À›€vœ‡M°¦W{Æwd£tƒ„\„•qo£ok’ZŒƒB›ŸX€¾[y—r•`‚£gr”pb†flQdŠR‚}H™§g”R¿¡TvÕt}’ib¡``2t|,£C£Õ~g½csQgIn}G‹vN dˆP ŸC—±l“´\‚´p™¯‘ƒÀ€bCŽyEZºvljP€|^w¢\dMNe=>n*DO4P`+<L8dI*U€!5k*QJ%‚k ¨6n XgŸ7]‡9……M’£F®´mq¡t’u{ˆ|½ÀTºèf}ÅR‘’L|°edI{~B“º`y§‚jˆf®ƒ[žÑb¡µx·Ç´µå¼[Æ©\ƒ@±E°×{Ϙ…ƒQ«”0£Ù\|¹j‹¢V‹’w˜˜My´{‡L®™fx•y°žE~ÁJ9]1\*g”`e„H_ 6TrM‡r,k¢IRd#`e%y³%ŠÄ-¢qX¥Ù…N³„Vk?c`Gphaƒz8] vVe=„xP_ˆVhp/|ŠMyº€ÕŒ9—•4s¹B¨wD—šu±¬~sÒ®_~<¯ƒ5{vcšÈV’u[1Çj,7•@)˜·–9k8Oeen*i{4d•b†5—Àt¸vÿ3ÿÿ€ŽÚŠYC0ùƒkƒ«qÿiz¹ˆÉ—¬Y}mG‚jb[aT„i1t?efOPWqFga Q:dL0„šosŽHZ|8b¡Gж+Çÿn»Ún¢È“”Xe¦U„‘GwŒVw¢in¶~x‚:§†]‚¯GžœNvW–~xÌœ´§Þo~‘P`o6y7V}x”‹Fx``n3~…\z‘]Hm?~ž<…í}Ti+]›\Bv:X|.Uq7Sb'qvAlŽGYv8pU>Áo¤‚dŸºY¬^v‹KqÚyv¤OkxB±³ri|FX¨EZƒ?\›HX}s\y<j|N~€hr™NŽxWe:l¥bx„=„®Ip…;yX¸°Vt·Mˆ•{àð†´ÿm³¹b„Úˆgnj¸ŸjŸµOtˆ¤^š]uŒ\x¬iŽÃ—v‚>†zv°Zz²k™©p—©^}x@ƒ¤0–¬HXh:Rl,sB‰šU]‹IuwoššÔòx˜Ée„¢Yˆ‘hvd}˜{˜žRˆ¯Gg{=b}C¤µ€\¬Rµº†“¯oz¿E‘²|mˆÃi|–k³‡‰»ˆxh„²O“€t±ÃK´Ì\j 6fjVÆZªÍhr IEX7†‡xÔU™ÊZ‚¬s‡¥t’±‡gŽcrš]l‹^u’euEwŠ\d‰RqŽstœMj‚Tc€9gy9g†N™´cq•g±o‚¬e¥Ïx±ÂYa~HJrE]{EJ€/:RB_tGlŒUš¿Š¯ÝUn—CVzn¯Ð¸£ßGl^²cÈêùÿÿ´‡¬?Va8[{=aˆCGhPƒªh‘´‹³Ø…o—c£w—¼]¬m˜¬w”Ÿ…œ€z¥`hWnb”²L|‹Gd{Tl\}¡q^‡ZmoMdW—a||}©s‰¯j¥ÌSk‹c‘Âg‡¡T_ƒM„¨Xu¥`~«bªCh„IcƒLs›`†—I\ƒVg’z€Zt–w¦Çx–»‚§·p®´‡·È¡¼›¸â¥¥Å˜ÉïÀÎâ––¾Œ’¥Wp™c~®Œ£Óq‘µWv“Ns‡Z_€i~‘cpk€¬bh–e‡¡hz•[v’]oP[€Lax²rx˜l¼{¬Ük‡§Vj‰ZnƒQo‰Vn„HeLf„Wnj3}tGdRQ„dMjSRdAmb8p‡Bu—pz˜}g qUŠkJu`]ZKRoCnjD‘j7pšDuoWV…TWfJjk<S|?BhB[^Mou1}>_šFLnG]Tb_6ot5oJXzT`[Nd]0Ur?R^JaQ@Pk3Ml@R^5Tm8sb<|Go„Lt“HhIm…=q‚L‹Qƒ›Zÿ”[ÿšPÿh0ÿ|6ÿkBÿb2jT-fp<i€Dz‰C‹WŽ’W ¯r‘µs›£hˆ·ƒP¥~Wna‰jKŽ¢X|¥zz—Us…Wwa’\gœ…xys©ŽC©¥P§Àˆ•Ï”€¦etœ_oŽsŒQ—™^¦ÁcoÕ‘ž‚~½^t–reaj…GRƒDSe>Ua=žv=Ͷ@Îû„¥Üt´‰mXz’9u§<Q†Wcq`V|X_tR‘z8“®[ƒ¦Mš£c´gŠ—y£½x˜Ågª¥f¨½{‡¸}c©vi|HŒB¢P~»d’•WwœR_Fƒu.—Gk’>^{:Ž{1`¡J€p;œ–=§Y¯JÏÖÇb‰öa¤C·tHx°`‰–Q¶¦6¬ëb·Ê‚¦îŠlÄ¢YuTzQ\|<d|`dƒ4M}VVlKf‚-¸€SeÌœ2b§ab–CnŠ(”v3Ë®kmùqªŠ]Ètp©s‘šVp—Vk{Kcw=S‚NmmKŽ‹W©¡ˆÍ”^vÅ j„DŒ4pˆNK{NLn;\o5trDcp;XpDHj(ÿ”5eÿÏuL^I“‘`4ªˆYPfz>_‰3‰^+_ŠIr7ƒv]x‰QvqC˜s=†|b³¾xªÖŒS¢Rvilf‘i„MŠ£5æ›z{ÿo}—TŒ„8£Ã[—ÊvšÌ>u´]H8JPy^'H¡Igs.VpN’¥pQ‚tr}MÇ¡f¡¹²:©©RhÁ•„i2W1ljgÿÞIˆ¡¢”k.q•\`y:VNFÅE޽M°ÜNÆ 6£³PÌAÐüˆèj©ÃkÁ‘X‚ŠaKVLP6dp1¼gÛÿʃÌs°Å—ƒšA²†I‰›yÿæ–®á¸uÅrt‰Ev†e‰r˜”Ky“SŽ‘9€›fÍ’‚Œ›Zd£C^€7{…-z¬wLxRhm9a™[p”A\n+Uv9bs0bƒKgp.·µ~ÝÛq£ä‘”ÔcÇÈ`yže«¯Cq‰gd’R|oSq`_wÃU[l)v’CjPjŽEV{0u|Ea€IhƒV~sDnŠ)\p7v TLŠ>„^a•2`„Jbw@n£q‘œ€“Èš¾¹‘š“ÆÒ}§¾iœÆq’jƒ·O޽P|‹Qx–UVF‡esŠG‡¡]Œ´J‚¶O£Ëhu‰Foš[–™i^t=n@–swŽUt¤>r‹Om’Ay–jsr€X ai‰M O›³u’·jgB{’K’¸zƒ–O…“w¯ÑhÃ×w¬|¡¹iq´Do”Sx•fu‹hg„Ls‹aZyZªƒ¸†²EŽ¡\¨Ñ†Ž¦}w”D„¢>{f¦Ùáÿ™ƒ9e‰E¥±Tk†Dm¤JSqA`„R|Uu‡BgŒJ”Xr”=_q<gwS`tJjˆesv\|£^¢¦•·Þ’¸â’«·me›Aƒ¦:g‡@k‡BTw-Z|M‰•Upˆp±Ð˜¯TÇÒ|êÿÂÃÿ€’¿pÁèl¢Ã¶Íð¾Gl—AlMsBcyE_ƒN`es—„~h³É˜›µ³Ïp„¢gi\izTq”Yœ_¨riŠ[DfFY~BTtZ‚œƒ¢¿_£Ìi—·Sr•W\\_Š_Vzlg†d·€„ªvœf|\pœl«Re“`ƒZl“HKlZ’·cYrDgGfcl‡Oc†wŒ¯x¢m~“m•¥uo‹ª‚¯¡¯¾«¯Õ¯ªÎ{x¡pƒµg›Îƒ—¼† Ê”¡Às”¶fx—Jb|Md}UkŽu‹µf…´n“¼\dˆYq“Kd”NjOW{cn`€žtŒ½…•Õ‚˜ÀY€‘S‰ˆ\“Op‰Lv”NfŠZsn:‚nHaˆNV†dXdPImBeX7vm:~Š[~›w]¡€hvfxU„|Eu©Ed˜Zb‚S:€Q\O[FtJWVOR_:4jLPMEsc6|–5o¥af–q]g_iEYtBda@jtOHlOURF_Z-`i7cl9af;Ri>dm:y;y›@s˜Kp†V{Xz§Xo˜]n†SaxCjtG~|FÿPÿ Sÿe5ÿo(ÿe8ÿa2R0€|F‡F¢V{£azXMcªtw‚leŠoEƒn>]VcO=tc:s”ZgœrgƒUyyTqˆQo‡\•‰LšÂQh±d}ƒh…‘_€’h dlŸf|}I{™l§˜fÄÆu¼ôqñ i‰qLGNIdFsb?”•8x·PÚ•Nÿª™µ—m£¡U°@mÔ‡OŒƒwh=X¦Hk}Ig˜@eˆN’ˆGh¹Y^{WªvQ¸[¡Áh~¹sj“g^‡XlyMnEƒ=Ž©Dgžvo„g~ŠV‰aÁÁX¸ÓyiƃMpoPg9|v1‡*¦ˆ?¼ŠZm¬]Œ˜v¿¹OŽÒ‘X‡`‚p4Û®R ü¡¦©w¼Ð~“꤮¶Œ›Únšc=‡9VW/ku/r—'•oUšËyn®r[„KrG”œd“¼š†ÉR€ž:œ¡C~¡„—šÂ¢m©Ò•Y²—eo=l—^‰œ7ª‹\ZÆV[Q.Љ=z¼atU’§fŸÔL“t•Bg˜Af…4t›=‹“\œ‹PŽ“l^¥T}…*k¾žnIDiO\JRzx7Pf)•S-]œ[»f+´ÞWÀÆy¥× Y¼o_x5DyBzd=£¥c°¼§dŒpDsI'A2j7%XŽNs6x“bƒEƆu²é ¡Ç{¼Í¹óϪšÿ²E{9tp%©PP·Gxr9ver™J_&‡HÚK²Ç}lí `Åý“Óÿq·î{Á ‰ÚكĔ^ƒÓs\…iØlÿÿÚåÔ§ÈÓ›Ÿã{¦çhŒ¼“›¶“¥»†‚¹gQxReŠXB\ 0]$`]&€O¡Œ”k¦mz|`ƒ‡Mp£RqÔ\À¬‹…v_¨@Vq5‹‰‡’œa}›M¶çzg¼NFkFN_2dŠS\YQ]n8q~Hgp=\zEdj6hŸUœ˜[Ty1`f8kq`mySwu.}e«š£Ÿžj¶®¨Þÿˆ‚¡CiŠ_‘¢Mz~F†º@ŽYŽ«ˆ‘ºg‹“dn™:\[M™a¾Åsn¹pUuB|pEe|=[y1‹ai¢U`xF|‰pM#dc*Y€At…Dc p~ Vr•@߸¤¥Áµ«Ë¡‘µFŽ—f¦Ç~`•D‚ hX‚B|f=dƒb€«wn’l¥ÏuŸÒo°v‰¤amŸZ–©d™³^p–@t’L©]dJm›Q`€A‚H©ae}VaFzŠ[~l›¯of‹<‘Y~ŽL†ŸE…‘[¡¬v„er’N|¤]œÁk¢ÝQšÌP[Š@s–Nf„1Jh1‚‹wÀj†±p‹wk¡X‡”HƒœV³Ëow®Stžd…¦•\€U–¤O¥Ékk†iŽ¢}„“YÞú_€›MaSdsL‚~G•ChwJ_uBXsJb‹;l„S~”Fi”c¶Ùžx¨db{WUxKœ®‰”¶T—·XT~AšI_zKª—kŒ¿„‹À`€˜n—ž—Âí±Äâ«”»–†wŸfn‡U޹K}«Qc„1Zy;_Š?b‡=UrNiw`m™y‹€‹ªesi‰IZ{Hv©bfPY…NaF`H|žTzŸ`™«|¤¸…Éþ™Êvd†76J5[jRfzJmƒ[oŽqn‹ZTkSj|JF^Q_Kj‡Mk˜Z«Rušo³lŒ¡[E[|Nf„FeŽg»o‚«^wšauŒMG`Oug‰ž…Ÿ´ŸÌ˜²Õz©ÁÎ’«Ò•’¨~—¯Œ£®{¢½m™½c¢Z†¡d{ mz¨p„¬oqMk‘_|²eˆ Wk”]w›^z“f’o£pƒ´rœ^u•]pˆbƒ“XjŒQfˆKg~Ux]=t?iˆUVdSgP@a>JZ9U[2hl?mzXX…qc€n|mPƒG€®dZ©zQqdOiGLfF<l==M;<P*DS3bQ:zs4m–EX”i\p^^mOjtG^…J[pSPyAAe8OW2\^!jr0}€;dˆNftSno>ƒ„=„œWf¦onsmztHr—OjqŒX\Gq„H|w;ÿt>ÿ Nÿe7ÿg#ÿh1ÿf.‚J/s|@xqH‰ˆSe_v€Wu‡;l”hk|Zi~QH~R:[KRQ5|S*u‘Eršp‚žck”Wƒ…^ˆ’L‹¦M‚±g[¤vfg]vx5†ŽMX³]JriƒeDx“Wt‹j¦’g˜Ç€Zɱa„xzy=SW€u?œŒ.©»^˜Æƒ—Ãy¥»}€¿Œƒ¥f©G¤Êe„Äžr±˜œ–HŽÌksÁz~škŸVˆ›Y”£hyn¨z7›j¤žW‰§b|[eŸ\?wVXa.¦n:›ÆPš¾zO¸Wk[?lv8u\¾©qsÞ’[€pqb2ê:¯ÿqŠ´ƒS«RxqO®ˆG[ÈZŽjzp§IvŽ[èD‘ö¨w‹|\ ‹y©´‚«Öty±|;‚\_V.€r2c’:nf-‰m5Ês¬·p‚ˆF‹H‰žov~€nŒ]®‹JŠÒR—½U³U¿’[’Ðl…³W^aqˆ9¸|[iSdj;r0j•Cª¨D¢Ã“ÈÜe·Ú{¹m”ŽEŽœQšÂj}½‹šmYw™an¡Xjˆ5ZœOGlGIX@re+XlD@9(J<{ubò˜H¬Æ§mEÿêwìã^²ËAt³Nc§@„i‹OqN¾”M„×3A†pF1cb@…~Mb˜Hœ¦F“¢–›¥ŠkÌrƒdBk£rˆšGëž-YŸ‡@fXdr'zƒ<•²GaÂvyŒ%mbE™¢zk–º£Zªñ°ÿõŲÿÅÿÕ…“ê’¼s†º°_îßhßÿù‚Ӧ̊bŸÌfK•xwD·Ô`í¹áŸq™U‡^[lQ“5{†7o™R’—mg¿osƒL‚§jv©\yºn}‹0u’;jŸQg~+—‘C_=Udt¨•RpÛEH_/id)]ƒ3€}Fd©YmLfoHRKf_'}]u~Pi“:s4z°Zt…6f“@ªŽC•„`MŽO•uVäñÔ±þ±lz[”ž]ƒ™y¶j~Å1µœ‰ž¡wpŠBy‹aÊHm¢`tw¶ÃŽ£ÝKzt?ev]ajN¢™ZÄè|i«KfdDW`hu…O^Œ@sw?g»GšÄki¡Fz¤c„]Yxj‚^nŒNieuHW˜U\x<j„?nŽCuThzCƒ“Mb€MT‡;Ipz;oŽEY}C~‹Fx”[‘›x`ž>`k8m„:rŒW•©„|ŽR`{4¼¨i™g‘µZ©M–ÆlzesŠWt‰S`†[m|Sp—fRtZpŠ}¨Â‰wÂPh~Gr‰X°©©Óimix…X–¦h«¶‚£Äa•Fl•j¢²“âÿœ¿þlsFn‘?mƒK€¤jj‹=Ž´_®°•ÿÿý£ÌCž›;“E’€b”‡]šTJh8Tl`¦À‡}©Rvšp¦·}ºÓˆªÔ]Y€Og5_ƒcfoKoIbOšÀz§ÕHˆ´lÁï¨Úÿ™¤Êg’ªkŒƒŒ¬y‘–ZpL·ÚyØübªàrªä]išA”»xíÿ›ÎìXBV|Igck’vm„OН’ž´kšº]¡Æˆ‘µK}¤M|šm‘¸„ŸÁx…®gw¦xŠÁ„£ÊiSwQc„6d|8W€:IhGQzau’Yk’IOf?XrCWp;QwGQv>hŽPtž\p•jpŽiy¡^KaEgFoŠTt n–Êz¯b›Y€˜8Vf8hy]—²m‰ p…ªƒœ»v”½´|‹®ƒ…”gv‘pˆ£es™ch”`mŸ~¬|‡¦qžcv–Vi‹Mgx‚²z†§W\‘ku¦elšixœc}™o„¨ag˜\xœVx`o^m‡^Ro…T]lGymBouVA}[JZI?\39\8BP.EO2eL6nqEU‰c{hV‚šB|²hc–shkfstBZŠG^xRY{;Vy=M9hc:f€6o€PgodQjSRm8Sf4So@HlFHhDKg7I\(JY'^a4jx7YŠOU}Qhb>jr8hjHJubfXY‚r/y’Io„^kvKp€B{Š[|}AÿtAÿ‰?ÿg1ÿg%ÿj+ÿ]-sH+nr8zq4aŠJgTy†D“‰PlgnvbLvARhQ_mDms@oz;z‡Bx’fd¥id‡du€ZyŠF_MXfZNbHwpB‚|1t–Fyœ_e]ckApx?M’[`qT{@x¸Š_Ÿ„}€Ju¤Oj“Ss‹7Y—^‡ƒh‹ºo©{…œzµf‹¢e„¬dv¨‹w§}•OšÅ}„½š™ªšgu„V•”N˜¬W¶[}œl’ŒOˆ–ií±^Ùÿ–{ï[‰^xp6¨¢e–Ë¢¤¼”Á`z¤WŠ•>³«e¾Î Þ¥džfž‘C´¾ˆ‹Ï¤n‡ž‚| S`~Dcs:yv@_}\‹‡Al o…‚M’–Rh¯dTT‚zG€£eYWzn:ž‹8r€PAiD?@)E5Ÿj¶šhÇžeaªo‰‹3’šU•®M€Ãu‘ F™«WÔ¼c^å¡„uay·U„}Lm°A“”Aмa‘YŒ¥I’ºL™•Vx¬[‹¡|~Êqu†CèVy¸]š¬JÊŒs¤ÿƒ„Ça|˜b™¯btËnœ2¾÷³š¸V¿œ6ýÿs©ÿqª¸G…鑌¶L¹¤R„¤Š¶ ‰f§g‹f6uÈW^hC|ZPпa”Ó¹~³µikCr{OwmKrŒGž¡Ig„RRx]NLb_s:zzAb ‰@<x``8FR7ia:O<IHHAó–jÉÿÞç缞±j•yRÿ±…ãôÊùÞ¢•ù¯ŠåÌÁ´‚“zÏΉ”Ömÿø“ˆ¼¦Å“°ábákiX+†·5¦½¦ÿÇwé±u~ž?‰¦`\ŒJl—adƒGʲV{ÐhQc&’l.ƒ¿h[¬zs}Bp*Ho/Ÿƒ5³Ácn|X“w4{¨sÚ¦¯h£O[^1Š…yƒÉ^g}7y{Hl¢B†\}o?³Ðp˜³ryY„¿Œ“·”Žjw«`£À|Åálu¿G·ÿp}جcŠqgg6ˆ·ˆ¥~j“p}yfÆÒg«ã`¦ºƒ¶ÆŸÄÀŸ‹ÐLbƒVw{G~ |‹ŒMxŸSix+›˜•ËëÞ¢Ó{v—9–±K«šn‡¶H¬Êˆb¥O˜ŽUƒGÚª[‡¹f¦§[z”;c|;n”Gy‹Kcˆ;d–5s‹IhˆLu“Cv‹=~§XŽ“WxÅ[\v<a@mˆ>T|.auE‚¬OVnVf©FWt8o’D_‹@£d`m–Nw³soŽN}¢ll:y‹Um’FXuIk‚9{ª;€–eTsGTq>Z‚=Ž´?]˜=^pDu†W™›zuw²Ãƒ’›h–¦dšˆˆ™‰†œGlŒH™°}Á§ÿÿ½š¢Oaƒ[ZyOŒsu•Y–§g„„ŸÔü°{•aµ g¯‚k’H•³WeQrŽ=`†A¡¹”£ÏyœÙe£’v›js Yk—h“¾HZ|Bh’Sw•es£fŒ‹Íÿ–ªÜ‚¬Õ³½Ùœ§Ç~šÀy{§Zta´à€®Ì~·ÒÄÓð¥£Åš·¦Ï{°ØšÚü¸f•ReMjŒ.Hr4Ec*RtA\‰‰°||ª{Yˆ„ŽÀŽš·t¢µwv£gVc€«Te˜iŒ»—¼az—Oz¤e‡°zˆ§nuŽVc`Rw_s—NVv;UtOw‡To˜U}¡AWzKh’RcOgz[iSf†V¦Xg”fˆµgtz‚¤`o’K]|=j„<jˆ]Œ¡h„œW^„Z^ˆdg”{¦¼kš]WfOw”]xIHrDh”Z‚»rr”ip‘bX{QO|H\€Se‡i]ƒ`j…Zojx›^v£p–fxœ_s˜Zd‰WyW|“RxŒ[hjŸ›Zv‘PPvEPeJW\BIbGO`K:W+9V5<M48M*J@(T].VhPkhZ†tAn¬_i“tfvXstE€ˆP˜lx©gw•\S“^SdOKg6W^D]c9X`<]q>_v2_v?N}@MhBJc2P_-`V%^m/ju9tK_ŽMh~NVnDR\AQX>dZ5oz,„ClRo}Sn†E†]®†Lÿ¥_ÿ…Mÿj*ÿjÿr0ÿc2†N-dh*\r2cmH]{Qjv@}Xc§jxvz~|B„”Mq™Nq]p„Mb„OVkZQxQlFwBs˜XHtNeS6iu0j}D€uEs•G†‘Xˆ§e~œjW…[Oq^^hHp„1ZŽfl}x“Y‚•d‚´cv¤c‡žFy—Vm™Jx†gi‚edˆ\Z†`‡€8‡¯fˆµ{…¶`€ptž†Ž•Œ —i½³bžõx…Ѻª{€¤kpŸb’[ªÕfœå¢aÆ®ƒ’b~ªC~£Ai–[BênµÌ„gÖ~V{pƒlSÆ“o`©ˆ[n8cqKqUÌ™puе—€MY Ss\8bv5zAtŸJy‡]¾€Sœ®w`§aKb5xo.„@·ˆYžkª„I””Rv>ƒx?¡r,ÊâWÄ×tƒ¶eZVog/TNocC†‡Y~¦p¦Pl¡€K}€]*f©_rCƒG{¤U”V^̺f¶ó¥Œ’‰“o¬¯†~Öªz±y”Ny»š—›e¬Áq“ºrm¥n_ˆIfi1bŠ|`Ž€§s‘¢¥yª¡ÿ殿ÿ˦ÿ¨»qdƒ^vo\¶±C›º—ɘOÚ÷ÔÃÿ¿šµx³ç£;–ÀdK)Va@|4qmD_iQ€Œ-\˜rŽ—&-²]„.'Z½‘\BZÚS‚{2†‹fŠPšªošN¬¡ƒÂÑ Ö÷¤ÉíξŒ{ÙòŠÏ’U|:ˆ§¹Ú[”÷ˆ¡P·™pvÿÐwŒ:a—lÝǸÿŸšFÿ¦b›Ru{\ª˜_¶ÌdÄão€ÔueU~™<½ÑL“àt_‚‹T[(t 1âˆ\~+Ve)›˜G¨ÓR{Ñd[h@kyM™¥Jv«|r‰=¡ƒˆf)Œ‰8§±{ƒ’7iâwa§\t›K„_I”Ù¦Sƒ‚auLa“[Z€>m Zr—8€G{žRv‡;“Ì“\xJmy>VxA`u.{‘9r—F½¥YÍÿâ‚°dŽ’uv†ošŒlo©VŒ½‚‚ƒBš´Tm‹Yr‘FIu2kŒ?’ª{Äó®ÌÕǕĨ¸n¢e¥´g~†B…yKra;rWr€Iƒ¡wH—D¦³Ij¢\w‘DÌ`›Îbq BXu9Wp8Un=ƒXˆ£s›ÊwŒšd^pJ\„-hzK†®jœÉIoš]\„;l‚Oz¬D{p˜¯‚¯Zi€1j“QauoŽ„£ÝZ~ RgAga{—RQs7W€2Zl1K`5pl¼AN{4`jGsŽC’™d‹¢c€Œgµ»g ¼É¹jr˜\mŠ=o“l¶¿›±àŸ®Æ}„«M€ŽD©fiVjL‚’ir”Q¼`¿ÇM{ˆN—T‚Xa‚Z•¶cy•^‡¬ ˜±ßöy½Ì²¾nk‡OlŠ_aƒEPi;€©^ršdy˜W[ub‡°y‡©stpfiV{Jƒ¡mÆòg›¹…šÒ„б}¶ÚÀÝîÿ‹‘¸‡•³Žw¡“zšRl™=ˆ–Vy¢G‹ÄDq’4a€<{”eƒ›ps˜gVY`~fLlDUob–®XŠ®wžÉV\…EH{`do…¡lƒªp~–[\~_{™WjW|¦]iŽA^u:UpFLfUazceyRc~9\nKYz<RjMqWx’f¢Pj“aeŽQd™v›¾LYp?lˆDb€Hi‰]s˜k€¥]ƒŸKc‚J[~t…\b}Nže›°`}‘DZƒK|³v™Ëk~œRdŒXp S{ N]‚[q™YgˆN^yN[vVkœdŸc^~hyŽNlXXmPs’R]|Vc„ox›j˜ŸYJe>=[N>Q8DN2AT4CS)BS1<L.DN,UN%Fn2N]BU_;uZ6\‚LQ€hPiN_]DzeDv—Uo•ju†c[„T^eTLd;S\=[]3_b1lt:mŒ=oŒW_TMoIG\7X_-\i#Rn0PbDcdDcEU†RVgC_]Bdj2pg2]†5\ƒMwq?_“Tg€JŒvGÇ‘AÿºtÿŒoÿe%ÿl#ÿz5ÿj<ìQ*p'V}Mi`?oxB[{A]l@jsM‘~[œ‡D…³`x kq”j|‰Wp˜kXul`jC‘p:—²H˜µˆŽ_„šRl’Mr‚Rƒ‹E„`†§_„¨ag‹rYŽayqDËŠ6ŒåoT®}QkZgk;nŽFUšRf]hŽEaˆY„~F{ Wp•Xp’KeHž…Ak½[‡Žnˆ·aw„Tkˆ…PŸ¨\‡Ô€§…‹ T·] ¥z¯a“²ry±x³¤tÉÔs–Àv®·mgŸ…]}Il…DuS•£‰…¤Œ_IcuE„y<P‹QQp)o[/mD‡Êe‹nc±Y·´c ¨XVi‡PjuWkU˜|YW€xQXNoh&z:ŒR|z\µA–«_s–P“n@€˜_c‚‚|^Sz{_jZ=M}=Pb/TU;ia$”`HX„Ra^=|s/u±1`}M`5`u;c|4—z;“ÀMz©±w¨Éy¿½n‰Ô~§ss•WGx€xypM…›ˆ‡“c£mhqt‘qP‚ Aq’KG’?tj}£^e‹=Ÿ‘I ×¢¹•¿ÃN¾d†§Lr¨`d]K–i;£ˆ£±Ý¶^¸ø²¦íyÃÕ}²ñšn›x¡T‰“.¦ÔEVvPrŽhZlh¥—~À.QD1’pH”ÄY‘¢T`eYÀI&šx~šwM‹}š–Š®£È§Ÿb´À®çÿ´€ÁZò›G]¶y“«`qšs¯¡(x¨‘_ˆBn|#‘Ò/ÿÎuj\ŠÀÄ—™GmÍ_omE“°¢w£h†‡®{V†™D¦˜oûΦ£X™±T†²vkø¥`S;nTNyw:†x;š¬wÄ·„—Õ…wœpY™KtfBds;ªpFÏ€g°–]à·[°vl‚B|ŒPr¬Uz–Bb¦Tc„9w‹D‰t‘¯x{yVpyBŠÿg[‡5|™xPd*gm3uo<|Ä9c—C’>¸Ø²ÖÀ‚Ü¥q—Vmt)¹´o|¢}o“uŒ‹Ws«_„£DnŒPml,zx6—œgË÷‘v˜`“·tÈÆ‚Æx›Î–‡ƒL¢•smM“®Z›cŒ¿rˆ¨i•G¤»}jaf|Rm‡€ºwv¢qttU`8[z7|R}Ÿa{™ZbgHY\.°ÊM|—kU¡F]r`¢P•Ÿ<h„Sx‘cr¬6ƒ’]¸_v”Lc†=am8z;tŒG|£r†Ÿr€¡NŽMrCU}9^sANp0JfC—PV‚Dv¦OfO{‚OWw7iŒB“|ˆ³w§Èl©NˆkÀÙ™³É¡ÄÔ¦¨Ïtž¹}¿²{–§\u`r‡>|ˆ[¢«]y†|´³Y–¦gžZ•±G†Ÿe®Û”p¨?cuW©¾™Þÿ›‰®{’¬Žs˜?ey@Op4Vs5u˜„•ÅZ}³Nc‰Yˆ®q|«Zx—Kš¹nl˜q„†¦ßÿ¦Èí¤—¿[WPW|k|•ŒÈñˆ‰°gl–Ht‘P^†>f’Jq§ZšÂ‘šÅ…‰ªLTvDdeEXgLp‚Er8VvAgˆKe†a€Ÿgt–£Èçj²Ky¬]޼lƒ·‡¶Ôo‡ªYšSXn=@iVr¯hy§MnŠIv‰Ib‡Ge}FZmH]tCUk@fˆ?f’LZsJ`…Le~NeZkr;Nvq¥¹OSmB\|BWƒHZMkŒm’±s†§Wv‘Df‹]€ˆD|¡c¡²{{¡b‚d›¯q‘Š§ã‘³ÀVjˆs¤·v‰®Xiz˜Âag~E\†@QrVzœatHQsK]Rkd–i”YeL]rN`{bvˆce‰\H`H9TH9M5<F)AJ&3Z/;K-DJ,DP/VT)=d6?OEDR%WM%W_/JzH<oNFK:`N-Vu;cqLskD]|DUdKLd;Q];a`8vg6i‚?aRYZWwXSkPNZ9Sh/Li0?\4AP8cO1^~.{EoœLpZmŽNpyE`‚>T‚UVs>M{@Ua@ˆb.Á…6ÿÿv_ÿd'ÿo#ÿˆ=ÿ{Pÿ[4N,V„]PfS]i9Rv;ol4Š8‡—C†„Gm£a‡ŒkŒ¥`z®yˆ˜‚{ƒlj„ZpuCd‹M…m–a¸l«{udpM~W„˜Nd±tDjTLZB c3Ä®:ôªLœ¡`RI”y%†ÀMj©ooU‚‡5c©Qm†Uv„Fj‰S…ŽMw«V¬[]©M^|fMpH9g`@Y>{\/‰ŽFY›kW„L€uOl’DuuN”’Spµ_`šlS€Wyv> šLn±‰¡c’šQmªW`…Nlo@‘†9m²yY‡_m{=¯~3k˜PmwBšqD‘e³„D{¢ž˜‰Hœ”š¡f£ k¥¯Y‹²h‹e™ŽEŒM…ŸO²–MsÉWgŠagŠ@y„>‰³Sh†X–t?r`]q8kw9Ž;ƱTšÄn™Ä7r©?ymD˜ŒKv©X“s=’Œ=n±wj€5¡‰AW¡M˜u0…ÕdjS†~S|K€´i¯au–lt \|‰I¤LXQ_b;j€6EpQZ`5´z'£DW~LY{V=v9m[À²LÐã›Ïò–Íõ•ŒÔ‹DzeXN1ei9…iIm’a‹y6“UpŠq£ {”‘b Žf¨ŠU€:—`:ÎäŸËÿ”Òó¿žÌ‰¬°RØÍ\Ôÿ£ºñÒmoD¸P¨ÔYmÁT—m>ɦF¬F™¸ˆ¤l—ÆU޳ƒ…™UÿÁÐÂÿ˜ÊÔ—¦_¼’ÇgÒÒNÏüœ³ÙÑŸ¶Vg¢l¤šb©óÖ‹Gf3²|KO8_ƒH|*‰x¾‡z¸TáÕlžõy‡BegL²“J^Ž|…AÃæ¨¨Åx¦d”“b–†LŸ€EŠw^}pYߊ[fxPmh6~J§”d•šY‘pM¯òŽ‚²pz”ZŠ\_xH’€^”¡|€:†rY™«S†¸~Œ‘By¨I˜¾ {›CUw:Oz0iy@œHt–Wa™J˜~^–´”ƒ„ra”{n a~|^›¼Q}†=§u?zrA~†>b‹@e_mœ_†=b¾\|“Y{•O™åš¤õ¸³¦–ZÃA››céÛ¥Åÿ冺€ˆ¦J‚™Wo”aŸ¦k’«x’Q|CJ–7‡šOv£SwŒKRl1gOe‚HPi1Ye>pŽ>«ÏkSz@|‹BO‡4On7amHi§[j‰<‚”fq«Gg„H’¨R›Feg;…z>r”\\€BcŠK¹¶i†•l—©j•½dQs=i9Tw.St4rn;Y|=y\r…E^~D´±N§È†Éµˆu¡\¶u‘³c´v˜ºŠ·i”Ã’·d‹ r‡d®d‰–p‡¬S”¬]¦§b¯žT§¶|£¾q|޶qq’vg€s·¿€u’Xzœ›‹Âj{•Vbˆcp‹S^u4[}2gŠ5b“\ް¡±Ýeµãqk…tzše‘c†¯pXŠLÊ«¿âœ¾Þz‰¯—Ãç^«Ö£Æ„¸q¯ÓœŽ±q¿p•Êo¤ÊuØ…¦Åkržq}¨l•·_…¦BkŠ<j`°ÅYh|NgŒ>FpOš¤b›´†šÏ¦ãü¹æµÝp…®”¯ÍŽûû„ƒšLiƒ?a…hƒ±mdbbŽRkŠPt‡WYvFNnFPsS_{KjŒO}¤htš[аWe{9K^7@T2OoYˆª[Sk8KnEf’^’ªKk‚f{˜gk–h{¦Z}¨e{”Oz˜^l“h}¦{ªÌv}m€¥†ˆººßódŠœmq›u—Sc‹yˆ°kv’Q‡¶Xl‰Zad‰•Ce|Gk‡ObŠlxœq…SZ~Se}NWtWmƒPc‡OZ^GBX><Z9BM5HJ*<\5AP6;U.5K*3C&+<)94-I="[R!^_,`{G[|MagK[b7Ok;^_Cnd7U}@HhHNV7YZ9h^:ox>oƒSXdElbH\LPX8[a6Dy>RaBDS3?Q1uI$_.hM—HY tbx^gvJv‚Gj›]Wˆ^ZuLQ`6c['Òh-ÿ^ÿiBÿf"ÿn"ÿŒ;ÿbÿfJC3bpCjlMT{8ko>‹u2 Gnš`™†Rl¥c¯~`¾Sh»±t}…nTpŠVV‡JUwV™zL¿œE¶êŽ‚ßoœsЇY†¤T¡˜R„³ƒ_bA]?KG,Áf-o䕜‘’œNƒ©F²ƒ€¼wa¨gZ}B_€DKyFke:ir=pIƒŸ?ž\cWE€Y_a1mŽ9;’<6X"HS#2UGhX(`‡9ivCl„=b˜@cZˆrn¯a^Œ=`‡=nRrxHz—:Ž£nŒÄa‚¸Yd²YmoUv“E §O µn‡ŽU}zGˆoD˜†IÚZŸé vn„šb›hµŒa£ŠZ}‡i‹gRŸeF ´^ÇVÄÞsåz}QOSƒqO«§[bæ}ivD ›gȼ½†Ñ©”â”—Ãj•¼‡Ã›~¿«\›Œ„¼~“šx®{h‡¶t¬š_‹àpk®\…“K¦ŠcžÃk†ªr ‘Dƒ§boªeuŒ\p£WªCa–\ŠgA]‘^e„Ctq4˜&ˆKŸ“:Q}USU,jh#`˜4wa‘¥¦u¢šÃs€tµmBrL>pxE³?§Õbª<vŸ]O™Fšk6n¢v•™e´¶‹¥ùq”ÊJ´ÜZËê ÕÚœšÌ•ð”À΃ÎÿË¥ÿ¬©š®ÅŒµïžq—K˜{ÿÿœ¢ÿ€‚á|›ÑS·Û´mk]nR{„0ÿ®[ŠÄ’Öu¡`£à}ŽË«–àärð¡f±££’a™Òu„Ú…ƒŠ=‚b)tÑ\ѯL´ÿ²È½L°ÿYˆœuֽޒÏV¯ž5’³nÕä{‚åZq¦X•ß–²Æo„Ö{¯`µ²oÁ–Hj?šuCï~KeM^s|P·_F…ž€Õ¹€¹ÜŠ™yv\u~Uy€”{Ž’r‚;Žq4ly7ÇI¶‚Àuz·j`šG޹‡x€d•™sžCs¯9e—BjŒLq„Lao-pƒll„<‹§C”ÌV´Ä¸–‚ŽJ‚¹H„’FkMi”.qIGNKp3Vp>dw6fj@wÃoƒ¶™LbXqwak~1ÅÊ›]”NfmG^CŒ¡W}µOnƒ]›©sq„ehvA†²V¡Kt¶qWd:Tk7dh7mƒ?©©—„¦@›»hl’<g@byCkSlrEUx1eGƒ’HTvSg}Xt‰Fšœh‚–NtP‘™LtÂX]…Fm9_~Y~ažbk}OªIQ|0^}3p‚GŸF”¸[Œ§uœ»d\{B£|qŒlr”efFcƒIµg^wVŒ¥Py K{¤Yh‚UˆQ¼ÈcŠ´tª©{¨W–«xy”`‹cn†nªe¬u‡±rs•=§¸]d‹LuOSxWZ|BTt9qTd…2CY;Ba4XwKiŠQTxh€©Ys[[qPk‚OZpHVs;r’\¡º[k\³gl–h‹´ÃÜ‘¿Û”Öö¯ðÿxRwf³ß¥¿ápje‚~©c X`V³ß¢ÅèŒÙów¿íƒÁo]{>[‹8TCBiOX}Mi›ey¢¡ÈˆŽ³ˆ¨etšŒ²Ð°Ê\mŽFR€v—GOqKa~Uy€N]qC^rEgo<KZJi}Wy“Ic\^‚bVw\c|;Yh3Mf2YzQ‡’Td8YoEmŸs¥OjƒPm‹S…¡_ˆ¦m…^s’NiŒNjŒas§‚‚§ff}i˜ uk˜¨¸Ívvœbƒ§k~ŽI]ˆfs˜^fˆerœ]e‡Sy¡^o†Kj…Hh~M[ƒamŒc„‚Oc}T|–Ul…Uk}TlŽ[YXPJU5G_CHU@PS3@`8MR9;X.1L3,@(+2$@3Z<ra'Uˆ<RoNcgEn}MnvB[Ob_Qlh5j…G[VTlEd_?x~;g“Vd€ncoYOt^WeHXg6Go7?gAAYEDF-FR+[U)U`S]B\c9gU„zP{—Fz’R{™`sheˆWOw;V\3öd.ÿ}?ÿf'ÿeÿr!ÿ=ÿŠdÿjZöE5YG$Uc/^c3›t9¥šAƒ–bš‹dz`…–q‚‚Zw”KQ‘ba˜™B³u‚˜go˜XŠ_Âu@ˈŒÅ¹xž|’‡dš¹hœÂu‹¹zv¬gG“hy[5®˜+†Þo³šmÁk‚Šbú•báÿÅÿ¦¤äx„¦eR“RYh@s8~³T†¨m”¢`u]HŠfvo4qC]¡TO‚K„z)r¢;z‘;b—9TPln,|˜B£Q‘™Z·µR¢ÏtT¼xƒu?Ž¥Ku]ƒžs£›^§h›fiŽRk5 HqŸP}…\½9çÖˆ˜´…Ò‚|±¯pj³šRpOb^?†xA‡rIª~J›IÇzEq¤W‹_W–£O¤¹slË€g…Fg>—:…–jgŒk‰‘G‰½~“®“€¡_n£lbvPs7´•T••e§§^ÃŒX„¦‡]Jxd;݃bjÚsfaoš<{qN ˜S—Ćdšoˆjc¦ aV”Cxp< ’@…’VbyJrŒ;T£K`w6‚‹Il‘fQ‘>”>1dr<LhEIS>Ï—AæÿµžÿȵP€F€±Ype:…Ÿ=Öª>«ô²¿§uŒ¿¦¹ÓŽ”‰^ÔèzÅáVñÿ¤}ÿë}‹X —]Ùÿ„Æÿ¶‚´ƒeƒK=}®Ž`J°“V¢Ís™Ý‹k¨=×¶jÏØ“Öœ‹´unšuKŽÞfš‘A}Zy¨c–uwÑ‘‘”KRdk¦¡a]8oa[·tuª«ýÀiÖÖuà„Û°XÅûš½Ç³Íá±´íÿζÿÑSˆC«|]Œi‰_=µÎ ×ì½Òï°zÀ‹îFɃuÎî ž¬Œ“g,³–wÒ…N¹±xÚD¢¬v£ãyî©•ûËbÐ^{xdŠˆr“[s‘2QpO†{X}ˆ2¡ž@v‘‡…ŸO|™^¦e]d=|:M‘Œfp‚M‘‘Qmrt—Ÿ@£à`ašP\ƒA{‰Y°¹soŠS¬M‚Ĉ–P¤~µE’°c‡½AŒ”AvÊJVÃ7^r)r‚Q œM[…OHf)›—F¿ßvr«Sº|f”/`2r—Z§~T_|Hb|Hޤ\QG Oj4€|[{™`l SJy'Re/f‡D{£FeC”¥dŽQh›AUz?lw>a‚<snKxŽIa‚Ce„R_y6e{N‚šS‡ŽCt‹\qšTSl4i¹Em‚>[ƒIi…?uPrŸPn‰Kq¯a_–?[y=‰˜BpŒO†Ÿfm–K«Ä¨˜Öcªº|m“EƒŸH^|7”°bi„G_yGS|3¢xgŠOeˆ:b‚W‰½vm@§£¦^‹FÝÞs‘¬l¢ÀY~~Bu›b„«woœHV‚HŽ–xˆ¬H9Z-cwBGo*Gf+<f6b‰7Nn0Ly)Vo4Tƒ/Rk=k’WC^1nGa|TZ†›]™½cx¥N£]u£MÈgi—V©Ÿ—”Ë|¯ÌÓÿÿ¹Ûÿ½ÖŽŠ¨T\ƒ;cŠU£Òr…ºj޾—æÿ˦̋ͨ¬Î‡¶¯ÊT‚£m¼Í^·_v™[¯Ì[lž_ޝXy˜L]Qv›cXˆ†ºg¢U}šsm—C]u7NwMHc;EX7H\FWj9Bc2A[T_}9svLhƒMqŽRˆ¯\‰¤FnƒCh~[}•OnIhƒPeŒV^wGWu@X}`Œ ap’^qUl•\†¢Nfˆ^‰«hФ`v–Zs[p‘~•¿r~¦dtŸnuH[[t—WteyZz¤o„¢Q`Mi‰E\~=TzHY}Ze|JX|Y‚–cްWp„SoŽ_PYGET57\A>L?NO/GW4]S;Qa2B^?;N1@H&gH'xo%~8dZPwf\jE\x;rpLbˆJamWhl?twKaŒdqsSz„Ko‡R`‹d^yuojTf~UjƒWc{GF~PDfL;_;GJ0OY'hY/^c*c^4qd5{‡<…˜G“a{–fo•a}Y{›doˆVXyEÿc7ÿu(ÿc&ÿdÿjÿŠ5ÿeÿyQÿb/øE~V.__%{:}—Gl„\ƒo`‘šR“ªmŒ£ce•P^|\–kJ¸Kƒž›–{\ŽdXoS‰e7^”Weuo~Z„‡Pš¬k‰li¬Œ}…\k—e‚SޝQo½pm›n`†bo}GÎKáã†×ÿ¼€ÿ¼u³ŒsŽ_{—RœF}®b}¦oc¡`ƒ}ox•KŒ§J¥bz®S£_‹·a‹¤eêºO–ÿ^À~³:ÔZ œ€ÆÁx¾è‰Û¬†·‚‡µW‹¤`v«|‚žb¡£Z’Äkd¡lpŒNu‹8r”Qy™jd‘s~;¦¦l‹”¢\”«Yg¤«e?Zl<r5µ…Vÿ„C¯âŸk“gkrAEy-VL;x^Nhxe|yBršLwš=zŽO¥•E|µdm™H†—T›œikžPj€5h•+‚€cwnHˆooœuN‰ m]lWZ-¯‡TÆÔnÈØi’Y}¦Y¢X±¹|´Ø³´»™›šKˆPˆž@¦’C²»]«ïv˜¬dT¨]tg?a‡q_¢VMh*snlW;°„?‹W{‘Qj”R¦vIjâ¾yk=•¬Z¯£RŽämb£W„\ZTÆh‰s7´ÍjjÌ ð£cÑÿýüÿƨÿà—F ÉIȾ˜¹ÿÑÀŒåÇm—æ¡„œbDh<³],ŸùšÉ©h‰»¢ÄBßñqõ휃´‚j‚]…:x¶g‹€Cr¨\‰>–ÓW“¤L~«TIs>~¡/^~6Tr'WŠ/aƒ]ÍÔ†ª‚n²pÍù¹Ãÿơߡ³ÍiªÏeˆ«uy`Jm>ޤp~¥7d¥;Iu7cnA‚ c‘¼WÒÜ›²ù›§G¸Áeó[ùi¼÷~¤³T×ÿ¸W‹|†r;Ý™Ÿ±šj̈[—Îo°§]ÿíQ‡‰Ji;p£”\l7ip,{©ŒiˆK’‡]ts3ŒPcŽ;x†^œ‹Vx²e{„0w¶jZw7‡adyVt“Ldr/Mt?HnHz|B}~Dg‚CŒ Ch¶:Êæ»LÚ~¬ËƒuF²U©ÿ¸£Md~[¦~@£Áb’y^’·|¢¯uvŽZm´Gb„8W‚Jf‡AYu5p8ew=jz5™²czšC[ˆHt€rtƒpv’GmQ‰¶eÎZˆO}€Obx8WkGbmEw“Q€zKfy>u|FbŒNmŠ<š§J•ål‹³ihªSL{<Ln.i£Jp†P_IˆTb‰Br¥hŸµrz¯SÚqe”N«ÌŒ¢²„“²i†Á[ ÀŽn„Xj\š®^¤KwZ‚›cOn7jƒRbzWfŠU|R`ŒFgŽSb~jf‚W~ B\>“–ƒyœn|ls¤R‹·`бq[„KŠ»kyˆQh‡Gc”,eqbfzNIn5”YˆES>j…Om˜F|¨Teš>iŒD3R9OaXj8m€Q{•fe˜ZŒ¤Vn—]•¸^…±`hŒRŒ–}†±xƒ¥ƒ—ÁÒåÿ{˜qZxA˜Ëq¨Õ|œ¿t–®l„¤l½ƒ›Å¬Èqk—Ed‡}x£ZeŽlmœjw£o‡¬pyždw¢ScˆUjCz_‡©{Ï嘣Ìzi[b‹^vš\bŒGazNz”Ruu8dv@ZrUe‚>Yw<_qNs€RiŠfy˜r»|Œ¥]vDXtKe€RkŒQr‰]x‰G[~F]~Cb€Yn[o‡X{ŽVq“giNc†Zn‘ew•`q”axžb†¨}–²}œºd€¨`s‹Mb^mŽ`h]d‹dx¢fi”VrŽToM`ˆE_‰HXzGbˆI]xPi‡i‰ªZ~“Pj„T@Q3HT04T4>F6>M+PQ+eO/ba9OkGEZDRQ:f]5rp:b…O\]PfUXlEXn8^nDvvC]XofLmp=g‚OrrS[‹QTxg[lckkTvMqQhŠe]~[Qz^GfNE^:`R/]o4bf9^n4sdDwz:~’E—]y£g|¡z„^x—X{Œd|…\Yš\ÿfNÿr2ÿe'ÿh ÿq ÿ;ÿŽaÿwSÿg:ÿ[+ÿR.jU-h‰OaŽKu{JeG~qE~…N”‚\j‹Ukn]†n=p–Nxƒ{†ˆZ†ŒY”„]¤¤I¦nŒ o‚§Vi©Xs”b†T޳u…ªre°f‚]Š»Koºhd¢pswGˆœ9\«^„v^—u²¹š]Å•nLjˆD¤Qfµh“…‚‰®Ov—h‡F“OxŸv…—El¤vY‡]PsY±l1ªÍŒlâ·c˜QW˜SxtO’dŽ¥‰™º¯›ÆgÒ‡‡‚Q}oЉ´Tž®e½ÂbvÜ{c‹O~€T{˜V±¬V~Øt‚ž[ÒƒE‰ÜŒ•Ÿ†f¶w„G˜§Co¼T“‡[—uDÊcx ŠdT[rW8A'C8__$Yi.esKmYSr4¤y+VÏwDbI‰e'Y¬G`yJY{AulPމTµ“OtwnmuUkr[‚a9V†4nJ2fb>wj‡rZUxZu\T¦¦MÃm„ ‡¶to”a–mršP’˜S|¶nf€d‰E`œMTl,s2t…7Mµ*ql.©£Q`¬‚pi;²šKnÛ}s{?‚zH§¢Mžªs‘än…¤ws§=‘wu”Zˆ”Tp“u¦ŒZ¾Â¾ý¡VÊÒ—uR]œj¸pE³ØŽkÓÙ•£áµ¯°ou•dÉrI‘i—™q²ËD¡Ç’¤»Œ°Å“¥Uvzho7yxEk’YyA’©Bɼsàÿ¨ÿªlvIm“s£‡7~ÊYe”M{•2qÈ~`€]rˆl»¬’²ÕÂgÍyÓ¯r©¥g`¾„tÄ|h³Uo:}rexx‘jŸŽdx¯ÒŽŸÅq›¥ui†J|h9Š‹tšyDø±’–·…|`°N]&œ{@²›oŽSÐ’mÄ„i‘®…äÁ«Ý¼wÅ•Zºujs¿7‘•l¤uAƒ€Q•ªY‘…MwžG—”f™•EgkR^ˆ]w‘dc‘@mq5W€J]ŒHh|R`=££O„`t”K‹m=ªÕw¯®s’œ{me‹¥±Œ·›Åœ¬®ÌQ Àiãrˆ«T«©Vº•]²ð³•»_gº[ywY~”Wi´Jw†`V}%†¤\z¼6Zo5`n2{¤qŠ—x|€Ef{6^…Fnj9[i2•˜T‚®e†®s[f8Nv0fwB~…?šŒG“PlzFZf3ŽŒL]‘KLo4h|l‰Ÿly¤?_—ISj5Sl.t”YXoCw£Gi”XX}5m–RTl=l„eYoG—Áf•Ãv’¶Z˜SlˆFƒ“] Ez{AduUQ]FKl<K|;Rl<j~[’ªfq¢Z–Åu„®ce†8Lh)Ng=Ébz«Df‹<|Š^}‰Xg“L{Žr‘¼xžÒnµe‚¡bm™Wk}LDQ1E].u~@ZsO“±€µ¼oq‹KNlO•ž~‘«_i4Ih8b‚EhAZsUÎÝ~”Æ[]‹H]ƒSŸÈ†v§co•Hx€k’§kLƒ§€¾Üt§c²Ó‡¯Ð Á߃s˜Ir”]Y…F‘®—¬Íyl„Bm‰FYzDaIe‹Zs¢d}ŸXkŽ^‘šMp?Sw<_‚P\‚Tsžzƒ«†—¾af†QŽ›Qqœ[‘¦Z„·^Œ®o‚MfpCVhLs†CpœKgs@q‹[~’Mr†dŒew–Uc’GY}E^}CVOv‘R^|Np†TlŠPl~N[|Ul†JVvTq“O]r=PxK\tD\uEUoN\wVX}beŠv‹½o‹¤`h‹ZtP`†T`…KaƒbhŒ_t ]pYoŽ]o’Vk˜Mo˜Z|‘P`wW”\r™`˜NxŒJ>U/:R1;I-LG,EU%Oc1PX4Vd7mkAjeFncCYo?`qHalGarS`lFuv;uxCiŠV„vN`ƒPeXU]h7Tn?iUAd€GW}eTxWgeHŠqDn™T[oOvWWhOVe<Rp<_[8Zx5PoKMd<bYAv~3rŽV“V‘©cY¨ymv`do7zr[ÏzW‰»_ÿ‡iÿGÿ_+ÿf!ÿp"ÿŒ8ÿ’fÿvSÿR=ÿE$ÿB'uJ*Z€QWnAkk9Z?\gFd_4ph6n~GT{Sip9o‹:‹ŠRK’Z{€f˜yT–§o¦ÂÑËr¢ø‚sÌžw˜\Ÿg¨czÂr›§`¯Î]pÊŠS—j}:^«IT‚s)oFE7)n`2a‘TU}Pov4] Rm{@“XzºVa¥u\sJcs<y|Jy‚3H…R:k9:V'r]j•M‰–os¼dD”akr.‹}\‡¨U¦¡]£Ñ€r•J™[]oI„@‰Ãs ªz“Ód\¬”ƒvT¦¡U~¼o^¢qYm^qhC˜‡M€¦mމS”™n¡™OÄoÙ“³´n¨ÚSسN‚…Oq}VItb^h2\h.^h6e`$ˆ6e—P¡ˆ3ˆÖMƒªWr¤JkŽipˆ5¥‡4±8£—L“•f{k<¦z>¯µ`•¢`™ÄTw‡I‘_SlqCÍ3UÁbb[0„YH”ŽUº`N;l™n|‹8x•HƒXpšX¬€B“³W© zh}Vº<wºR‰°@†ŒMЬj’®tT¥lXc1hƒ@££&q³cwLV„MvZ’ž~¥ßjZ¤Bmu%Iƒ2©b>¥Ý~´ÐmËÿ¨×ЙˆÖR²–3ß‹2’ðr½¦QÅé‹Öœ®¡F‰®y°”L«’MÕŽD±·‡€ÂR·Ÿ_Œ¬‘l¬xf‡nTYh5q^1Þ¢yÎÿž¨êš‘°§n{yKc‹>w~Ql‘S¢¹ƒ§À†y“ϛaÀ®{«ÿ®½ÿҸМè·F¯§~ÇkÑô•Œÿ±¤KnØLin<pz;®e‘Äzª‡gŒOVDht$eŽA„Eœ³a ¡8ÍXgža—žG|§S®¶m´jðÿÆŽ©ZÛÅhù—w³›ŽˆV±|ewªm“^sˆH…šF¦¶u–ÄŠ‡wBØyPi¢sjxCg„0j‘B}[p¨FgŽLP”5Xl3pˆFg“H¡yF‚¢fkZ…ª]Ô¡tc‘Rq¤>޲NwNHj§QpuRs¸lrŠXj‰/†Œ[†·¡^~^b™Xƒ†9i´C`”WFc>c~2Nv?om>c‹6ž‰9Ÿbˆ•M•¥sjq6U2žoOqtA]b2n q—‹‡_§*a{;Yl4…Ÿa|s;cyGdvY‰§b…¢s{“>kœ4^€/p’Co™WZ~:X•6Pm1Vw8kz8}ž[^‘LW|9dŽ2[o3]z9UZBRtAOt8@T)Rm:¡ŒOm„QOk,Rp6dx6`p2Ni6v¤?u©Bˆ°R|™xx”|œge~X„žYT1i‡L‰™rÈû•”ºIY{JiNv¡Xe•>\‡lÒÌ•ÇÞ…`\€ S]|:n|1pŠ^Ž»dxŸVt—m^€Kb{M]‚:g€\“°qWAs¤\y”yvšEUzLft™¼yšÀ`u˜€Æ÷’›Ä`p‰Dv~H‚™Tv‹@m—W‰£k‚¨f†j|{„µec}Sk;jyHoŒz§µuj‹A‡›A\u3S‚>Yƒ^~°hnœKf’Vw£]ŒGW‚CpJ[„L‚ªp}¨cjˆYhŠYh‡?ir–·m‚³[¯kzMl|Epˆk«¼`…§y°Ån«|ªl˜[t‰YpJ]BRxI`„BTtIjˆIVzF]sNduViuBMhHeˆB\ySeƒL[}@YuKZ{?Tl7Eg8Mj8EkKTwm†ª~•²[s”`w›[oHZ~Ga‰Zoct™bjŽ`kšds\x©oˆ±r‚˜\eb|c¤l…žX“™TFS*=Y,=F3JJ)TR'Wc5WkCZhAWg@]Z@t`<rnBZTevVtsNgrGgpQllC[sEIePIVANVDUZ5Bg8dM6pq1\‘ZYvdZfIjm8^‰SH{_CmLX^@Rn.GiBQVAS_2^e@Sa>wd>n‹7a‹\ZWeyPTTdkPou2d…GòkN—ÃQÿŽÿ}Oÿ['ÿj ÿoÿŠ<ÿŒ_ÿoZÿV6ÿ=!ë<#^a'AuTJX8’W0k¨A–{`Ÿ8ž¯\z½hx‹ZnE‚‹He—W~}Q‡…Mv˜m¡HűHÑð ò瑺ÿÍnÖàs‘i‚¢_”®_´uË©sªì†{×¥™ªkƒÈPœ¼pzµ[X’__j4dwO‡_†e8—œ@s¸t“dmˆBq‰`TšY_uEG€BSZ<Ux)_a/E6[d/N‹(cz8›3{»g{ |•¢eq¼^JŠR}l>’b… p¢H|ŠDŒªK‰±dm¦ež…YpÌr€Ue’Aa€sPkE`d;pm/^pBohhr…MEzIšL;¬›cwÀv³˜O©É…µ±c¯“w‡F\Ihz;¬4ŽÞ]b±abl8 1ݨPj³‰«hzn”jdzCˆv4hŽ8}u8r«c¢xZš‚YY{T€<F]†z|vbX–clR€ºW|hHó¥GXLJBC6C5(vJg„\tˆ;[¡M€|+PŸJkn<y›H›£Hà–ìÌ‚‡Ï‘À˜NºsÅ®A†ºlic‰|R¤“ˆR©€prAs|ZykZ”M•( –7Í„ž^‘¨he¶CˆuUŠ·T|‘}‹˜m¼¶U£ÔŸÿ³tš’gAda—N5ºÅ”œ¶f¬È€ŽaóÔj±ã™š¬x»‘Q Æb›Âw•£nƒƒAWªhMh'‚6q·i\w6|t8ÿk£·Åz“Y¤HgvMz™E¦’DvÐzds@Ýr;¤ÿ¨Ë{¨a›µ·ÊÛ³ƒ›x™œZw§jÿxH°ÿåÿïÓ‚Õ‹}Ë”¦Lx¯N„„Dq¡m”kbƒCw¢SOf-:f –iµ†cc™Q±p¡Î€¬àŒÒò»ÕÔ|åÿØzé’ w>¢Ãlú䤸֖¢d“Ÿj‚SÿД~B°®Eª®f«º‰¤µ\ù´m«¶tࡆ‚D§¾e•‚NÏoªYj‡<cœ6m£Q¬²evIЧfdm3ŠF©g[y†I©g¨î»U‚Sˆw3f}Ui|-yCФ?\BmN“©pMrA_}1ie5t@žÞcpš8`t7y€3‚5“ºQvŒO‰œT¹âŒx¸_V{6oŒ?hˆH|œFˆY_p2Uw4ay?xŠM¢ŸY˜^Yl9a€:u†K„‰W°UUv9v–CEu<\nTYyK`tQ‹VgŸLr›Lr•Hv”>d~=…¤\´GYq3^x=…ªfhbÀARo.fƒ9l„wˆ¸fq4l“;z„BvM—b Ë…Êtµz‹¸nˆ vzSb}Ry¢[W€7bl4_mGs€Vlz_ar=`€fLlTl€I…co†h¢Å¢Ðjs—Gc€AlŒ=}§n·nwœeh”QZŒ;Y„HgD`‘Pq—nU|M…§tzªeh˜B`…GbŒPe‹[o‹m»å–™Ï‡•ÀPrŒDpHj’[†´q•½{šÐi‚®[o¦Lަkx™KiIt…EsSf}_–®u—¸h‘®Sc„=nJ^‘Sh’b‹ºly¥^y™[]‡Tf”It‘OoWn‹VxžgšGpL]x@Kp\lŒm•¬i£a›\€¥]|œz¦ixžm„¯ej†\^€af„SkŒKhz6ZrBi‰H^q;McD`m?XpNtŒGbfCZt;VsHa{L^€LVkJd„Ti‡K`I[o6Ng=Tk;NnHNhUY~fj‰dsYs˜už£G[yLa„PY~T^€T]|Ugƒck’g|£u‡©uv“cl’j}¢mmŒlvnˆ“YOH+RM*HQ/ET0SM-HW.HVCd`GicGb^Fqc={xHbˆd_kh[_FT^;UbAV]<Cc89Z@@K3OQ$RZ-dd7kp9ns7_“Rb{d]xNlvIuwGXSMpLblKRt9LtE[e?Nm+_j<oa2o|@`J]…]^|OcvNY9dn?iv>`„I·hH«ž@ÿ˜“ÿxJÿb&ÿf#ÿj#ÿˆ3ÿ‹aÿjVÿO1ÿ9¤H#Qs.RjT`k0zn5‚’KwŠcšJ§¬w{Ä”ƒŸ|Zšc_s^BsO]UM‹k2Ьb’¢`—¬cœ´•œ¯˜b±°o}¡u’`‰˜]‡£`‰ªmr¶[n˜|i‰iž…WŒÃb†¤‹i¬uP~sEu?Ig b`<ƒ{:ƒ¡dW®ˆiyh€„E\–d[ƒS]x>Tx7Pc/Tf*‹g1u»EŠ q‡µ\x©rS§`I‚iYsNx~Hu•K~wh9€_džRU…Jce'XpF7hMIM0Zk4^uNUx[Um;gsAT…9m`1ok8xw@ƒj@–˜g}¬m©9o—C‘xO”£M»¬tÿ dõ––—p‚›NÔ…9ãÈYóÅ”¤«žÿTŸ×‚ɹd²æ¡ÿ™_ü’©y?´°aÞw•·]‡²‚ª{R¢T…__p?Rp2dm&“v2fªikwWjvYªyU›—gK|$u³@–ˆ=½ÙK¤Ï|`ÂUj’?w„:¯Õ]pŒZÆq¨³œ«¹tŠT»ŠLÕÖ£‰Ë˜e¤XeF@REfa3Gi6^`0;m,˜„0ÂŽ‡¾q„“<–´i˜´’TwL¨¤Fµ³wŸâ[—à;”¸;}ÄWˆrw„¿|€†4”-š R‰¿njÚYœPlŸÉŠÖvdU€vG§ëž> ‘Äg5Ÿæs§mTd9nš5Ph›i¾¡>©îh|ª‚vŠÁ[{€y”¡„yžnx4c)‡?[ÄÎDNeorNëºg¬ä`dª3exFl+¡«?¦¦‡ÿ¿wþᱤŸhÍË[ÀôtºÖQ¬Òz]Žfim0N¤~Æ$Ÿÿ?X¾PŽ}r§£Ÿå›Þ÷¶X}@XGcR¡l|ª¬°uª»DÚÃq™“l¦qÏ—…úè“q7ÿ±‚¤\ ³]“~¨–\”mŰw‚[ÿØ‘t¼z“…mŠ}]‚·xŽGrCb@®˜IÐ÷³^–7~‚GQW"~|Sh…3˜]|°kˆvŽ–Ddt6~z5Ìóq‰ÄN½§¢pÇWJ€:bžL=R)·…~ÿ…KUZSY@`eH\h9~Y@‡|MŠ‚QmlD•sሲ†ž®O°hœÑ]§öLµUb„0ar;tzM’¤Sƒf‡¢_¦Èt±ÙsŒ©e¶Í‡‡Ìdi–.pŸLaŒA}§<[‡9Yw9u™j“§Gy²Fs†:‡²QeƒAgŠK~°`^|9Yr1Ul7xŒUžÆ|^‰HbFl‚e]ˆ\`ƒE‹RawCu|De~M Ô~”Éiv®aަXf‡O¯_¨Ö^•£†•¸g³AsŒ^|®YuL|´Zz¬Lp“EɰOŸ¦`Џq’Ê€¾w{¸Us”c~¡r©Òy˜Â‡˜¼xy«WŒ¨a€°UœÖywIVx0Ix;u•e–ÂU—Ëby˜]¡ÏW~™To’€²Ð…†½Sq”I„‰n¬»qÀ¹{Öð©ÈÚš´Ù„½Õƒ…¤vŠ®m~˜e²Êa’e½·x”Ql{X„¥q¨ox™Gc}Ol“a¤kqh®n€˜Xp–iˆ§Z|–I_oF{‰\€¥{’ªSd„Lj‡BXx9^vP•kŒ¦ZuŽ_y©mzœ`q•CDcNe„IUy?g‹Tq˜^˜Âqzˆ;SmJ[‡Jjs+=T6TnF~ˆb“©PmƒOxŠT¢h“©UeˆDRgAZtTe‚Kb}MZr?\€?Ux?SqAMdGWoFInMc‚Ofiˆ—Tf…RtIWxIMl@RqKQtRl‹ir™lu—fqŽ]oly^_ƒbj\l”N]O,gO4^V/Q^<XV5L^1CO<QF.e]0^j=^i>TcI<hXQBTJL<QH9QV2VZ4V]/Hs9OW4Z[%Yk/lm;exBY|L_mMZuGJsBQcCX_8\kHdvPcxXhyEc†HvxDl„8i„OvzHoFs}Rv…Vz‘XqYj€PdGev?{…H‡BÄ‘PÿŸhÿtLÿe$ÿeÿo ÿ…:ÿˆfÿfMÿI)ÿ2v8Y‚1XwI`k-glFu„Ad…Kc{Y|}Q†ig¦|J‚Z:eP4L9aI$l_,O‡ErlSj„S|„aL‹[IdT`d5\z@i{<u~Kš’PY¿xYrTFo1tZ?u–RV“jMs]jlF@‚6Q^#`(˜‹<iÁˆ|˜|nžcpŽPi]ZyPfv@a|Ax~J`›=xr8s™LR}_KZWIb_™b:·w|¸q}\^¥Qw…N‰ŠO€£c\ˆP>uA5G&WI$\l9?j6IR1\[4š~7y¢LqŽJM~IoX3ut-~z9’zA¥;ÈŠB™]’˜Y½O«¿kŽbÿ‡eÇ娮hÕ¢oÃ¥_Ҝʴt«”Œ®©NÂÙj¶ÆØ±µ¹ê»‡¥cφDÖ݃«Ø“Ûve¬mwyO“–Nb•[`:[uM—i2İSÂ_y†;˜F~–c¦nF}¯R™MŽóA£•^ŠÌ—n”kkŽU~ C°˜5œËw©cÈfˆ™J€‡=…”X“Dv—~žuežslŠ:Æ5¯ÿc¾l@w+ª_0x³s[[ ‘<¦¯—|µ{ˆ«EŽ{J©Ém§Ðk”䜻ô ¥¬ˆËÔ„ »sŽÃ>ÉVÿу³ö€r`L°N^v)À;y>rÆNd}%j]š{JÉÐxµ÷¥Á¸¡îitÉu`“-«…9Üÿ›¿Òh•e¢eR˜d‰oR¸¥u{}O}“PPi:ƒi+Œ°Wƒàr|Á2oŸC€–ÙÌž}s€t+yºgƒy°ßZƳ‰¼¡ÿÿ¦ÿøÅ¾ÿ–r´ILr1@S2„JÝÿާψÂblŠK€’SŸ¶ny•[Pw@CGŠy#n—BîØtÃÅ‚ÛëŽl’Pˆ|všˆMÍÿºŒÄe¨•i–aŸtW¨Çt£µaÿ肜½³´°\ÿüÑc{p‘¥Qg‹NR}(Q{Lv„G‚„9„™\Ñxç|»\QZ)f?Íÿt²ÿft’^t}:p‡Fd{9Kh6Š}ަ»bYmœM•DTjX¨‹>ŽÒP–à–[k*Yv(”š8hxIÌ N†m,ƒ}PfpB§«`ƒZšÅy†¬u—Ás˜È‘¤Ï“”ÖRƒ¢>^:l•Bƒ©‰v“T‘µd¡Þ~µÑƒ‰»lˆÂv{¦o„¨tŒÃu¿jk~\’Ï‚j—Q‰Òm‡Ë~èóæšÌ_y TÀUi‡M[‚7Wo5bƒ3u–pšÅ‹õ†n’X† se‰E_n8bv9d”LeˆE”ŸRvŸPlzmj–V^Do‘G…²yi‡“x~Ub‰By“ Ï[|•U¥²ne`„‹~u f€¢v¢Äom˜J‡”bi£j…pˆ°fjŒho”c]aw£h²|…¶bh›RJkZa€pYZ€ URq=—»r–Äg°Ó¤n‰i“½bmŽGd‡T}–\_‚.c†Gd{_yœfš¼”»Ê¤Èë…y˜m‹£s€§q‡¥guš€‡®fx›lµ¿€x¢JvˆSšZg…Gc†Ny¨GZ~QlŒ^pšqoblNh†YnŠ^˜™Ml‚LŽUYv¥¸Š»Èl„¤SfƒPo~IcŠ]oª^nœUq›Ur¦o~§Dbˆ@j}Ia„M~s§¶ow›o‰§TgNm’^x€9Mn:nŽ^€˜gŠˆY{•Ykt†ªynˆT_†CdwIn‚Oi‡Sv¡ZoOjŒGY}Q^ƒS^‹N^€AUoGX~Vv¢Zk†\rƒPWp;NhFZuA[yHZqOWwW`ZaŽZ`|Pn~\oˆTc‡cp˜c|™VeX3d\8gj7Yd<QS;XY8Rj=c`;ix0[AMoMNO>AP7R19WD"^>3NT/[Q8_q3LsAkY@uƒ5^Œ>N~KLf@VZ>J_AJc9C_7UN6Q^-Nh:Wf<_qA`sDb}ForLj}CjˆTk€PeƒTmqStvHu€ZkƒX‰tZw›Hu‘UˆƒY}—Nž‚kÿxVÿnDÿ^!ÿe"ÿr"ÿ„9ÿ‹fÿgOÿA'ÿ7‘6Y„,BuBPR(n_'L„;5dHWF;ox<~„Caš_bwR?rBTLASa$:Z.^P'Xt7Iu?[iFOxCRpLPs5SrBap.\;x|:e•br‹RV”7NjKqj,T–`i}_ƒ–7_NAw>_]0jv?yƒ_’av¬xD™gSPCoj<rŒ?Ž’M±¨icׄ[wd[}3GsIQ`-]w+c„5zŠFe¡nv…ey•ywŸcZ‹YVqQRl>Nd>Y_$[x7[xPJw>Ue5hp1€{.Ž…Fƒ el³Tck<f|5‡€L‚„?pgmpEšfE TÑŸP‹Ñ¼¬‹[„H†‡‹¡_‹lO‹ŒL˜„Z¨‡Pñwjÿð¥¹ØæŽ–•U²¡’|ͽ¢lF𳝹‚h°‚U~XÇi<Œ[P•{Xc#enAa‰@}aDt…_ƒ…F§ebË‘¶r9ÀjV£«vävqNˆ¨^YˆadxJw8z€?ž]q¹[¨„frËmtwyee7j‡/q•Fy†*€µN|žG«}zZŽsŠBF†Ecu4npPž‹Gжj•^ƒPs‹ZÓ¢P¬ÿ«£Ç™ìV}¿gI|>sˆ \™L~€K~ƒb„‰@p„Ž•ŸT¶¼vº™ïÿ©Š§¡§Žg‘Â~›¢p«¤ˆrÇdóvNÜÿ²÷“Ñ‚ŸéX‘—xzMø”T²ÿ¹–éPŸ°F꣹ædµ°JÿË_¤ÄI‘™›{Íx|hec}feoBË\|Æ~y8{Ãb½Ž<éà®|‡`v¤—£ŽƒÿÏ}ÿÿÿáÿý‹Ó~”§`z”NVv˜<CC=d1Ž‹jM|;Xx1ˆMª’ˆO©›IÎÆÎÙýè¯Ä’ãêœxžAyqU¦¤`¹•z°x|ÈÇ‘„ye§W¤±Wv‰\•o`y‰Gž£S¨ÿÿpt'bʇL^)Fs6M~x@—¦A³ÂŽœ¸¤‡–N°Ætm¢3µ’Qãÿþ€Ôº¿¸zo«a›‚>œR¤ŽfˆŒHMlJe|9awFc’L‹ÊR—°STm;ˆ™X–hz›KÑzQ›{7„†O怞@Úù©–ø‚Xr:]y>‡=Q[.¾Úƒïë·ÐÿލÓk·ÿv¯ê“–Í{u‡Ue‰cdcަ‹k~d”Êjx™j}›Q’?Jd3mwbWƒKl„B[z]Ÿ’ÚdÚë‡Éçn‚»kq}P¥\l“9€‘a£Ì‡Î|W…hmŠ]—À}š¹s]v1Yd3Vx/pœAgQ‘\Áfšª^¢Ãr€§Ž²W‡žF–¼Œ£{“Åup ‚†©PX~DZz<yoN`uCVuS·°{ož]}®jfEEl=V|<SqEf‡J_†Us’Xf‹efihŽHW~3N|8uReŠTZlR{“‘ÁŽ«Èv`yKp…UfW¡]Œ¤hŠ·Xz£=x‹P‘YЧ}—{”ioˆCx¤Vu¤i”°iˆ¦n¯^•®xÛÆljKxKvŠRjŠ?v¨}šÈDZ‰Dm˜\n•LcˆQpŽQ`‹Ut–Q„¤u±ÓvŒ¶^¢µsk›À{z™{ ·X„ d®ÓrÍù~Áädm°k¥Ó„¯Ít¯¸Mh…H|žOX„jŒ¬dj`gŠVOrPZx_r‡L~˜_¥r› Yo{T}‡@hˆ[e‡XsˆQz£[Š£etŠVdZv”`sŒZn’La‰Xr”fw–XoŽIYu9MpXp–lLVj7E\3@cD[nALlJZqMmˆNj‚JVtGXyTctSiŠOa|[v†cn‹hj`6fe9Nr@WXFSZ9gZ<nzAhtKj„HV“QXuQX\B]L7D.jZ.gT>QV:hYDUs<TiGfeD~€5j˜ON’XC\FAT,?M2E[5IX2ZW,Vi+Wh=OeBWc6Z_7Wm=kg>m€AQˆNZtQXfCX^A\l;{kBhvMqW‰ŠNœˆkx•fRvidÿ_?ÿe*ÿ\!ÿcÿo!ÿ…;ÿ‚bÿ[Iÿ=&ÿ8Ì<KZ%@`JTM0e_$:„ARWEcl,h‡Aq…@2K)JD$7)L&*7W'1S3jG$k2A‡FW_6Pq*MuBToAZr:zu-ƒ˜MU•AUx^g{I+‘KE?•“7‰³c„£nƒ\«œcjµ_~ŽXiA`†P–~EnžmF€}eW5{“1›¤Q¦¸r«ÃtƒÓ’t›od”]e“VnFz8hª_NwY_iT`mW‹†PŒ¤O_¹df†:p‚=hŸHQˆOVwKnuGw…A™—Ls¯mŠ’Q¸”<¡ÔjÂ…™hóa’¦‰ŒjÝÄxËÕ…®Ã|מSž†tŠn¢”g€²Z˜o\€EÆu?¨‡[•pt‡CžlOœxR}t^@^=2<+}J(_€Oq€W’™Z{±V¬lG8vTYA4Fhbvm*GzK9f?W““fd©SsrN¹ƒNŽo|hD¿xH¬ì|Uòqa‚9w}Ezt3©™:wìin€>b†RˆŒ?gwjbq=‰`;d–MU|,”|Q}œ‘~œKŒž>¤šOŸ¹ah|”iy-^ŠKo, ‘LvÒZg©NŸ„>ªÄªðι§¿Ž~½ˆ‡[gŒI?b(]oA>T4QEv€.dJp™Pv}L¸»ŽmÄžXt[faW{fSf¿Vž}7ÝêKŸã›‰R£½z‡Âˆ¥ÀOX€‡i¡:žœ:±Þ\–ÙÄ~ÂÄÁµRáÒ}ÿþ°ÿÿèÿ»–³û°‡Òp}z@^i4Œ†8c¼{¥™W‹ÁˆlŠ<j±LÞˆ[æÕ£h„P_Y<Q\¨‚nƒÄo²w„¤c—¤9^ž;:5ax"‘¬.Pt3šdx—@ÿ¯WƵf¡¹›h²wlfBtk`§mÁ·zé¨Pÿ¾n´µyט\ªH«¾{ÿЕÿÿd²÷‹ÞòW}Â6¶Å’Þ–b–цgŠG®´hS9QS{.|<ÉåxŒ±Ž—œ´^¸Ïi]C£½X‚Ÿt¶˜b|¨U¸éužßlŸœQtŸCs˜7¨¡_„¸soŠ5€v9iz=‡}2ˆ‘+ÍÎ_á·|£_vµ‡bÍÿq‹Ádµ‰W†·´ÇÒÇ÷m{Tg{?\v.‹©qåݹàÿÃm¬Uu•¥ŠfƒPRp<cn8ŠUtIR~Hd5}@|[ŸµIz±SeŒ>‰—7k§LL]4 ¥’£Æ˜ÌÚ¸¢¼œ}žq‚·Q| GuB{“N‡£m‹«v‘¿M}ª[†®…›Àc‘ÀJˆ³SpŽXºq ÔO[€<ˆ¢‚²ä‘«Åm‡‹yžwSkCv‘p›ª‘†±~¦²fs wÏ×j`š.Wƒ;UoB_ŽIu‰\bNfuTf†G\ˆ:gH”¿]y¯Rs—es’Sh…IIgGgŒOrIz¡IƒšgUŽ/gS†©Z|›gu¡o‹»wv˜g˜¨j{—g®ÎŠ¿â¤¸[TwOwŒl’upVŽSh‹Htbufš°z¯±a®x•¯aˆ¢Y~šY‘ [VzJˆ«Žƒ¯AVˆ@]€f„°T•ÆX‰¶EhŒ\ Àq«ÄyÈî¡Óÿ´á„¬×—‡¦Oyi±Ê|¬Öy‹¬hhš‹¹vÁ㈶ÖmX~_}¬‚…žSvœKN}Jk‡YcHa‚HV€CY€Tt’\u’s³Ë~ˆ’CirQ|“HpOo_…¡k•¼|¹Îqª[y’U`|PWnLhXo“cw˜[\ˆ[g‘`c…?RrQWzag=N\3Nf(Bb@fo;NhBQeWjƒS]{H]s;NsNZ‚Xr“Z‡ egŒ^t•dkeBdh<glA^pG[dDTc?be=`xDxSf™Sg†ghlEdnBiM>^O5UUGDO7JK2_U1]m<raA^y@~d=[KXhW_i;ec7R†=UaAhb(\}7Z{DIqIO]>[[4yl/m7~†GJ”PXl^^U4Z_4[h8bi8ƒjC|sP„|Y¦€Z¥ªlz¯…ã–‚ÿvEÿc'ÿbÿd$ÿpÿ9ÿfÿWCÿ8ÿ>¿Xfx.J…ISW5ej(r€<˜‘B¶B‚¶q{®XP›V1sL)A,O0sdeˆB[ƒIWs>XtHYo9ct(m~9E…EMd:a[(]lFf}G=‰ZI\<R_*fw2Ew5z`S]OrwW£}IˆÁ€‚¬œŠ£{m·sL‹Vjb?ˆtR›§HªÆs”Ö|’Í„š¢p•ÒŒ¢°i˜ÄplÂpXwfZ|=cx[U|U;y3MSEt_0kŠHhpK^~QØj;…Ð^§œnŠÇh\‹\fq;•…NZ©…bfXˆz0§nu„•eHÍŒC’Îw©Ðu¡Àxµ¯‘¾©oÊ—|„}Чb»Îx~·}³[M³|S¹‰RÃvW†——É‚Lo‘f0gZW60L€,7V$0G76&†RZz9n`<Ê™QƒÃƒ‹B¤…F?ƒT@I0UL(Eo1G]!^C5¡ŒKzV¦SˆÉ¡‘„jË„XìÿŸnÿ¤]“X>|8zW,rœEj’N€o7v›nË<{Ôz‘R.s©<€•OiˆHo2ŠŒ>€_š•[½ªXÆÑ›ºœšk…XqªTg‡;zˆP•Àd‡E{‡kgeÍ›E˜æ›Ž´va|jc¯*d¨:pŠ5wƒ/ΛCt¶q³Ðl¶åtkäsF^nÇw<žÿGm»8;V°ù»ÓÊ›˜Òµ‡ugмT‹½®¢zeÍ—|6x•f=a‡7<9SC5͈ZÒ°›‡••ÃÊÙ¢ƒ›€lu®Vh~%[ŽIji8s›ƒ}‰c¡Ÿfœ¬QqŸE²é{©Î|ŒTË’QzÖx…MŠ˜¤˜n¬n|ŒEÚ¢‘¾„аi¹ƒe¡Épv`6]p`‡µUwz4b©xutZ”Vz«J¶œgõ¨•ž[QaBU)_h;‘¤wºÓŠãüŒ¾ê™ðÿÑÿÿÿãÿ ¾Äzô՞̀{ÊY¯º[à²j¬¸²¦¸û†¨±Žoˆ:n¡9¹ndŸEd9mƒ_Œ‚WˆN†Íaƺm²TÖ㛾ÌsÌõŠ•ÙS’×kއW{^XV†'3_&ndB«Ä•¾ß•¥W¿ÖúŸ§äp¢aq®Ouƒ_¹Ä¦nØ|xŒCˆ¸ZŒÆk•¿aÃü‹¸Û‰’Öci–:e~ThbARl0ozBoˆK‘Šaca@h|9}|^Z†=ÇË ‡±`˜Z ؆fC‡”Lr¨mQk^XkF£W_™L©Èˆwj]pXz¥W†›zŽÎ}¸Ö‰¥y„¼]Žœ¤ºu`“3|—Zx„lƒŽhPt9ŠÊtºÃ‰k‹DVx9rˆWtNw«i~§su¤Xu–ZŸÊsyˆ˜žfaœ;Im4Zt<XŠJr‚@_z5No;PwEIjOdŽNJm6| Y_‰dj<Rn;Pq<\y@m‡V˜Å˜±o®Êjœ·w¸Vgƒcl—_x£|©½y–´]l–mŒ§o¦Ä|ƒ¡XmŒOo“`t“Ua~Gl}B_„Im…On”Z¬j“´xÃæ‘£Ð„©ËƒœÄ`k‰OOxS°…y²Do”?c‰Zx k˜¼oVo9VpL{¢qšÅ‚¾ã´Øÿ‘½ìž¹Óz¼P„²h†®p†°[\…CaS…yŸÐys‰0MsOj‘›°Nu–Hm–@i”MUEf[†ª^s˜a}‹WmŽk‰¯p‚¤Ju–Oc}Ke‚[†»kŒ½{¨Ò™—È’»j}‹SnƒEbƒRq [k—Xc‚X`Œ[~¡`y¡RbˆG_lN[l9Jc4If2EkBWpBcz>UkNg|HVpEXt9MwFc€[bŽio mz«~y ^lsMƒlN†ŠU{ YnŠbsw^^zDl{V‡[v¢bjœ~yyZU‡O\TSiO<Sh:Hc?XJ1g2m•AenS=^DP:<^m1gwI£‚K£LJ¶onke~x+w–RgŠZ_tUTtDgd<ˆq6x‹I€…XO—[<pmSR=jX.cb5]qB|k@‹gF {cš™[«±r¼µŒÿ©ÿ‹tÿb0ÿb#ÿ]"ÿn"ÿ‰:ÿ|\ÿLB‰< †f.ƒ6‚¦I\¤kYmMjt;mˆEl[ŠU’¢io¸r|“hh›bRˆavf1yŽ>lZc’iptJ[wDZs>sr+[E8sN5O;DOR_&Pi4Rg;u_?hZ#s•Fz•PS™^Wm;YqOwu5†dw—v‘vZ“d5rNRF2he'”—S‰Ôrƒ¾‚c”_`\y_ko[‹‚c“™‚¦¯tyÐiG•cMR=|^;c†]n}Be€1…L`¤]s;n„o€‹[Š”f‹[ˆO’[KlkyP4Fy4_PI‰M:…Kv©a‘tЧy¥ng±m”§t¢m×]á–u¤Ë‡ž “Ín¼gÇŠdÛ^º¯f™”`Œqr£`Sš“C™¤vˆ¬f˜ª\l¦F€ƒ7D~Wj:2ˆ…B¬¬hg£i@tL?U5gY\n+p*EFiO`KW}CM_M’ocŠgfO±Ò{nµŽ‹¶J† a–’PÚ§€e¬qr1ŽDž‘YÈÈŒ“Ù¯¢PØÚV—fix’RmL¸ŠIǺ„if¶n@ÿvO»ÿ¯ºyW¨Ac`7¥…XN†b“X.µµN‹ðW¡bk‡S`l@}ew»reœU“‚>Ó“O…µy´±{âéÄ•ÿÑ}TÿÎXäíìÝpk¦]¡¦c‘ɹu—Uò¶jáÿ¹~ÃZS®vZhT€^<NhCHrUU€$dŒ û¥N¬QˆðÈ>dMD}°h¶—z‘·”^ƒKdI…fD”žXaJ{¤mÆzYæÞ»äœ˜t,u6~•OÖþŠ‘¥o{pD»±R|‰ox|8u(N°pYLVA>Ÿu5Št7T{H€vP‡ª[H”Ÿ\š–`ÿ½¯°à‘ P¹©k޵Db›H„ŽKr¤m뤇óÿ£íä‘úÿÿ£ÿÅ ¯t§Ù•œ¦wÖ²¡‰£iˆGŠW޲d¥»®²—„°Î‚”»Qª±š|´=s¹P}£`̼W›²•®a¤ÕfÄa˜®‡Õ¶¿¥¶Ÿx«§r{` «]ˆÊ=zºh‹µe£Tëú´ŽÀ{£ª‚¶¼Â‡¸sd§‰XZ7b“3g¡_xw~§iŒ»{’VUd›£‡j†~ïë¹¾îšXwWNP,V_'Gf%nlw˜Uy{J’ÃMcgIypWhu=޵lUb]OWKŠ‘bl~<c•Jw˜e~”=·Ône”¤kv‘ei”HX{4{žNq§K‡™}W{GZ†FeCp¤gŠœn{ÂG„œko{JM‡:Mt=„¡sb‚\S2XxMz”Sf[t—h¯kq™F\~@k~h•Wj~a¬`w©Kc_~¦Yt^YtAw…PlJN~5Os4Rm>w¦jRp;Ql3Sn9]†Ba‹Is›[r‹_eU¡ÁWnœax–^PeEi”[Œ½|‚¤vµ_LuLeˆSRKw‡U»dš¹olW‹ŸY‚‹R°¬ux’bl`v•qŠƒ€›‚iˆQbk©eŸI„‘e‡±‰w¡KTzFYEaK\}E_‚6\B]Œexª—Ñõ±—·y‡£œ¯_t”U¢J_>]@Jl;i‹ZxŽ]–Xbq8f‰Ma‘ir’KTxGXvHY€LW|?^xc€Œb€™di‚Kl…YŒ¥v£¬d¤¼Uo‚Bl‘‚¤ÆyŠ¼Š‘Æ£ÈŒ°]w…[Š˜Tuœa} T{ŸGKcN_…jƒ›o|ŽZf€L]pARkF\p<Sl=Zw?eŠOlUf‹d“¶\sœK]y?X|EYrHTvZgnt–ebqamQhsTtU}‘dfšob“kZzYww`‰‡Zri\¡|jspV|PbcYoYB\u>ZdA‡W3ˆš<v³bswC‚VUN@pe4‡q6˜HÂdU½‘zk{„9u‚Y{~cƒ„SR‡QHkF[Z?wh9‡zKpŒ_O†xOkTd`3rl3i‚NujNŒg>mMzbZ•iWhpÿW\ÿrRÿa-ÿ\!ÿd ÿk$ÿƒ;ÿue©E>dF"ho6…rBŒSrmd‰kMzT{žXq¦dy“L_f|XŽ‘Gˆ¡pŽ P®\„¢bZ¤^LvRh[6\†<Lt8Ge64\62D.BL%@W&SQ.Tq8sl@n{5xˆDlœb@z[NW?_g7Ht:6gSeGRˆgOS˜]:oEAW.Wd"pˆ?V Z<mc^O?l;l‘>9‚>HF:ƒ_-yžk~˜zM¨uIXXSL,lh0bv€—q<xžvk™K¢vDoœeGyPRJ=NL>Y?.~J1p`G}k6Oj<_L+–i0y~=xwO~}[pŒ?”pS”¨[û‡]ÊÝ‘©’pÓnË´‹¬Û§¯„SÄi ‡_»geî¸_®¶€§d‹w`¥žfMÀf:C?‰L@«EŒ¼t{ˆndW2³a8T°aJgU€d+N›<eT=iˆ<’†=@{hKp*sk.ˆŠZ¦evAupG{Š\ÙºT4“iV\-ux6~“LrqL—B`¨Rfd4ÍŠAÞó}vÄ€Žzlž¿…e‡Ts€5i{EqŠ=˜?£µLÙ…QÛüš£œ£³ƒslnbcŽŽ: rDM¤n‹e+…Ê™[K‡‚CŠx@ƒ‹3]šY¿f~‘[ {W|™u}¡o‡q>¹Š€Óÿèa½_©œmÁÞpuvš¥@pªHŽœB‹¸<”´Thº¦µŠ‚–Äiÿÿc€ÿ¡z–N½½Sؽk´Þzÿ©BÇ彬顛¦c†©e‰âvÖØ…hÚtzrG|ˆ6p@n`'¢ŠZ¢jºéj}m‘‘¤‘Ñf·t<§I‰¥D½´RÐt·Â•å˜e¹¸R}‹>Y\4°q†zHŠŒE…„^{W¼šD¤À¥·²r¹}QÝÒh²þ¶Ýç¶ØêdÌÛp¢Ú~¬ªiÄÝ…yŸÆ–~•=Çå²ÚÌk‰avmO¢¼Ÿ‰™p™—?šˆS«¤n“±tpt‚kVFž{Y¢—^ŠmS_‰-¢`EŽ 9ijG¯e³¿Œi¦VsxAqz]k«bjˆP{•iž´kstEŠeeŸÆx}’m{¨X˜Ói¯Øˆw™D¹¾gªÎ`ƒÂsPtFÁ´UYs7h…4l <_rXµæožULs&Y‡Io†jssmyXb†9qˆ[n€Bd=qƒFzap…HqRy¢Ex«M~¡UsONh>K`2Rs*z™Mc}-b„?—·t•©xrª^x¨Ruye~¨Zg”JGdJšio†l`šI]hS]qDY‹@k’UmZ`“5l”M_~Nz€ƒv¦r\‹OаQ|µCpœQ†šYbŒMh˜aWƒ1Tz?e}L›§Qtt@cMgƒOt˜Vt©e[Ž5Us3[o9V|.On+Ae%Gc6MoAJe=Rm;ZrHBe/cŒPcŽSa‚E_sCTpCLc5Nn2SoB…¶€‹¬hh<d„LN4Mn>]w9|{UgoX€•i‡g`rD~•VrŒ`mOZqMahP_q`q‡Fo†No”]t—pi|Mj~Zyo^€0Ji>R{B[Ed‰IgŽ>h”Oˆ¼[s›u–¾Œ™¼_m—q^f1Ad7rT€ 0Ux)Ky=i€Ihn?}”Hg‚@\…Nb‡N[|RaˆPn•Tr™PSu2>_@XjFY„R}Uy‡OizV`rVhŠX`‚@f…m¢w¹ˆŒ¾™‹´or‹Ph„Oe…Sm‹Xgˆ`q†AfxIj[\rTYnEVsC^nBXt[€ŽHq†S^yJjŽYn]x¦~Âw ÀmƒšFWoH^y;MkFKjW[uY`‹ŠSXCWj<dgL|bD{Lkœ\g‡W[VzrVVT§‡cŒ‚]}C]nJ^dAgj>–kA˜Iq»d}ž€“g}§bp‘el~J—jB½–P¬Éni²wvt€p?hL“‡N“¦Ru©j[ŒchsGet5_m<orLvx]r€Y|‡S—ˆHq˜TtihngGf_AVrK:jPDPEÿC%ÿg$ÿY&ÿbÿb#ÿe&ÿ8ÿk^‡?9mi'8y35I<sN.Y“Jie‹…L”«^Œºu‡Ä°nn»g]’equB”}D´_i©ovwh]ƒ]OqMee,Rz3UmG`c6\z,\^5]r+Mr5zU+‚…0v˜RnVf€AaƒNWkDjl5p„@o‘95]oK0Bh+cL2‚nS€œ@I¡LNTLPiD~L-‡€>y¨Ug™o\yU}V:Œ1O‘XdQH‚~;zŸg—e;€¨Fzˆ~e|E–uG|‰T}}@r‚I˜D¡ 7yxE‡iSmr4…W9šl?¿x?NvzBvoBtvA”LsªZf|P€…C—œJʬh’íˆt[vjL•gQÌE£šU r\™eމUŸ|\ª‹aŸƒiŠž`©Ÿq¬×uDÆq3>Eua"Kƒ96Z#bC'>b©PY‰?N{+lh$;2tKp;#ˆFáŸLku}pQ‡CY,jH0ƒ¨K\}]n#Xw-Zˆ<}r5i‡X}z\aq6™m0ƒ—Œž§XºÂetÚr~Nh{GZZJ„dDw Š¢šP…µOÊ‹cÿɇÿÿ©•«›jx\‚@§{w‰Q€O¬CÙˆk§<•šVbKÀrV½õ„¼qÉ¢OxÚ^Õ†2±Ñ”«ñbÅéfrÿLK2ZLFŒ_9MƒOez'g}NÔ™OŸÿ‘ƒÿ‡ª–J̻йó¶ÿê³¥ÿ{R…ugwGe‡XŸ7Ć;Èã›”Én|–L”¤w…ec“u@‡¸mçÂyº¸t<|T©½Š˜–`ueŒ|p¿f‚†A¶Ù~Â¥…¡}eÄÿ©ÿÿjÃÒ¡e¥£‘’7–S”´u´Q•Ô~¥ÉxÍü¥ŠžVz©bÖ‰u½ nÚ°¥·Ç˜ÿÿÙëÿÎѪˆíÿ а•Œo™µyšÞ«Åæ®Ý”V’Hnm&eolŽ|C·l¤ËsŽ}SÚïkrM—0‘Aÿë“gq5nÀb`f(y™VtoržwɃ§‚‘™Yd‹;ŒQˆ™bŽPÈe¯†^²û…‚f:bv@Ä¿`Îcp†K•ŠjŒuk䊰{¨mt´a•/œØ‡gx1l~fy H¥ÓxjE5KZ`*p|-\f7mRF‹†CjZEnz?šH\mA{y^¥Æ‚’¬Uk¢]n…S“D‚°Pj9Œ—{œ¬s¹Ój™³‹¨Çq »rŠ¥`l—UczJ]‹,jžASg@f|>pŠPBJ,kq8XdAazMe†E~»]w—UO~:ARK“žpt˜Y«âiw·R…§[Ÿ»Ž²[PgVFh6Jg7b{h~¦ot¢du¦XSNiŒhm”qzšKR~0Us-XrAOx4Cm&Aa,IiAXg:]tLmz5Rs2f…IV?Ls1<\(CW/DM0Xu2m•Uu¥jhŠUjVq›^kšGZƒ9YqBx”DaJqNrD|`h”Ut§Jt¨Ir„Gs€<^k:OmNb~IPzOo‡\U€Av‚J_ƒMPl.Fk4`r6R~>u„N^~Ko‘h¥¸krZ}œu¥~”½na€6]ƒ?i•Hl@lƒG|ŒN‚…If„<_oGa’UoPhƒFX}^‡¬jq¢fv‰V^v3OiEbF}ˆVz\w…Kl“:Vg2E[Kj…:YrATtfl’gfŠeh‡KS~>PqFcyJa‚Mn’VbxJ]lO|¢\i‡\Š´k¶R|‚J]wRo|RipBSkGTxVz†SVzeeƒgt\my@MoQbŠI[v5AW?YuWoš’x}QZ€LT‰[{hR†k=tœYk’lf‹T‡W‘›X~¬c°‰]bnnCt{GzŒX‹€N}™JS¤}axvmL~‘S›€t‹cwˆ^Iu‰`_„obw`muB†o>‹ŽAxŸTrlmŠi^]krJSl>^hCvi:…P‹“]’—ld©hsigqg@ll=`yC^iE`o7ÿZ*ÿb'ÿ[!ÿ` ÿb#ÿh#ÿ|5ÿf]‘Z5†™>M’U)_RQ:!Ld\sIey6‘„L~Àe|¥|Ž•cwÄka£qk†Unˆ9M§[8wcMI9LS(TS/ce)]vAax@xo2yŽA^V[qE\^Chm:b|6ŠzVn¢ghŒVtyHXzD{i7o‘Bk†Me‰bQƒ</[CV=gf1}ƒ==«mCXAPZ'^V%hi@M‰SsqGl’I{†I„}H~iwj9†m/¡“U•“YŒ¨Z›`s‡iexY|u;]tCepD’t8Œ¬c؈OÅÍj‚xœd6ojA¡eKÃmHº{d`¢_…^<•†Fˆºy¯²m»e|Ÿd“šO_¤ˆQd>ËK@wG†dP±lG« Z±S³±rĘXò—d¿Óƒ’‚oqE½uJ|Ø“½fÆùa^Ãw<T7hcY•@U]OHƒ&‰m!r„H–›_ªjtšB\rH|`>}‰kzFb›b‹cL¯h€“V˜°P°´m›ßuI¦ƒOR2ocH³zBkºs†KŠ´ŒŸ¹tÇÑ”tòÂzƒJktI|W3”“8±Kÿ¡c¸Ï}Ÿ†Št\²šóˆtL{fA‡±OffmŒB™¢MÈö«ì¦˜›CáÌxÅÿ|¸ç¬´ù¨ÿØŒ•볫ánµèyÿ¤ÿÿÏÿÿÈ_ëŒ~ƒ9»”M”ݺjŽ6OŽ/V•^ˆwtÿ¯Ÿ×ÿ›˜ØY„£çã‚~ÿÉu£b‘‰;€¡tnuIÖvh|ä›™»‹ãÄ…yþ«€ƒCU~2Gp/owQ‚|V Á’j‘bx¥g´Œ[ž½D|‡CžMw’U¡n]¤˜hd–bƒqy¶ó›Â“™ž½v`’Z€…P›¬mb“„yndŸS›£‡‰×œ™^‚^›•9’¹†Çÿ„´V¹Ž‚æ×´¤ôª‡Ãu…Nah*™©{ÃÙŠ¼õµˆ»z§L¨Íl‘£Y“Çmyªs¢¥ÃÓª¼È©¢÷ey±P£¶\ÿ’‘u°;iDlu=c‡_o’Ef|9_tNyo}?»g®½u¢à`fwWˆ¢xmjAt…‰fXŽœ^Óý¬•¢mšÿž[d3x`I|’MŒ‚W\4Ô¢ëÓÿȰßh±´š¹u}„5¬½‡|Ë^q¹Jez8ŽÀWyµD“ŽFœ¹Hj“Jn}2pu>|nYQ`*{‹I–Â~sšdkw:_ˆMcI‡ q†´m{’j ‹{Ò÷¬—Ñc‹™raŽGˆ©nos?}ªB€¼h‘»pe<`hM€«k‡£ƒiZgyE—³M_vK{ˆ„{—x[§7?Y7cVz{u¤g•’^ZvWzži~‘]Kf4>a%Gf'DcCv¤m}¥e}«e~žREeO^sPQrPh|WdFVJ[{Fe€CeC{»CgJp“O^}9w€W_…CSnG‡µ@dƒ5Ze;l}Fe…;U„FOqETvCa|Ts‡]_„M`‹>byEtU‘œa¢—NhnEl…X{˜Ii™Vn£J^u@lƒY~‰H{VewFc|B{ˆS\<vƒRZyL_€3Gn.Ki1Ww8kD[Gf‰Paƒ\f€YZ{Pk†t„‘UlŸ`u aq‘S„ˆJvEoƒVƒŽPn…L” Y“´x§Yh‰S[yW|–^q“O^~Bi†F]‚UlŠS{a‘—^|V„¨T‰ 7Na6I_7]v<_}PqŠQn–Mr”GoH]yEaxPiŒ[lŠWg…Lbxg޵Œ±‡–à ¼Óy–«RdˆEhpEgo=PfJ_z`˜}4LW58EFVbBXmFM{Yh—Wiƒ6JjBYrRi‡h}e‰Ž_x–iwycoiQ[{PfsZj‚Kj‹On†X‚„mh|Z‡xfvSx~Bl™[]ccrZS{ScdUvc/bp@vy\|{^gˆe\rSVmELeKUeA]n;oxCl~Lw—Y}Xj‘[gbnwJ]l;[pFclAttC~†O}Žjzo§ƒcuKVvVU`Dfe:vn:ÿr>ÿf.ÿW#ÿ_!ÿc&ÿg$ÿx1”cZ~d5_„NLi\.bOQ;0][;pG_Q.Ÿi0x¹V‹žzÀ¢Sqêk˜•a¥²L„Ì|hsFKMT*e^%t€&w—NtŽX}Ap›Ts™Xd”O†lAr¡Kj‹T€xBl™Ss’ap•G‰ŠSw›?N‘RgbIœ^7]®K~rL¡i"€4 M–Ô{j¿}d“RoˆBywHc¡Om“Q¶‰XÒÍdŽç~ž¨h‚¹dsK†”K«’Z±s‡¡a{¡[jtI¨tLeW‚cD“O‰œ^°«Zðºq|¤ºÇ˜0£šXž€XštLÝcK ‹qt‹\š€<¯ƒ‚ЬdwŸq’¡i±‚VÕÑ[ë΀Üéw½¨jʬvÞÒqzÚas_Õ—Q· eÄ©k¸â‚ £yqŠOr]H–JǃkŽæ„j‰„U{]‰o6wqfŽ?^’0ew$ÿ˜G‘æ¤o³lsg<rW]•Xwe*ˆ¥;hZS|_1J8<M!±f7µã™¢Ï¸i°®X@X<ºc:’s‡S¨t µ{i¸›c[|f/:t9€T"‰nFŒi@—Xß•`¸¡“‹²k’¶Zvxijˆ[ѬO¤`Îe»{H”ò¨t›Ž®¨q†½Š¥¯cžàš~¹ƒœÞ•ܱ|ßÿ§ò¤£RÌ·šðóÇ¥ÃÕ`uDO7’W-k‘·n‘_u^@p~:Fh<¯‹=q€—‘piŽ1‰R†›x¬Îi{Ãq¡X.r“oÁ„cž¯Ž‹‚Z|œ[°lwnK{£g_–Y€ŠplªF–à¾i‰8•™Cl|]« }¢˜†É‘‚ŒU³w9À´ijšdep3‹µ\›Ãy’™h›§[Å›„»‚Ë…¥¤TÆà°ÊÞÈ•Á¸ÀÊ‘€}Їq¡žTÂß¿¾ÿ—”z”‡B¤Ì¥¢muq?h“_X𮓀¤ q‡I†‹4¨ù¨QiE¹²—±ã|žJ–ßj¨Å—Ûÿ͛؅oqcÿOÿ¥ÐlÇC” E—·\Áx„½l™E¡Y‰À_¯q• Ȉ¹]¸VušMO”®vteD¤Ç©°ÊÖ‡qy|‚]Tw3kŒ6vŒA޲sœÓz_Æ(nqY½Ü´„ÞRˆ|j‘…eŽÄ…{–PzS”Úps‘c}›k–È`‘ÍSŸ®i¤Éyæý™¢öMvš@YkD‹YžŽSv”BdwIxIVHaWiBcwf™©‡–À½éœ‚·zŸÄ~|L’ÛH~ cœÐ~«Ë•¾ù}”Åh•ÁbbšWNj8”°_¤mS-fS_‚JfŠ=bLRr)ZuFh‚Xƒ”‚u c~Ž`b{C^<g~9]u0Gd8EXDr–Y€ªVJe6;S$;H=LiQmvFMn8F_0:X)Gb-ZycPeIe†fp§\u§[…NWtOk‰]Àˇa{P|ŒAj>c‘=]ˆ@_ŒD]Ef†Lgh4m\f‰=UtBw”_ž˜np„K`u@iXdsJƒ‡\XvEUu7q‹hp‡TЇZ‰‡J‡G{Pa€UÏÉeiŠ`BV|5Hk9Mn8Oy;pƒIlŒF_ŠHj}<[w8avKmƒMžW~’WžOs}:^nMŒˆWxYx W‘cޱz|‹O^n?SkEd}Tu©Ve†Hr™Nb`t—bƒ¤t‰¥_›d… [}—Ho3Us;X€^{©Yl”U YdŽSYuZIr}Np‰S]wL_uGa€[wqx‘x_Šz†¡st¡gŠ¢Nh}FeyQv˜m™±g|w2JQ,?O@dkDlyD^}Y`€\jŽK`‹IexJRtGUdkkVixLI„`Ba]CM8OU:d`3dw7`‚UiUƒ~Xa‡cP…XtjFiŽHM’eYjUOm@\aHTd2WO9_c>[>YmSpeHYi;Jg=Q]5P_/f`:zG†™K‰Ÿ`j©hcˆctS™€Cj˜YbsVhrKhoA}YŠ‹L„—^azQTdZ|Y6w‡6„|Jÿo8ÿi.ÿXÿ_ ÿ_!ÿd&rt5M^QK\3IV.DG='^.77'5H+],Q@ shrŠL£‰hÀXh׊~‰w›•Vœ¸kÄŒŒÄ‚L°‚PfOzm(‰Œ0„°\‹¯q‚·djžbN‡^Ug=rn8‡P‘v…®d“©t»fd”`x]}‹Tuxl^k@›e3K°bHY^fB#±d;¤Óp¬ËœÓp²‹Ž‹n]«]jxUš‡Y¬¿bÂÄr²ÛœŸ×’tºf•›O˜¼jªmhœ¡g¡«uƒ£u„xBˆ|A£}L‡œ\w~{¡lQ|œz„~}€—1‹^ƒU†£W{LfXšdcjTY_6†a@exDtyIɇ>šÄv”“Ì}WÇV®¼PØØ~éÅ“¬¦ ¨²quƒ¥…E¿±w•Ðy£¿`ЍU‹«Dœ—S—ÖbwªQo¯?`S)ƒ€=r¢bnƒb†”1ä•a”ÀÑ‘o‰Ž_űUÅi˜…H…¢yf–Xnw2a‡M3t9PKˆ>“Íj£Åh_Šmz;q—T‹•S–®O~©b;wJ\_6Œ’1Qªs/G;k^©Y€“H‰‰ZXM¯] ½ŒºÎy‰¡b¿°}®ÙŸÌÈmžã°r{Ffx=^Š;m6wœYqœQ͉Z€ÔuÃÛs‡ªŠ¨°œyÕz³ÔT‡™y²tcŒ×z€qpÃR„ž6˜¡,ñ‰=‘Þxm¦:x¨U¹»:˜õj¸¹/Š˜[ˆ¤fgs:˜·P´cS˜Ã~©¯g™W|¡N„‹HV¡:OnKbe?‘Kb AŸNœŠƒ› oouW“mx²n–œeWŸTµyFdÂH“}Få¥kyÿ±ˆZs”Dx‡e©¥Mª¶a~t¿½mo°xˆ˜Vycˆ¹pkw_ ~lxÏŽ±·\Q§To~G®¿À¡¹Šž‡{w<…‚W¢¡`›½t…dCf>xb2ŠFžþ„Ùì’©øV¥¿]Öª½¤Øq¨ë¤}¨`êÎ éÿÌšÂJÿÿ§°€˜ÿš¬î™¦P‘¸”¬£d’k<ÔÆw¢¯Hº@cOit<˜¦“”ÂZt†0\g4Ÿ—Xy²a|[R\n3Lf1q¥6±Ž]Ýk‘f^tO£Ïst˜G¨·ŠàwŽÅyq½ai…A–À€Ml-sz[™¨jѱ¼´×Ÿ§êˆ®ì…Ø·M„ˆqx±H’—dµÉgz‹Z[€=oDk`0gg=™¤Ocl<jo6kifº¢ŽÇ{•À†…¯x–Ér’ÊqyaŸ¸•’Ãpy¢n—¬Q›§«Ò|‹Ùev¤_r¡HjŽYµ®]g‰1\†7XŒDl„G{«s{šZb‹JPdFl<Ki5Pm>_HlˆM†«d…¼ef„F=U :S1C_'<S0TwAUz5:[*Sn;_tFJk=[zcvšprƒfoL{§Q~œkº’‚°c’ª„‘¯gˆ±S\†A_…DJm<d“Sf|Mb‡Jkq?_}Vž¤†•¬qu‹WWsBm{Dp™Gµ`È]„¯SOnOƒ˜TgœaiP{ž[n”E`yeˆ”X`}U…Ÿ[dƒ2WxAjƒHOo9I^?Rq?dBVvAcy6Qq9gƒNzŠIp”k–Lb‚A_|VˆU|žn ¦XYpPŠ¢[‚LZq=_x?PsKn’Qv’Q{ŸKk^|—y‰£w‰±u”¸p~žMb‚Ff~Ba{On“p‹±y–±]„¡[‹²h‘em‡KZvSiŠNh…A]xKsˆRciVRndu–hjgp•il‹`€–Nv–ošÅˆŸ½d€‘H^lBe†[šŒY|ˆPbpI`[ušqޝ\‚‡Y{JQxQfrUy€FfšW`^RnEQg8Yk6bv;`„P`XRuQn[G^€Et{Qs“Ac’Ywv^ZAP|PC[ETK2gX,]q3MLUjEci2Zs@atHVj=`j4tw=u‰K~Ž`v˜cfŽe{ƒ\Ž“Ot–hVŠuQlJRb6qj3z‚6eŠ]bgN_e@YgCU`=maMÿU6ÿ\ ÿ] ÿT"ÿ`"kj%Ap2>\9<S"KY9H2N&DLM`Xr.|'`§;wuI¦•O Ñb†¿ƒh¨wqŠY‘V’µu† _`šŒ‚…iZ’7gzC‘GŸa‚¯kyŸd[–SdsIƒˆ7§Zœ˜`‡ºw¦u»nvopI„’Kr{sq|?†Pª¥]‘¾~€™\¶„JÎc”ƒ¬…oig–_~‰Mr¤fv‹F£—dÉÇt©à”NÖsiHy™0ldš“Mµ»i¼Êeáë~’åz‘¤läwIÔ´_y™j‹„_‰jF¼vS¢j§’D¨“Z›²kˆoXtaJseE{f[}x\]Qeg2»z8{ïYMw½c‰•Fº¤\æâpçÿ›¢ÿ¹ÎÆi «€´zXÄŒr€/ŸƒCå×€«ÿÉ·Ôy}á‰ÎJ¦ø³œ»x³y{n2sšHˆ•K¹•a£²ql°lŒŠPrÈg¦wX¤Ëa·µŒ°À]¬–l]ÉŽV|8M{Ip†4h¨Z]ARkC–[7’uduÁˆ¡§ToÒi¢›L{ÀzxDa©†N}H(^=3?IX®m(ÿÝ„ºõ½® M´µOoÀ‡›_k ªU¡ºl¢Ë¹¬¡¤à®D¨_Ga uy8Y Q‚w1[–^”:}ÏŠX}€¦µ\jªugR¥–¥ bŸÙhÿåšç¤zt‹z…pP|{B—^²ÿ‡³M…ØšŽ†Æ‡ŽJx›PhŽS}|8»«Uйf¨Ë`œVx…Pq‰JcvC›ŒaйCœ¥Sg´3j=bˆ<r%°Ä‘“„V¼±b“špiŠK`rZíŠUÉ煮âs«ß]–—®ÎÅ{Õâ»kœt•›ˆŒ¤ZGrnå`8‚Ñ•ƒ¡€á“A¬»uªµbp T°§s¬è²|¨z§£M©èc‘šx™šgIžTŽ~`´ÅwÄ]zŒ2Ò°aŽõ’ƒnŠ«P™Òߣ«ÿ¶Â”t¦Äa–ý§j…L±¶°³ùæ³—Ø™v¦¢OÛÇ’Ÿš_Áª|zªPÎîå”x¢cÕ¢iÿÿϺìbœd·Ûµ±ë›œÚ u”>šWsoJ©J8‚MXC±Á—„¤Ry‘€|‹PHu&y_AvG–ˆv£Ír³âvˆËY@‹(žn^”FlyDq–HžžibtVgoa™£ˆ¡¾šV9nm[?SR=W)BX+˜‘‹z‹SœJ¶e™¶Q«—©â’ÂЃ|žf‹¸Q²Ü„¼ë›‰¸`|¯M€ŸT}±GVb{Le˜VdƒV “Wq“hsx†·…‹»lmŒUo–gj‚MTˆC^qRJh@k|EpŒ[ŠfnŒKMp/OhKnEb€;m‘MVh<>^6J\Gg‡,B^%B[,Uo.Ee+=e+JmAHf)AY1=Y(B\Q`…@a‡Fj‰@ahL_Xr‹^{¢x”´€ Ƈ™ºzy¯Q\ƒSi˜;Hj.sŒ…õê®íï‚bEp^Ç¼Ž„ mˆ³h†‘^w“^…·d•ÁƒšÅz~¨ZŠ»užÂp„¼p{«az¢MgBRƒ@dŽKfsSi€IU|Et›dpHSi9\l?pzSfu9Uv3ZpE‰ŠE\oFezPhKjvGkzOeu\f…W{Œb‰‹HŠV–W•~RypBi}Hfq6RiGY|Fk‹E`‡\‰ª´‹³|™¯~ˆ¡\m;QeC]ƒG^vM\{n˜¹hy˜v¬¾r‹¥a”AbxS]x[Œ›U{‡W‹MkqJdy\o‹fs˜iy’RMl]uar˜u”¸sv•\iˆV_|g}£sƒZJfnKX}YV‡tŠœbe}Wq‰Ski3w‡HuŽZža—‡pŒ_„¢Upœ\p˜\ZZFUKWJiM6e|9]€TjwPazK~xO~zJOŒgG^T_W4e^&e|<W‡K^mIay:hzI_€JeM„{Cc—PlSzvWh‡Uw|]r‚SfŠV_€hP‚_WrHcf4ox7SŒ?HsQGN5HL4=V?MJ3c\*ÿf0ÿi'ÿY$ÿT ”V d‰5UB;o/D['SX HRLV%Mh&j_/˜‚5®GS¢jw\Oˆ‡I¨§_”Äzf»Z‚eroJZRVoP]}PO…Z?kMsl@ƒ¡=¥®P¬ÅvÍ“jn‚ŒVœ\–´q¸›‚ƒÓšÌžŒe¸d|‹si‰Qˆn8©~en‚[²[TÓ·NËë¬Áç²aÙ¥ˆ|ªsn¤†\’NMrM›`MŽ·Rm±~¥‚?x´hm…nxŠY•‘?ªI†I¦œF‡¹gÀ¢j›´€¢v³¤pµª^·xž˜}†™PvR›pZ¶•g¤Æmx¶WmrkyVEZu@‡L2±wB–„W••VâŠB‹±t”˜lÅœ¦’â¨o’lŒ‡\Чh¯–ŒèÛŠ¨ü̹¾‹žÃ½TÁ†}i:¤¤TãØuæÿɋη¥k‹ƒ[§„\e«v‹’:¨¥Y€Éx˜™S‘—R˜‹V‰{\“‹n›Îi‚·ln”lpoX‹}[–»aVÄZor9‚ŸI¤c¯p…«…{œh‰žVO…[Ql<†“Qog{—›<™žfšµf„°X2©[2>>8aN>°“YÿÿjÀÿ»¯×ª©òy\kCS>‚‹1˜¶_„¨ƒ_‚q_j?\yCW«D\t8q”>\†Lˆ™;ŽÆfa¢N}Ž*d“ayhA¿‰tÊüg¶Êq¨Üm°Ù|ëˆWºÿÀ€^f•8“¨L¥ÜŒÉ‚G¡Þ‚¸bOÊr¬¨‡iŠ`ކ7²¯HĸƺeŒ¬w|/{P/X†A©c(n–iЬ”Ÿ\w~Kr¨Ožœf°ªeŸÓ’~”L¶›[^L«‹3ÿœ{ž†n…âv¯Þxt¡V¨Á™y™au˜AŠEuhCsƒJ”L÷«mq€R_zRš¤Y‹’r~’žÁƒsŠe¶¼ƒq˜Aµ‘T©¾}€”Z^]Ž€Q±‘rumEÁ¡xhV“x޳oGj+8?v@VÀ½ŸœÌ¨½ÂÈÆLj*|9¥à‡rœXžÝ‹ž«_ÈJ¥ ~»{ZÿØ¢´ÀåÁW›©q‹|6p‡l•P‡Á?b0g„LU‡PM_:_~BtˆIx©:—L™†w|P¤¶|¦ÇLeœ5yƒ<rŸ>loXe.[c3zƒPM<Mg*znG‰JŸeŒ¯[èòÁÉĨ½\X˜5{…=¢™I†–mAgRo/Qx3…¥QŽªsy†Q—”YØÓˆkmPqN˜}®gŸ¯z¥ÓxœÏ‰“®V|zJs˜HXq:»ˆa„YzŸPu…]Mo)i†K`rTQh?ScQG[>dvau–OokFes2Of7d‚:N^Gz—OZs/G]3_ƒXk‡T]vHep+=R/Ed%NoCw‡Kb„9>b3@J4L\0G]2CY%@]$?a*;^Em-Nx?]~b–^k‡;8U'Ka4lŠv}˜^޵mQpDg‹UŸÀÕGZlgqƒz½ÇÍÁÓhš¿o”¸……¶xx™awŸaˆ¼”Æ|Nz]^tU~¤w–ÍŒ‘¬e‚jn›h²mÄq„µPV}5k4B`<q”r‹³ˆ½g_…8ReDCI.HZ6On7p{F`q8qz7Pj;Ql@y}Aw~@q€Iƒ…BvƒU™ŽY–eŸžc ŽLZlBcqNdb/Zi>p‡MoˆKi”yq¡pq–s…ªmx¥eoŸf€“>GQDpˆAg|;]yj‘°f˜¸‡²Öu£¡mˆ—^wYydj‡c’aƒœZ|\‚ªr¨b{‘a’CR}hµq‹›r•¨g£Mg~HHlkŒ§s|•anOsWn¡[jŸhz—VhxKc{Nkg5nvAs‚_d•cˆg£ˆO§³_{Äa¤…_†jGrUQTCkT-`}8P|RY_G]d4ehDxo>j‡PatYak>jn.W†GV|Ijk;c|={‚V’Qo•Y‚…Tw‹Gu`ttNizKm~N|~M]”NX}^_rCfo:vu<†‡Cb V<’jIZE<R*;L-]P&w&ÿ?ÿ˜Iÿa3ÀJ#FR#F].Tb9Gc94Z.JF"NVI_ 3`/W@+Ko2Ae?7[aU;/ˆY)¤ˆA›®[P¸x6eU>J/DY(ƒ_2†œ<O”]{iD€Š,O—\£Še¦Œ]sCfMOHEi[RŠyWk›u¨ju‚¥V†¤oX‹Oyg?c‡;;k^eK@ª[#°©~š¯¨m¯žƒ_}§Nx˜XC“WcfJtˆ:kŠG|€uv¬QÆ–DƒÂrj’M|y>t€?|…8šJeŒdL«£a€´t³¡g~¸b¯˜V¤™lµ‰[¨^…¤\Й_¤ñxÓv˜½fÏŸZÀëy¡Îo¡¹V“¤ˆ‰¸Œ³Äu{·gU€OecG‚E€´qŒ—U°–K¸€£Ì‹~²‘m•Kx|yªqy™X D¬„{fjagXNŠyA—•c²ºV‚²n¢R¨Æw{ʆ¨`c’eaw7xk<†´@rªjxvav–@sŽV£šAÍs…›m€eˆŸ`x€“¯`ˆ¤lÀÀh‚ÓdnšX¹|L–¶¶ºI¾Ë™”¼‡lXÌUqv%lËIƒ–;ƒ·D˜¬k_¶¡½oN¬ËvšÉZœ¥mš¶c’—p^¥T\€5S].€r5’Ãgv˜cX…Am¡6‡`Dk«]^ÀHm”PO†T>yº%Ó«p®Ê‰ÇÎ~‰Ì’š¾w¢Îl—§mÒ?ÎéX‡Ø¼d§g–…J’ŽV{£†Š‰i˜›W[‚c¾o6 W[²ÿœ—Ž^g’fyIy‘=g„<—l"WeAhwR|oA¯¨k·Ä³¿¦c–·O—žy§€fµ»ƒžÑgÿ‡tÿÿÙË«¢½‘c¬¯vpŸ_‡ qlŠBŒ~C…\;^uLÕy€·™q¾—Q‹¾V0m€vo„7v j®~Yz¢F™Ÿ•¸Vñ£{i”—`‹ƒ;|ŸP„”I}…P™ŽGެx{’Jž•qqˆ?rt2‚¨CdKzžT¸›`˜‘J’¸PÑÏ©°ä¤s¿k—šfІRÉÈ{p¢R{‹u”ØF«ÿ™·KŠwJ°tŠ{Un„dz‹ONs"aY?BE‚nLŽšIc‰3]zMMk(vk6h}JtUu¥µt—É?³Ì}Æñ²½¾ŠkÛ<Pt6kwAZŽ0nh?–ŸPÿΤ•Z·»‰\{oƒwu˜OºÌyª©jIg<}R…›q¦TžÞwâ²J‰´`z™L‚¹O}¯MˆP™fw•Ko|d†jq„q‘¡^Y€7ilMˆ`R|‰Qi{RBg+DoMr'^4ƒÆIc“2Vx0\o5b‚CMk0Cg(D_%Jn.gMy“_Ž´”ªfy¬SW‹3[}Jc„IO\.A`+AT(Ea8cnWZ~8Tt/cx-Ol07H+Tp4Kl/NaA•ÆYÊZa=VvYxcc4Z~0Kr5Po@tŠs€—]iˆ;b|E\xkž¸llœ6]zDJl^vpЧf„°l~±tÿíz¸à{…¬rwZd„Eo‘a`…a‘¯eKk>IpSw¤zw¢x…´|u®au¬PZzBb—c‰¸€bzt‹˜ƒ}•X]g+CU!K_6YsJvŽIjŒAl|EZq4TvFXxHƒYš¡l–”Gh}RZ~tg¼w˜]v…FytBjl2eh=jzMugp‘lЉZŠ›i†µl‚²hz§ihŠ5MTJhŠPbŠHpm’°frŠw¦Ÿj€Ss‡m¼}¨°]}ŠekŠ`hœ\g‰ax¦z§m—¨rˆŸ\y˜…”¬xxpx“a€“D_t2EhZc†inXdQlŽjvuŠÁiv“PQbCXrUVpNdtJ~‚K}©Vy˜rŽY„¢\r£ud{]‚dIrHgY;wv3b…@WxTgjIaq?]xDfpAblKiuKXxEe{F[€>\qBlt8n‡Bo”co’ed”^j‚hpwM„uK‚|Jy|TwˆZ|ŽR_’PF|eMX:cW5nl:˜~Gº›RqÀ”‡sp—HcŠUlp?mt6ÉyEÿ–TÿbF‘P&ks(^ƒ72{6$K1#.U*gdVh*5p:DO,Ca0D[/<V8:K#^J!Œj,Ž„Og¡tPˆcfn7o1z?f…TcqZP~E1K.>DBu?1ƒ‰hh¢sC_6XEgJ ‰Œ-§°\VÊlal[މD²«^iÌt`”‘E vvŽi]iCYp@efEj}I|‰Ho—Dn’Nx’Id¥LbyBŒƒG}³N] T‰ŠP—–>›‰Ve½Wk‘YxŠ5~”Fv˜e^‹P|I‘Žd•šS’yŽ¡j¡‡W]„¢Z‘‰b”´Z¡Ê}žË”—«†¢È¦Ñs¸â~Òœ³œoÐâx’Ò–oŒgmvCd:’‡:•»rˆ…—§f¢ÇruÑ–„ˆSJ…N“g5‚Îpƒ¥€ƒ«h`~VQQ8xe8_=Ñ”6ÏûŽšõ‘‰Œgh±q²yrš»vœver@g:kƒXŽ<Š’lbDmO¼Ö[fÑ‹`Ot’>l€XjH{•W€viŠp™„R…Æ{a£h¯‹.Œ¯]w»dn…`…«KŒ T¬«n–µU»éq¡ß‹‡§cœÞ?}¥d¾{Pçkl\ŠNØ“M¸ìt¨Šné¦_ã·]ÔÑfmЊjw;“™;u™KyœAwŒA…¯]{„_lƒNa†Q‡•6ÁÕcªˆ|{i²¿fœ±„¨k¿Óc˜§k‹©gˆ¸‹€:‰Á_€²|Ù²\š™CƒœS€”M´·JñÿqŠÿ«œŸQw™o‘œWv‚Y›E¯¬Y©¹‰ŽÀp†”F¥ºuÁâ¤Óれº‰LŒ”‰È±w·vÿÿ‡Äìæ|‰XÒ>¸[y¼}™šBTZ1px4Ž8ŒË{°s:rps”˜R»Ã’ª\ÿy;¨ªc˜ºl¦·z¬x³Ðb‚ªq¤³R¤½Z¿Y€¥O£‘F¤Ì‰˜¡nbk6 |˜»|›¬KYÅu«>Áǜϋ‡~2³´q’¶te”Tz8°’V£Âœé—Z©a~~=ÜÚ¡˜ëŠvv;ºÃÐÅáÑz”aǾtD¥.lr<g€T”fG—‚l“¸L<g%MM!Zd/[y6N~1AE;äê”Äÿšh9 £Qÿ«ÿo]j•„–’y‰Ám€‹u€H¦ùpb„Bš®Œ§«bYŸDN[8=O$S`Kx•Ml‡_gLl·>{ƒUzN‚´jqªxreS©¼~¸£Põ`°¹…§«Œ‹L|ƒSo†Hlv9^p?sy=kpcqHpšVq•Kƒ«Pgy5Sf4v¥_¥Çˆ©á†–ØgZ‹ASgDhŠF`x5[y@V_EE_)TqFY~Dp Wt”XŠ·Sƒ¾T_ŒQ[˜3Oh:Bh0Tz@Nz9Ih9iIœ¯s`<V{Ag˜=]•D]pOluLšÅh“ÅhQqEjŒQŠÇRfŒBMYG›¬Y“°F¦C¢¾€yœUl•@N{2j{Pe‹xmŽ;^r8Ml2OlGs‹Ur’[|ªâì‹p‹PQzGOjD`‹O‹¢Xc‡ZoOqx8O}d¾€‚°gv™lazWOmKVWx‘‚¨SaS|™UO`D]t?Zr4Sj3_pc~ŒZ{•G]€IUvLfƒX`~QnŽj§t†•Qz…Vw•ešo˜Ä}‹®fs‡KyQ|;kgAelOgzTftFd_OXpkv˜r‚¨nqœGg€QdŠfŒ·kŸ¤y~Ÿ^n~Xy„V’–e“Ÿn©xlQ_€Wu a€ ZwœUa‘]w¦uŒŸo‹µmmŒrx—X[tTq‘Uc}:BV2?XBPtTc‡UeR]]s™q²‡£¿[‚žMdmPkoP|€>ŸGh¬]upb‘]f‡\nV_xTN‚OQqFoZ4}ƒ4l Qjgi{Vz€Qjed€icoJoHzuA„‚Ly’P†PD¥We¢ai~n\…Pl}UrrCy{PƒƒMlyOe€Se}QauGBqMJ\?ga.Wn1|\7¸vIƒËs–¡“—žjb®~Uy]Zp;–i@ÿ‘Fÿ‡V€O2jq0j‡EO‹K1vR/P/k9kƒ(cf>R„CM|JLr6Al6MX&]X'Tr,Dk;N\8{lNž•PK¨a)OOB/(`Q9n]7Y†@A\I5T3t<z(–²ssœjr›vç‰8Áêf ©‚g¥Äj¯ËqsÍŒ„s§‡O|Šqzwk wL¡£O•¬Nb¸p‡€U|Rf‡nd ^s‰Z¡•9[¹j|xhv—QƒœJ¢„B‰½hjµ~š™P‰Ägn‘^WƒRer=r|GŸ‚Kš]¬ f§šHŒZ—•yf T…~G’¤f‘´yy¾ˆ¥šläàqpÿ¿¶{‚ã³T‹Ë… oxƒ¨]tc‚¤V€±Hw`g‘qt‚R|šm´ V€³e°\ÀMpÌ„žš\¾Ëxa±}[{4ck1UJ\TWƒjk‹ ql’qpˆT‘|Li¢xxRc¨ZvfJyŸRª•U[®~hlLÌ©EŠýs¬„¦¹L—À‡WÒ\Xf:Qi;]h/Ub;Yf4Lpg}T9{ˆL«©c†ÁpнH€—av«k“¶K¢¤T–æ~—Âs£hz‰LŽ}HÖ‹{‚µ|š£Vwˆ8Õ˜R±©³iYŒ‹p¸|HÆæj³þ£Þ¶\´Ízµ¤b—Ìuä´bx¿jd‡?pB‰ä=p w•—eŸ„X¼§r‰©u}€bs€?ÇUÒ…r~UnĆ}…@êÆOÛ´“çÿøuà}¥M£‡Cò¤r§Öнà v“Vr‡B„”A¡º]ÂÕ«ÍhëÉ|ÿß®nž”Ï„E«ÿϸÿšm·T…«Oy~^æß{a¡DɪO°ßÚãòn³ÿg´ÄY«¬…zÿ«ÚBËÿj„™FÿâlÆÿÙ§î]›Ôb³Éˆó®ƒ–GÞ¦]¯uxšjtƒQ¬‘¬WKTcB¡Š}m‰z‡”s`ƒK”fz¡²œ^b4B9"qYÁ¦ŒˆŒmj9}Ÿ²†—B™‹I¯ì}“®D®È‚ EÏîvµæ£¥ó¢¨Ñ~Ž©o¹te|½~i{Hsn5_ÂRzd>žºsP¨AuW|™>†§NЦ`JGBIK ]V,~pHˆ¢YQµ<@[ë«·¶û–gŽ)® Q€VN{ŽFiŸOhd5u¹-kw/¥Êé°‡†ÀJd`9Ìò—ªÿe]•-6h.J p~Z¢Ùxv¼Sfv8•`¬Ñ‘m±kYp\iF}paž©yvb€¤IzvL²¡ewŽN`s5–§R©à[µáP†˜Vƒ‰X€¤[s¶V¥…|ŸPÏòНÚÊ횘Äw]‘NGb5\b:U_IQzAQ^,>T!NZ4Vs7€ŒXŒ·r–ÌsÁaq¡SMm@Qe6Jd0Nn:^vJq˜`cˆ=‘hc„Bd7e‹B€ª\rœDQp-Lb;i‡_X8Sz6u\šÙŽqŽEUf2@]*Uz;f—Td™]j‰T{”a‡£n‡«a lwœa€ŸOPw2Tp8pyPXsFx¦g\}DXt6Ln2c‡BŽÑ]É{šªZ^[…AMs^v“w~ph~G:W.>W=RgI_eRk‚_y©max9ruOwˆV{t@jc5alSovLtwF]j¼r¤¼hw Wk—lˆhw’Ke}dz™ljw`y•b…‹[€’UnŒ^—…Pp„>qrGjvSzˆFvtGkoS`oQY{eq‹g‡¤jzœcs”w§¨xŒŒ[fyPe€[“£e ³r‡´s—·k†§SsŒOe†pp•t—Tg†Qr¨iz _zœNLdLd{DZN]q9Tf&4C.9O=UxM\…PY}ak“[h‹ooŽ‹Ã|Ÿ¯QnV_^W€m>‰Jj¥_n‡yRŒUCpVM^<\b6Py=Pm5zc(†‰5r¡[lheˆc‹z]zšbwŒƒ[y]gjOuk:ˆxIv€U€{Xy‡Ex›Y`™g`l\[|JxxIqv@j{IkxPhKjwD_Omw?pAjy?{‚H^ƒ>wmCŽz@w—Zlu|{Zy“_wjY…H‚mEÿ•Kÿ®YfV>Tb0zf=ƒŠ<‰œVb®M“sLf±F…iO‡¡@‡µ\o®iR™ZWy@Šk(˜‘/“®cr²Xo{ThsK=n[@6G\9?ZtN.p-9ˆm0A0H:k["yN”—R§q¸¯ZxƒMŒrj_‰Y•’j°pŒ©\®iPaEJXBsN:—rL‘«k•ªmh¥_[‚Z_eH‰`Hh›MŠR¹”;ÌÆ^ˆã`µp‚zOj•L[}Kf]PV|Nƒi7~‹Vf}Vj…IoƒFe†Až€IÏ´NÒ‘}ªmƒ†OizRŠ„@…Èj¿_š²k½»f÷‹’¬‡ÃÐl°ápËÆeqê®N¨ç}kÔ‰g{_“–Q}©aŸ©xmÜs™™RyÈQ€«daÌrÁ‚OÝâq¹ô‹·Ä€§Ùs{ªt_šSY9\j<\k'v+rAs”M‘ @²ÈY…Ñuy¢`q”NXŠJšfGWÃs©l2¹ÿƒŒÀ±©°~«É‹•˜£„è‘o¦f_ze»l3i“d|n>F”4rc dD’d7ÿ’MŒü£€™Bmˆ.Ä™a¶ÿ~•ͤ¾ h³}eCyZ?°{GÿÈPÆxzŒ[Â{E‘~Ъ\õà”ÿÿ±ÒÿÝÒÿªÐÿ•ÕŽ™`LÉÜ‚¡ùˆÿµFþÿ´ãÿ¾ÁƒV«É}šÍŸÞ‰ Ç]¡ijŸT|i)ˆvZx„Or©Tj™CŸ•G}›q¶‹fgÿ·Ww%–€#¬ð¨o¶w–ªr”«^¢¹O—²^µ¡u³Å…ÁÆ|ÛÛ“s¡S…»]ס` È“• Vˆ¹^ª’Mÿ¤læÿÑèÿuN¤ˆitE’Ts¶žåÂxÿÿöÉÿà ¥¡Î✪¡ƒæð »»–›â§~žaù™Rz¤m…”{íˆPs˜iÊ£X«ºUy}ho¦G›„KšlHsDxnN•´WÎÄHÖÕuh9`†kŸx?~²lŠotšwQ¤I®—Ãߺ¡Þ{·´Bž¨pžŒ¦·´¦©£ˆ„bD|3–“Kƒv`Ÿ•o”<¯¶eˆ°M_o3žµŸÍÊw¼ìys§sw~S\Ÿ.J[*H<"GtóûÚ½ÿÅpˆ/•Çr¬Ä‡°ëŒ¡ll—¸TŠªy…`¯Nv“eå´f–µyÂè¾Îˆd~?ÊÿžëÿÙž§zŒ¾r‚“9{ªa_€kti?Yu6€C¹gq¬U{“]”»\a¥>ˆ…]²×¥ðÿÆ[w‚MææpÞþ€™®Òܞ_|Df‡A‡¢f‹Æq¯±”¼fž¹”–Ø‚«udŽJx‚\V”&Mt4Tw.]€0[€+Vo-M\9|œv…®bp‹Nm‚^pžPOn:av?krLS^"Td6…¶Kp}sr¡Qu bUv@ƒ¡MxœOu£l‰±r©Jˆ¹i…Æb‡¼^x±VRuiž¦ hwERn31G"Sm<k–`g–;Mh=ŽÈg‡¦jž~¬moŽOc’gs§AlŒGZnFrLX}EKk>d‚>RwIr[j[c~]XtJn”^fŽIB_>QkVl…\[?Lq73P,ScQ’°Xn¢gu¯_…¼]²h‚ˆQnoXteAP[7CX5J_:Sns_wYYp^r˜V_‚bs‡ix“XiyKkMOxIi‡Xƒ”`‡Žb“§\w‚]ƒŽSlwRuŒXj}Mi}BcyNfŒF[€P^…Yc‹\rŽlvxbr•[y~@tˆcŠ—e‹¨rœ¼ˆµÙ—©Ðƒ”¶\d„IRpSsYi}K^}X}«o‘²Xdq4>a?QtCjJeq8HW+>^5N|Qr£]s¦qx™bv…RfyXbuvq‰^g‹Qc^X`Klh5mŠ@p‘Ydg8Q6_NGP+Ne&Oc)Ui-mb(‚2ƒ”Z}™fu™lxˆgWbdflRiR]YDhi8bj6vc=€tHqˆPnŒUO‘bLmVOe<emB]m@XfGrmFz‚GrŒMdLs‹QjŽLs‚SoƒT^LreMŒAsNp—\€ƒOw…CsŠXt‚Pv‚X§ŽNÖ‹HjmOh‚=„†Ih•D}‹]†’Lšc±V•‡^‘¤K€·mv–{–gU°fIZpb0{…I0Žf.GUL8'@R&MT-\`Sr(Žs.u©B2…{VD.IUHZ+uT4w…L›ˆY_¤VXj]~n;‚•>… d’§W€¿p§€‡Tq’V»t=…„G†{JŒ‘C—Mu~OQ‰QjcCr/…žNd“v«=é°cÄÿ¼aÚÈb…iV„>doCYy:€o4s<\rF}qQƒ›QW£|e€A¤wM…ÀpŽ…ubško~Lv†>}DŽ h±so³pŽ•S¥¿}¨Þ¯¹ÒŽ‰Û¦žˆƒ¾w¡_Ç»”vØŸo¥ao¤^T´s Ò~’騡´i] zFs~pV?uj8axUŽlCã’^†û‰‹ŽZ’¯]g¡yn‚9s…K€BØçXÌÿ¬Êêåÿ—Öý²Lô©ejD•Œ=£ÜbвUXÄ¢‘„isžj`‡j¸¡H‹ÿ«“¨q°¶zƒš|€ŸI[x[X7x‹Gy§P\‘E“<š›|¦Îe‚‹Z„’?s’‹_Ÿ_k˜^|–Qÿ¦JÓ猯§š toÂŽo‹XvCÿ‰eÃÏ^‚¨WžnС|羜‹ÿº†š~³Š·à‡ÀÞ‘ÿî©ÿõÉÿÿåÁÿñ¿ŠWßöŽÞº™Áš‹ÜÖl¥y×€JzÖ\guGa6gÒe\[iˆ>m‰9~’QФ}^Ëh’,{«=b¢cXQrrC“Bz¢|ˆ‘ZjžDT§³µwPëñ”™Ù„KÆÉ˜ÛµP½™‘|SÖ”ZÿÆÃœÿË¹Ê‰Öø—O«Wf(‹²yíÑã¥Â‹ŸŽ;‹‰mJ~[Œq:µxLŸæqƒE¤÷[z¨jI`0ÆcNd¦QŒ±zŽ®S˜Çf‰ÃbŽÈh§ÿ¦j¡S|›*c¤:†QÄœn…¯‡}…0€¸¨itNp’YŸ¤W¢×Œ¨KZi7b^9cª9yPw§I‚£HrÅY\l+–‘Vv zW\8}j8Vb)X<@†’?Õq^Òôm±É{~‚Œ¢¤Jf{DÉÕ©µÞ›¤ÄTMV;B<6iWU—mb{ºz‘’W{µVŸ‰a}º_ÂUbb-mxHµvgr esv[Œ§|Úÿ¯¼¯vçÿ©·™©Åv’¨…¯²€t«Lq S‘©|jLwoHn YosX`ªIvkZ½ä¥p¬O…¤kœ¶c˜ØQœ®IÖà««Ý„]X6Q?hVQWs.}†jo–TÒ¹¿uÌRŒ¡x‹¤nÀmx·LH~.L_>ƒ¢\T…6j…O Ì`¦Ýe«?r7‹·T€’WkˆO_pOUhBVs2j‡I{”GŽŒC«µ€„¯q†¼uµvl–Rs¡U€²Zy¡dŒ©{˜{”f…¯hx no£_oŸfw§N„‰Z_w0@^-JX6hNaŒ\…µR‘´d›Î†ƒÁWc}`…–_g‰Jf{†žÉ†{¯\gE_Sp™KbˆLdŒLs´Qb¨Mg¤EMw=EZ0DZ7Hf4;K1E[:TZM`|TbLd”BQ~O‹„^[xbƒ¶„ÀxlŽVˆ•U{ƒDerQ}ŽM{”OMx5ObG\n7MfBE^?Y|YuzWh[k€D^€Ek‚ar‹du`¬q ¨Sq„Q{‚R€œ_hpEn|CdˆI^šUc`}œ]u‘UdxXƒŽPRhPxœgœ¥\ªz¢£gˆ´zžÌ¢ÓüµÙ~‘»cqŽCVw]nNWk8PsP_•ff…EB]7i–ZjŒbƒPhy?a~Nz¤_„¢d}€’À‹˜°[omJ_pJ]ƒ_s›Uz’Mq‹R}jGˆ†4n Ge—U]UAGYaBTi0Hr5Lm9W]3R]<Nd<‚TE{ŒNf™ueylL[^b]k^3py>iy@TkAX_Cs\6{x?z”eUŒnMskLa7]_3\k5fyF`„OjvE}wQl€DbYcWipNp{OexMteA€<m…Dg…W[ƒGhx?€~?‘€;h®Yi‡Z‡m7£~A«³Uޏmv¨jr|Ytp:Œ„;~[WvaSaFfrZ‚Z ]w·hd“xYHj‚EzA}Š\Š>ˆ£AyY‡•Py¨Xx av—P’s˜¦Kz¦OY|V{t?w‚D‹xHxO’nS¤£K–É“¸~§ªŠ¾„x“”‘„P†¯rŠŽT¡U·ªd‚Ëce’fuUQyKc‹Mys@–ŒE…©jyƒUƒ{J†”n…¢†^¢qU€W:xD]K,k|3‚}Pš>©¿E§àeÕˆl–gµƒVhÎtou`„}M«EØÌVuò˜SŒW]i,I|IpU;§F†ì†Ä™Ám„Æw‹µc{¤\~Z£•_vÖlœ_b’_zIÄÎn~É–uvf®Ÿ:SÍ{lR4jjChwD`lb·l<ÎÃjƒ«l]vORnP‰r@nd?¶€B·Î‰¸¼»Ý»·æõÌ¢þÚz£¤v„m†ˆ€äÎ^Ù¨š€v£`s¢Z^zL‰K¦ª˜µÂˆ¾´‚_°—µ>LwYle,’IÀl²btŠX—xK–«YÀÅh†Àj?“ˆKŸˆR…–^³¤>°ŸvÀ¹a”ÄTŒ±l·•I‡½S{–T{’qŽy=n‰_w}JöÌojÿ[¦<{m3Øé~ÄÕ¢“ªxÖ¨uÿÿ²Þÿü½è•å°‡Úî²”ÐÃlpwU›¢IyšNp•dxo6 ¸kg`¬‘@£Ú·n–ku|Y§š]YxrDŒ¹I‘¯Yb‚m•z@z¾qƒ‰P‘ŠZÕ°ž½çb±h¾¹³„“y…¡Uѯf”g‡Zo’IÁ‘^¬Ön£}R~g~PŽjbx—K–˜FºÅ{¸~Ñ™lq…hq7{.•é^f•c¦—w°oIb€5ŸZ0¼—H¢šU¾ÅlŒ‹€‚¦—¯r‚«M Íc¼É“—Ò‹² l¤Þqµ†“{Yg8``?w´ZWŽPÌ~gÌï”yÿKgT˜xеrh†o¦®l¥Üs®ßhjIEl;i_7Ue/Xx:b‚ ×NËÈSÆ»‹¢‘–¨{]ih/Érc‡|„«¹Ÿ»Ï‚vªM?Fp[J |œYl‘<qž7txB~fL{|T“ÀdZt%‡¢b=G'EN/XcPSpLJZDksy¨xžÌ¬«\êÿ¾³á™°Ý}½äŒ¯èo„²[uwIP1h{[bx<ª¹‹»\yœU¤¯¦ìÂè®Øˆ“¯bk’^c}_dgT*HGX&Ee+fxPu™dn…LBh,MfGmvhi¤c|»Q‡µUޝ~¡äeеqºç Îøžypr–~…—\v—J[„K T™×c¯Lºg–¨h‹¦cfŽIu jd„Zi…Vˆ§mÃy‰½w§h³XmŠ]i‹Wm–NT‚@f‘Jb‘OLf@l…Kc„-Od6Jc?ayMeyam¦Pˆºmuˆ|²®vQj7nŽMqšOwˆooŠnTvF\wJat<^yI`tFk‡t޽‡£Õ‘šÖrvžPNg2Gj4I\(4D&:I(Fc96H>`yao”_nFTj1DfBr™swšPOfBj„l–¼ak‹fpr˜kk‘V›•ISf(<W)@X5I`CL]6p‹WYh3GUG`€Ya|Uc†Tt–iuŒZ±eƒªe–Æ[q‹Op…Z‘¸a„ªV]zPhSMmA[nL‹€BYtGoˆ²ÎzšÒzˆ™VrŸu˜³ ºÛ¥ÎÓv™¦`… Ga…Xnƒ>Xk@bZzXb€Ll…Oa…ep›c˜`zŸXpŸ\dˆLayKOlkX€—™±cyŠZаjްu‰ªkhŒF^sG_Gs}=jŽL\‰VXsMZuChvDmƒ@cˆFLK@V?BP.6M5YG2md'I‰Rkd_`qAb~Ttk>fƒ;\tHQ^D?`<`I0Wn*YyW\pSVyPZf?jh=yr5pVFŠ`F]F\L/ad/]mIfvUbgCfzIPrGPaAeb/sz5o”Pe˜Tp}Dh3Œt9v“Ou€a{@±w@‰§Y\ƒ|Ll[^ZBwq<PŒFEvVXTCuY0„ŽHŸ‹P{²cX’uŒn]™¯T€Ípb®qkl €Fƒ¹dh©s†Œf °i¯Å{sÏp¤†\™±ghwulyI[Lx{MLJAKT™90¡Ÿkl…onsŽ_mŠpl‰@tvEŠˆKv‡bwf•`d‹^}kG‹ˆEœMp¤Uo{D™…?w¦bnsL[tEt}<•™W[·yb€Gv‚1RŽ>erK•2ž¹S¿‡Œ´–Z¡w‚sHh”V‹mN“€Cq£crqHŠ`NŸu^s7U|=Zk-®‚.§Ì…Ù•ˆÀw‰Ä€Šª|B©mjDšžM|ƒ~tr™‡…‹¬°ym£{VEYz9BWXjT(b^/Œ_=v]µ™LX¼‰»„_œ–m«¸L‰Ü`Xƒ\˜z3€™\„—t¶¯| Ù™my¬|‰^[œdˆ|AÊÅm˜Û©¯{O}\QjH±‹9xÓl•‚?Ž£s_Œ`wWCrlB³šCªÍ’µlŽ·„k…n]\_yi1›•G¦Ì_{®gvŒ>`vB_w7œ‡+n~^’z=ÿ–k«ë£š—…¯Àm“Ål—§`–°Sg g{–Qj”NÑtkõþ¶¸ÿÀèæ…Áõ“˜Ê©aŠR¸¦5ý–}ÐÿÒl°Ž°²UŸ¹k—ŒR¼¬d~¤SfO†¬L¨’G¨ý…±Œ•ƾ¸r§ËŠp®Pf”BzŒ2R¶}‘˜-ybÿ}m‚HuJ‘i²‰’ˆW‘“J£¦n¡¢aÿžX¬Î[“W€‹F¥{C¹•@o£Nh„;YtK~ƒ;=nFGU$GM$Q{* 5wšLºÿpw¯FJD¦Q¥¬j±ˆÆè•ÁÿYûl”¬iŽy¥ÀXz·`“uΩkJ¢c~r/Àï²Ì†t®¯nŽ:¨¢1[œUñ‘[LÍvza;xcPšqB‘ªqNr=jb*›l^¼èª…žy‚`kcOiwC”’<°°S¾ÿ”z¯t\ˆ)‚ƒDb{4Š¢fÕÒ¥éü´m™qª€…UŽENe'Œ‹bÌžmÛ¤îÂzÿÿÍÔÿz¢ë]â§žŸÅ[{£LrA`9€dC®Wíÿ’Òµ±ÁÖ¹n°_Dc3db/´•_¦ŠQW°E<J.‚‘Gbš1Ø´ºÿóÁ›¬r¡»–gŒ8–›©Äö¹«]t¯^•¢ƒ¨À=ˆ‹…•x¢R™»o“Њp”GQ„9Od=T^Am†;o©VoµBK`%]dJYu0˜‡cF}.E}-=O&ktt}ŠŠ²k—ØaŒ¿ƒˆ˜‹Úõ¯Àæ‘[šN€ Wv’rbMm–P|¦vŒ¼y¸}¢ÅŒ™h‰¹hv‹c_|NVu>Qo7]ŠYj¡_uœDd‚m¼É™ÌioŸ?M[AP8ƒŸZe^n’Lsj}§K|‡X‚¦VrUd€W{ RUx;kkMŒ‰xj„A¯ÈˆzŒNm†MOs-Mk.Q}7S}Ls˜Ys¢Yp§Yr§h~ ……§aZkO^t@^v>Uk-F\*Nk5^Š15Q)8H2I\PtyKZn7SmA[{LLe:I`An‚|©§cMT?TrUdd}`nˆ;HU3Kc(>\,Pf3OjG^~Wb{?]mF\…Te‰N|Ak^‹p´ry›z³Õ‡²Umˆl‹–s€ŽOTqGv‰Ng‹Nt‹X„‚Rz©m£¿£·ÙŒ®ÊtzJeYt¡znyQnt[v’Qj‹[jIuZ|¬{‰Ÿiv–Qg„=SwZpœcqŸex¥q†ªZi;Gh2@]?Cinklœls¢tušfvˆPis<L[DqŒT]UMOTnCYq?Xs;Rk=Wn7YsB>mC5P@,@-6;(`?!]b%ArAO\JXd,PyD<e<AY6FW7ZN2j`-o~7cƒChŒOjOa‰MaHdxCf~Fi~CH„]H]RYZ&_h+cuAZVdoRdf<Ps@`kDƒo4~ž:m¦`mV|~D™‚9–‘CxN€€S£†E£•Fb¸rK„v[fEqd.‘‚6ž‘Lx°[‡ŽWŽ‚LIšl`\fmtINƒWkiE„{:u§e€‰d•šY¹[··e³Ê‡ÀÊ‹·×y˜×¨\̬C}}=[I†JFdnG\~R]k>ro?Qˆ==UFO;!k`(Us]jlO„yNyjlŸ[stD±‹>‚FŒ–a”EbŸWswH†z8ˆ˜Q}Tƒ‹\ŒKµ¯U´Ú‚†Éo¡žW·f’蟜’œ”H²²Q—Ði€½brd ’`¢¼x]¸‡w…U D›žUyÌ`–«}‘\ž¤R’Ý[‘Êl§kp°C–~YÄ`¥ÐŽÈÏ…sêQsjgu.A}4OC<kZJTq3X[U§u4ªÚ|•Ã’–ÈS[Ì[Gw-PP.al9sy4œ‹L´Ço±ã’{â’t’_”l;‡ÂfŒ{er‰A£“DµÁ]yÀ†@m‡I\3”J;x–‚вH”°fW¯h|Rd]c/¶f·Ù†ËÖ¤”ò•c’btl3~d<£]©“lÕ¶_½Í’xÂnooJcl<z{8u™Xst:jv;€k=vrEvŽ9“³M–ÆOÛ¶N’ÿµ˜ŸqÒÿ|x‘ˆ’›Ys¦fOoVG|3Kk(Qn#€x-³®›¼uÇÀv„È›LlB[Cix2PqNTq&§w/¤Ö[¦¢qÄ—eq“‹ŠRœ’]é±\²ÿ½|ž}±‹MÁªhÆçi¨ÅV—–Lx±kªÖ~|š…d~>ÌQd´a±vA{Êbz“\v†0f…8©W“›VÒ¡\d“‰“u=p¬[«uoÁ\j•S¡•B_2_j=jg(Kd.JP,`VKn+€m;‘¸†q—cÂÁGƒ“ƒÂâ`qŽHXr@à€M£×¸ËºÜ¢Ü†ƒ¦q~a_ŒGi™pYeJŠ”?”ygu[Bd`3Ä•fš±QÿúÔH‡D‚?.y}C›„HÊRÿÿ‹¼éeŸ¬i‚q`³Nhs6œÉPe‡P”UÚè™âÿïS‘1Na%zy5‰´ZqžoIy@V{0qwKàÊMÄ]MH<MHFnlDš®j¶Ëz÷ü¼åÿ¾¾ë¶”Š`ЧŠ|«UÁÚ…QR,iw9ÿÛ¿›ã¯˜ƒOˆ„hž¼y§§NÃÈloÌM‚wn¿–p üR¶ž_·¤Tœ¨WŠa—«I¦ÍrÌÿ ƒV¹ìÃŽ|—i‚žZ}˜NR'U‰Drjd¯º†³u›áz|šVI~.f`Kd„ZÿêùŽái[‚7UYDe…>zˆF_vAa|Pd;Zv2’W‡´l•ÊušÏw>g;y”‹ÍÆÓÌk¦Ïš ç“æÿµ†ª{}À_”¾tÔÿ°žÄwŠÀW†½^Tˆ0OaCQ|)YwCŠ»o‹½j}cm›s—Â|ŠÎasŸHIt6?R:‰‚kXiOXlLq™gp±Ew€Jp™T‚ªaj—H|©IZ~:RyHn–psŸT~zcUu=bƒZm¥:U5TjJ`‰Nl€]…£zˆ¾r‰ºXi•RTZ-L^1L_<e{Wy¬VkPo¨EFo0F`,Mg,=T5FY-@S(?L1[rC_y=Qa<i}UkKVjElƒmqV?W/@S&>\5Km6G[Cn…Z²NzZwŠNl˜cƒg„¬d~”Ko}g‘[€—]p~f• €ŠY¡hl\k‡RhŒ[oVo]iŽ^tœv´×£÷þœˆ›y‡˜k‹¬Os‚J_pFYoIn€EPuZo…PŽWk€a„®‹¥xŠ€gkuIbx7M|Rqªlz¤qp†dgYZyI`Oa„b† rv’syŸ{œm‹†Y„…Fmj?bbR`žZP‚_OnQ\k@Qv7QrC=b>7S4:U*FN(AU61R,=E*bE!Q^+Ah@WV>ag&eŒ;LDYfHGh;[U:U+…> \ˆªix±jp²in¡ay—Ys‘Ta‚OO}QaeE^f5do7ayMX}VSvSk]>du5cN}yClšE`n`qT{n=Ÿw;ž•Gt—_r}Y…‡G²ŽP‘Áz]½–@‡ljY2ƒ.w‰M{—Xx•a…h‡˜Td£e^nElu9X†LioOrŠA{Mz”Ki™btˆd„^šŠ{´£g¯Ù §ß¶’Ë—Š¦lžE‡”Oš[c…IfzA[sPaiR…h7ušEg‹N§—B•²Gp¬fƒˆ]£ŠEz»`Š–M¢“c€žP{˜[“E“—D Ys“S›€UŸQ¦Ÿg°»vxØ£šªa¢œa^Ä’~}ª©9ÍÀ]¾è°ÕϘ…É~§·U¼|®|yf‘š^†³tx¯‚…q^ŸƒlmÃp‰Œpx«ihˆDdtZˆ6šÌ™ÀŠo ™L{p=`"a`&E‰2E;<T.*…?$¢ÆKŸË…™ÎŒx¿‚n—qaw?w+žOzÈf‹ª[œœi·Á…lä™`{Por1v9‹›YWwdyk7‚‘]lX‹žcŽTçŸE¾Ø™§¿²¬j“Á“u¼xv‹d«ˆJîÚzÿÿª¨ÿݪ©€pÊ„•…4¬œQ¥Îr~¯c|n]lX^J\i,~Ž4F†\ˆµS»P ¤Z”¼o¬zQˬrwÊš²«R«“æÛ†uÿî^‹]ux3€‹MPxFCi/>G"EpoefKZ)e³X‚—LV‘<Xn>U3Sw,M[%‰š)fuc~“N¬nEl’u³”E³¹j’Æ–Îн”Qš‰†‰¢PÁ´nùϓ֕³`еf¤»WгrÑÆsc¸®Nv¶k ¹c¢Ÿ^›¨_Ÿ¦tÙ—ŽŸ¡k¥‰=ƒ·NŠI›Ìl¡¸^Ò´aq¤l[}P]l-w®;‘aJvùF…›;’®Zpžc¤o–¾YÑω}Òci™H{“Tp”\¾‹Vo|Sg†b`xrco]Mq;si@ˆºUj¨_~qC€z]zZ-h_8´›`µP§ÿª†„Ahª`ª„<~¡Vj~2ÿÑnþÿÆtd`€xp´ÿ• ÜzÇçrŠ™£m¡ÓyÄØ¢‡Ò”Zˆ4wc2‡Óh„K{¥nn¢X³¹Lµÿ€w–Q|^ÃÄ€·¼Šîÿ‘”¤`‡¨] ¼xtK°‘ˆ~ˆVhŒ9wo@umMžvRyDœ_m_Y3dMln>™‚C”{Vÿÿþ‘ÔŸCZTr9n±ÕfxyEU/zsB’Q˜¹hæ÷Àp‚p¯º™Éê—1D!Á½`îÿ£\Ä(Sh.u…bŠ P¯¯µ›Ìy_˜S”¯~—Íi}·\³‹ÕÖÅV‰!c{Ed€5e…IUj;Fo*:R,¥¨’WwHƒ„•Éÿ–«Ú‡P|3^yJ\tZ‡¯e©Ôž‘Ážk\…—u¦Ø[™ZŽ–”¿Í’ŸpPsGY74H%hxPW3?c3b{a`‰d}œqt™nao`~¡\Sm;IZ7t™C[k@•Y‚±`nŽMmTn}T§Zl¢I~©_‚¢]s¢_z´h³\q|GnNr—[±á€¢Ú_k•Y„™C}’R]rXggtœjXzMXd?k¦Kb‰E`VaskƒŸl}¤^Ec2dpCjzJ}“B[d09I+BQ:v„g^kE`wCz…_]xHg€ak‹glDHk@Gl)F[бao”Sd‚r˜¸a€‘Vm]´u† u€oŽ‹R|”Xf~KqŽ^‡‡W‰•d{Ž[•²g“·e¶j‹£mŽ£^|’X~§_‹~‡º¹úÓ~’™eŒ_‘¹etF€–K`Šbƒ¦`xWbQh†Qfr—½†³k`i>BYHk†Jr‘h€¨f‹¥dt~GGc[`eg™s|˜‡ Ř®¿…ƒ«sˆ°rr™a~žer]o™ZK›YIpdWaC_r4Uz<XvJBe<HP4LP)IY%Sb)Xd/Nm9lV/uV+G]3cL6|i){‘@ŽNn™ZUŠ[JqTfR:‡m5ŠžUˆ§pr«ql”ve€kcƒa]zVNvCSaF[`6gj4ar>SaH``E_n=juGs…Dj“OkŒXg‹JjS`}Lpo:~n:€Cj“[w~TŒzBµ•K²Óv›Õ™r½‹€†b‡“CŸ¤OÊjž¼o›´^¯¥cw¸‡hƒp—ƒE¤Mv©opUŠŠMw¯_ZREnDJX4_i7–e<¼c™ç¨–¿²©~•Éx}®s—“U€ªYh˜ghŒT†rMvƒKƒ„csZ–£\…ºix™mƒŠYrŒEg†W_uN†qD™F¶¥Oª¶[~¥pl{WWOwZK£w<oZ™fJo©u‚˜k]Xd~7r4––>¢¢WŸÉq‘À|´®uš¼…Q¯ykmSr~N‚QÀ›Gk–c|b‚˜^grEn€AuˆFw˜OqŒCt _w“5pyk•YO§Ur…6[•Gfm?G†<Ea'rK$Áj0~âs}«~TXPt1fc=”‰=t¤\†EȾe¼ó†X×’kk8e—`j}>Ç@fÐiœdFCˆaWb&ci7gC{GžR¥“M…Æjt~s•xI†Œuaf€˜ipÈRÉÝt†¾›w}gµ~P“ i¦k« N˜ÈŠœÏ‚— ‰še«Ù^¡Äd|®zsˆCZeF‚t5˜‚M˜ªl¹šwÙË„§{z€ìtÂU¯ÝÅØÃž†Äêêb{ŠKެMY•Q…~?©¸NhÛqƒ•@¢ºY¡ÞšÏH‡ÆIdžSeƒGô±I‚«SZ“Fšš4ƒÎ`^‡b¬Œ4…Ý{‰¬r‹xF†vr¼·†Ä‰„¨»\×±yÙÿƒ¶Ø«Ìÿéo€ŠyKc„IÞzB—¢§Ž¡S†ÂYlŽU’¥R¡ž]Àîv ÿ†çáv„¤Œ¬ŒOz¹gp¡Qÿx=žy];~T‚½Q‹ž:OnZ†iEŽ˜co›i€•O~€Os§k’qNצ‘ç‚h•LeuM|’SÌšTgo;psH ¨ƒŸdŸ¸]“¹[X†5u„'Xw5|~Be™F]t+o‹O¾ÏzñÿÎf¥Uwk9¡P‰MÑÈSùÒ–·žrr±4ÓÌ–œñ±±ÛšÁ¶^¶ÿzjHŸ¿z‰Ç†‚R‡TISr&uI~Žmuzud™SÚÿ•a‘SPk+V^(t£m|FÇØm¯šdÙí¸—Ï’Xk6¡œoÿÿu^5crD……X†š@{e5·¼qȼšŒ»S‘ŒWßwÇôµÅØ¥†‘Si7Jl7—_kÙÿÁ‹›m¬·o¯¸f¢ÕX ×b|¢Zºmu¶Y¬Ãކ³eÀÚ€Öÿ^€<]…2´^w™G…^h”LyvmŠ–vG‚6C\+Ž‘¯×zu–Vd‹Dz¡NTk4V}9f‚CЍbT€HW”jÁɹ€¢h~›nz¢H¥ÎPfV£¡ujhv‰jn™v»{Y’4S‚7qªXAb0w¨RнH>h$EZ,^mNzxSpEn˜_{§PoŸ:_uDQ‹6CK(Gb]œ¿›´Ï‰Áåze™8]‚?жXXxRcyDMu1a~HPjXpwqž§tŒUwWOc-^tj’©Œ‹¤\“€}fwOTl7Ic0Rr\šgtšMx•_¦q•©ijyDNY76KFTc?KbFr|Osw\de;LT-Nc<YgFjv>apT“ž\¤rs†Ml‰b}·s|¡Vpb€£h‹¼ŠªËƒ‘^r€e†”Sdt<KcJb‹eƒ¡d¡Z~y¢ÄnŒ²\~\n–`ˆ”Wsˆ_mx`y‡fv|am|]}…OZuY~œa‚™`…£ƒ“j¡¯m›V}¨d¡]p’cˆ qЧt“µa~ž]pŒJ]‚fv¢…ŽºnˆšNhmPVs]c“o‚›h›demLS€hs™er–n}œ…›ÆŠ¬Ñq”³f†¢]{§k±„¥Î„¼ÎpLq=ZnWcw;V>Z~KZ}AMlD>g>EW5Ta1Zk3^i.SzALlKSC65C(2B8E<!eV.†w<s—\j}xb‚dk…[ƒ†L{›Oc‰eY~f`wYhiHK…O^[Min-hG}N{KvwEDpK[P?ak2xkH‚—R¤c¯i†³i{ªds¥ggUewKioIiƒKh|M‚kF±K¢Ís¡Å¤‰Ç†~ ˆ›¥ZÉÇa§ãƒ’Ó¤z qc~nfqg–pQž¯M~µka”kzu[®‚@ÉgqÈ‚Yžcot@Ž;—¢Lǽ]¤ëy’ð”¹vŒÊs…¨m„¦c}·eªq¥^¦}S¯”K†Énw™[v›a›U”Åh¸h¡·Z²[\Nsu:f‰B¤zIĦge«lr`N›P{b?f¡H€ˆSG{C†X,v©XiŠKog6€Ÿ2‹Œ=~’Er c9‡kBV=s_7v@X‰Ic=§@Vªi]cNx„5_–PZ]CZR6fV,Tp]\b0p}Cz§MsªLš£_Ƽh´Ø–€ÇhV vE O¡c¢–r_Ìj_iX\~BKb8Yj+po9_|Q—ˆ2‘¤ae¯”r‹d˜ @”›f“´`ÿÃYÿÊ”™„^˜F}š+>J=Y"h\"—‘4w¬]š Y‡ˆb½}X£\g¡Qhp<vd?]ºGM8—‡a’¶^S{a‚~7Æ™Wv©Žj•Q‡’G®Bïì¢Ô’Œ¶nÔÐSÆôŠŒÎ³‘fJ°}Wâ¬kæï‘¨ÿ·lq™x9l—®¾bÕû®‡ÌvƒÊ{²¶Sµç„¤É|ÀÃhkš€h{<¤ËN̲R·ÿ•Ûzr¾]؃\ݪqbá“‚Ž2•rN—{ Tž~~›žê°|† k}…>¸Æbÿ²x“ïóš†A°æ¸ttpÿÈq{¨^ƒd(ŽbµSiˆO¦…Y²btžT„¾tî¾UÿÿÿäÿÒïÿ»ªóÇžÁZÖ–Mÿ¿Œ“©VÓ€~é¶¡•ÔWµÇa—шa“6|„7by6bj0‘Ë2s‘Zkd>}ŽSˆÎ‚¼°yhÞXƒxBˆ£`Û–Kh…Gt•V“\p±[Na*~R[ŸLwµƒažWby0N€@‚3§È^Ðæ˜Þš°ØÈâhÆð²xÃIǶŽêë¯ÏÕ¶jsY€–V†ò¡Ê§sèÿЋƞ«o‹¯n²³‰tǃln=€ˆ>‚˜<q«T†‹m×ÿiðç–šÝkb‘<«¥l ³Š–¥nÁÏ” N•Û`°šd[&ik=ºcbÐʾ°Ù—Ôñ¯ÙÒ‡·™^Ÿâ¥ÇƒÁpÈ®‡·Í¥Éÿ¹¼ò¤ƒ“]}‘M”ËbN¢<‹n~¾ÚqŸ¯gÃä‘ßý¸ªÏŒÊhky?“WÎÍ»¶æ„×å»âÿÕ³Û{‚£ho‰Y…†`¤Qc‡K‚žh”«neŸF„†ƒÀôŒñmšŒ‚§k†š|b–Eu£8jœJmˆR„£MjUqŒkuªur¤dh‘Wt¦R±ƒ™ÈgTu7Nk;Pz=l‰V¥Œ_ƒF…£f‚Ãsx¡;ZUjQRf)]t2Uˆ4Ky-bCm…VsžgržEo–:T†/fjAnŒPYuYÄ~khcÂʘ¦ÖypŽCsˆIs¥Xr˜O}žUšOZq6Ce1f‚@k’dmQx—Jm|L|—Le…1Rz3T‚<e}Ck}Vv‡\’UdlHqœB[|Og–IZ|FhFVt=SvE`d9Zb7T_4UnFuUpˆK|…d—¶ƒ›²}¤…œ Rp“z–Í‹‘»y‡«i‚›v†¤…²e^€Gu‡c §ZnGMuUZƒf{›euždp‹lwšxv[sRv•d“U`oK„Quw?ds<PgLa|KhŒLnRX{[•^pšuƒ¯~±i‚°k€¦SnŽjšSWmZUoWhhm‹AVv@T€tzª—«^gr?Rub‘§r‘¨p~™s…˜y›²x•¯g‰”e°Œ¦Èx‚¦Xm”H[†M^{X^|nkš§b`i;l{7d†An‚LwŽTx•PgŽXT„SOsLRb3Wm5Wt>S}GEyPHX@EW1@Z4RH&|b)’Š3n°Xi›}‚Z£fd£ve‹l^}XSeM]kC\o8Wt?bcDyw7šJž¬g‹¡bk‰^V€TbcEmq1uE„›T®e ošœmš¨|®t„ªmˆ‘cjVnˆQp†Kk…QˆƒPŒ aޏ|¨v¨t‚°g}›_v–jwpU‰TR``a`>•l6z–Kl‰qelRpl?p<µ¨_Õ‡v¶•†žbŽ©F‘³b–°r‡²jt«„~žg”¯k•·^™É‚ƒ¿t‡Ÿia„cƒeUž—F…Íu¬§e²Ï}¨Üv˜Àx¶Ïß‹¡ë“jÉ’„LÈ£Q§¯c˜‰m¡†R¡º„Ä’½§_¥Ö…dд]tG€bA`¡MzFk‚9ZyXvs9w‰Mx„PuEwIw«BixRg`<tT:nvBb€QlrA£;u°WUŸXNZ6YV5Xb/h^-”‘0…žUhŒ{y‡sÿ·B¨ÿž¢Á‘r®ƒUsWƒq+‚zO™Vu¢~NTJN(PG"Za,bm>N7h%•ËeZ¡„=}ElW)¯ŸG}Ô—\’hÄ‚\‰ÌÑÿ£G›á«’—pš†A«”OÂj„°reªxxœO²›I¬ß€ÈÃÓ¼‡ØÇpÿwš¬OÁµ]q›yv‘?ioF‹Bw•DZŠVsr)½‡:»Ûšæã‰nÏÅ¢Šx¤À}½ ”ŠÀ›™œRŸ›JϽ‰¤õĉ«nhœ]mtDزfþþ‘ÿé\¥jixD¬ªXÊnp¢aN‘H…w)Ü©Zžú‘ÜÔ‹¼Å‰h¼€ŸCƒ @o˜cx¹Iá§6m¶on€=™›D±´As¿`‘ižsŸ·hâÔxaø¬ –F¨˜`ªä›ð¨x¾š§’gÿ œ†b³‘®“¨WÿàuÀÎyu¯kÓÃÏÖ—ïÿ¬ðöחѹ‡‹‡~<¯yÀÀ–ðák}‘˜’›ÿ¥³_kv[SiÌIªd>v¾zh}^Ð eµÙŒìå‹êÿqÂÿµtôµ›“A™¸Yà^Tfv;TžVc}Z{Ëa^¼1pDnZ4„yt«Ê®´ŒDw—j˜hÌᢺÿ¬¢è”²R³ù‰´ç¢©”ZŒÏ^x£Uyƒ“T©ºuÇm“¬wBZ<{N%‰I¯Yž™€¡Ð‘y¦N‚…_”4€ÈY§Á^¶« Ó v«Ñ´Ž‰”‹WnŽPŒœTÌ’€ÿ²¬Ò®—Ëêp£Ø[⺶¤M·ÎZ̦´Ó°¶·Å–±tm…jzf`• sÝКðÿ¼ˆÓnHi(A`Lk2\s1ãàµäŠṎÈÎËÿ’ÃÀ‹‹›M›ÁK§µ‡†¹j¤Ï“‹Ä¡ÇçÍ´Ì£Op”Dg†AX‰C†Ž|iŸH‰n¬Þƒ§Ó˜™¾ŠJ€>ltf^s?ÑÜa©;v˜[Žªl•»`[ª<dŽXtždq^£±¸Ûi¢ÆsƒÂOJa2W‚8`‚CZyGuOQb5jU_fRb|Xo…VrhAx—Y…¬bÒˆžÌ{’µu„¯KZw1c‚3b>k‚Ot¦P åvœÆ\†³jФR¿âˆx¸YwšRy°dj™OfuYÄwœÔ†„½Pyœ<m‚HŽ¢lt^ix;SlByŸR‚ˆ;[„B]vCAV/=`6Ni6i…LŒ°f®å_t_}Ÿho\y¦R^a‹¯ltu6[`0[rKl‡j‚ª|Òs—È‚«»‰‹¨v¨¦±¶NaQhbvŽ{”³flš`ngƒ®\zž[|”CEiGm’aЏw®|’µz‘Ælˆ®ah‡IJZGKiRn‡Zm†Jn†Z}ž_Œ†IhŽFk‹ešÅ…²ÍmŠ”If†W†„_Œ¤y{žq–t‰“SqŒNk†c„Le„NPxJLwOgŠGRsT`˜|”À|ˆIXsJZƒr|Ÿn„§s—¢yˆ“ƒŸ¬uqyVVkmy·ŒµÊl•¶R…¢@Om,;`'1Q3HjDIpWa{>evCn~Jv€N€Sd’WZdWhQ\hDfl;jn9ry>hQgƒUj}Il?c…M^uKf~H†‚E§RyÁ‡z›~‚¤khª}T‰z^mTXl:[pBXr<]h>lu@}E}M€š_j’_q‚ZsŒP|UŒ‹L…œP‡§]n¬ay‰`†‚I‡‡Xn…]|ze”pQ£l|p{™Uc“[Z„_hsHŒvD £[iÅ{SŽhMtCIv2P_0fe2{a?[Š>^kDŠ\8lŒF„’Q”©O§¤[Áº`—ÖsZ³†ƒyV‰8j¬np‰OfDXQwxMŒœQ–ª^‹Â”ª~p¤iiŠV…“Hv¥Pwždk¥h˜“_˜Æ|‚®t¹uì~šÝ®`¬™…bPªw?‰Œjvf„N³¯s®Í–·Å}¨Ú¦aË¿ƒxlaœ_SpXŠf6p§Kne˜Jo›TP€iud<Š‘Ir´bjMzg)wƒBx‘BZšb^rJŒwF}¾n³¦kŸç~LªoHi2gf$eŽ5OyNcl3Zv;ao8NntCePjMB~?‰uAh~V‹@}²s[’Tjf,b€2Ql4jq)£ƒ;SÈJmdwy¢HZ tSy<uk+ª¬W»£¢®hærz§‡d³jÛ [¥£–»È„q«y‡sUœ¼k¾Ìmˆþ¯‡‘µ¿h¬–f…j²†C^‚lIe6£j#}¿NxŽC|‡Kap<Vm>jGYʺ_ÅÿÊ•ÿ¶t©hŠ’S˜ n¨–c„»”·—V™¡}}CƒzPrœJwšVz€b‰¢y£}w‡±m§Kv Rp•QXŽ7ho'¿…Kޝ‡›®`Ôênu±s¨œE“ææ—?•Æ©ÌOÂ~Áÿ^ÿîZÿþ£¥ÿÄðŽ_¯ù°¯¹yÙÿ»=ˆŒE_'³p2q¦i²”K’©¼½i•ñžs‹hfd:š`<ÿ瓹DŽt“d’—NใÉðµ¿â³‡Ç¬Ñx–툾Ó{¿Û}¤½|œ¨u›¥Å¢[§KŒ§VŽöŸ°MrŸ`ž¨XȤšÿÿßÿÿÍÝÿÐÿÿ–©ÿËy{Je}8œt7™ÉiPŽQaz.d7}¦hnºqz„Ct³Gn”Sh~:³Ãvõá„Ýÿ˜{‰”¹x¦µ_β…®ÿ»y¤LœžaÒÁ‡Ýÿ¡|µTˆºm–s¸¯žµÚ¶‡°B™°Z ࣣœu¢Õ…•§QmZ2wo2`o-ÊȧŸuH Á™^_$„…G¢Âyœ_WãÐÕí¹Ž|Z…i¢©¨r‰q›–ruÅeè–«ÿx¹‰„oÇG\ƒ7tbI˳”ŠÍL·^¹—”ÿÿÓhÂQœ\|VN˜'ai4ÁÚ¡Ãð•ÆÓtêî×i}ufRzBu‡VxY‚ÛrZ„RHP)aYBœ»‘›Îƒ„nU¥§…»Nc™>]„:‘¬j™¿“–µ‰Kf@\lX¢|™Áu{˜QszVdŸ.z–^¬ÐàÿØöÿàíÿ´¢æqgu^YWuœs—Á“ÖcŽÈ[y c†¼ZY|A\f<Bc*-H:IiCEn,;Z%h„Uhž\s©`¤â›‰¼j_{Kœ¬h®<hv8=X.S]?c{Z“¶zËpq³U‹Ð—¿ÜÍÌälzg…o€¬]iPŠ©‡•µ…¬`YnBjŸW„¤o¾Ïqƒ›FcnBj‚RbŒIrŸOu a]†;ƒM[s=a{]”¸ys¢db’LqŠblŠm~¸qy¥u‚ªkz§Rm”Cnf}¬j‡»zŒÆ‰•Æ‹€¯uŠ´vx‡X€‡]mŽ>=]3]‚_µ¶w¢½q“µx•ÊrÇu»^Z…Sv˜r£«z“¼ŠšÐ„ŠÅnGa‡FhŽQx•Z¥_q†R„‡SsŠSy‘a}¤ˆ¬ËÊ÷÷‚¢LavIYlešv|£hf™enQl‡PyŒWkƒ`ˆ\u‘E]~Yr–P]€n“»œ°Æ‚…’DKe8?f[t‹xޏ™±ËƒŽ©s¤Z_v<UvT‹šrv|cu„U€5Pp(Fp2Bg>Xy8AdA]}:RoH[k;[qA_„GI|P5cFBL3IQ+WZ4[g:bc4m{DuSz‘Tr–\o’`ccoŠ\ŒY’X†´vµ”z®„_˜nas^[†MYrJ[l>dtBuƒAj“Av}K[|FapKRoAhuB—{C‡¡Vk‹e\„SksPg~TyxOtz@toHttK†WŒCb¢ioozFS¤\D[Hm6Uc"hh)QŠYJr_Cn1Wc!Ba$PZ+Rb*B]6f[=¯k,‹ÅL¨´lºÇl‡ÚŽŸ¢…„ªaf”y]zTds-Z€O„{ISš:JiDan4|}<‚”O…œjrd|—c°˜U‘Ãeƒ¿~€œ^o£f~YŸd{Ÿ]²ŒR’Õs|¾‘i–gutD„‚6|P”“X–¥e³²x׎±³t¥ÐˆÑ®^gms[[“[‰x9ŽŸO†¼nª]‘´tp–eY<‰c;ˆ Rb™iŒm2~½qR£i‘^=o·Rœ¢hf§`›ˆl™µtLăq_:{•0‰¦_q¹m_¡TW<pb5ŸŒ2q’l®˜@wËpЧjmŽk„9i™Uƒ—?vµS”Zˆ·g¿Š_xÚhm‡^˜@q™O{¬h\ gˆnAm¢HŠ—Z~¿oª M–¶©º¨{½¬~ÃÅ…«Ã†‰°Çh}¨dfjVzf@‘T|¶x‚šg…„]lŠ[[x;^n1«w9x¨V¦œ8‹Òrw´]c N\_BI{9td#qŸbµŠcÞðkÕ¹|±?z–Oot8eŠ@|qAh†U`t=ª™6xÁdpM€y1j“<]t7³pJÔ‘jš]mrY\š/~{0æšf‰ó бTªß|mÕrDqªq¦ª=’ÂiÏÊq¯ËõÇ}ÛÿОá•ÍŽ§U§É˜²ÍˆIm‹GR.ka'”¡W§µÀ¤‰Ì¬ÊÌ‚®ÏœB’‚=M#†a&ÿˆg²ÿÿ}ˆP¼ÿy˺HÇ¡©ÿ‰¯|ЦF€Ëpw‡E¡oj·Ý›¡Ás¶Íi¥«`zÁ”ÅsAŒûq¬ÇmvÁr}«i‡±O¶«g¿ÙŽýÿÝêÿÑÖÚ}°ê~i‡>h”I±›Rj“H|†B±n¦is®Xal=‹bJ]_–¨NòçªÆ¿s‘ÿ¼‘¥F´ÄR–HÌ}‰·ÿ³hœYl‹XiQ‘wO Ãe¯ÚxÀ¡‚z}sxaJ¡ÆI…³TT}:‰kq’¦eªÂ®V]/IS’WPºÙ”PP0†‚/ˆ»WÃê‰Ùÿ©œè{o]CËЂ™’f—‡DhHp`.¦€Y¿²šùÿúÿÿÿñÿÄÞÍ¢÷Û€‡ŒIw²RÑæ²vo7æÆÿÿ䛾väÿ{Åÿ»b’GŒ¶Xã꼼⽨‚}üÿªÃØgcŠ8{šasÉGlƒJÈܳ½Ý™ ¹‡a˜D¢s[Œ<gl=sdXk™Hˆ£`ou>jŠKw \n‡gj‘IQxK Æ{²À‚Ãý†|ÝT¤·W^†Q—¥ —œ’¼Å ¸Õ¡¿Ásˆ¿[Œ¼tb€]tzsfr\<LDU€Aq£_¨T>QA`=Ab+BX$5Q#QkBmS–iŽ·{|¤y…Œf|œd`‰bx‡M€™F7N Sg1q¶PÑÿªšÛY{½iƒ¹¨žÃ²¯UKd6Hf7B^<r†U^lNZa^fŒS›Á‹¾è¶ÿÿÔüÿ¿ãÿt„ªBY€;ZzGa‚S‚¤z^o<IZ8N]<h}Gks]œn‰¸qˆ±n»s{žmk†^mwi…®v}›U€Žn~Štž¼‚Ž¿ŠÄwg~p{i^aDz®jŒÁbkŽJx”`zhŽ`€np™q‰»w„Ãrš²v—³nwžosuˆ¶Š›ËrxUizRkŒVn{HcJeƒZ‚Z€ƒUt†Yl•d€¨y¤ÄËù𕔜Vhs<[w]Y~[f‚hy™du’Um‹Qr‰JlS{›O^p=OiRn…^Z˜Ù졢㕒²3BY2CaQLbv™µ›»ƒŽ¥a[sJ^pFqt8<L$#0,.D5Ed;Py?VXs¨m|•BUf8Jw9W`DXe8Xi5Tw9LsNEl?JX;MZ-UW.Lb2]\3hv6YˆF[zKdrHqrMbˆRd‡mZ‚W|xRša„¸a¶aˆhxtR]W\}cfhFZ~<a|CU‡=koJ[uA]gKdy6`€AxuF‡|Nx~^u{Rp‹M]ƒS\qC]o=jj6tzB|‰Pv–V_ZVt[nk?T€ECsJId0Qd#Op,:s<2X3=M*eUpq#‚‰KešJwvEšŒBŸªK¢¯i£Ê{®¾…rÉŠ_yŽzdC‰‡Qp‚Sv‚JxDeƒEN†AZo@‰b/dŒKm}OYSƒwDFˆ¤\Œpp¬nSe~gv…R}›ax§jo‹Sƒ‹Oxœ_d\v€Q„•U±¢jÅv}¢„Ÿœ\‰Â‚“©t‚¹„°°‚}Ôhy¤]f›fpV§†?“»v’¸it®‚†£U’KZ€;qo?|VŽŒGlªe†|j©ÄJÄÌ‘€ÁžJsnCÓ®U„¨n»®T‘Ðz¼—u‡|n„^G‚C\O.•h3™µv‚ÆŽƒ¨pm§cpNl—ZyxEn¤h»ŸZ‘¯P~™}n¢mQxD¡IoÈwT}XMlDISpY<uqFm•]ƒ–D‡£‡Àj‘¹[±³m·Ô¦©Ã‘º–€ªd•‘arœT†¦]eª{•‹7|¬zƒV˜Éf„¦tl¥Y€‹Elrf{~VЧlY©n‚‘.u´d‰•L…¸fšÉ]‡ÇŠeÏhŒŠN˜·ud\tqA™•:{oLÛŸH½°‰—¨^‹¾gry6XƒBG~¢9†œ|‘¢]YiTo†K™„3„§|̨€t¢t™Jm®R°¨Jlž…–—Nˆb˜M«|[{õ“ik”RoE¸“DÿÇ’‡ïá[{ATa:5b&qE$w±l3P=XJ!“€7ŽÀ˜Em=te'ŽªbËìx¿ÿÿœHÿð—q÷ ;\"yh8µ«oä½jÿÿ¬Õÿ½à¿|Èÿ–Þ³†™Èp—±^S©k—Z'¨zc‘›G¥yÓ¬k¼»•¹„Ŭ»øÿ©ãÿɤ噚³v˜™N“b†¢[‹´Vq£dfƒ5on6X=ŸK[_1Œ[<}qD¾¾§Ñ¶€‹ºxl¶}`wBE–³ix˜MAg+n‹.}•L~¬f‰‡Pwf˜xFx·R~n?›ƒuÃTo“AKƒ532 xKSYg;\LÛ]€ƒdÆ=’¢dpwJ›¯_¤›ŠÂÍqš >“˜Vѱˆ´¦Y×óœØÿ†Ÿ–dÃØ™ÜÿßùÒô¥ÿz MOk-bŒ6Ž®~ƒ«iätÓ€ÁÖ©×é¹ëêÙÏÿÕÂë±z˜j[oWÑQk×=E`<†ybËñ«àà¦ÿÿïÿÿÛÑÿž„½m–PUt9]dOUW6WSBuv\g…Agv0_|1™’a‚˜Ou“e¨hkœLL‚;RtLšŒ¡»É|{‰I^oC‹»U¦sFY8nF~›Wšp¡¶‘‚ÔM9M0,B+]NH_GN€Mf†R=j$<I2%8-77@Q]6GT;dr?dHZz=Sg>v“\e8Am>`lOZ‰7d–iº…·Ú«°Ó”µa|dp“h\†Cj“PTv9Ol5~£ObiC¢…a®or—f…”ˆÉ´ªê·“ÁÉ‚“Úk~ÅUi”;dzEMp99T.Ce6^wUm…C]{>]xv„•‚r‡p¨`\}GXtHx‚O^mq‹ŸUmMEd;\Žf~¥oz¦[To?ewIf†cË€zž_ftDeDl~SuhŠ¥cv¤k‘±wŒ¢]oŽv„žo‘½Yb~R[{qkƒ]\pJ~‹R^oIw€CWq:n†Q‚‹k®¿s{œaÂ{–¨Ï¡¶À›®³ln„Z{ŒKn‹EQuLGgUTsO`…WhŠZzœ^p–F^t5Io@V{V‚«¡Æà´ÅìµÏÝ`e†@UlBI][dbm‰mƒžT\u6Bc>b„4=`#>T(I`/DnESŠau¤pŠ¡f}~Ie}@Om3_c3Zj4im6\7m~KhƒH[tMOwBLU8LV1lU*nv5HŒPE_QV^2bg/Zy>rwUq“U€‘c“Q€Ÿt†šv~™gyšXw›htˆii†JY‰Gd~Mm>vw<jm>lnLg†AqzQkŽUvzWzuEwnDmtFnkQakDUm8]u2nt:_u=QrIH`CAl;>fA7]?=L2[R$†Pƒ;X±_?†Z6e8MQ&h\ lJp‡T‰rYœ˜T‚¢j”’d•±f‚¶‚ƒ¡y„Šic„@szBn}=c‚O‰uDiŽIf•PN†Evi<kŠ6Y…fXi=uk;›}:§·g•¹sY·€PsQae7ytBtŽR¢m‘¤W¨²i¢Íos΄^•yy9£™YÂaw›ˆ’\r“cq‚YwSÂŒcwÂdžg{‘qsšU¢x>‘©a¦n…ƒ\h›_‰G–¨Xx©li™Z`wHmh>§§?»ÅhޝŠm¦{S«›HÊÂy…Ï™€¤‹;§vkKQjQ™GʱR‡£[Ñ‹JxÅT‹D€l‚˜xu§UtƒZ‘›X€±_VuM}ƒI€ŒCƒŒŽ¶mlµun€QR—`Kw>Bx(Q]!f~(^{?o›C›‘Uz»Š®gx‚a´W¬Ï‚æ|¦f‘°e~Äx†¸^kºsce^€7„‘7[¥S•ŒL•·†È¢‡‚ðŠx¡[Š›M×´€÷êߤÿÒwÀ~¢¶IpÀz¤V•¥{j–p‹Fµ‘_ÿs‰Ýx]žnZ1ÁnU·ÚyšWžªgjbR1‡-^ˆX“r(”©p’œOX£Âcs¤Jþ‘T’›s€¤N†žWk‚Hi°6[|8Žh4¼”L[}H{…\î¢Lp´rw–@‚^›æˆ¨±‡fÙ’Šr,c¥nh·Fs•2n¶B—±<cQWvVDc.ÄŽ4Àõ·ÿÆl„ÿÿ«Å[÷¶g|ý®=v4«o2˜{C|MÈÔŒ§à¥ˆ´)n[y)íÞŒ ÿµ®…<»ÿ™¶¹x|‹|+z«Lzw-®´O~ŸwƒwTÿßÐÿ¤c†?k~'j?w„@ŠY_ŠJ{gA|y1Lr.ctBzoK²G¾X¹še£ÿ• ‰PUf/›‹B[ŸPhh;UZ _r4t˜W‘°fbœC¥±y—¿_d›IÅvn…Aœ›k¤K…“d©Òs‹öcÇëlex<Š“Mez@€„}ŠygZª5›Ôa…±b…f`f…oriJÅÖº‹²bi—+²‰N”²¥¬^¨½ŒœÖ˜¸³„ÿÿÿ®Ú‚tÈYcŠKrEÕµ‡~oƒvh‘zuœµž˜Ê›^©\Z_RІ_ÓçºùÿýÝÿËžÙ„™`}¾pŨ¡éÿÓôÿ×ðÿׄÖa‘Ãs™Hs‚F\‘5†™K‚€I~«Oel>‚®bƒ[›¼o¶ä’ÿÿÿÿÿÿªÓo¡°g¥c|”@[c1]9—±RcWG™šNS`=\8b†H——’ȯ¸øÿ£‰è>?€%&<25./65n‚Hk—Kn{@’—7ÿúOAi)7<Uw4Sx7Qr/XyGWzFL[O|¶j„µm“¸ˆ±‹’žw“ª‹‰Æm_‰8U‚.Y„.Mz2j’AlŽ<bIˆ^Vf=|–YT†9„€a¨äqНRˆS„‘k¥Ü‰›×wi–>Nt;Ku6U|@b•Hp¦WXrDSiB]wgTbI^m`†©Kklš·|~›Zw†t…–UeŒ[^|Gh‚_ImO‹¯y¢Á_‹…d‰¡vyªflJ^p7`s>XrW~¸wŠÌzg•Q_lKs…Np’b}“u™ÂqˆÂi…Èlu—Lo‘l™©_{ˆTf;Zi>i„TtŠnŒ©žÌ¥è…¨Å”œÀ„‹Ÿ‰œ¶ˆŒ£y|¢`y–en†9Ta5MoDVzLbQX„Qm‹L^}AWˆESpb€‘p|‹–¤¾ ˜¸ew›P`F]zX~«]‹m›´`}›V~‹N„’HnŒCdwAP~Xužbœl€‰dZzKEjQbˆ]\`/df-`y>\tE`s;gyKg„GYTFuSLd=UM1]N)`e2LmDMbLP\1`d-hl6qDh—GX‡q[kYXgUjjQ}Kq’\oŽly|`yHf]fzSpnB~{@f}Hi~Kb}IvwOn…AnŒ^nƒQwu<yxCpsLnrHbtDYxFvoIv{=]ŠRstDxHM—^.kU+D,B>j<“g)¸nz´X§iTzMii/d…>bQ€iImŸGf„X€`Q©‡Oš¶`ž„‹^eŒMv…Zr‘9i‹b u:«U†§fxœb…”S‰Mq–gU„C]i8–o5¦¦G|ÆQ„_vMW‚FŠ~?•»Sp·djŠfp‡b‰kƒn¢‚~œX™¯T]¹nO}cXm:>‚KFT1\_(tw;‚Mv“ou„YZ”Kj}Eez9²}KtÌZ–¥U™µO^¯v\s^w`.eb:Íz3ôp²¸Š©ey¾|Ž•t‰£eZ‚sgpELcKk_VVŒoYv-|FŸ”Za†W˜d8y™…‘—a˜„v¯±pc©wiUZ“>d|Ay{Gc“<oyM‹…\¹¨‚™Á™kØag¡YczMEpE6P>;V,jd#fK vIn׉_vª[’ÇM Ïtrµ€q®Y`~j¢—P …¼mi§lpŽMv <“Ÿd{«hq§VœuPŸ©u ÕrŒ¬f‰³rªZ”Çz€°–~¯es¯ey’Yƒ‘fy—U ¸SŸ¼|‡Ê|~“i|¿_ ª@ÝËTÐØ§¤ÿ‰¥ÔnÅÇ{L¾„?r-Dg,c[,c“E\€Dqi3‡‰Fw¯ylžQs}<£6Éâj‰ÿµ’˜8u¯\yJ=a6I¤f–f'¸´eÅœ†ÆˆF¡—FˆX¢aV´“†o4ƒŒx[›j¢ƒTˆÓ“³°xèØ¿§ÿ´”šUÒòœ¾Õ©ÿÆ£zÐÒ¦hÙÿÿÝk|BŽÄC¡ƒ=ošo™ÂtÊÞ^Ó}|}i“BwHr’h¬´K§Õ‡Fu@¤’5‚؃½I„Êb^šCmx.p f¯3Ã÷騽~ÅÿÏt†=iw9¡™TfŠK|‹EPm@fŠCtŽ;¯VqyOëÆŸ÷ÿš¹˜h‡Bt“Jh‰:KyBQY0ZY?7Q$QI(dRNJ|/mj?y{W•ŸmÀ䎚ŒT˜¢^š’A˜ŒY÷ÿíãÿÝáÿîXzÝuTv:vqZs4š¿|Œ²p`Œfxc7fZ>‹¯H’Ü]hœ8hšFbL‰€PÿýÆÀÿŸäÿÈ”×qãæ¥êw~§L=?'Žhf„Y]‡kReXJuHO„¨Ns’\x¤Vzª]‘oäñÓ¯ëªÓÿ³ºÿ¿z©nªÕzy”dªƒ¡ÊðÀÐô¼Û‰ÒДŒ´OŠŠdˆ¬xa|I†·^ŒfHl.FCA³š}ÓàÓ¦ •“®ƒÀôž‘¯b§íl‘[žxQœ™^ª°z«»ro€ZÒß¡Zj< cŒ£gPPR`[x°¼šîîÞ’±UU_8ÝM”ÐY±ÿyšÒj¢Ç{ÑÞŠëämƒWYˆ(Qw+Kw@[wM~Ÿ^CX-<H6JSd`tUwY[`Yk„C„Œ‘¼ü‘Îa·ünb±5o–K`?X†5V~@h~`h•o‰°eÀÏw£Ù}¡Î†Ú|ÍÐs´×u˜±z‹µi}žQ_‘:`”:€³Sa|UkAJ[0Vh?KgKe‘LYŠSNpNen`rX[kGn’io{FeXuž@q‡N[x\„¶’¤Á_i\GfgH`zW{¡[pœGhŠE^‹nŸÆž¤Ñ‹™ÆazŠ?\v=]tNgo˜Ï}œÑƒ“µosŒ`v‹_{—`k‰ReƒDYi@]Mi~OSmg‹®ÿÿÃÏó}w¤|€§kf‡muš„ˆ©z”§qr|Dc{R{˜_„®^_„HVvGt‚BXpEf€@JcVh†MSoYc†f¤[f‚IM\Lk‡| Án”˜k’š\zŽSŠR|†KW{Wv[t•vrœhl|<?[GYrBYqQOvHSS,c_+[q:QyS_lD\y9^oDOsE[iE`m=eg6Xh2in<kt<V€JNg@X`5Oc3pZ:S„<MiaTNBLW)mW0‹g3i}CZqU[cFswAkUelRjCƒ†Dv˜_m’`k‚Wx{JqvIp‚Sy„Wh’MrzMiqEkyJ\q?HqPbXAsj7a‚MmxUs‰HUd;tf:W9FU [])m(t’Eo™iO”jRlUah;^t3mƒ[‹{Yc™ZLhO][8ll6P€KT[džjCt«E—bx´Kjo¡€Bž¯P€¼‚p’xY„UapN{Fe—OoqH‹…E¦ Bbĉlqx|>}šT¼¦ZƒÖkyŸmf”fh‡Nx˜Q§›T‰¥x‰¨~lœYM‡tlpBlˆCR‹IfaAfi1tn0ƒ”Tb¯\i:V†INpFgi2hp.°ŽL†Æaz¨q–”`”¡j¥•S¼™N‡¸_–l‰½{‰ÀWºqqiT_nFŽo3‡ÓOu³R}”Lp£\ƒ_c¬c‘J¡¤Jg¯WtiC³€M{†h„‰jbU‚…O]H•v4[µgV–Gmw0ƒO‡”dŸ©c‹¦{Pu2i<5EhJk–8c£N|ŠLcœYm?T‚E~z4x§T|sf•`‡º„T£|fo?dHypZbšfxK`°PxpP‘šSxŽjŒ‡f‡‚Xʺb¢ÿŸ €ˆË^›½`ËÞ‰yÛ¥fœ]x’aP”euG¬³q†÷pk½uyµA“¬YrºkyƒPeiQ×vUrãŸ_€UCiJ?p&HZ“e(ZfSu3\r1Ui8±mAf[b†Bk‘-˜O¯Ôˆ¡a“‘N‡•I”wCj³m—„=¡·kЦM’ÿljØuI“[‡@•§Wg•R½“L¶±{¡¾ ¡Žc°œj“²U°†yiZE’wBJÿîzÿúŸîn’–Y„Ž<jX)iý®m‘D[Ybl~LftXb|5fœKZ€:iq7ÈSa±S8^!Y^&¬–Kh»~Œ}HyH©¾r›®k†¦j|™X™vÿ‰sƒRa¼e]|@E·ku^g…4rm7bG‘q<PU'Ø»U™é®f5ŽŠU{{?S’WKh&^m9dq.Ez94?GL!i_%x†5`›HfgP„iE—xB¯‹z¥|¯¸–ßë÷¼üØe¸sÉ↡õ–^¡AQu2itRvJXh:9r5W]8wž9¯®‚íù³Öÿ°~ç>žŠF¸Àm¶Ê{ µ•‡u·Æ‚æó°íÿ»îÿ¥;À$vE4v=‚Sd~4Yž)\j6”¡VÁÕš´ÿ’x£EŽ›wüÿÿÆçËØÿ¸ŒÄxŽ¡V±;Pm0•»e°ÔwÄzk¯’¼å|Ùø¥Û~¤¾™y¤bq|QYƒ7b†:yZB]!TO<²g³ÓžošK›Ž“Œ°U„œS¿¾{yŒ\—’qoœWŠxjˆW»¥mSh9+-*7 PN6[lA^|8°Ò‘·àŽ¥ÆƒËÇÀ×ò´¤Ê}² wƒ™Dy¶Kd¼:z~CqwHav5€šak‹K”²IŽŸOJm-&7%35J1{©…‰¬Žƒ©Š¯ê ¸ë„ŸÝ|‚¸Hp›Q™Ådi›mw›~¸à´ÁàšvYa^b|g¨Šm˜¥i¢æ^…ªGFbCPZFi‹ERgIYsIQr=iŽW~µUsªkŒÀvr¡SXuC^†H\€T‹¸lŽÍj{ºN‚»hŽÊ^jL]y`Ч†~VPs9UzCi›Po¨cаakŽN™¾vs•iˆ¨~•ªZt‡?^u=Ru7Zla…ªryi†´p‘Ãu~¨\jŒ]…n™œXq[}š^V_Ks›–ãÿùÿÿ²È鈖¾]j„Wb€cyjq’ak‹^yv›¿¤¹…’¢St„BLi5Qn=MqHgˆYlŽS_Kg}Zm†HJf*.N:Ff_†¢OdwNj˜\q¢Qe‰G_~>Z|a`…de’nq•\sŠIYlN_mBIk9QqDU^,o]2at8U~LY{Rem9cp@W|GXeLif7mk:Sx;^pNr`;gxEfcCRc9?`6pN6Sy+HbH_H-r](wa8_g=L`EWTEi\/fv7_€G^b?za@„r=o‡ZcƒkHsZUYHoM0ut;ƒD^›OXr[W_A]bDkgAPvGPfD[X2^X0N`?_V@R{?=cSM_A_a'hu1q‚7Š•9}£Va^R…`hd<’o4˜±[e¨wQjK~VA€b)†8vŸV|ŽcŽw?{¢S®qi©^lŠj™ŠFµµSš¿€]ŠOzXrq=‰Œ7|œSr|R„NŽ•Oa½nXv_„j<r¢Hˆ^o¡l€Œa\¢hez[qzDzZ~‡Zt]_‡LGv@b`6pz?s}Dr“PHjGl[.‹p@sPd~MOd1{s4s•7Œ‹F|Eo|h†M¦©`kž[—‹h¤O^Z†m1§Po´N…`cc=NS<¥`.|¶x{¥w“°[¢±q™Óžž»‘x¤¡s–ª±¡^š‰TksR²i;p¦T{Š_J›Qbe+w‡4pŸa]ZKsTbU)Yu=–€CB‹5M<VLl„'€–7u–by”jŒ|f_¶\fC_Œ9t>baCwxCvž_Z~V_j;{O7QyZUZ0Š‚*až^RnRqq<]˜Fr~6ª¢H’õl•¤{Ða«å…Æ|Œºst˜†¸[z›c^Œ]’3®³oÀù¥¿â™xË›ª±MuäpsšGt¡9|Œ?££Me±X[†8h‚-\{5^€8€˜:P¨J–/o T‡žJuŒIvšCGu›Jz®[loHuvEs„PvMƒ›U€9ŠS‘zcüă©h{ˆJxkCŠ{Cb¢u›¥P€ˆHŠÎl„=ˆ¦‹~‰Nox?[€<QV4½—7¥ÿ“Ý¢o¢ÿžÁ³OšÏvŽ¿\°µš;q9HQ"}f$‡¯c{Âq™›Lg¾s“œRƒŠZjv;]‘PR;Pv*‰ÉˆLBŒ‡T•®gÄ–l ÈŒ¸e¯²tò´N‘J_”6g£E^y3‡E K§Áƒ—qƒxG˜»cfzQNt<Oj&€:×Ç~ šXf•1m‹GXc6Px/Po%f‡(qh.™y@¢|`…g]i–GqŽ@ƒ€0œÇo¾s¤¸“{µWŸÍ°Ãª¥ìõÅëÿÕ¢å‘c S‡’Q’ЂtŸXeIr•WÄ¥{–¯n¤¦‡Œ’‹‹r4ÌŠ€ofY˜o…A§Àc¸á‰Áä×ú²èüÀ¹ÿœg/Ѩudzsš†O™pt´°wb…0އ[§¡ c{9¦Ò‘jsnƒ’}Yu]FE(atE©~jpN‚q~¡ŸŒ—·j‰„s²ÙÁ³Ûɔɯ˻¶â¯”Ë^‹<BZ1sw=-H=F#H\;y‚UuÀK^®=‹U ¹ah‰f„„S™‡n‚¡fK])–¥Lr“eßÒ}\r-™ºUÐÿo†ÆFr¯R°èm-A*):(82C2~€oÉÞ’“Îhëÿéãÿ½‰½M]q7U\=ÏÓŸ±Ýp…¶p¤¼wp‰;Ov:t¶EkŸg‡±œ{¡l¢¨¹ªËŸzf•ª~«Ws¥h€¬tu°_³Ç{¢ïˆˆÒW:^-frHŽSw}ObpY–žƒ¥¼a^e/Yq0MeAxRh¬Xa…r—½†¾qs‘jy‰jp•Rk†^’ÉœÏx˜Ý‚™Ý Ëo·^{®W…·ci¡P[~BBTHnLŽ}Ó|œØ‹È[Y‹Fa‹]q‹Tv”_Y`?k„@g†OwLe•`pšYdƒi“¼‡«ß–¥Ìrˆž[dza†”bdˆdy›~®msJrŽoˆ®¼À×°ÁÈŠ§¨[f‡IZkIcz[dnŽdj‡oƒ¡}|™x‡˜SY{<Qr9Qy=LoLf„\…¢g‘L[‚c”ª[y•Hvƒ@qxDfv2GsQi`j™Xo†8P€@Vˆ_‡«}‘«nƒ‘SauQblQZb9H@U†DAb4]L/jg.a|G_yZ~mC{‚C\”]Oo__[?gd3Dl73gDJJ2HS"JS2T\1Jd6dT:Cu/C\A_I.ha&ee>Q_>KSCYX4ca3kl6Q‹HWi?kj:[i:XS9Ul?5mF=O6cH"eZ'ƒm6g VZdYhBXrDonCqxCa€LkzDms9`iBiDrŸKYwVN[;[d-um4‡5s¡Xw‡]j_BcpRMœ†@š¾bm²UiWZh4j&”J‹¾u[½‚ircŽ~Dj©aoŒkiCЇCu£P™okšph{V«x?…Gy™k_]\{@~v@p£Mf‹T„y?fKspUe†L‹ˆN_¢[KtQS\:lj5st>f‡F_FTx:mx9`Y2o4‹ž]`ŒaPd?qb2R’9FnMlW)Žv3‰¤P¡£h]’Y o>¸tŒ¥mLp]YBq~+KžGol/ož=u–i‚©QEwbV\&zg- ]ÒŒŒÆ„›®yV»ŠuQkd€L€}?w~E•vWyVPxM³V+u¬VrŽcU›V~}3g‰Y{‘Gk›gIyYGf(Wj28~4)8,W5bk/jyA?\DMW(UL.bj.‚‰7Q”oli*M—Sbw&c‚DPxH_R2exCby9|~9VuKe€=FwPU9/žz1£ª‚®Ñ~hœ‰†‘]„š~—‚ÿº€´á‡{¢Š`”U—¡M»wˆ¬uœžOœ¸xeºw`tYxH^˜N{}@€®]wÍM޹VwŸaœkl•_BÉWDB&sX3wÏS\›^ i(’ŠP¦D’N†gP†˜@Z›CkŒ=q¦FcŠ;Sj;œ‡:u]“€Co›Yf‰S·’Xu¾¢Š_D½’T©§ldQ…z<[†OŠ—> §n©®kœí•¨ˆ?Ðu«ÚÿyOÑÊá‰ÁކŒG©œJ³©‹¶Ä„›‹J˜žT›ñ•’[”ežxWu—X¤šC„ÍzP™J>Y-BL+:G-:M/c]JkuT¸§dpÄp_ˆ<i†Mrµˆ¯a̦mi¥hs˜+™eªUiu0uxCÍ´tBÉÎWUˆAPg Ov$Dn!Œ|HéldÇ•hË|¸ŸX¬Æ{v¦D¢MDQkKM_BH[€}idSŒ“Uo®M†‰^cwYw¢d•~o£²g×·¨¼ïÆŒ²u¨ó–ŸzÄk¬ì©•‰Z~Ícu—uxfM…¡YP~@Bi'Pu0LS~“/Rr=e–)µâbÏõœÕý£Ñë¥ÌóÌò§˜“iûÚ†y[_ˆ„W™²‰¢ŒŒÐ•ÆÜ‡ÄXxQwšm0C/L\2`Š5Lr3PM9[‡<cwF\t3NW)TpKh`K’¨¥¹±Õ¡˜¼Ÿ™Â”kUšªbm®*Ai'UD6µ^i¯0¾Ëµ·á˜Å~–œpÍÅÇÉÿ©¾ú“Õè—³ßxÈí •ºiÙñ·—¥xÔ¨„ÿÿõùÿ®Ïõ¾×ò±5A+>H9J&‘ÃZt°PkrD¦`žÚŠçãÆÌàÀ¦ÜpëÒi¥Å^Ž®|Äqº×ƒ—ÉoÌb€¸yx´u~²ox§zwÊfhgl…e‘¢s€¡«ˆ£}©¼’•~ËÿÉÿ˜Åÿ†j¨1A[&:J,PZ;`}DVf=X^6e†Nn°^Ÿ³}§é„Ìdˆ´‰ŸªŠ‹·mrQ{‘w‹b^`v¤sƒ˜|¸šÂ‰€Kh“J©mšÉ‰•Yl‰I]xUyhœÂ|œ¾ƒ«ðލéjVw;_{Q[mIWi3A[7Tm;RoTx–Zl‚iq–\a‰^j”l r‹µm„¯`p–kˆ¯eŠ´‚™À•œ¹{Œ¢Kf„In“\dNf_¥¶|Š™W›_~’[c|Uc|Q\rYq“u’¥e€‘Os‡BYF_~?SjDVmSd‹fœa…¥xަ~”·iwŸVjŽRl™[u‘e©™VekJYkEZgGWqebuhrai†L_jL[yLdxMx¢Tq•TBZ7OY4M_*Qa6e^?vd:{uC^^TtoSbHRb8@e3/\5:C+HGPV$WZ1Cm3UX@Ff1YW6cR)Pb/TREad7clFquCUp=f^F]‰@bg;[t;4gB:<3EF)GU0Fc;eT+c\*€f<s“Hh…aŽyRnOrz^…„EˆTƒ{Ru‘GwvQ‰~G€œ]…ŽemqLb{Gmm7|†4e{XhkVMmAlY:‰@‹¹L‹²jq¦wav\^HŒx6”¢Sž¥\¼”Tƒ}_e4[y?M…N<f;XM0}o<~ŒQy”ZuŒ`apAqfI±|Mn–`qƒKz™G†‹N‚‡Yx™lb‰Vh|Ki{HR„VSsNCf3rD+tn6t„SowIp‚Ep}MirTjs;‡…>{“Q_S^wKm~9V…<h^Ijl/‡|7…MžU—}P˜]ƒ¡gL—W/_heR/to;vzJ†•X—™K©y\ªrqXtŸC¡‘U’Ö¦€Ã x«‘p]PV…X¹‰AyémŠ—XµŠRÁ¢Sªjh¼gÓhHqÌfvžD\ SUn9Oc.`x3€y6fŸPu~Kg¤OmŽIqD”Œ5sÄi`}VqxLax7ZS5u\B •BV |mk4QŒDo‚&T{Hcm+^wFH`;{`-]v\fg8c‚9prEƒf5°«\޼||‹gT[aj5Vr5~C—§Z|¤eZ‡\p_CGa£cgj3aM›n}W0R›E‹a)´·^œŽnrj‚UoŠK^…J‡s/«Öv0e‡zL•èUˆm{•mkFŽ_`ªSrs.އ?Úìnqî´u”7¿—[Q¬sKo+wz5p†QhUnŽlO|;vn&¾XùÐâÿ•¡¿Šs”_œs7P¸©x£Fic8´½tйƒ‡|®Y¡ŒŽƒg´§_–˜kŸ¤Œ¿x€¥f—´efŠJ§«]¸¾‹š¶q\œn~Q|u?¡’AÉÓdeqDlq8Oa1HE/EW/X`2X\/r<ôoÇí¦ˆê„Lˆ9Pi"hŒBž‹Zjèsa~&ž†D²‘VìöQ¹±—€~@y²iSn"cˆ)`€6wSNh<¢•EÊŸz•Ÿlÿ˜e†§\—Ä|˜VnžJiš2†¤g†²e”TpšZo‹9|‘rT\DJ'duK‚”sa“g¾¬“¥k¢Ç…„•Nš†XÄ箤ު~³Køÿ³hÇ=z‹Sr–Zv‡RÛîvéÿÍSd%ƒ|<׎qÉh¢¸yƒ‚b©ˆ^µqe—rn³É“މGö¢™ÿÏ¡åû‰£¹TU7>G-¥™lQe?Ÿ…ŠŠË`f¤2]r,„ž?N2{VQCd%1)69'ZL3DP-g=ir^äǺ·Ú²ºö·†Šnx«Q—ŒZig9‰P?e(pec™½‹’yÆv|œRp¦?¯¸ŒÿÿÒêÿÕÄÿ‹õÝ–«¸¹é}®±se„B‰{e¤h£ ¨µ›¯ª„ÖÙ¶ÙYŒ–L™mÄÿd¦1RiJ¡·s¯Ö|©Øˆ…§U³Ïu·ú‘•Øi…·jmo¡Þ‡ŸÛ‚Òy„ÆlX‚VŠºšÎñ¨z²PWy2Fj:mf~XktSLZ8Z~L„ƒyˆ˜t¤kµ^~©StB~‹@\k=dz;[‰Fk“n’”{¬ÓŸ×‚|¤ll~YYb\s‰{¥XlŠcˆ¡l…¨eoŽb€’]‘¡w‡Ÿ_`„KhŽ[}«|—ºi[jEVxKNsLk–keŒ]m’o‘¬~|§JMn:k‹Rg‡M[„<Zn1H`0D^2On=^yJXiAVwDVoGToh”Á€”²co›uŸÂ}‰Ÿgn…z¯qz‰BQpD‡˜^jy>d|kÒ½ƒ™{‰½|ެb Zv‰JWx\†Ÿcs‚Uv˜VnŽCeŒPo~=Ys<SgH\ˆvާo€ f–m Â~™·t£½w¦¨r‡qb‚p<RkIgm64H)8R3C`RfŽShˆRnƒW|™UmˆO`wI^uFRk=^`<\e2Rd8Kh;M\:_]/`k?_uRNtLI[;?b5-`83E/;DQF S])E^9ZX9bn4Z[>ER1<M6`>5^j,omJntI]tKfjJjo;nbDke:RgAOcCK`.d]2]|6]m@T\5€`7w–=kh¢rT–L…¤{˜_ŒT}}Ur|JexXbqDj}I|yDŒu>I€nEs}AvkJ_zGfd9sq>~vEr‹Vf‰gysOqlKl‚Je‚Y`~VkxQYeMwTOb6b&xžDFªmIH7OV-Wa4mgJ’{LPvMjlN~‚.¤T‡ž^m¦X’V|P|‘Ze“Mi|@d|IptHm~MzvC|g@ol5gxR~zEp:rWuo9†x9_}HxwAbŒCl|NxvFmŠBŠsLo“=v“OgqInd>h;emNQmEib<”ˆ=\¬Us‚Kš@ЍJ„¯f‘¤dËa±ës{Ønšsj¨¿|“¨£µ†„™``˜[™‡?|»q¯}{Á¡`ˆ›b—°gn°p¤pCžÏhw·{x—]Y]Kz8Yu;N}??Z2KC/mhBXgEMsCFQ-md;cŒX\zABY0P`(og>©B|£ˆg—QU{B[{2^s0T|?Bs:b]$tr5cv3U{7vŠ;]wK’sF›ebKXŠp<l’eay=h€>•„8|S{ƒWL‹Vmg*u–APiGMc0…c&Wm_jf*ç7ŽÀojkH†{9‡v7s£EMp<LZ(”t0”¿{]·gw‘LEpWIX,·‡3£~ž]u¸d‹€3œœM»Æ˜ÕÑŒÿÿ¼ÿÿëfÿÂZ€/^‹.ƒŠU®›aq•„o’Pu9jêQ\7°Ue²á¦bƒXjw6Go6MW)p4&h—†›xD¦]¾×‚§pC£çf¦ªb{´w¼J{Ê‚†—Fw±LqyB €Z¡Ès Ð}o¾{¡r;¦j—ºjfœv@W#XY$q^&X“B—4âа{ãbEmL<D)AH!Yq(Cu;a^+„[ih.Zˆ0Zƒ)c~#¢Ô`¤Ùxp¬@s€FPx1¦†2_VP‡hB„ob®–x¦¼d›…_’‡cÿ‚f¸–v–Ù“lŽy•†Oa¾D‰‡IoÅnCo%Us4Z¦>dj:Yg9=J%[_=‰Œe¶Å†ˆàs°Â¤7O:Wdn1ŒƒQÉݪ‘ìhÿД¹à|}ˆP_¥e¡vGÿÿÿàÿ˰Í^Š´U£|C£‡Ey±Tƒ~CȰd´²\²Ãj¿§¦êÑ•˜gf£nÇ霶p½ëyÒü¤œÇn¬æqÅÈ”Òÿ¹Œ›vÆÛ³ÐùҶݨ—ÀVTu-ŒÃOçÿ¤}ÙRÁ¥_xƒQ}’c…“qq^§ÇjtL£¡Œ]Ž?Sd0gy2ÍÈsOl9ŠŸ“®ã®„¹wqŽPP„1ªžŒÁß—Êç¸ó½¤ãÿ›±Ò^¨œ¥kšI“n=§‹XÓÿš©º„ƒ¢P…]ËʰÛõ€’µFˆ¬c¶Ö“Sb+WP-qq^”‹W‡¥_¦·j‘¼yàž¾ï¨ªÕu–Èqˆ°v‰ ƒ‘´€˜Ãˆ‹Ì{y¶l¢Ö™V9@ZJl6l‘POu7U†?m‹@bC‘¢]b„RjœXp§j{¬Šflu=or-5A0xzZ²Tx¤\|·_yhsžXl™9S|U«¥•«qp“Nc‡_ƒ¡TUIu˜cºv|«_s”W†½`aŽep™@U|AUrRl‚PYtK_€]„›gZ{S^|=X€Wyªtq«bp›Hat,Bl.Nm?i„Qj‡Hh†;Nz9Ig3k€n‘¾€‘¸`ˆ¼y´qv¤HEtNZv[qyG^†Oy¦o|WÉq«¾gzšz‹{„—t‚šmz‹Wz•gftBawOn‘Xi€QaŠPcq>VfCm|MZ€kr˜py–e|“bu‘qy‹y–pph7YxPdm?b€W†{,<[/B\6>P?ZhDVsSay_s„Ui~D[mE[sILpE\U<b_3gt:Nv>O_<QT+W`4Aj=GdI[fAVz<S‚JFpCFf9RJ/Ob+eU4bg;Ki?F^@HS8TZ2Mi4I^:cM=pR5`dBZj?\^<^\8f]2nhCumKiwJxzG€EZxMhfHf<jœGYŠplrX§yA˜œb§·qµ§h£ntŒ]Y…UWaLWq>kv5ƒt6xˆAœnJ•n>ŒiKf†LoIyw9|qMqr@dTˆ|Gn~Jp{Ca†b`}WMzOJeEIW/UX2xU(Œ‘;H¹xTbcuW)dj6^c9cz1\nAbz<˜6‘¾jˆ©yxŒ`u‚_f‡BypTNˆEh_<lx(kxCnsC†nBs|Fp€JŸxN|‹Eq€IssNfŠ@ms@bh<q}7\s:{uFh—?—=€—I°‡BUŸPo]Gcy=pb:]~Ntƒ9f•;jx<bRY‰Gxw9‘e‹¿wX§{uxSˆ˜hMˆr‘[1a«[wyif¨FYtRqEg>U†G‡t<‰‰NncWwmMeŒfßy8ÿÚŒg²™W~DiiR|}B_‘fNtPj,Z’4Œ‡;Q©eUm-Sf>\X)“Hu©{µIJ¤\bI@7£®{d¸r{ˆ@{ÌLT¥OfwC´JvÁhŽ‚Sjz@j~Gt“BX¥Vb]DgŠ={rB†Cy_eG6^a9o5QrKWqH”ƒOWeeWt1Pf*MW-st(ƒwKay8š? _dSnx;—¢Gu‡QTƒ>^r(p”.ia|–J@nQFj1‚'æ°lŒÙ…e¦n‹zOj‹b•Âaº¬ƒÿá¤ÿÿøäÿãÊæ»zÿ©^HO€<}{>ÍY’Š]¿³•‡Å‘`«ddp@i‚_€‡@HU<XL&1RT<>Žp(rwcv²E»ˆL£´l¡–~ƒYl®}ä«udd~I`‘jlK,Ÿ“FÙÿ¥·ü”„ÑhƒˆUr}H~²Li}<[l(~£A¶c•¥gq–xs’dl’^1M"FK%D,7I"6;k]%Vm9Ld'Šƒky“G_d6€wsŸŸ{µÄ—}e6`]%_‘‡TF)]W2kl7†ÅhŸÌ™r—[e~`Ïxl¡vuiTuoDnxJcuTb\6hvas‰ol•8˜~Fa~1”¨}ˆ V‰¹ngŸ`¡Ÿw”¹³V{Am¥iŠXvxLo)†…I`M¡{W‘Tˆu]o_2Óì¾¾ÿ§ ëwnOM\;mp6òwt\s(_\/whB‰pHwOÁ‰b ”bŠH‚ŸZßÿ¼Ñÿ¦†²g¯½†™‚Ø¡†L4zstl{IÂɸôÿÉÐÿÕÿ”žòoÿÿÕÖÿÆÈÿ¦ðh¸g~¡Zx¤\Lp=~fAD/JJ2_qEYo1o|Kìÿ ‚µHwn½Ý¤£Érrš_Re7sy]‡r›Âl{ÃL•½_£”†ÇÿŒ£ÒW—J¦Í’¿±|ñ”¹Î»˜¸òj¢×‹¾ÙŽžµW YzZ@d[2ym5€dY‘£Hˆ;yBdxR¥›‹¯õ„ŸÙ}˜Ävxa =4N:¬…‹®oƒÍr„ºp[‰6U‹*Jj6zpŠÉrÁÓÿÿ·mWXpK€Ÿmyªkºuy«qu˜nlœCRS#?K6‚w\¯ex“kyš[pKOuTPaN[k‘¬‰u£~ˆ´{t…ZiŠKjžfwŸmb~Qc~cggr„^iVg{E‚¢IWs9No<VoD\‚^©xm…KOlB\w`‹¨m†Çr~¶Zl™FUx7JgC_za˜²sÁ`·N^„APvZo£t„¶v‡Æ|€¨‚¥Àn…Y[nJrzQªo§âšÒsˆËz‹¼X[nM_vNUzar£uƒ¡cs{Jv‡LbrDeƒEXzIoˆMaDexIiAJq[gjƒ±s‚ Sf{JWma‹V_cEk}G^{FY}^ ;Ph>\t>Ug2CW7MeJV|PUwESfFZwIZmQMsGXYAWd2YrC_mAW{?Kh=Pg?TpNvoD|’DxœQz›Yl“^J™^J^JFV5XK2Je4Q^DP_A\e8h@V’HFt^?IDH<*TH)XV5N^>OW:XR3[h@`bEqi9oƒLssQcnRyfG„c:}Jn†ba‚]{o@œzGª‹Y©¨iz£wn‘qd‘fUxTNvF^j2e},]wB}lCm:dI`vKmkL¡|>ˆ°Ux§lfœmiŒ[k€;}b@‡I~‹]TŽbEzYEU5KG#ƒJ%”3j£ii’ucHQ…HXi0ow={H•“@~¬X^”ihl_L|AMmCba+k|?Q~P]Q+kn‹€>tŸSŽŽ[€‰E~Y‰sF—‘Q¶ X¨Qt¤Rm‚Lct=g†=ZwGnc7Ò|9•ÄcÀ£a†¹iy…ds|6mmRn:…XšY…¹dt³]…œ\wL¹„G~´\{§oZ¤z`ƒWNxKHa>HS$p}7‡ŒYƒ¨OQ¡‹”nB_¹b•xPx·ƒqŠNy‘My˜ZƒO«„G¸p[žlOq7|t)w‚6‡¦Eo—QloNk†Us£=f“Wr„Bo‹EyqQÒ¬L¡Ø³Ÿ¥rWØnJcca\2i€Eh}_›ƒG©œw ®Ÿ“¾‘mªqA~dZa1gm5ttOo—B‚žRÐ|]uäYnRUg5ng9X[6my?€zE† K]’YPXRtb9ĤOàÿn_¹i‚v0’ÿ^q´U„nK¥jC„ƒScºIb4tXv¢B_}Bai1—|>Ò|^sÂ[dSáB±ÿß´ÿ‹ït¬Ìp°ñ¦}Í{œ²oÿðÿÿ×ÑÿÝrÿÎ~„Ut‘V¬²Uwˆ…azHŸœ[x¼teZI[l(Uo>Xn9Zx+_y6q”@mŠJk‘Ln˜H[ˆV¢Ž2}˜‡o7e‹Hqr9`רkk+]™]ll=t‡B½‚OËߤíÿ¹õ§¼ôŽ’Ùf`’WK_2T_(rr5^ƒ9rh/Po7X[)l€BgY5>š8?*C;",Fg^1F•`fs=Mm+Ž€=CBRf!rw<’°ib^:¤ªy|yLXf/Sf,nŒD€O@ˆŒh²„zÆX¥¸l|¶Qv«;©Ib›=_m(n”ZrvV^i9_†-y~H‘Ãa¥xGyŸW‹‘dÄ‘s£lfŒQVb.grH2m&!?'4'FW!ž|@‹i2§ŠTÇÎŒµêŽ žm}Q{H/^^S(vuP¾U@x•=~qLvOAƒWGwVŽœi®‘i‰—Jçÿàç÷Ì¢škZJO]v8Sw4Jcx±`kŽO{˜bÑÂÀÿÿÕÿÿûúÿÉÿÿð³þ®çŒŸÉ–„Át¸á³ms]T};9O'^O.l|EnŒH;PDg*~ƒ~“Ày±Û—ØøÖÄߤ‘S<_ >F$Fn$DCG}gWsŒCw—5‹˜c¼Ý£˜èl¾Ui“7yS¢¨e¥íƒ¬°hPa2eQ7§œa‚ŽP˜{h¸~Zĉ[wd;me2tu=´Z‹®i¨ÏuepZx‚kŸ_aŠIJyCy¤cu¦`›¸zŠR|™ns®Lv°s¶öŒ³ëŠªÏˆ† dg”;zƒ@_wfp†^]rVwˆ_†s~›PLs$Me6^qRn—Nbs[b†QYv9Ql@Gk8b‰`w¯Vu¦k‡š_WtY®×Wlª[`{BOe-F`CTg:Jq=X…P^‹Lb•NgšHs—K\zY~Ÿvs’bQj.6R'?^Kqwb‹£‡Ãey—PVƒ0Mu9WpHckW}ixœJY}=h•g„²j޵qޏ}†½jqž[m•MYnBYuTj˜iz³lqžbвt´Na}Ji‘Ul•d•§d^qGauN_„CUr@ZzB`†Rt‹P_‹Sj‰Ow{BOeUp z‰²py˜Sd†DXeQs…Jk‹Ub€^‚Lf‹ÕºWw’Fe}C_w;ZhFi„UwŒKcsBMpPbƒCUkX]zG]uH_vBOƒSfkH\z@^nFexD`Tg{Rf†Gd‚\iŒUh€TN’]ShX\U9vk3x‘InªhqŽ]eŽTt|W^ŽWPtgPX?]O0\Z7gS6Yu>IbGLK1OR4RQ:yN/s†HsnPjpSQ]@YP8h[2hiB`mLY_AxO;¬L;Ì}N²—b„kª‹eo£eR‘nlr:a*[~D}i5wk7iJksJ¶nDÿˆ>ÿü{ÿÿèËÿÛ•ò¶z½vƒ|\’N†§isw\…bFtBY\7we&}„D¥hŠÊn}¶hl¦a¡pNx”KO‡djWFf}OUkM[pHwy;jJŒ†Ln¡G`Œ^ac1|w.g‚L„}X¡˜`ˆ•_¡z[‰¤V²§n¡Æu˜¨c…©jg¦oxLj”K[…TZm>io5•u8¬±_t¥p~„Kl‰D£r<²Œ@¬±Z›£d”·f¦Ð}h§s£K¿R¨ÊŽ¨ÑœŸÝ¦k¿”Uƒ|Oj>j.nÇ[g•]¸‡T¨ãœàÚ‹žÿªËÊy¦ç…Œ³ƒ}±gi»Z{ºX••M ±`„¼fh„c³Š5”§R|“gO“bak,|€9áš?ír«o’‹E¾Â]Ýötáö«¥ë¢Ò„‰·SX¤X^w@pl6]7x…;{‘Oaœo…xEc›\|{IU‚E`v4iuCW”P¼tCpŸwšAdDXs:et;¬m@t¹zŠ—^{–Y‚l:ÀÌN·ÙŽ›Ò¤xuƒÿ„K•îâ|S‹xPr†aŽUØÿ‚z’ƒ€xBv§d[Œh|}8¢±Tf½y›±R¶‡pX´•]Óਫÿ·Æ¾nƒõÈ{ icŒ`r†?ú·/åÿËÿ“Âl‡ëgi“> ˜Jiô¤uy1Z¾lm¿Y‹¯tiƒP]—B`˜D}¨O³›Løm”‡nŽ•a—ŽW^§pnh+w´e’H•Ož³{¸h޳\•–` ŒO’À`±¨[îä—ÇÝ’¨Õ‡Ëô”XÓWFp*NL!dd*~ J[q. ÅH‚±DH|=Jm x]\oe Œ]=3>AJH hd>¢gXS&^^Br]/W_Cwo@SS>\a)…_irSjj0^|L[W-€c5ܺOÕÎ~ڶǘ˞güÿÅU dvœjrŒg<c‹ª`†¤Y”»K©—`\k7އ~¹f‹Ð‰‡°v»¸~bn?‡|J“çj†·a!f;*bI0±_çŸÕÄw¨Êxˆ€e=„ j‰;—Ú[ßY^†:f?JB!’\JSa2WJ'K;'MI.ŽZŒ‡Ev•MêãÍÖöOp'OQ#MK'V>D`1“ic[x=^K‰Œc`Yد¾ÿÿàæÿÁý‚€Îa„˜o ‰yÿÿËlÂ@O‚9`y9CH-~ºg1f#9c'@Y)BX%qoh—¿tqGKˆ0mQÓ¦oK€*]’(I‡&kƒ@‹ªS¸Áp{Ndgo»±ÆÎª›©mˆšSmƒH”za’g{ßÿ‘ÁÉ}ÿÿ«Ú¨w–S…gE`\:ˆeB•®h–ÀkÁݬ«Ï{FB(NU$TdLi{Z‡ÌtÆkt§]r¦`n“NKy9o’Z|¡©âˆ©é‘¥ÒФå{|»Qn’BQs-JU;Mg17R(Uc;df0^r1VfJg‡Z„¡gf˜_y‚_Xh<<S5[pIuže±k{³fy\‘g¢b€ªK`•ECh4J$GfI{›Wx¶iªðsÔsŒ¼t†¨dv›DbwI_zMQlEKm/Gf-Hd>q_‡£l€™I]{FWB\‰Nx¶S{´[‚µhˆ´UeŽU¸tŽÄm„ªee‡e| XjD[}NbŽf“¼|Œ´f‰Tp}SfYk‹Jlf—§ew•_lxCfrFSyJuŒNfŽC]…Jd€Vn€Xz¦l|£Te‚=Ny]uœk{©kƒ¥cˆ•OmyO^ˆ\it|›fy|^…§©ÿàq…™Sa‹HhƒQeƒVmWamETnTl‡XfHQvgUjGQ`@]b>gt<NƒJPzIpa=wƒ;]§cWŠlV|PVrEVqD[sBaƒKdxM‡sD¡H¡½sÉ’¾”†¨~r›jc›lj\‹vVn?{xF{{Lb^Wr`\XAMX>OF7rH,iq?yaL^jEKOC`F6]O+kR.nV/[]:NK7wE.³N-hƒG_KN„ZFP\—vYƒSRx2^p1X….dyKbAsƒRÿ}Qÿ¼Oÿÿ²ÿÿÿÿÿÿÿÿÿÿÿÿÿâÄÿÿ®ÿÿ §ÿҟƧ¶°aÃgyšPš“O¤¹g·uf›mGr_W^]ŽI9n—as—D{’A‡Š6ºY‰©T|¥_”£`rÍw\¦Žjr@~:j„A’KßÓY•ÿ¢Çκøy´óªžß†¿Žp—ql‹\{—cbŒcaU`†Mls5}p0‰Q—©at‘X•{>‰6“{G›x@œ§z€ÀPvn£a¢‹?œ¦a¨Æ¥¥Ñ £À²XÊuazu‡QW…calDo…Q¿…Z®èŠ…àšÅo‰Èy”Ÿ[w–q£”a²ælh×’jsRŸC^µ„isOu:žWM‡b]h1a¨/–vD¼Î`¯Ú}u¾m¤Jn¬]j^}œNšÀtfÇnx’K„h9–`e^%cr1h6\‘;~„C†«\‚‹[]ŠJT}9^x4}9ižhrtHލRqªqyJªšI}‡nÀ¥[°ñ® ÿ¡½v©–l`˜y¢jP¾Þ…mÓŠ™ÔQ|¢j—¤K“›UÀ©V±´Xë—‹¤¹ŠÂ¡kÓŠ`¡qdš>‰V{‰h±Za|[s·cq}Nÿ~]¢ÿì’›om?p~¶]|ŒEY½BÙ›0¦Ü„•¼|êÿ~—¹€n·|ưH^ݼuf'¬–rVŒr`v7c|Abn0jr8buL|Mqw6˜Ied!Zc1\QšƒPb¦X€‚BqM‘´W–‡kh’z²ŽUnzœu-`j>Œt2²ÃtÅ„¦¬dÜÍ÷ÿ´_ÿÊY/*a?)\„G”‰J¯î³É׆I¼zn‹L]n.Z|0C9$GF,Ë`3`Šj[:Ba'Jf-IP,Sa6–Y2=T!Y\$…â}Z{Mž„MR«SµqCŒ²l“yg€tUh…DèÂx±³€âº|МWœùT³N—Éq›Øz–¸}ÉèŽÄû—ÄÝr‘óoÓ^SÿùÂËÍ£Ä↢؇“‹SŠSX…¸wÅÛ¬bÿ{ep(»±†bTyœSʉtŠêhr›I™¬«ÖœšÀ|«ã°æç‹ TWj6aR1U]6†aA}\?‰oG[=*\H?vnP’ªmo›N[‡896{žSc}Df‚Jèÿ½–ÿl>\'1Y*'.ˆzXØÿ¤üÿʲø„ÊXr£BopI¡Ä~\œGX’?GS8pVhºñ½ÀhR‘8>n(WŽ@f¦N‘„]²¾TÊÖˆõÞÀÙ¿Š·Sa,`:trU˨£´‡uˆX{¯RbrB¡‡Nwlf¯Ö„ŒÅMopA‹ˆ€ÝݸÿÃÜÿè»ÿäÏÿÝy}}<nQ„¨t‘¶ž·„]y?kC‘£[gn7‡‚B]|d®Ñžê‘¯ð“ÍokžKFa=\~KNoJJ\PV\Mh‹Zˆ·el•E]?R‚->M'Mi7E}/Ed1Ud(Tq2`ƒM}[~²jo¥fsIi–SXŠH_y@S…ZkWq\x–Y}’Uq©Tm˜HY>Yv7AY3lRgt Ȱõ†“Îtoš]_{^d’@Hs1avB~Wl–5>f*JmLs•dv’Vbv6=]9R~S©y°Þ¢¡Æim›X]†Ut¦p‡±q‡`sŸGgSl–ao—i{p©‡žt†£X]|Rq‘Shk7G[:]{‚Æ»_]xEhtJqyJk…Ss\…¬n’¾i”MYtJf]—U€£[nŒ^{ t†¥hm~XdxMhŠbup{®q‡±PhqYvšÓ¬gv’W„•Zr‹Tt‹\x€Q^tMd„Zd…_e‹[f~b7V:-N35?1e3)el2J˜V\oP~p3d“[XwTqJHm>Mb;ag;v„<‚’GžšYž¡Y«|ˆ°‹†¯‰…¡€|iƒg‰^~c~~V†Œ[€iw‹cqpx{^pp[sdH]<rtDdpQSZ<FJ7V@/GC&U@6`L'SJ8`N6dc1}i;dtCvbVw}@vyY`VXwOay8ª0‡ÉGe„rƒQ{Xÿz[ÿÏ_ÿÿÕÿÿÿÿÿõÿÿÿÿÿÿÿÿÿÿÿñÿÿÿÿÿÿÿÿÿ¼ÿÔŠ½ ‚’…a•civ`h~S\|PxjGTCQ>•€-m§ahƒ]u=žŸX§^Ž´t§µk›Ã‚p¹ žkäÃ^ÿÿqÿÿÅÿÿÿÿÿÿÍÿÿ«ìÑɽ–„d’}[uZu~IwTŠ”t½¨Té’ЦV¢°X§Àc–©‹Œ–a¾‰UƒžYwS±{7¦b‡Çx®vØ¡c˜¥k˜ªS¸ÇŸà¹ŠŸ¦5ˆ}GC<QP.ae>isEVqG®eJÖ_ ÞÅŠÑyt’ŠhF„’Hw‰d~aK•unx4ŠvEi¢zf„8›:Lže:t>N_kz%fiQ{<{f¼—TyÀl¡VxÁmŸ£bßÇu«õºiºmxƒ`¦‰W\›mic4^i3b9enB†T…–k‹žV€ŸL¢TzQ‹Ÿ^ž€[k³„y{Ju’Kr›HɧEÁÌŠÕ㵡øÞq§‚|Wge[µ¹PÙù“ʬ~¢aŒeHÿœEŸÿ¾”ˆ‚ƒZv’K¡§Y»u˺‚ˆ®ˆ‰§cy™[“\ˆ·t[´j›¤E]¤a“/F¦yu}$uŽ>UYa^&9TDpY%Ê[‹ÒŽyÃv§ïO—ÿU›^bŒ8ËF·ÿxb¦e‰‚?j‘Oxo3qžAm£>‰v4“ ]šÂ}s¹rkªAz—E³\œ°c E†µ\dJU~?sh&¥‡O°pO£KjtJx{L“ƒDy±Y‘Ž>àÇhÎÜ¡‚Ò—{®FŒ/{¼Vñ¬MÏùǸ֓Œ¨{¤yhlÄZ‹’HÒ‹hË¢O¬ÿy`uJtA`tBU‡@J@-tY:X]&RY1ˆ;tÿ“˜[rt_nyFá¦T~ÔsT=“„<åRd·nc‚H~‹Yœf©Í ÿÿ¾pb™[d¤ÓÎî ºÕ–Ÿ®X¡¥ƒOd+QO-—–QÙŠ™‚¶i•’}Z5y¼ZÙÚ˜ûÿɯ܊¶ºwÏÿ§˜’]ŠyNÂñÎj‹;†md’¨ƒ¡¬™áþÙÍœ…Êd7h-C3|aCŽaFº‡_^r4l‡>il2¶nuÙd_wBT—1“‡KžÀry”UòÿÔÛÿÑÿÿÿ4W# $,^gXͱÜПéÿ§—ÈZj®CÌfèy‡œiêæÆ½Ú}i•LÑèÂÍ쵞ˣ¼ë£Çÿµf´XTKG޼NwœcÀóŸÑÿ«µõˆg§C€‚Lae?xqFV†A½²…ÏÂz\cBŒ6FE7¡‘sq˜A´žl¦»^Ç¢yΣrÃÜv¨§yÛÄŽñ±r•³vŸÊf}”_s‘L]‘Kyº?§nÀ_…ÁOo’b_ˆXqy|œ¼xdgMr‡K”žoƒ½EW~3\°9R”>]z1Gb*QgB|¡Mhz4BZ,ToM˜Âo‘ÛGSr/bn;r‘a}aw£cZzEZxK|¤t|–U]_CTv;Tw=[GfuIdzUu•__‡H^Dgv@n“@c“V`ˆQ\}arYf‚bdŠVwŸtˆ¢Qi6Ia;Nj@Ju8Q|4UxC\vLW}:Bd0Ii?q”Qe–m’»“¾è‚†°Cr¥f‹°Zz¦Y¬^}¾P]‹^n˜tЍs–¸o•\™a¹]x³_ˆ–NSkBOtOœ¬–ÌÔky§_yœBUqNp˜T_‹Vfq“¢hy†U|”N_HXxFaŠKX{Hb[mˆN`O[{U\c…§v•³l¡HX_B[vt‘£k¡¨dq|Nf|RomPXkMw{Xu~OWsQ^vORdTO\3,`0%E5B3sHV€4TŠ]bqGF†@Hw\C`DAK+B[1mW-ƒz,~—C{cn‘`w|g‚€]…•]~Žg‰y^rzSjzYnvU{tP~{JskXshTgqYsz[`tt^±nJ½—Lo§fhƒWY_AiQ6JP.e;*YX&UW7dK0lp9{†V„…c©›e”ÑagÃ…LdbaI?‡m)º¥7ƒànl³¨„‚f¨žWÿ™kÿÝqÿÿÕÿÜÏÿѰÿÿèÿÿÿÿÿÿÿÿÐÿÿÿÿÿÿÿÿÿÿÿÿÄÿòoÁ¨qw]ŒwI‹¤I€•T„œe‹¦^»•gŒ”F—•ng“T^qM€c9™‹Q³¨cêíuÿÿ²ÿÿÅÿÿâÿÿüÿÿÿÿÿÿÿÿÿÿÿÿþÿÿšÞñX¬˜?p^MQ:YS5Ys/ex7‡VÚ˜S¸ý”«¿ƒ·yƒ§`¨¤d¶µt£—^§¬a„È^|‘\}¢c{³cqšm‚‚Sweœ…Q¥³~rœ¢g¡p›˜YtÔ}c²bUˆX=xOFH3–WÀÀlèÒÅ™E…¢eL3p2™eI¤[eU3Y„6’{7p˜X‹VMtBMf=A_-Lr*ih7T8Tv,J,Za5º+`µsz[E˜²P›ÏZâ¢t»Ì°~é‰MY‡n0l‰K`]6\n0h-ˆJwfwœT~˜Ky”G¤ \}«p¶Uƒ©’S}†RŒœQ£¥[{äz’yg™ÏÐÐ}{›}LŸky¦˜¥_‚¾~·—R¾ÿ‚es‰ŽrK“¦Y»³Xµä…^‹p[ƒM‰N®‚T}ªdˆN©‰\¿á‚šµž|À•UkQ´²WË÷‘pò…Žw>;ƒK^q4w0‰¿E~¾_à®M¥ÿ¥µ¦s„òˆzlK¤ª[¥é Øá„Îü¨¹®¬¡¢¤˜™ÃÅ£›ÓŸw „ °on¢€ezYTT6bT*t‚Kp”D€{?n„Lss\£Š8®ÀŽ£BiRˆL9jt]†d7gu¡Fk¡I‚‰@š[†¼|tœ:U}Hb{VP@I4D<8Lel¶¹bÙ|mÿÿfÿÿ~ÿÿº»ÝŒ„zRY†NmLD\t=Žk;myCZu2l\;Ý–eeE^rE\{=惄†Åd–È^¿·f”Øz™nS„0w“Y…¬c|¼u±µƒ¶žLx¹Q‚iv›§Žv¡I¦Ý‹õ[£?D<œ-4Šýxx“Xem>ë\[ÿdzÿÿ»’ΘhNd{3¯Ù¦]5ŽÉU§£w„¥LÊÛ‹¿ýÈ–â…ª·¦”Éxw SO]&dQ1r|;“†L¹³sïåÏÊÿÎzÍl‰ªiqu\¡ô…šÑd’›`¨ÿ‹ÿÿÇÕÅÈû®£ÿ¼*FBR.I<-C=8+Bq€G Ìp¦âpÀǤ¾ÿŸZ¡V¬¦ˆÑã±Ô÷ÀÄÿ©‡Ž°Ù§®Ð›Áæ§3s(HR<ÀìüÿÇÿÿáÿÿñÖû¼Áß–”Ìr]¸B†·^¯ŽŽ~k38%xFr<¶`ÿú¬Èýu¡²o°zbÔ¨z´¦p’”j“’‡©À{Ÿ¬z{”EYc>gnY~°hœÑ–³Áƒ¢Ý‚²ë’‘Ñmn©aa‡Zco:dlP}xTX…@n‰R‡¼ww´^z›l—Ü]Jr.6J Ve;cq=K\4Tp5a€WšáЧÞv£æk~·K`xGC_8EVDy„PoVn_…‰Beu:a}?^‹Cat1W]9D[4e‰HUv9Lt9fWx”OXxKp{AV|Zf}IdpG_~V}´slž]r˜O]ƒCX†Ov¬d`~FlUs”ZX|.C`3OqNn’Rkžb{«q‡»hr•W¬i…±dÒl¸tˆ¸w–ºy–´r€¯jhžt§s¶s¥â|¢×XZ|KbuTd€`u†lz¨u”Ém}‹>UlHa…MWŽRqJVp;Mh[t]n•JR„6Su:]€Ce‚Tf“a~¢eh‚_k†af„__uPWa5Q]@\…|¢µ‹Ó³cu}NfrAWf:XyM]k^€†Icu?Wu8Db?7T;8Q5CQ2SU+Zh+wn>n„K^’VJ„RXmN8e3MO/JU!S^-qd+s€6p†We‡Sf|Sln<xaJssT€fNjkH`mVd`Deg@XcATKDTSBTN8n`E_xJWfM§\GÍ£<–¿a¬ugš^^rLJU2_?/eQ%[`6dM4{s:r•d¡qgÑš[¹ü“gä²AsŠTE5›V'«µE‰Õ~vµ—bÊ™Qÿj§ÀŠ«·–yÿYÿÿ ÿÿÿÿÿÿÿÿÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòÿñ–ê —´uŒ£g£¢v ¤k¥·{À›xåh£¹eÿ¹]ÿÿˆÿÿÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÿì¦ÇÊ›Ž–›w©†^¦uJqAIp0co$z)cšL¹v>ªà^‘À¨f¼}jˆ_Žx?™²f›¸u“¶x{›ptuT€…Py£cvžb†ˆSv³]ƒˆfT®P–kM“™eÀœe¡Ý¯„§o’}M[FT<‚X!Ê•E}ë¼o¨ŽM‡v`p/y};~\_Tpo1e•Mb†G`’Pj†=hœ?NvL]^>`b<]UK€Œ6Z’O]jGaa+m~3Úv<ÄÅdoûtSi:\7@S${Z(ˆ[½ZŒ‚Op”KW’A‰˜9{«\m§W`U^kH‹>Œ¹Yf±e}zU_¢QR…Hyg7d’K—8›ÍuÁw°a‡Â\wkZc–mWh:o’<fyPƒ¶^Ëc™Þ¨“¸pè¯S®ÿ²…Ë{½cv¡payhvu>®–U‘·w^ŠR¦’@•†ÎÉ‹nȘ‚Ž>ÙÅ_Òî°®²¨V†b„ƒ7‰®E€µY³ÃLƒ¼ZÌÿoqPto¨5už1uŸL~‹\ÉžN¸É›¥ÇÂË{›á«°¡Pm¹´wŸK¢ˆfhŇil7Ti@TW-U\1@<4_c-€k.bb=[o2„AàÀcÿÙˆ«ÿ‡³ùx¦ß†`‘Ck/p¬=ry9s`sm2gÝsZ’14i&2\6#²Åe`›ZVr9{lEb2ÛØyÿÿÓùÿÎuô‹–”V`^J?‡ô{§Á‡{íjhµJ§§hH¢gQc0~xHwpPhs?p—B²X•½m¥¾iZCj‡AŠœWy¹cmB~ŠQs§gNk2Lm?Re*woB¿äÀåöà‰ü£_¡M-Vàk‚‘µj]>gH%o`FÞ‡„Þ]t?hŒ>`¢AÈçÀõ„š×‰œcíü¼Ž»kйb–µn†Æj†¼o⺔§Á‚‡žUÅ»……»}ÅÀ™ÄеµÐœ¤¹¢‘xÿÿÿßÿÂÅߪÂÿ²ÞÛºiâTŒ¬hïóÆÿÿÕÿÿý‘ÿms¬Il¦4xÅPX‘=x}ÿƵàÿžðÿψßbpWØýÌÊå½áÿÌ€¼díÿÁäÿÆ›Ñz œoõÿÍõÿÙøÿáóÿÄ¡¡|]bJ\UTÏñ½ÐõÀÖýÅÂÿ”²çWp¬+\I2„“_îîºüÚŠ–£m`oA´ti‹ŒZ·ª€c†”cš¬bY€&X~:‹†EŽŒc`†J}utÂì–ÒaUnKMT@e}Mq€GlOˆZr¦KaŽ_‡¥uw¦e}¿Si–Xw¬XŒ³[mŒ8]j9~Q„‰UŒ’n}—o‹©kƒœ[{…:]j7jeApMo~JbhCurOt‚Ax{Ap„Gd›=~Ps–He‹J„V‰’Q„…`l~@ktA^f;j‰Xs~=U[C\iY~§~€´p|®jo‘O»|‹ÈaZy;W{T|†USx:NvBl‹kx¡fu©Vq•Lg‡?V|:]‚Mh…]lŠ_b„]w’wަ~ˆ³«Îy†©‚¤Á…•º€‘²mu‰HXqGYxAq€PxƒPhŽZ| VnŽJS„IUvIm‰\eƒM\~@b…T~šk†ªZƒ¨Pm‡6S|B`‡Osan…Obƒ]nˆYe~JgzCZi3PlQ›|¡¯‡Ô¨\f‚G[IStQkŒXƒ„b––Gy{H{˜Vw‰K<_;JV<Nb6ob<ZˆBavSjfJZ…CQxVTbE7d8KN4MT Eh.]^7Re.fc<`e;]jCdm7}T6u\5|lDvjAps=sXBto?clGYWEZX.V[5Uh8\j5Tc:†[92‹™L¡]Sœu]vWS[;U?,eG)b^.{d<wAPŠ`…KeËj7¶Ýutí¾Q‘rqEŠ>š¬Vs®wi„s‡oV´†R~žcl„pž„NȨRÿ»mÿü†ÿÿõÿÿøÿØ¿ÿÿîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ±ÿú£§{ˆœt‘j‘k™vkç˜gÿÿƒÿÿ³ÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõÿÿÝÚæ¯²¡‰œË|…ÿ•qÿ¶otµ•~xR[•pPnSpn:LŠCR_A†uB ¨N©ÉYÏ„ nb¦m”ˆU•½]нz¬©–}¹eR¢llV;ZŽ=i}Lp{Fc†L¯rH†¾b`Ÿ_Š}Q›VœÇuSÅ™3hQZ\a“7om2¶~A˜ÔzpÁŸhƒ}x•LbOˆV]¸cž‚O}Ì\©¯j¬Ëš~Õ“_ŸzXlHRg"d`)„j5‘r>Z|WXH0}c5›y7˰R•û~oœŒjƒ?by1]„5r—1}–HjŽJüªJlÏ¢|˜Ng‰Nc›?^jTp€@m•>¤£C¥Þt„Ë€h“\epBL|L[i$‹™9‘—Ld‹em|C€CK¡hhnAwŸR„´=†¥[l¯m¡i™â›……sƒ Qæ£f‰Ü°[|eŒl5e\9ŽsF|»lžƒNcÃlVf9·¸D뜈ΗËËd¸Ì‰[¨v¤0[ D”‡-ˆbF¯t¬|9Þÿ“|¯˜N?H+¨nBa‡a…sA“ʈ¶¾|´â²´½††¿²†¿aÑ»q…ƒZv[ƒ•DS€BNZ6PW#j]2‚“3i>~“=l…<´±ƒ±ã¨Ñá¤×ô„Âúœ¨Ì™—ˆ^C‘YXH!\‡IJ}-ji&x‘o¾‡cMµmD +:Ñÿè\—qK_8HT0}a8½{ç鹿ÿ·È¿p¯¶h™Ìo¶·zÕù½çÿÉóÿáËÿ»«©o[‘W}[tu^mpLx‡Ks›?…£N]¦?gS)¥²VX“Dª„IY‘<‰xTs„>¢zÁÒ©±ée[‡2_…-ž´ÃÚ³Åo±{…£[…žVl¦gHo=Ji"ye<yn?^d)tŽ@•£LÎÏ™¾Ä§Ë÷Ý®ô¯‰©o–½rà^—ìz¨ð´÷’³Û‹ØÆŠ³Pˆ£Vž©klI†«]m°d§ÓŸw²g~“[^\3b*£žp•ÿq“²Z’mkXDt¾À‰ÿÿâêÿÑ‚¶ZŒÈXÎÜ¥gI>D%KN6•›mëóºüë–tÊNÒø©Øÿ¬žÁŽ½Â¡ÿÿÿÿÿÝËd‹“oÿÿïÿÿÕÿÿÓU\-9M$0HAC“xŠ{yn{rx±¾ ¹Ó³o˜=`h7‡qH»É…¥ˆfîX_9~ Z³Èw’‹Nž¥c°Ër¸ÒaIG0€—>]œÌvZ·<PU;‚¨€|¹q¢Ë—Ø„œe}¥v…½m‘ÕŸÔo“Ön“Í`f¤FZ‰Bfƒoœ²“¼”¾˜Ád§Jp—@bm8\h;pt?nH‡DzzL‰”n†—]hl?‡ˆI“”S¤”JioCiPŒƒBj~i‹§i˜½u¶blE—Šf·šf’‰_…‚ENd0Si5Pg9Rf7iuIŒ‡Vk{a[kDRjINlISqS[jO[p?[yPcxD[€_s”_un‡«cx™Kb‹5\‡%Es+TˆPk¤Id—JZ„Kp—^v¨t˜Ð€•Çsf‚Y\wr~Ž]VlDWtDVn<JcD{xNdQužU€º]¹e{¨Pb†D\vQa†[‰š`pŠVo˜gvŽdŠ¡m¡<YJs‘Jj}CPb7QmGgnQboVh†Ift<XeWmk‡¥yÀŸQzX}”O‹ˆajœ£]‚”Xƒ‹j””cŠfH^=K`CG`9bf>Ms@H_NN]6Ka1MT7[Q85d7?I6UMMf'ca:sW.ta8huBWg:kb<lZ2_^0^iFkh>rs@~g<špD~‡QTxLW]H`qDauBUyCMn5P[6gW5’d1{®A\—jU]JoFX<2eO+gY2hp6yuOnlQƒWPžY5¹”L§â–¹¯ž¬ÂlyÕ‡\¤zLqJYT;j^0‚lB_YfyW‚z2‹K¹_ôÌsÿèŸÿÖ´ÿ©”ÿÿ¯ÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿéÿÿó»îÅ‹»šî¯wÿòŠÿÿ¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýËÎÒž§ÿŠÿ·zÿÏÿÂÿ°œÿÔ¢TñWdcgY+YvLM‰OQkImt=›™M‚šy•q{½wQ¯qqsH~–@¬ªbvà¹w~y›PLŒfYU6OT1cb4Uf@Sp8¢l- Wh”eyN–¦R‘Ä{UÓ‡frM¡<ÏlÃ}€¯Q˜[’äÊÎw’¦ZµWx¢|†w_‰¹b™v½Í´¾ÂœÒÀY–‘b`=_Q3}^*wu9tƒ?\€=W/“`Ð M“ÿy£Š“¾¾oœ³mÅZŒšK¢±rɋžˆ~²hÄzGÒ±v‡ýw¨N‰š@n«X›’TÅ]qžza b„}LLJFk6jh"j“?T¥PQTN¶†4±ë‚”Í€z¢|o¯`k¡VltLŠqcï¢|‰Ì¿„¼V`ŸX›°Qk»SŽ[PzAZ`0[\,}`,O|F•†$ººu§°c¦Ñ‡Þè¡ÿÒ¦Þa͹M|à±6KY…v$†h[»¶ZEUc°¬6ˆÄ£5nE]<»’=Jÿºio'°‰?©p•¡v£¦ˆ“§n¨«j`³W„·O›>}©Z…šFn4XÀXp`*hc8}Š@}N‘µdµfÞßÿÒ®ÿÿÓÛöÇÍð²šçŒYd'@Ke~%dsDR]1l‘Bvj:aÐwKr,e‡0’ÏPª„Jãô®âÿÆÛÿ¶nÞjp“/™î~¶ÊqÞó¬éó”p¦_”©j—XÍÆ§êÿ×ðÿä¢åÙšUt”NtqF_oGeW6y{Wtq<‡§PW·Md?޼J|„GRu5oR0bm?š—h’°Q¨¬rè…ÎVj€C·Qxëƒt”bƒƒ~Ž„R•Àl€¥iˆp£ß„ÁeduN>G'¨¸FŒ¤Hm’0¤³”·ÔțȟœÂ‚‹žX‹ÂrÎh¸y›µe”Q››N¸¨q»bq´>eªR¤à‡`HÂñ¸…¹mœzQk=‰„QµŽ†eœ,f¨3rºKr[WSo;ǵ¢‘»\‰ÅaöÿÆ{øfhB5O[)ƒ™QxDÊ»¼ÌsÒø©ÇÝ£Óô·¹ç—ÖõÒÿÿÿòÿŲÜ|íÿÇÿÿßÿùÆ`uA:FIj+(D1< FJ,Wq>eg/Se?ƒ¥i’ŸzÑÿw›Àn‰¬Qµ¾žm\nZ4ŠN}et„Rˆ–x³ÌަÊpËOduAƒ©iœÔ“ºø‘†ÈqšÕ†šÍ{’ţ匈 ƒ¨ÙŸ–Ó–Ô”¯Þ‘ªä…jƒ[qX¸`g¥KGjKa{k¬Î—¬Ëm}²xŸÉn|;‹x9nq@™]sq@p`Oƒ„lˆ–m•ežÏf‡¿h©¸iÇj‡À`Œ²kv£T€™o‘žrc}>]{@ad@UlI›g—™c}~F\l3Cf*<Y)Nc?v|AF_!6K#Ga0=e)?d)=^%A^4Gc1Dg5]„ZzŠS_w]n™PnœDa€(Q€*Ch0U‘e»g|¨]aPp£k˜»ŽÈdf‡O[y:>T4>^/Gb;NeBUtD_xK`aBhu\žµi£Êu Çy‡²]m}?ZjA^rS[„i–‘_Œœi›Wss_ˆv1GpA{vAYvCRe;FqAcwBZuXœ¤ank;IRGn…kœk¢“Uv“\o”ToRpŒ`‚Ÿ\h…l–_tmG]uo7M0@F4GV*Q^27b:>UE=H#4A94(N< BO&>P4IP'RY$e[5|Z8xh4|pQwrDqxMugEwh:g~EelJyt=¢q:Œ‚Kw€WW€W`rR]sGYh=ZrBQzLLrG[S:^%m†:L‡eJhP<c8MK8O_)Qe;bh;kvFauTteN|V>—X7œœ_’Ò†¡žfoÀ{OvLX=eK']r0opCV‹J_pPyv3‘sE³lEÿ¶Xÿł⴩ÿ‘ÿÆvÿÿÑÿÿÿÿÿÿÿÿõÿÿÞÿêÜæÏêÿ—×ÿí¢ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóÿËãÿÈÃÿí©ÿìÿ¾–ÿµÿÔ¨ÿÿÿÿÁÿÿÈ›ÿæQ²ÅjS"–l@™º[e¸Œ}|RU^‚gU}¥Zs¢db¥hˆS…¿Z±§r}Ñ–ƒ¤go–h_V@t;QU,BS(ZV,j‡6sF]ŠIR€Fp{0v¡HާfŒ©~„šp²U„ªv‘¤gi®]Ù…Zì·•£€qdžf¥urœtižQž@„¾{…´qŸ¡sœ¹{aªRo?wV+n:¦J ¶cß“ZÿÒƒÛ¾¦Ôÿ§mÓÉŸƒP¤»fšÁ‡|‹l„—]ž¥a^Á T†]Xh?„ˆ6ùªkÛÄ‘Ëÿ¶¥ã“h³bo={~P–²dpqn„FI€=sh-‹”C¥±X…³{“·U¤^¹ÐŒžã´¥Èˆ~¾“l–R{—E\™I~v=cvo™B‡‚T±Ï…ŒÏ¡[vis‹NqµQk›>R/iåt ˜MrÆOz…O¦w’¥{i\¢kc¦Â{_Åt~5PkQ´c4vÿ¤‚œG¤Ù‡nª`Uv3·ÙUßó ‰à²~Ü[WƒA…v3œEqzTd™S¬y@y ]²ZŒ»V”£H²³yóª_\gYtp:i?yk=k:¡n£¶}f÷—ʦ5`w…TDš×”z¢€H–N²+†Áš8U)q^¤…G|,{y5`t-èÃ~ßî³ÉÿªÔñ®êÿйú¤f‚i‘ši’«ŸznI¼¿žg¿jŸŸcg®jYn:c9øàصíêx€IŠe.apBpO?\Ikv6is=ij0‡nDs©c¯‘`æý¨ZµaQh0v7–™NBL.]c0ž©mÇÿò™ItE€@¶²‚iòXLOfx9ˆšYšÀ}¤ˆRªã§{ÀkYQ7XW,a^?xt/¼D¦Ëo¥È ¦×ˆƒ®bx¥xž¸r®Ðˆ…†R—²Ne«?{‰IxxL…«^³qzÛ`„€eoyL›¸nŒ[̳”¡¸{´è˜£Ø‹¥«”Ù}´Í¤INŒz\]¼?˜¶h¹T¨évåî¼òÿ²‡ÞVVŒ/MW9››}…å^=‹¼M²ÁŒ³ç›žê„ùÕÞÿÿÿºÿ€†ZÛ襬ÞlJ[7%(C\'Œmy´Ýc3hWc-aW4KX$M_.gp@Œ±}¡ß}½÷£›Þ|²ÆŠv JkŸCmŒ2Yh/Y€@•ŽGo¡f–À€°Ý£Õ Ù™®}„}¤ÅÅu‰š…†Ãg„±zŽ°ŽšÔž’Á‰¥×†–¤‹ªb~€Ydscqh€ªlq¯RnžQdb‹_•ºŠÔÄWqeC‘…X¬¢rrv9yqCgmY|‹bwo¤¹xŽ«e¨g–Ç„±çš£ì¦±ð›…ÁKv‘Yt“Vk‘Hf†Bx±Dhwqƒ–dVeIQk=H`2LY.Pb2^j6B^'5L$Ak4Vw@Hg-H`+Ie-Gn*Jb<PjBMT5RjHr”LXPo‹1O‡EVŠdžØšŸÀyu§ovš[w¢di‡Zz›Zi•N|¤Nc™:Qk/AaQh“]q©eoŽ?8G*N\Nz„Zušw¶®yš—Rgy<Wx@W~:WtUo{Nfvl¶ŽIh\6L])JoEXuA[xE\mCf}Sj„Hclvʺª„FjeJx{]•huuLOhSeqTj„T~¥a~_nv“¹Zlx9Nxp8=(EM$B\0NW8R^50b>4A6;9B:PDGT(YQ-St3Uf9bl5|h6}|BquYosRflOZZMcX:]y9ZlDƒf8†l4pxNzpQh†PD…aLgW]`6ok6l‰LR‰fKi]``4eW(2c8;H>OV*ax8u€Cq‹Op—aYTLƒlEoPTREˆH,¿k1‡ßu~«…h˜YUyZk^<ƒz:y–KuŒWOˆNYkPaj5ªV6ÿe8ü¿eñ¾–Í¥‹ÿŠÿ¨hÿΓÿòÎÿÿóÿÿòÿæõÆÊÅÿýÿÿ¡ÿÿçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýúÿÿÉÿÿÂÿõÏÿðØÿÿÑÿù¬ÿÿÿÿÐÿÿëÿÿ÷ÿÿöÿÿÿ[ÿÿSlu§n+zÙ_C›†UbEXtF}}@y±[¦nu°ltŠmu^™¢v{³XfŠxOz\OhCDa4U^7KP-kb'‚„4—fy”Q¿_xµXs—JZ”f”{Th£|Rv8UW\`u5`nPɘ=šçž¡Èª®Ú‡Ó³Ø …¶‹šVƒ¦r„€UoŸoœŠl‘Ìoa«di~8j‡C˜xBkŒKt@Û®mÀý©È ~›Ž“Q˜Y¦moÓsŠMl‡cswl£Rr§nÇK°Ék¥Æs„²‹]ˆ‚qxKh„:}:—xcr³[d”L}‚:{¦Bx¬Qt¦McoDcz@Žw5f†c´ŽD‹™`¤||9ÒÈvvÃa‹O“ªG]¬†Oœ4KU&YE7Ê>Ûÿ¹¦ÿÑW‚o‚T1vÈhTA²§OöwLŒl?9+DJ hO.fxK”_Lg|_xw8ýõkeº¾ž¨^Œ¹·¢m¶¯j»¾’Â¥Œ«ÿ¿hÕ‰Fc9‚`.j=nwFyu>¡’@vžW©Yx˜Éj•ŠNV~qsY1Œ®Z™£k¬£VüéˆÓÚxÖÿ¨ªÚæâ£°ñË…Ö‘“L&nf<áw9iWlvc>^#.M)E5CZj"ÏÃ_Æó•Îö¢¯å¨ÈÒã¢jÄ{Dt$™yK:p8D_%di.¦Ó’°XoS_~8H{0Ui4š¿Jx¯O‹r>•zU’¥K›Tu™Df–IŽŒ;u}?rHˆ‰NÅ·ty±JƒE˜¨plLFa^<ˆx>†Ä\Æ{€Kyk*‘’=íÿ®ÿ”F€5h`<…¢Y„Dw¦VvSl_u®69Y—nScÓ9”Ös„l:šŸO}ªCeq;Š‹\s{?m†Qt[;„k]žµ†‘ÀiV•@€›[¡¹r—Þˆ¬£‹hœQ“YVP4—[[oa„q[‘NoˆX›¼Â壧¶~y¥TuœB{ HUf>Žzt‰c·ÅŠ¡Ñu‚¾T«ÊÁÿ§¢e€}?Á̆‹±fbG¤»n³|£ÿÿ뀳Ok;w§N‰µUG‘(55kMDpx?mVJ€¸Tv”MztB|‹7y”EžŽo×Í´ëè°Þõ˜ÎÿØÿ¦é—Âáµæÿ£ˆµ6ir<¿üƒ”Ýs¥~—¸‘¢Î›µðäx•Ä]RiIgnH‡›u}¤d…XxŸi·¸ƒ€¤l‰´O_:f~4uw\||A•QUƒLk…\jO^€H}™]{©ˆ•¥§ktuFŽ‹`Œ²}¡¹bqx8PXOiWnNr˜X•®b±f‹š‹ÆßÊ·Û¼¿Û› Ócw k„ªrŒ¬c|”We…Sz‘]g}Vb}OTa8Ob/Xb*Eb.b€3Nj8G]'Kp>e–9Bo-J\1Og2BY.Fa6ht@RV,HU:bWbŽXu˜[œ¿€ƒ§‘¡Â‘—¹•žÜ‡Îp„¼q†°b¥oœ¯y¢¸oНPYtETm“Ã~½†¶O@T.omHhxO†ƒXo‰Mi‹ZuŒV|˜YsœVq‘Oby<EiWµ•H[R-UX?fgwLe‰E^iA[oD^f@eYe½†~ž{H^eOm—€Ñ¿Wfc=QbIWxSo£h€žUxŽq™¡±»i‡‹LpwiQV.]l1IxB^fJ`b76\48B?F5!V>#PJ$B`0iS7pf,`xGfwDwu?q‹Io\l„_QsW?ZCNI.OW.Wc<v_.om&lmL~fG‰†SZ wU†bUs>Xd=ff;V|Q>j\2D7B: W?dS.‡k3‘—JŠŸi˜fƒ‹d…‹c’da›Vcw_žm6µ”C¦¶bˆÎ“l®pm˜X‚L]—JIoZHXCH[6CW1<I+v4 ÿ@è†Fý£ä¥zÿ…ÿ `ÿÆ•ÿÕµÿÕÃÿóÜÿÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿùÿÿÿÿÿÿÿÿÿÿÿäÿÿîÿÿùÿÿäÿÿíÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõÿ}„·¸N¤Þr’Õ”ž¼hbÀj[L_i:YuTRwJ/_A[1%}e.Ÿ˜LU¿Œ_i>n|;cs,NoR=c*dI :ˆµ]¼±jæ›|žna¢aK~T˜i7L¿dAo7•_0W¡R…sE°¨WŒÐ~’µ¥užª†qÁ˜z¡† PVŸXrw@†›Q³¼]É}W¬€Jn6Zn*™w7~ˆB«—=ÓÇaé¦v–Ë…T¥šw³Ÿw¬Äz‚Åv~¬xR¢no‰Atˆh{rUr>’‹U{‹rV¢]IuLig=ކCj§ggˆNrqY]ŒG¢;‰¼uuŸcuªSX’Qdv8c>°“=_¥dM{7wt4»¡V¬ù¯^¢€¢’;‡Ð|…‚YM¡ike'³‚<×í‰âÿÇ¿ÿÃJÚ´c7,—ŽTÇw`ÿÿŒÍóØÒ¸|p®nŽmE›ÃP¦ù{mxaqƒJä¼W«ÿ»†S¯¹}³°³Ør—šmAk_ˆ_+|¯a–¾Zn«]iŒ3cu/X3]„=ƒ`4~„u_™M’<¤¡Vã¶t‘®VcI£œKƒZt£\ž…FÚÄvÇû•ºzžËiž¿ke£‹od[;X9R_q…?K^0E_'0Q-_K[f…+ËX®åkÀúu‡Ð|£¯[›ÒCjA^X.„]Q•V:‚!gn)v‡Jw9u¯ib~AZ‹MªŽAà}_WsX“p8ÏÆi–º’ˆ Z£®V›Âd½»j‡–a€³SyP¬nŠ…Qoƒ;„BOTx|1[2{˜ah´J„¥Uà›JáÞˆÕ÷¨ ª[Òÿ®œ«dÀÜ“¼^»Ì“YÐiXJ/¢vd^>™¹]”¶m¦©xÀ}Áþ™ô‡td;cR8b`1uÂav¤B`n1ŽnlšP€”bÆ×¢–Èu·ó†gqdc@l~T†‹d±èg~¾W€Ãkw˜ir¥`…žvŸÃ¡^šKw£fe36QFV'…‰\¹À}¡Îqÿzßÿ¢¹Õ‰³½ƒ£€}žÍrµÀ½Ë„o¥7”žXŽ‚s£ÙlrŸ3q0k‘4h^G¯‘m›=eu<€¡d³Ç¡» €…TŽVKƒpQ|‘CTg9LX,fa>W^4|ŽdQZQ‰ss˜¶}ÌÛ¿©®F{ohµåŸ×acwI~•eku®Ú”¬ï‹}‘X‡˜Y‹‚Vƒk‹®u•·u©»{p¢V}’}°ý’ÈW^–AT\GimLŠ—Pw;f…@X|B} Sp€Vz[e‰\€£{|ŠK¤³u„¢rµ³ž¦ÐgqŽUgˆSqŠLs“Gv™e™ªmsuPƒ‡w{–_Us_›ºt‡\ª´‚–°[d{Mj”i‰–MVmM^wGF^7O[7Vu9j‡=j‘\w¸P[y.Z`§Üiu°CPg0GR+BV#=O<rg@Ue)Hj@S‚o|œql›z†¹to‰e‹³œÂëÆáÿµ»è†¹t³yµj¬¤j|—VmGZuVt‘eoŠh|”k‹¢WŒŒW‰F[tH_yBNc<QaEY|EPeLmŽh€¨j…´NdŽ]œ’0EI)AIBZzYcoGg~HY…VoZjŠFdgK”`K˜dO~‰o±Ñž×²Zg{=\DfˆSgˆ_m{Sote“¡‘§_`{GTxLYy<PlHQcG_]M]XAGT5JNBJR1\_7bi9?iAMO=lG%Xu2gd@po?{zHs{RiƒP[y\SnNYU<Ob2Ee=NR*^c*gi8„iCŠ“MˆŸsKžnChU:S<QQ1J\(<Y>CH-FA![S$oo3^|MFuTF^K8`L7T@?B;QD5hT;›m@ŸŸM—±h¸r…´{q¤hj“Xi€Mp{CwF_9[v66\7,7*&.` ¢7ÚjLÿ…Vÿ°ÿ¤|ÿÖÿ÷»ÿÿçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôýÿÿßÿÿìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùÿs‹ËXO‡ÃqL¢òs´®ƒ“Æ—’v{³„cfV‘Qin:¥:[˜Jbc<œ*¸ŸRgÇ€at`|}6J—?P^T^Z-hr'ª=”¨W¨¨qm½Ž`˜hm‡LW’^Š~=_§Ul…Xvš;‹ž^™¬G¦‰l¬¿z–ÏÆ¨R° ¡iwœŽ›¯WT¨i|o:o±Vt”BzžOb©xKs2K]%`l/‚„;ĘAÍâß§ƒˆg©sS’xµ®tY™k~=l¤\d‚bgm?bvN`oElk:zz>z´nhkfyfw‚V‹˜c²³tt⦟TmšPÅrBsÒ®VuSQZ5†v;`¶¼Z¬Ú‡Š€†‚e[µbé^FyÿÛc©W•‚<rÄz”‰M`švpF¯ªL”·ÏÅyÁó¿™Ö•H©t¿R&ÿµ¦âÿ¹ƒf¥Û‡`Ãws½L·Ò_Ç‹Š`ÂvަDÇßvpqcmL1uoBq]TŸrb¯j€Š*v„L«H™¹‚Ѝs™£[ŽËaMºJTi'bN,ao4~y-–aÿËx€ª•¨žA®¹w‡Y«¢7šªQ‡œOyºZ×¼…Æ±Š°ÿÃK³m"D!/>83RDY!Qr1@w"ˆŸ'L5(.0Fn;%š…ÿÿ¿dÅ¥“¢U2‰V74Dr!@e#/QqN8l’h]¤>l€=l|IJz=q2R±oOb.{}7ƒ¢E«Ð”yp<žgA‡ D‘¸Oa„¢El’M™’<l?… U‡ŸT~Xx„KœÃbœ°m¦¡j™½}§³bÇÊŒçÿÎkÐU¿§u²òs—ÉqµŒiºÒŸƒ·hˆ”Vs¦YrD—a™Å~~°n šsŒÈzá÷îÒÿíÛÿËvÚSYo4jŒ>mrUPT)ng<[h0¢^{U”ºwÕØ©\ª:•Yš•\wt]ÿäàÿÿÑ’ã‡yÀaŒ»vŠ·z¡ÑŠk¢Wcd?J{4Cg$Gn)KQ5Œn™½t«†”ÿÿØsµ?z˜GTp/dL:b…5a†)\(o‘0†¤Sw¡3w¡7g7™™`ÓÏkï»x¾‰W»¸ ƒl”FUgI~™F„~DÓ–o·©h¥¼wÆÙoh‚8qVK²¥rƒ—O`a?ƒŽ†ˆŒm}ž[߈œ×všºsÍv£Ö”¶’ Õ§«ã‰„ dt‡IyrLnV}˜Ytc²Á‰Ðj™¶|œØ„ ¹€„«RjxQatbƒ¢UbAŠÇ_ŠÝ]c“;c<Y~@`~_¢q{™a‘Œrš¨s—·y‹œp‰§vkMi…9Kq/jvGgi&\]5]jAEe:Ac<_xYsµk•ß„…ÊnŒ¿r“¥SUo/TxIVƒS¨Z“OxxL€Y—htƒROcAƒÅ’»é›°ËR^]4bh%=H#HUFsxDXg,XzO…šxбwvšw…ª_^ƒTm•—¼Ð¾·ÐŽ£ÒžÅs†À¥¾aœÂy•ÇkmˆKkzRw|Pd}JWkQ}|d„™oy¯\c{@Wp3@F3ChC`q;DV9]kRi‡Yi‰RoŽRj}-CS'DV,Gb7VfEgu]€¢v€¢es|FPZ7|UE{ƒbºr}„wÄ¥_qF\BPjC[wXezO_n†¨j„]}Ÿ\t“W6qL1SL.?5B9,kE)nV6Œ^=‘˜Gy¬gU”j9fV9HGc8#g`&cv@bmCdkBbdH`hMbcLikKsbG^mBWmH`fD_t8gt;¤i?}ŸQyšv\}aE`FN=?`.>Z8JW2[[)__,pa1qH†tS[uMThOR]AL`H^XD]k5‚o;©A•µ`˜¥ƒ†´oS³tLdOUQ7Qd;eV?ya5›z?›‡TfxR>eE4B6?;%cA&”X2À~FÿqÿÕ†ÿÿÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóÿÿÿóÿÿßÿÿìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÆî[y²:7€<29Q7#½V%dÇrˆlbq£X}fS¬mzv_w«^`Ÿjk‰I_z?°h:}Tu‚pasDLWMj=€˜Ht—Za‘?~CŠ•ByžSbœe||K\›UP€?”u2b®bo”RŽydi®^u‹[HƒI¢_Aµ«‚uΜzvY€¢{s™b¥ˆa£äW’šv¹¬S£Ìqªé|´by–hY?G`2hf¬‚/ŒÍw°¼ƒ¡ÀvŽ•}¨R_…XvpA_Y¼…=xˆ\U‘ic‚CGp<jp:Tw<r¨;Z…hdIo—N}ŒL_ŸjvN·¬tÄ¥Œpܨ“’Hdƒ‘[ŒDY„B@|CEU1ƒk4U¶iŸˆAáó„…¿¯°¿j„Ó¬;˜ZdV.\|H€z4dyk¶@…À‰›¸a‚¿n²«X™è£m‡ŒI”‡S´Û€²Ø~§Êœ]}TØ3¨õÕÇ^³íºÒ˜y–€µ›?ˆÿ‹ŠÆI‹Âl±½h˜„s°¾qÅÿs¦ç™t¯ThTã‡;ÂÿßYŠ\nw0‘†2b¦LžM„`T{W•‡H³•P–¹_Û²a®}”–E¯õ˜É®p”K¯¥z¼Ò‹¦ã”cÓcKr8(_$/75F<M 8@=G8-L!1+G0;z”>v‘Ks©P7Y=a75]•`5%?/!}H@Oï_QA L`'7d(]j>Cd[o£ikp*ûȃˆ½v˜ÆwèØS…¹h|r0reCb‚5^d1mt<d–“JŽ©Yx{D‚¨X‘D›ŸXµVr¤_¾ÌwµÝr¢œp¯£|ŠÚfÿž’í§ÄÿŠž±r¸•i³³y €k¡Kñ¦v»ÿuÌì€Ãǘäÿº¥É”¹É·¿ãÕ…°]¿Ä”¦ð˜r¹N—Þ^ŒÐ`Do4„R;†‡Y¹c…³^Š®KLW-ŒMœnF°¹„¼‰€ˆ_·æÅ‡‡Žbu‰A{__ÊKKx/bŽL>R,–—nQ’*:P&$14?\i>ÿ¥Ô£ËnŠšU‡¯WgŽ=³WAm o†;„¹Qk”2pƒ5ktA•Ž[Ù°{ÿ¹žÞÄ ÊØ ŠbÎxiÿÔ±ÿÿëÓ¸a¹¨c¨wYŒqÖ±ˆæÏ•Çå—êÈ‚¡¢hs„Kn‹L}™`¤Îx¦¾ž›×„Äí²ºéœ³ßœšÔ¡²¢¶ÊŸ’©}°»`¤>y‚Fv˜@^~GЬq|£RWˆ8fb>[`8jw5p\Ldd@dhGŒ›[›Áh¡i‚£ILŽ:[uGm—`£¤Yƒ¬`†³SžuÀÚ—~´\Œ«aw¦]ˆ§QY`(Xk%=ZBU/HiBm—^n‘]sŸŒÇïÆÏû¸ÊüÀÝÿ“p¡7P‡Jpža…œoŠÃdx±`u¢G`3W^/TZ0SprÑÿ¾¹Ärg~;Qb7mq<E[%dbI^`/?M0Z}bx«‹§mq›ee—fv³Wi¦u‡À†Š tµr}šS~›k©a€„‘®kf€QŒVq€H`t<\uCl†_|ºx’Í\e‡9LS*BM?o}Odp9NQ/=N;[e6BW@TrCMg7Me5^~GdŒM„§N`uP`fVbsFj]1LSAz‚v¶Êk\Y?gƒ]–:ToFOsOTmS`_}²fp¡|–ºck†S\…^‚€E@iUCI@KL,hI+nX5~iA•sQ‹¥^o tRxu9RW0:6P7$kAGr8OZAP[;@W;CK5PP4bL;bR8jX7le?xqH‰ŠDj ZvWk‹Np†`mzS\~HrwS\…=VvP]d>b^1_d4^b6Qe=XJ>X`67K>C<:[<3oU1€yCŸO¤Yu§vt’wm”b=†i8MJK< Wf&S{<…e2Œ{3qW‡YRmyNneS„c?΋PÿÕƒÿÿ¦ÿÿéÿÿñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÿäÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÔÿuŒÃCF“1/P,%$Q UOLmGvX8KCu}F‰§H˜±j½z}´w…«zr¯ycžaY€Lw\1n˜Kp•do„H_Š;~|@ŽE— X[ZŸŒDv¬Kk“KqŠHŠ‘Kb®^W{Ad}2ƒ~:i«fŽ[ˆLb¦rBwIŸR&¦ro«Pe}‚jƒJWŽ\®w_RÓweHާIºËa–¬‚žbmœWXf>R[0o#~¾J€˜«jƒªiªaw§ž²Rk²W|ˆMi™IƒxYr¬[wˆ`YƒKVnO‡k;f¥gw“GŠvUrjSKzITS7hj7[„U~>l–m_œPSeAZ].`dF_vAQr;\q?Ti<¶Š7æû›µÏ½k½‰RuHLy.\‡0I—:€(]œ_x9x„RZrF’}4ÏôrÃíª½ä©Ë׬ˆ¡¡x¤|˜·[¥¿„ãW”Ø¡neJxŸ`™ºRbjdŠxB–×€Ôæ‡bÿÍx¬>i@5ÍÿTÈøÏÿ—·ÓœË|hhKŽƒ]ÿ¬J‡ñ˜p|0ïƒC‰WT²uOoŠO‡g1¥[=¾™c¾¶t“½T˜‹L‹˜GvoV5aAjI+jœ8ðßb¸ÿºWÂ_Dv0Cj"ak:C-V@*+Se&@k+*BW»¢Z¹wŠ™QgÈ]8•(#=("ƒ6-BÄlT8V];\:^H[…0‚‹<ŸÚdŒªY”¸yàÂ\ôÿ¤|–:•ƒZ s›\‘£JtvNdh<^f-lo3z“S¦’H¤©t‡~Bq†6Œ¬_ƒ½T©¸qÌVŽÎF›ÀL‹€Pƒ–E‚¡T²BìÿÛÿÿñŠØxµ~Oº…ˆ€‹F”£IÿÌž³×w¹¹‡²ƒ´ÇŽ|Âs¸~”ty¯k™Š^Øÿ¹ÿÿèöÿ·§¬«qWD‰c“¤\Ôzl|G`^8e{3rŽRi[9€‰X|›U‚©h¬™OpÇLÚ`ÜÊöö¿÷Õ¼\²JLn/Qg4HO6iqG8A32R34‘§PUb.z_L@z)Th.|pBd|8ly0„ªFi}9zt?—sOšnT³»lœ]®“T uZÓ¤o™œLü’†ÿÖ¸ÿñ—£–Z⫇¤ Vv¡GušB‰¼dÑňÐÚ}áÜ–ÈÌ`‡Ow—^y‘ckˆeËØ®«ËžÎüÀ½ó¯½ë«x²ng…Mˆqdš¡{xšQ‹HnˆAGpA~‹[tˆOds;ix+AZ,n:BT#P[!uu5dy=M[-6M!6O/CP>‚`@v~M˜C{”€ƒ¾MyŠi—É“‰µxšœ‚˜¶}x@;["Yr1Ti(9>EŽ»v±pc†IdhÆôÎëÿØÿÿÉÖÿ¡ŸÝ_zŒw®kŸn’Øq›ßw§Úkp™?j`*L\8¸ˆ°[NZ9VgBmˆAp™Ns˜>EX*/;"NM;p‚z¼yt¢ev¬n{«r™u•бbm]«bdt1WfHu¥a‰Âsˆ¼[\uDOxMe„Jf{@oŠQ€›nލnƒ–Y|ˆ:WW0YT9\d?Zk/ES,?K&8C!.D1EU=_b9Vd:i{]…©r±YayAJk7Xj@Zf<Rvb©œshe-Jd>x~Pb^1>_<SnN^|d‡´s Û}ŒÊ€±K_x8KpHq^;Gj@RR@]J7hX3rkB‚‡U}ˆ`|‹_w‰fZ†i>e]@;@OA(jC#Xg2Zb?Oc;FS?OC5PT2WE.FH.W@3\h/ztN„ˆ>v•Zeƒ_^|Ka|WheEktC~tBs‰Ij~W\pOoc=Tf5?^;JN,`R#cm-s^9iX6vP7{k0x•M•ˆW‹Ÿ^w¥y€žlu‹eQ”_QtNqm0‹‘;l´ZjyP”^:zcP€W\‘uZÿ¤kÿÞƒÿÿÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöÿÿóîÿÿëÿÿìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÍý©œœS†©6Uu274,2"*(7&Ü/ÿ|#²ä¨j‘œ¦kFœÚk‹ÃŒ«Œ“º†ˆ§ˆrŒvrnk„©]r§S‘‡C™¼WiÌ‹~P|–Cz yh‘Kdu@yA„³S—UcJžy6›´kQ·kWr:[u1¯@€«_d¢bxŒHg ct‚XŒŠ>h”u¡j;Gί\dCt€8Ê®VoÛ¢Š›Lƒ©^bnŽz8}rZ`†JSZ?ML'–…)®Žm‹³pŠTwœW¦“[—¹uu³eZ…R~q=KœKj„7q—C]vg^†@OˆL^}6@gPBK.GJ"«\+H™[;X%GT*€ƒ1™µUpŸzPŽOTS3BZ=FM3@])h[*mŽQ=WƒN–x@”ÿurŠlbnVSz9`‚+L/fm)j™I@?rT%ޤXtŒu¥®o^Æo¬¹L¨Ñm´…s[Lo‹s˜sm˜sgi²‚‹o9»Ò‰”À›@š^Zf ¦ÔP²ÂwªÍŒ_Uf»‚9ÚéÎÿµÿ—¢Â‰n‡q}[?9\.ˆW.¹‘Csz[©£E“¥c³F¡\¤‘M•¿a‘Ép°Ÿ^£³R~”SnJU¨5`d0ÖâdÂØ¬Îÿ¡·ÿ·•ㆇȊHoL.U ;79$Y#=1 KiW|#«vUZ¨U£…OÉq±çvÇÿ«W‚3nŸD€‚)`µQk¿>^6þˆD¨ÿ²¼¦Š³Åp‘®h¨ÿ‡¶©u¼ô“Œµ[}VTe6³vF†ƒP–gUƒuX•Œ?…}T©„@©¹dÁ“^{K¸‡OpÂ\\dKšG•½}‘–:œ®B²¬cª¿b—›hÆìŸ©¹gÿÿÿoy[ÿÿ”…ôv‡~E×Ó{ïÚ“ŠÃ{±”`ºi“Ô€s¬J›À†Ž±_a£i~‹MkSFoŒ‹…}r\6Œ?=j/cnK–¥˜µ‰…§s†ªne†=FL.hJ@ž¡m–߉”Ás»ÿs¢»€¹bžÞsäÿ²Àã°õ‚jB›Û|E`$PY+W^1_:Úáfg©A[p6ª€_|˜Oÿ¦…¥¨^]g9„ŸRW\0~qJŸyQ¦’\È¡{݆{´„bÓŒ`Ï‹|Ý»ÿ։çsÿΡÿ÷‹Õ¼zÿßžÖ²u¥¥VŸS·l¨ÏšÿÿÎ…«T±›vƒ¡f‰ªmnDtŒ^v®t¬ª¦’¾am’WRa6_gA¡Ju|Sbp6^?gxAz–ow™T`k7LX7axCr[X <Y?eŽDz…Q|ž_t©NBp5‰¯KZz9\w4?b8Sk3_†U„‘fw€_«À™¢Çql‡e‚ši•¨OesCikAhz:RV6GPJURB8L6F^läòÑàÿÚÝÿ½Äÿ’“ªVXWSiyHj}g˜ÆxŒ©j~’Skq;f]Ah`ÁÙzfn1Sf2YhGލ_{°jŒ¼Tet6cbGqQ‚“p‰©ev™Xo£dk”[u“g†¤ly›T[zOdƒDLh7f„O\‰[k˜t¡OQrS›µ‡:Ll<Wx?RfAtx?NM3BL+BK1V[5YP1XW2XX7OZ0JL+;^6KQ3DO3HT<\gO|{Znu\r„_w–CTl<UoX‘›_‡k3I`6DfG…o1JN)<V@UsOW`w—y”Ð{›Íu޳ORpDKkBZa7Ge79V;>E4SB.cY2ouH|€QsvUi{SUuYUkW\UK[Q2fZ0Tg8WcDL]AQJ9JP1SO2]F1aU7_8‡E~’btˆZP|caVQa_8[t<T]4DX7AK8_D-m[8VgEicDr\7_oGUpC_Y8yc4‰`;shI€YF‡c5|TyŸjo”[|ƒbg’a_b~lJ~L€ª[a¢hemVfO9‹X9¦…Iÿ¯uÿÿ™ÿÿãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåÿÿúØÿÿæÿÿâÿÿñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñÿÿÿ²Áÿ„c«ÿIwÿ½sÿÿÿÿ÷ÿÿöƒÿÅ^‹kO\7>U7_=*™L,Ÿ®Wy³ifPp‚Pg‚lv†^M–n:h^QE2ta(_ŒIS|Dns;UpAY]Yi{7€”5•«g‹osœPššC~¥cƒ›YpƒJ•†L‡²CbgY3s®?v‹Xq–KZŠSj€6h„U[x]ŒBo–ˆ¶;ˆÙ—u q`‡A·yF™Þ¯Š›d’ŽS¢‚Q«MX€d±^-‰•c‘GYœUvYGk|<š„BtV¡ƒT¼¤{‡¹fes„BlŒC`ˆMtnGvS\‡Gc~BY—Ii<e¢G}”AUiI}d,qyNsI_”`YdPbf>G}7:P,YMPq4Ii0Y{(di:‹H—wnv yY‰VMT/Ma0^|.Š€=[•aX…<w{7c†WdqBp‚S]v^©ƒAuˆ˜Š´d}ž`oªb‹QmŠ_n¢x¨uOŽ‚ŸSºÝŒ…Ù¢d§ÿ¥iÈx˼Naÿ–=u5À`.È×µÀä¸Çñ¸<ª~OW¾¼>ÃÕy”逗Åkd¤_†„?xn<ÙfÍŒ^ŸÎ~¨¨iº“w¢ÿ³Šý„}Ÿ@º8Y«J–ÙJ„½~Ýß}Êê¸È°¯ËÙ©³îžqÑv=™='M8>+gS6CMl!@fTv!O†.<X['n¡W¯YQàÿ£·Ú‡õߎ°û«ÅßxO‖~9•’P—Y~>¬Â‘šÞ—»ûª 䃚Éy‰´\¡X¥×–¦]•‘AºY©¹[ؤR…·VœK½²f¾ÁyÖù£±¶sš¼qNK+{8lzF¡zW¨¬aŽ™P§ºQ¬ƒf¨nR‡ÊsšÕmÕºVظe¨¦]d‚?’H±°u‰¼woHvŽV}P{˜Y¡Ã˜îÿúqéYYƒ,|`Ic~Q{TY”mLëÆ‹^§E@^%FH/‹{k…xažž|lOPK)?C$[aGçë²îáÒu´ePs4ifGoKIZ+IT)`_.pD‰½_wžD»K‡]›Ê–Æv¦iq‚M]„A±€i½œn|zNjl:m€B„›O|«Z¹m½¶uš\¤…\¶‘sÏ‘tŸ{VìÅ~ÐÑy´Çrðã¶±ÈuƒµY¦YÆžl qVn@y£`œ£~»ä’®×y–œe“½€½ïƒ§Kaƒ=…™l{‚g•ÖW@n'Kj@ˆÈnŸá‰‹×icJ”pšÂONr<‚]rxP¥af‰Q‚Æ‹Æ~€–`l„^t›x¿|޳wÊw…Ñt{¸c]„9Qj>c†FruNƒœƒž¯]r‰P \~žUSˆ:Z{Lp‡L¯“U}DiEjw]t”p’¤¤×ßáÿÿâÓø‡z‡1:/#>7([^5Ou.@S5JV3KN8_yU˜£c`\Ck`?bg9moRŒ}[z‰™¯m“¥g…r6^oG^oFl‹Xz³Nq©VZCPjErƒ^ixOb‚6U~>`Svªoz¨kÓ{˜>c†ëÂxŽWl¦Sd“BQt@aq9RM'\T2\c2XR-DD(7K*AT3FO8]mPa„KTn6Mf=Z]:khUA\`DaM]9T^BZhMViDmi<T\G~tLd'BS+B]Gq…W‚dmžm{³ww§Tft?Nl?Ut:Rm2?U18[0FM-]S,Ij.OZ=bY<Nb;Vc@]uHpoLfzLWiEjc@df6Y{E]mE\X:TT4hO6{b5‚{C“~D{FƒqdorHi`M`_BfW?Y[7M^3\A-QB)OG+ZG'WV1[d:i]Bzb:nuNŒfO§†D¢„NswXKnSdK<oe6bvR_{NƒuHs‡JhfyO¬“@€½z\™„ytXñ}MÿñoÿÿÆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿøÿÿÏÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ±ÿÿÿºÂ‡¶y7Y”:)N‚$"ÿP#ÿ¹^ÿÈœÿÿÿÿÿÿÿÿÿÿÿÿÿÿñÿ÷µÆv„b’‡G€”Pfc4qkC}N’¥Uj°jO‘fCYDM[$V^/z9b§Se‡P€—GxXšSŠ˜en‚c‹ƒHu¤ZdƒPkp>†zFˆzQ~™3p‰`ƒAoC~vZk‚He‰Dk€>c–Q‹VÄj}ć§ÀGmÇbdži”…Q ºVr‹puR„Z.ˆ|O²“Zp§[~p;”šR¥¥pešha~?jj;®g8f–aƒJ¥§[¤iz°…OŠPPh4<dEXJ$n‚<‘Œ>x˜Ug‡bbdC‰jEizVUgCv“As£jo\NopCyqDlsIf Ezn7a¤cP€IX€4g~7™rHKung)žc0fƒe\|1["L‰9Pi+Ft6Uk'Tl6zu87‰PS:%ph/f‡0Áb=i﬈dFdÂe¶‘@}Še\b_xDN•O¶}@Çþ½Er–j`'¨ŽE{’ýk”gb9lV.¾NœÄ—»ŠUwÒ”|9½V¦¡nŸÊr¥©wt´i´–EÓæ‚¥©…‰Ö{˜«n›Ê†§¤`ìÐnÌÿû\¯}]x6sW;l„TG§[;<A@52B0`4·^r–u|a{/.4E7UC$=L MlTh"pr'„ÍS–Ñz¦Ö{¡”P3@#macŒ†H¦Â}˪œÁ˜“Ɉ•½|xšK|L}y›Çr¿ñ³æï½÷ÿÛÌÿ±’ó„Th,fY!Ç›Záò©ÚÂŒÙýºó©²üˆÉ ZÈÁsÅܵ±Ñ¢Ÿ¥°©…dºh Äz—˜N’D‹˜q ž[…ŽbØ’`±åjÀþʲ¿ Ë—¸§“ƒ„WgHzK8¨¬“¦®‘|µƒwŒW_g6Ts=²|ÿÿíäÿë™ÿŠYf3•p‚€Aº”u¼ý‘ƒÈXzµQEL,}¾_oiEXN3mG1 cK¡¥ZynV‡M>dG1ƒu>¡²aI£7 £u‘’XuòWxuPÍû½³Ø™È|‹qsvS‹[Ÿ¯ƒ§Ù•j›Ubz=›^«~Xds<onA“hX}“[e€RTtEo‹_¡™wÃkö×¢ÃÆo‡hHœ[®wfîÿ¬—Én¦Ûr‘£Rœ‘gÌs˜Í‡•·Œ´¹±š•Qc‰V³¯ž¬âƒú˧´€[^b:`Š9„¢`³æšåÿ½Óÿ¯Çõ¿îÿÓéÿÙÙÿ¸×ÿ¡Çs•Ä^~œOlŸYy¦y“«\mŽEx–fƒž}žÏOS‡7TŽPb±mk¢t}¯fYŒg¬À°ÀÛ¾¶ç¤qžCb‹WbŸOr–M‚¶Ui‚F˜ªažÆwÆà“®á’Ñù¤²Þp˜¾€”Èwu¯YLe:pkgeo;I]¦•§›k‘©aW‚3Pb6cf6Ik)Ld:`ƒK€¢k†¬w›š>U\;e[=noGpiAodNit\|—ˆ¬ìvu™2ESO|†TiYqOk{GQ^+KX(@U4QuBWŠBk”Xy¯„ĊˤØõƒr„H”™†¨‘^¡©j•Îry®Zy†LbzAXm7[n;Xb5bT1Va/cc1`V+BN?QaVo~Q`oFhrKsf:QYFvvU’™LrŒNe‡N_…RcS_„>^\HhJe[9tY;G&E\Lfua|¤kŠÀrŒÇasCS`BUuHOl@NV'GC,K[-MX1[^0Jn:QlKT^FS]:†X4„‹:Šž]}œbeŽmZuamb?pŽIuŽNhmPkNDsW4{`8‚yG€_zlT…tNpxK‚jKh€IPfOGS:>M0@<(Q5fB.hF*c\4][6fc5uL4sl;}YHc?“lKolJGZRWO6df)blEpn>wŒJy}Mt‰d‡`’‹Yœªsÿ‡ÿÿ›ÿÿÝÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿæÿÿÿÚÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáÿÿ³»çŠ‘€7de'.<*((7}#ÿG"ÿ£]ÿÂ¥ÿû»ÿº¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëȟ˸{™hŠ’Gr„FYdN_Q8_`F]aMdF<gT-Nj4nd9|˜Pt±mq„R…^|ŠY}ˆZkwYRh6S\Gco=j/m{:~n2šœ1Ÿ}q€L€c@Z}=lm1‡ƒ>}`n”Q©†N«¿x‹×ŠsÄn«‹He«qŒH]RiwQ›J-—|<—k\‹…Vˆ£W“Žc}¬swqZijDOo>dv5w{8t¤L®Â^›¢k¥µzjƒkPpvHht;`s7cx<SˆAxZ8¨‘_KŒqWV+Uk1[^Aˆx9f˜]exC™|9ƒŒX}JlKMpl4[oOguI¡ M©ÿŽlº{pšNš“Vp¨`˜_NX|gJg.cƒ:QfEB`@WS$mjBpsPT£bWa4^j;S‡3ow2×z;·É”rë™n‹PSm@Sk4^f8zÇMÒÍpHóÏ{S2v‹QrxDø•L‰óÛx»`nžY_t<eh>a“CA]¬auBTŽRir0u‘=¸ ]¥›‚|tFJ°`yv6c”À‰‰Žv{˜x‡j<{šqcŽIn¶Kao1“¼dp³pµ¥N¬²lŒˆP×nMxb0=$IE)+<,1g-6GUn'Rƒ.ij'º«š˜Ð–tŸS—¥P(? BK ™U‰³u]£|=B*ˆ†wcÍqq›SI~KŒo9¸}ÝÖ˜á÷±îÿÕ¾ñ¯·äžN‘OU”<]S0diGbt-¯hÏȤÞóŸɀ¤¯nœ`•¥šhŠA–”V[mA’‡b‚pVžÑ}†Ëx„žJŽºN¨·rÐêԜߣÊZ•e©mU†Ïƒ`ŸVj…O\›Fz|D|§e~ƒH´_³ x|Àc÷ÛØÿÿÿóÿùÇÿº{È_´É„¤¬p˜ÁŒ¥O˜ÎV¾ð˜–·y“²[Š•Y ÊfÃÿŽšR‡xFœ£YrËUª||¤žƒ˜ð{³å˜~´L}žPµxˆ”c¶Â¦¤Ï…°ØzµdwY”ÅŠÔ꣔Pf˜E˜¢hiw@ÿ”‡sLqs?€“dc~N_–NkŠa‡ qž¤x„˜Hz¬[„šUÓØ}ÿñ˜ÿþ˽bdpF®•}ÈÚ ¼äŸÆä°¾êžžº‚›¿€»lSnP÷«žÔX†uDœ®htŽB˜¯ŽýèÍìê¥ÅÙÆãâ¹ÂØ´äÖãÚõ«Òç¿Ñð£°qµÚ€•ÌŽ°åx®[f¨I‚©sÀàÿ³ÍÿŠàÿÌÿÿâÿÿ¹¡ôx^…Oˆ¿‹µå¼œÕtk†`šÅ–¾ÿ°Ó©Íÿœ~¹Q“£n¸¾lž´q—·¢Æ••Ç„¨Ð‘šÖ¼ÒŠˆNw€Lg_(2A/c~WŸ[…š›¹~¨Ð}¤Ï\f}+j†Kj’QlŠe›´rlrH’ŽPgˆHspFulR„_‚©pšÏž¹Ù_j}/IHK…MbvHdc0FP)NM5Q\1D[<]~Gb‚Ug”c¦…¢y‡ž¢ËÛ_Qt<V}H[}Ma‹l¾m‡®e¯€K’{\‘‘Lp‰ESv=]nE~r<_X9QP,X\0Uj6Kb3NL;jj@btEWqMoYyGaeX™lƒ°v‚²ht“Qb`Co`?ro8d](=V8VoJltPlw]©^p|>AF1J`<MW3?N16I(CT7C_1LT3`R.jm2]{QJ{aF_J]Q8yl6‚NŠcgŒn\nqliQo„Fh‹Zcw[_VGc]3vU5€j8‚sL~bN}pIyF•ŠKj³Wgha_cC]m9Sb=\F1YU1yI4Hg;kBCg],qH9n`7q^;fY7j\AyY9v]>cBnˆEbvS}n>vGx„ZyˆZÄ¢gÿÔyÿÿ³ÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÿÿôÛÿÿÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿxÑÿ\Pv,F>!04!!#"-"g"åKúµVÈБ˜½’ÿ‚zÿù‰ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿÔœÿû£ƒñ @†f@J:<3$>>$?W)T])›R+™Brªc\‹m>d@[@4€a)€€T_t^flBYkA`s;pv2cŠ<wi,’x5xr“uK‡‡JˆƒE{‰NbŠV}wF•ŽO׳O«Óz®²o¼¤©ds³}‘Gi³L…Wf„O[>ˆc9’ªY}¥nˆ˜`¨k¸uVa‹Y\tKs‘9ÿ´LËÿÀ}žÆaœfT€D€pDm¡a§šYÁ»f«Ñwh®©sxN„uSz’S|QUÂmLqHGL0b'p©p–Q|ngD:[L@*Vg/XV4Ti3‹p-’²|¥~hw£‹|”IZLpc9T‡MP[8]l0>b=/J#NNR{&Z€<HX1ld8¢zLO›g\€1}JnjK¼I_¥˜_U˜EP›lžb8ºü}¦ý§Lˆ‡xqAVvE\2“ÿž“¤u|»bvMe›P„³A€¡Mq‡U¡¿hn”jK”>˜s7b_Ÿt?º¨‚ `CgNWR/Ue%]g1ˆŽLV—OZ:`1˜Ã@\¥ƒvŽKžƒg“Z¤¨]‘Y½«V_tdƒÜ}O|4aK8ƒ*—G“â„:f(If"H^Ct)JE{]g_hTž¬O/G"^Q&y“P@mI5# ,#j6j{QguHYW4¸€…ºcË¿ÐÿëàÿÕ¬ð°ŸÐ‹a¡_;C%AVCX&OY-ct-ju'““Oy»h€”C}Li“Ff•6‚s2fŸ`]XGhy8œ¾±Ã”ª®il§ZIx.ƒxd±Íˆ¸ä’rØp¤WŠÌ„Èw‡¤a{ŸrU|LiHGf‚A•…dΪ§¥Ù³Ê“ÿä×ýÿÿ¯ëxOq ]ˆ†[ƒ·Rt«JÈÜœX…PYO9ed;oe@íÿºoxAƒtM²©Xku;ÃÀsœÜdeO@öÿÔÎÿƧÇjºÇ•¹û“^€7loI^Z:ºÌ¤³ÇŒÁô§’¼xjvC®]hTq·T›«‰Äæ´Ž¼xŸ`L}6WlE†œtƒ˜p¡¢‚všf‚›fÈ÷´‘ªtÉΓܰÑΧœ ]fb¦ÈÈõ§Ñ姼ȔŽÁk—r«†„‡}d}JYqcßã°rÂKF_7iuDya_\NcQ[¤‡žÉ¡ÚﺒÇxš¯†œ°‡²Ä¤Ï†ªÃ‹—¶•ŸÅ™Ð|ŠÍx’Òp˜Ô„ìÿªáò¯âä´èê¸ôÿÄðÿ¯S˜:QYbŒ ›ªÈš¢ÀŒ¹Ý®Øÿ¿½ÝÖíÿλé~¹¦[p‰Dma€‡YNp]‚ y’°‘™Ì‡È^wŸX‡†M€o9N_4U‚Vs˜X‰Ÿcl¡t•·¤¤º[Vg+Vw0Wt/i|VŽ…RmXŒ—oƒœXŒ‰Q€‘[¶¡f|ˆi”°j~‘IUe3Z]:bCUYI`{Oa{E[n9bh>_uAauFepGlzHcvKP`ELuw›·WjŠLkPc…Md…Z`€L]iN|dBpfOfo_‰¤pš©[{˜Og|8Zb9lv,D_%Fp2Q^7d\@unQƒ}\qy^kƒV]}Lb~b‹žl§mv—nqž^i…Ur’b‹¤Uv¤Urœ^ŒsIbW<^aNqo<EL"6C,MT(>L 2E&6M:l‡8LŠKHYLOH,kW%cyEKpaKdP[Q?ug2i~?huJVrIhXLeyCnƒL€‹Nn‰YdfS^\7a^;uj=c;zhBlI¢uK¢²XsÍ…zy€ˆˆE|˜Xb€_eQEWW=qY9Up9sGAj[.vVCoX=jUHw`9uƒ;ƒ‚F–}E‹ŠLy‹WmsU‘kG’=ÿÅsÿÿˆÿÿÓÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÿÿõÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿIËÿ)=·X!(7A!!30&"2#>1];„K ¦{N““r‰Ÿ†ÛobÿˆPÿá§ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓÿÿÞÿÿê¦ÿÀ]¹~P‚ E`Ÿ\¯˜N‘ß}z¾uY‡T=h:JJ0§[+Œ¦GIŒf¨Q3¤~>’‡[‚ƒLr„?z…?±‚@Â|µ¡f˜³wº fŒ·tyfwƒTä¦U¬¬bg·|—zHr²g©€Jm½qmPU‹Nw_3„—<a}Lp€4x‚U„—]¡d’¢|‘´€V™`h}<äžN©ý’a„x~?cc>ŒTf[$nˆAb’a€oR^žqZpZft:pp?—sIe½qudYj™]}†K²wIŒÜ®[uVrV9mh@xgC{€Q“šTW}iŒ_+Uƒe^V:…s5]eOkU9V‘Neh?\p?D‘?NV$1Y/KQc†0@}5{U%…œIƒ±_M‹dbb+tKAZ<ƒÈ<rcRYs:U}?]i1µ}AäêƒàÃvµ†`m]_:©•D}€yq¯mrTOŠWiD1–ŽD™ÛskÁ…SCYœJ¿‰D”ç“ulY¡[©P2f¿x’[B¤¡Yi©P}\1_Å~Q‹9cv=‘‘7X€G¹N„¼g°r¶uœ¯eU€WVo8¡T¿º{¬ð„ËhÒàeßÛi—§oT…7‘¡;Rq3¼ƒ=k¯\I³HN›²j9‹`Z1"d;6r*HW@kXšd:‡§eav<À™NÃô¼ó§çûÍàïÄ𻚽Â{‡]™ŠR†ŸRhµGw¸L‰Åry™b`ŒLyzE¡Ë{€¾tb¨VMZ\ D?NPa)Y~1¯”GºÑ™¢Ènåw°ÿŽa¾N¢®¶Úšžøœ|ŠI’¾…Š¢Ig©XNq?9i0f?3€J»¥~àÿª¨Ï€ÿË¿ÿÿö¿ÿÆo—¬l©½–½Ô®»Ò¡Ìí¹{¦W}~M b®¬“½ŽeswH‘†A’Ä`u]Et<å·‚œÝtšº{…†\£¼w²Â„”·m¸»Ž{¦Mm DonD §…ªéŸª·yov>ÛÇ–c‘GbK–²–µ¡“ŠU‹‡P‘}`\“E…Àpb”C³›ˆi–9UAL®qŒ|¢\¯½‹®Ù–°æ£ÁçÄÏÿ¾ßþ³›â…ªôŽ»è£¶Ø|^ˆNo’h…˜tOi’PjqxÕû–Ÿ´eƒJ‚°ZMi4IpL˜Âz¦ˆ§Ô‘‘²\zŸ`ˆ§oŸz¬¿‹°Ç–¡Î™¯å•¯ì•߉¦ï‘•ÊmOw2Ep3T8H~?hx^£…nGS9N†D\‚^ƒ»q}±Š¬Ò¨ÀÉ¥«ÍÍÞÿÒ¼ßn‹£\‰‰b«’^e bq·QU‹T\ˆo°”Àß‘~¨kšÃ† Ê‚cMks\Žªl†¤liu …w;\k8Ne4\i4\`9dcAle-caF~cP’’\z«Ok˜CXMj‡VeŒK—PbŽLg‡BvrQkjY`|PZyMpŒLa‡=G[6bd:_w>Xi0McC_…€š°Xhdz«VoŸUa Zo˜Pq†V”Ccq@T~bw³t„²u‡«lxˆA^m<No*9a2gX¨ˆl£¥cš¢Wlu=H_EgdXi…\f~giy`€…Q^€]q’xƒ¹}‹Áy‘½f€‰IrsD_sFrzN‚‚Cbd6]]4VW-LS(2G,3IJmwDOtKI`VPH<RX%R\,N\9<gHUN>Yd1Si8Y`Csq?v{IhvOvƒQ[Œf~rO{eEƒI„€T}zJxvI‰K´oA¤À[€º€¢—{’´`s¿wzvgviGƒoA‚{AxG_?•i;‹iI{eGqgM•e@©›F¢ŸaŒ`~’Z§„b¼›eÿºtÿðƒÿÿ¾ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬áÿR{æ7OŠ"0B!D=,%1*+*]/P` 7I/<E$rJ¹…9}½wru|î]Aÿ¥Vÿüºÿÿóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóÿÿÿðÿÿáóµúÿªçÿ¶ÿÿÿÿÈÿÿìÿÿÚËÿÌñþ”¥é|{ÓoPnrA……I“¤X“«\¢»[ÿß`ÿÿžÿÿÿÿÿÿÿÿÿÿÿÿÿÿùÿÿæÿÿßÿëÍÑŒ˜ssR„ŽVšœBaž„_~D€z3³Ns¼g€sFáFÉuÀ„t¤xv_i„b¯†4’©}s¥x{{~z—SBj`JV8P|-bl9syKh‡`¥|b[¶‰a‰FkoD^wHyaRZ¯U›iY„|^ñ™cmúø„Qy•NY|_ÊT;vÄ¡WbXJ`9XR(W[1Wˆ@jd8i‚GoGVXJv†:f„FMrFNm<Ns8Vm.Ol0Jq8d\¥8šÎ€]»pšz/µ¹yÖâ‘‚ìµ™í‚X”VEw6ar<d–TŽJKqm3X69S fm+n•;r¸St{PhgYLŒD\ˆ-yN†Ê\9Pbz(‰xLŒŸL“¯„‹½€}˜Tqª`ÿ–`[ ™ƒM,}žTŠ’A`žQh©O•µGšÍoXhI]c/g¦L§t›ÃˆœË S‘mP{3cT1x‘K¥½b¡æ¦ÿÈp÷·—„?>˜c#Tÿ†Ly¸|2R>_w$d¯hŠ‘A{¼Hm›?®Ölv¡YmŽJˆ«LÁÍb‰G†š@³³QïÿµâÿÐåÿ½鲤å»Ír–fµpµÚ€¸îȸƃÊôèɒ‹Á{§g›VÂÿÆÕóµ‹ÝŸ[Äaw|C>g%E[$[y,˜~MáÁ˜âÿ×ÿÿÿ»ÿ£Q–D»Ç§¢ëÑ|»Ùœ’Æm{Zw“[h‡LO›A^`,{d?™hÿÿÌÈÿ©¿ßŠŒÏyêÿǯÿ°vŸU³ÜÃɘßð׿æÇMk2e‚7åwt°ÔlªtP¢_Enj:”zP€zE{Iرn¢Ëpd9]8{›S„’Pa^4j\Ek€FQv5j~Ds„M®¯}l¥Fe„?—«kgE´€€‡a®€…y}C‰VEœ–X\~BŸ¶‘¥r¡t—éhoaE~’IuC}}T•Ê~ÆèŸêÏÒïÿÑÈࢹä´ÿœíŽŸÒ†ˆ×xœäi¬HpvFt{W\K–‰Ž¬ÜmR¥ÂxÓݶ¨Î‹y•Z`e_¥Çz‚¾Xz£[o™[u¡NnŒR;P=‚¢rаej•M‰„v£¶oBk+V„Y¶n’¾€•PMs-Cm;P†K‘´‘Çÿˆ‹Ýj”Ƀ‚Ëuwˆ£Ó¤¢Ó m‡®x€‘Ym‘\¤Ê…ˆÙ€|»w~¬ˆ‹£š¸à•‘¸¦ã¸Ãð¤lŸFLwCa{Ty”i…¬g{¯c`A]q9Vb@dwA]\BkˆVeŽS‘Åv²^œŸeÑcy®hy¬i}›Xw™X€°}Ìtˆ½\{EokX\pO^vMržd}‰5\l6Qz?b<MY%9R4D_tˆ^t”u| ^\|h|Ÿjo|WxŠi……Vˆ™e{¹l}®fhŒl{‘TR`7IXJv Tc”Xw{Ws x™¹qŠ´h}³Rfx;LS<S]OZpJS_8Sn)Hk1EoI`ƒn°…‘²p|LsnCfuCmtEg}K\rMomGba5P^:Sh9Fh=CbT;O>8D45C76@3;8&=='XK,h\+mxI^rBckBwd>‚’InžZnyoowVZ…gqfa^d<rf;‰t?…‚L|]uyQ‡S¦‡P‰¼d…§Œ¥r“¹j†»w¤—o˜‰RŸ‰[„ˆQ†vVŽoJ•uE‘‡JƒO™jTˆqSzvL€xZ¾ƒUÿÄqÿù“ÿÿ·ÿÿôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~½ü]Ãdeor„V6—[+6>"$%!*)40U:RS$5R;:H5AK{\*°Gq¦}`w}s]Iÿ‡>ÿ¾eÿãÅÿýÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÆÿÿ½ÿÿÖÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿùÿÿÿÿÿÿÿÿÊÿÿ¬ÒÅ•¯U• g•Gi‘vvŒ:Ž•K¨žg“²’¡l… `‡Œo“ša”Šqt²oŠ«WfM©„E{¦g³xdF‹oC[5_\%^`>RaAgj8l}TyHfyaJXCj6d_.ˆpBšlc¥w„דgÿæŸiúõ¿–W€Ò”YcrŸh<J²H@2qk,xxB†™^f®}lsOgŒY?`FW`1~x:IM]Rm2bi5Pp?\z7`…Cc—LW†7V}6P52le5Ô|9ÌâÿÇ׳ªŒæÉ€wYJuXzm/^–t:dM/h-±@bÿ·oŸ<tM‰Ÿk>Âw]l&=a:m=0•l;¢nU»Q;‘<cj)‰ƒKÉp”±l—ÜŒ¢Ádn¦`†}4ušQ\㥃—ª…Îú|f‹}s½UYg2޲uƒ·›šÿ£ª´V]ȱ ¿f½ÛšÿŸ¯î‡Ê—‚¬qÑ¡cÏT|F.U:41$ Áu.HcªÇPmÈz¬¾yÉé•·«‹š‡EŸ™qÑZ¦¹p¤é‹êê§Áÿ³ßÿÀx¢_îŒpÿÿÖêæ½°Ü˜¥é®§¿‹d¢nŒ{B‡§‘ޮа«É¤¥É››Ù‘ÀrȽ„Éæºˆ›^г|bŸPDw2W˜\@j,ah1x¢‡µµ~ºù§ÿÿÿßÿÛ’?Ÿ ^Þü¹‰¿‚X[A]<F”œw“‹a¥·‘w™€rm:ºÅ†ŒqDÿÅ»ÿÿ¾Áÿ“éz²¶{½Û¥}´ZÿùÁs¡RžJs°`d‡<Š‹]©¤vÈzfÿ×ÅÿÀ‚Á«e󱂈‚LË•„ˆžgŽfPtC¨˜u„¨[šhˆ \^qAص…ŠÄSI…(_o0t`EXp3Ul.Z‚BƒŠW×ÂŒ`V3¦ntÇù‹‚qF~YF‘œYœ˜e ’Z–ŸlÙÿªÑëšâø±Ìÿ‰„Ê[Ë~ˆ½ZóöÈËŽ˜±„Žž¶…l€J˜ÆŒ´® –µm‡¬x‹Ì^r‡ASeH\wN¤pŒšg·ÞtОxÊr‘Sb{Bfz\¸Á|q©Sa_‚>Mh%"4oqTV}/ce02A9\3u¥jšÅªÑ‘¶zs®Xn¬hɃ¨ÔœÇ쮾ߥ±w¡ÈŽªÏŽ†¦o¡Äž¥Ë|r„_v«ms¦n}®z¦Üˆ¤Íˆ›á‚ƒ n’{¦·€º±ð“ƒ¶urMVlDit<RqI‡°m„ÃekˆEbˆARn=i›MmŒX†¶†°å´âü¾àÿ‰‘Èq{{—ÅšÓ€™Êgzžm”»”¿ã¥Å醲Yy¦^hGaX£ov Hk™`”Õx‰ÈNa•5:b/@_gz†Yu„p{¥YmœO_†UnŠSg›Rh‚Lp•j}¢ckRk‡i—£MSj@gˆq}µz±bz›o‹•br¡h}v‰¯m’Oo<eyE_x4Sl Jr%Ht%@e2GcYy¡m‡œNioAgdJwt@`wB_vEQ_FdpChfEZk^ƒ [nœO\~O*&(2+9=GK2I[4f[7`s9j`BY~GZ[Iok>–vH„¡Rb i]wuWNLY\EgUGV\4_j=kX9qR6}bAƒlCŒ‰P‘©^µf{¸‚…g†™jŒ‘fÆŽ`¼W³ o¢ˆgÊYÄ¢\³eÅÛs˜Âqd†MýÀnÿìƒÿÿ¤ÿÿ×ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒ½ÿDWÀ_>mz^@s‡^|Œcp¥d0t!.K * 7*<E \I)_t8HyiQZE[e3wo=nt[vZUcmZu`Iñ†8ÿœZÿÔ°ÿúÙÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿýÿÿÿÿÿÓxÞÌŽ‡Ngžhw‘Z€›Jk‘N•ƒC‘‘[f¤jYxU°‚D|·z\šS€vLˆ£]ÌxSž¡cÈ’VnV©mISwnJ`7_X(A]7OT1\e-e„CÌg>`¯N|A?k5IX1;I1ZD(V^6zi>Ùœ`jÖÞ€{UdayW ŒQ‚°ey€\ISxv.Œ}Slf_p€NnzF±A3Á“=_)jZ#mŸJQ’Cwp0p¨Q‚~Yaˆfap8[‰8Œe/O¥v€|0˜ƒb«ÿ£\Ž~\‡<We+W¢Nr0I eIj:i[(¥ŽHåèŠhßµz AxªqetFRŸP<rWRM)YT.Gc1—a,\„V\…>“=–™]’Ôy±·}ŠØ‰s~Ctº]T‚³V’ŽEʰ…^‹[¦‹=šìžs†U«Óržèx—ÇŠh’`nIq—P¥ QÇ®¤µÍ©²¿¦ƒÇ†š`jÍ€GZ.LG!bR%·tK¤¾[¡LâÙŽw£l`¸p‡Im§Kg†3xªR¶¼x¾éš˜ÿ®ÁÅ…êÿ¼Ãÿ¯Ÿê†¹Þ—ïóª¿ÿ¸Ä㢤ñšÊˆÿ£áÿ¹–ÝŠ_L–¼†Š¨z’®r—ÊbJ ¹Œ–|OfwG}eHdŒ=•ˆL\k?Oi:My.Pu(x?±õÿÿâ´ÿ¯o¯BˆÆ]rNFƒ5'44Wÿÿÿe@vnLTf,µ`¶ÿx…£WÜžžjž¹tžÄmp±Av›Gg…8‹…gh£H_jHe„?‰¼WÚÿŽ«ß~°ªaþÈ~ν}n–JšœSÖž]絃w|3m8j‚6vE`tEƒ†Q𪒗yl·¼©—o„Š>‘De„8Vr-]y3gu4΀OI&h<>ñ¿ºøÃ»— ‡Š´Tš’P“Y¼Ây¢Ø{óÿÈ·è°Ó‘ÜÒ±þÿÒüÿ·Æÿƒ§¨g€†dz–d\i=T‚8z§u¯ÔŸ—¿‘°}ÁÒªÏï’O}1Ip,VhBbsHˆ—TÂÉŒÍz¡È…ÿ·•¡Ípwœ]am9YVC‰ŠVQ|'%:!0BH,Be$C^ E[0s„^Œ¸€»ß¤¤ÞŽ»Í›–±m”Ÿ|°Ê¥Ð››Ê˜¨Ý‡W‚JlgzŒH:TG¡·ƒ}’S_e;Pg5Bb3Pf[uUNjE}—XuƒGgŒc‰Âq¤{Å硤އd@Fk6Eg2SyDo‚pš¶n–¹`ŽÂOg‡Et‰Pn›tŠ·ž©Î±±Ñ“™ÀУÚx”¼¢ÍŒ”¸o€¨„žÄœ°|Œ¤|–¸vÎtŠ¿Yq¢Xu|•ʆ¡ÙŸÇÝ‹›ÀbvŸHc:Kscz™Z‚”oˆ«}¼v Æoz°s‚½gp™O[}DfqK\‚Qgar‰U\…o¢¼‡Â†»r|¥u‰£ab‘YZw]frh‡Tu“Z•Œ?Zf,Ns(Js/P{?H}47_F_~TkšKc›Uh‚Nfy@XpA`oOWzRlp@jyPsi|•fn—Sb}@2' R,_Snu4…|@ÙVˆ·Xoo\}]dgSqiBxjIpoOO^>a_<F9SS(Ul4UxEMwEiT8~d0xuBP‹ƒN“ª_˜tˆÇ|r¨x‡†oƒsT¨iN–Q˜˜y²ƒdÝ¥]ÕÎoÈí²Ü¦ç¯šÿÕ“ÿÿžÿÿÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíÄÿŠˆ˜Zuª/O\1'':0K1'€T1‹–XC«|"Hk$%&!(*,6)^3g7„šiaœ‹OwlGWD5RE(/4` TU!m]8˜6VÿxXÿ—|ÿÿÝÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖä刓€¦“]–¾{Š“nhˆMq˜W|ˆEo}Gb|Jm€Tr˜QlqkdŠI…‚@^„\…l;І\š…Q}ƒVIlXEa+C[,ML)NK3WQ*Ub9tƒ6itNwpF[‡XByA>_4l]$…i>v}Z“\¨àlm®M›Uj4tyF‡¯O¤l…²€YŠngf@v^A[mNeiB‘ŽB¦kq oi–^k{F›oHL_YO3[]<oFp–iWcCto6_r<Šs>l¬hÔ‡JyÿÑr”ZX¶Q°w3i–~ahHvIiu>|rFÿ„T£ØÞ„É© fw™l†¬i޽j•É}¶M|XhT#pÃF‰ŸGr¥^ot:°žG¾àŠ˜ÄŽ„w¤Êxž¿oÝÞŒ¢º‹xž‰kz:ĈJ¥Ç®ÉzËÿ§úÿšÃÿçlÂxm”K¢®P¼a}¬`‡ºx|}FSv3\eCŒŒOް…j·l¿o¢Ú¢ˆ²pŒ„F«X§¹`¨“OÀÔ„»Åt‡±Lq˜Gy¬l•ÍÅÌŠwÌ©Xr5ÉfYÜÿûƒí‰Ÿœ`Åë¤xÄvo¸E¸¦…’´GÿÿØÊÿ¬KoMvkCg–M{nZ§–YËÿª†ýyM7IJ&VG#OH#_FomCBp,Ik3AT#`L6oaC²²ŠéÿÁœó}ÊXˆÅ?hJdxH?.de3ÿÿÿg‰DžÄ{ŽM£¯xÿá©rÃpr¥j´Îde?’f~ÏNe4am-R›3ŠâeºÖ€ƒ§h¬šƒ‚ªfºÖ˜½×ŸøÿÕáÿ×´ò¢Àµ¡x½ªw¢wX¯ÔuƒzG`‹8la@„ƒJxœNy¢R¹¤|‘Wr€A•ˆFc„3ly:dœAMf.pg>a©C‰‡UÿÆÁ[F-fK@™eI^%ok>‹‚Z³§|ÙÁ°à¿éÿ®²ë~ðÝÅüÿÆÑˆ€”L‹DCY#FQ(l‹Lx‡^{yYŒšf±¿—¨×¢¤Íymaƒ?Ss>PeA’‰Y˜«Vy|¡´Ž¬á¨ÂÔ™„¦YZ{JЬU•]EŒ(*:-I%0U&OtITxD7U#)E*cWc©¤—Ž©m]€TuxOqU}w—¹p™q»Ñ‚}•\WqIp‘[s¢SSm8Sq3^†Hy°d{©G`w]„•L^ƒ:Tp-Fb,FcDu¤z‡Ë† Ö—ŸÖƒ¥Òp‡Ïft¯DRˆ=On?KbB…’€Ø}Æj‚¦e¢³ˆ“¼“¡ã°è–³ø‚ é}Énr˜a`Ywže®‰ªu‡§q‘©v†šo±v}©`xše¶”Þ“žÒ€{ª]\{`v¤`}Ã[o£qq•\fuI_yWvŒx„·{ˆÇ‘ºrx›[bjF\|Y¦dƒ¶`qœav¯ª{†£„޳…ˆµ‚Ž®sša†¤Qt‰Q}…Ij‚Usƒ?Zs3Hc(DmCc—ZkŽMkšQ]H`†Yo£acˆWiƒFa{BQsIWtDZp=P_A]iQbtRX|U^„?E0>Y:!XV%]^9€j<ÙxJ…§Zki[zaMmYSWGUJ4PO<Ia6Zj>sV<|;|«\e¢qiu\s|C‹‰N’Ÿ_z²mqŽmq^œ}c…¨uoy~g}rFˆ_LnpMƒb^Ç~OâÍpë÷’ÿúÿÿÈÿÿÛÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ³µûakÊVNMT7:@;)2/5%**F* „Br‚E-tn-.H6.59"6F*-C+P7 aO%TaMfTQh[G7WE!E5&BX,li9~n2œ_Jÿ…Nÿì‡ÿÿÐÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÂÿ÷…sŠ{‰U“Q‡ŸZW‘Y‰n=h™\UuS};Ÿ]»“_°rs|O~ŽI]€FZt>oa6±ƒV}¢aU‚G\h=Bn@;`*O='?G&?F'V]3kv4WtU>k:yY&V}Sao8Ee9d+±©T’º}nœ„ihŠza}·tn¯`—¤N‰¶Š’Êmm mqtLcv<aQP“£E˜kÈy„‘pc†tkp@†ˆB\œcd{McpKad7Z€;bn>h>–iBˆK`¡gÿ‡I…ÿå|‡fVjR¥u'S™rM^.i‰<iuB^|MÂ{Hÿ‹‚bºØw¦QpyI“œp¡¶•›À£j³‘qI›˜>ŒÈxa\—‡<°Á`»¤tÓ¾”¿¶‰˜[Åvƒ°s“”iD‡erY0^v@Œ±W×ô…°¹™Ï k¿íБ|zŸVj“B–£Ru³^p¤SkJGl:Z‘5§E†¸l”kŒ£qy®dz¥fo—F–¾a¢½f•Õ…¶‹@÷ê…¦üŒÍn…ŽM™ˆKà’…ËŽ\“RA~79T%ž]$}ØžwVigR_'wŒHœ>صQîÿžÍ´wrb?¡eU¡][\0¢ß Øû©œñ·G“JEC)QE$>N"¯?.}qQ‡3=al0éX^,|Çm[H'ž¢W³Éu˜Ã‚k¡NVr0§_g0t'‘|NÜÿÿ‚yY˜œ†¹•]‘U¡Ó|¨ãˆºâ§Mo8z‘Ao—E~ŒBlÂ=~–9ÅÞŠÑÿ×ÿ°gŽC€ºb”ÍZªëƒb“LqlE±€^ãg§•wùѨ½³†±y‰ŒYt>ov7pr<v‘=¢Œeÿ¦¦ª’m¯¤uŒTq“@fs;i:nŠLÔ°Ä÷ŒÚ´€ñռݿz{<_M6—Xhi3wi@—T”kR©…xo”I·®}®—|½¡¯°n¾¥w{®GŽdj–8Uƒ4b€:IO%@K&Uu*j~Q§Á€–³ož·w޵i…¸^OŠAކY‰‡F_O<§Â½ºö’¨ªtÃÊšµÙy¤¤m’šqƒ§DU…4u¡O…µt€²u]‚CDf,KR.-37\ML^†PNX<cwX~®_\Frv@bDqŠPbu`n–LgŽ`p•UMa6jšLn¯dœ×‘‘Íi|´cp£I\‰:Kh+b~4Bi3]ƒu”¸w“aŒ¯|œÍ}šß~¸m³fp¢K_—Dqžp”»ƒ”·‚‡¨x…¡nuˆftuw—x¥â€©ñ{žÝen›Lu”Xˆ®m‘”ho’nx¦|޲w‚¦c††Y‰šq”¢oŒ˜w¼„¥È›¥ÊjŽf‚¿—¥Úz|ºx™®^k‡?Im7>dVyœy“±x‡·uЏhb¡Xx¼^³f‡ÅuÈ{†¡`\vGSzs‰Ä‘œÇ‡·u~¦s¤`„~MapBUhHiw9Ja*=[3AnQaŸZ`—j`ŸLJp@Oyj{žnxŸXxžVe‰QiŒNDtNb;CX:IdBOlFMmL[`.J<CB9(>K,P@2aX,cr6bd7J^BQR=MT4\Q6^[,pY6pn8jO—fO”¥Io¯‰L„gORul3xTybw‡Yucw|Nue@jnO_iVuiE|‡>[uSmNRàxCÿåmÿÿ´ÿÿåÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿËÿüQƒÿ>8ƒG/8^6)GP3=;&0K=4.!14)= 0155*.'"+*<"[= Z\57\<7G2=D#1J(F>#<9!C7,LE%)[34/'o)Sr0J1ÿŒCÿÿšÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁÿÿhž¼juLh6n«Wi~[qc9r‚K™Qy•s‡£i¸«k„±uw»[]‘Phx>B|K]M'ku5nrQruSl|\SuMGt1@K-[[-Va9Mh7‚u-TuSTl;^e.Tf:Zm7Dq<O`({v8{¯\zns²W•Y²¹j™Î—wÍzyŽVtšR‹WU ¬\ Ý~†–ƒolƒsG\ŽfkO;PcD~i3q‘U|†Zˆš\n…c}}Z}ˆ_xpR‡ˆ`Œ©d_‚`’t@ÿƇpéÙX‡SNb>^œ?Mq=Il8jt2o‰=hO§W=ÓñŽQŸuðŽO|ÿ¼s‰]š‡cnkŒUL?—ž<ʵoγŒ‚ŽykiuL¹¶nœ‘xhOq8dFu“T…Êhm—;j¦B”‘Xƒ›sMrKUX!„^<f‡He‘QsªSh©BnŽ=x”@dz6jˆe€MgJ=ghB•¨a…Å[Fš²NŽ»dz²NŸFz§Hvª]¤Œ?h¦lf^"Œ^4S‘ELY&Te3uJ8l²a?w5N[¤ºi¦Ú¢Su?\a)b‘4a™*ŒŒ3¯ßmÛp¬¸J|zM§ª\ekFmµft|B¿Óc°dKo5;e8HU)n=&o`$li7WrAez;w¦`z¤\«ÿ¦sÄi‚ÀJ¡Àg¼ÿ¥J‹/¿‡}„ÿŸÑÕ–™²d¯ÿâ¨èÆŸƒVn:µ™Zƒ¨SÖÿ·£]zO~Kh°VU‰+o„9Rn%tp7¯Ž’®ï±t…AÐò¬®×—¼¼¢ªá‘›Ü}¾æ„‘·Wi_<Ìsc¥s¬—iáÔ›£°c®†[w´O€¼TÀ§„Ì}ÿǞᙆ µay„K~„EuEƒhLð¡ÿñ ã¬õÿ±Ê«¯ÅtÙ¬„tx@\U5eP-?["Be/€p\dŒ<_€8bZ8J+^R+py3xŸ9^‡*Jt5o¸Th‘GKa#DK(Yg2Zy4tŽd›ÄŒ™¾—–µv’¹z Âv•«s”nm®c‘ ™ÇÓš½iƒ{o–¡t¢¬l‹‚M’O¯N†¥p§Â’¶xi£V;J$*04. 2=-^dMzœZÇÿ›Îÿ–†¿P[w5[ƒ9h‰7UcPŠxv¥i‰·XY‡7azFg…l®qžu”ÅsÐv—ésYwM€–[rÂj~ÆtZ…MXoF^tRf|b§}’Γ›Ö‹›¹`z”b•¼b„±er‡KBd@8O34N(&:!4EF¤‡¸o€¦TbSo–eŒ¨gu–^wœyˆ¯€¯isŒBWlIh|ZzuLrwOea}¥yƒŠ\¤ƒx™È±¿à›¤Ó~x®hxª_i–OY|Lm‹c„g–»{“Å–Àñ‹£×m„ÆtŠÌ}°hw«]wœdt«‚€´•®Ú”¼ˆ–°‹‘ª\ƒŒb… ]y“RWs4GW&:^@g•n‰v‹½¿V]…CNvt€¬m‰–[sži}šep¥t“¾fzŽ?NcET…Y]SRzDAb0OH0IJ0/R/;5+U<DZ,NQ3NY(EQ+WX2fX.hv?ttEqrGzvJ‰gS^‘Q;vk<O]SB0nO(ldB‚XLw\<oeHx‚Nr‡LurFn†XƒŒS¡’Râ¥\ÿÄ~ÿÿ›ÿÿÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ÿÿåÿÿÿÆ¥ÿÁÐà¹Ã¶ßTÊ«)}»-',A!Z65V:V,#-d5018605D"1C%#9! +H-LQ&WY3]p;WjASa-@n>::/1*h+\p1MkG•R%ü©Aÿÿzÿÿçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„çÑ^’fwUE•”Ba‰x®9rÅhj€n‹„L™‘\w_iƒgh˜G˜yI{‘[Y{X^|Kkq:I…XcfDfIl vx‘n`kX^gA[g7UnAay4^kE?r2NT'Vg2P|GMi>]y?_m:m”Peik_FŒ…I²Ïp˜ä¥m¶op“LUŒHš”A^|uc_HOj:cl2‹ŠF—šob«W„FJu7,:Bx\&ŸÇgt•†ztXf‡pUNCTQ7iWAFj@QR#´ÅR…†‹p†`©‰PPnbOa0Et?nd+~—M– bð†OŒÜÊVnẄCÀؽT°†1T.[_'It@rw6‹Ñi†jKj›mchOÁšM_à½Ta2p}3°»c‡Ä“¶Ò‚t…hpƒ=Zt;f…=:^7I_%8U ;IXy/khB‚‡Og Jg4tN[9’‰Rl»ƒg‹4V0¦Ô~¢Z‰°{wŸe‰”Pm£L]{>}{6}†O¡I|ŸY¬yR’¯d] MKO)Bx5r|>vy4a‡;jjJ˜§rtš]–nS}ÉQpBJATY%–pP¨§L§¹‡ƒOQmEs˜G™¾h‡Ïo½c„Ö•L—>;`#]T+x;|f9ŒM¡Ï{zpC–§|¦Ø—±ëŽŒÄ‡^x<гdÿÿ“®ÿ’”–Aꡈÿÿÿ¿ÿ¤£~LîÿÊOEYK4œ¨g¥»”bN-ÀpevrJ™˜wµ¥‡€ªY`x8Sj U{)Jb!ƒƒH˜¿{ã乪ןހžÙ‚¡ò‰†¿q“ŠbY£B~fDÁ¸q½ßxÁÝ’˜ÛtbCiyA‹X¼›y¯Œv·h´³w¡—lš|S™`’˜T€yMÃÄÆ¾™ÿÒÃáô´Èÿ¹¯ˆÿÔŸÑÀ‘V¥=Ko2V{;Vq;q“TXŽ:HC,“eaP2Hj#RT&o“.i›.S‰S±Ä—–±cgˆ?Hf+jnEfn:¥sÖó«ÉÿŸ€³f®y’Šeœ¨“¢‡Är‹Ù’µå‡ŒYax>GRB›}d ¡s€£aŠv’¿wµÓl²«‘ÐÿµÌÿxK’5wjc‹¹aP’>EHo¶Z„Äm…ÈUT”?\}:Gp.JgW“§g‚¦\f>T~-Pm=j–9apAkTdœV¦³š¸Ë~~–]‹®z¡½~™§aYpB\€Ll›MUŒYu˜…°Œ \VlIjœck›Z^€bdš‰‘Õqd¢GS{6@]0GiA`‚P^zALe@f‹dužkx¢^]‡UnŒlvŠ[€—`x“Tn¦^s^~¤Re}O|Ut“TRa@lxjy»”ŸÈ‘½˜Çx–¤dx‹Lp^Š®tš³j²dt‡j‘¢~›t†º—½Ž¯ji”cYŽu–ÊŠ¹…¶}†¸wyª„ˆž`—’o˜›nSm;NW";V>IdPPp[p–x†¬g~¢[Yry™`_ƒaemy«nq–mqY_mJPmVc’o‚™hj€\]tHU]:Q_8=Y6;E/NAAY$HM0[Y*^b2\f6Rk@abANoBZaLgT6cW?AZDPDIWM.T]2S`<ZT9rM8gX2eTB…aGœ‡V£•U¶‘eÿnÿÍÿÿÿÿÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿ™Ë÷† {‰—z‘š`¤¡o˜«g6į%AkB#Z6*WAS*&5i'U>KgW$Br/.O1+""51;@UF)gS,m|=BoE=IJVF+FnB9TA==&;G$F8!œ\4ÿÈMÿÿ°ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿæÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•çÝx„a›”kq‰hQh”R[‹h³†F\•[ohC‹l7q_PˆYc`=cT>½ŒUTltV?GmO;Q<nF5fŽ]tD|uv¥ox˜J]”vKwTJi1Mb1LE+Df.al.ln?NyXz[3q“_G€Tak<›{GŸµtŒ§u—al”Q_†J…S>]vGYAZ|>ƒt1Ÿ‹^Ã|TM{Sop1<H?n„3fmTQoROƒCg~;A…M<Z/l_'TS0tC;‹xPÎÿ‹S«žou6nýo_u?d?RŠbjr/¢”L×®oÿ®}Z‚–ŠBI~^æT*nÿùYZAxŠWxsB¹¢V›{cš€tz=‚BГQÅÀksokCYvB²›Mm„gm9‚z;|©UNe=`j+Ho;Hc9Ry+=O!Gj*zh*cw?mˆDd7užD|…F„ˆ^€ÁcÚ“B±ÿÅ…IŸÈ‚séj—9zŠ8J˜Lkh7Ve2z>rI_¬hu5©9tÜ”~KHg0Wh1cx7¨FqÂucoDW\H‡oE˜Ç¶îŒvÉq™bE§VŸ~`c0Œ8•Ä[µÈp“䈲±w”Òy‹ŒjŽ´_—:v„p}™C…c—¦i@¹]-D”N/Êÿº\Lx'‹HÖ¨vÎÜ‚Ôÿ«ÎvpsCñ—ŸŠÃk£LŠFÉWšh]‡Ckr7{h9™k—Ÿ`ºÐ€ƒShg±FŒ€RLj'Hk(qiCˆyhŒ„k¤À“’hp}…W?_g„6އ`¡‘hÄÿ£¹s¨®jËŽrk];š–jvHžŒi¹šo³«aÁž{…MÜÒŸs`‚_H’jLª sÅí‘ÿÿÿÿñ·ÿÿ±Ôõ“ÓÂ…—“h©ÒyjŽEgCey<m„QŠÊ`z…cbˆCB@(¯`U`u+Q}'z‚]™ÓŒ¦Ý–Šq„¯yr’MD?,€LCƒ`±Ò ñÿÂ{±Ih`@¨ˆf‚l€wV„q»ð¨³Ór\…;W~AMa4}b=pN£€jšFIn)Nj3L_@ØÜÄÕÿ±Ó÷±·öw¤´““Ë‚ŸÐŒªÒˆÒ†•ßp€Õp™»v…Ô}ŒŸ[u¤fxª]Z–KV–BV:i‹AXn?lPUT2cˆjy®dbJx¨`zºi£Úp}Ê]a®TÀ|¥áy}Æbe®S\©c™Ñ‚–´tz›Yc‰i›½ž®·w‡©\Y~Ng“Wc–NpŒGOr4^…Tw¡oŒ¾ƒ‰·ghcu¨aq€Fak=Ia={k–±|—Ïw{«ZYmCaa8Vw8MrZ„šo‚žby”g‚“GWv9@U0Ie^Œ¡k…‘[h‰EpTq–q}¢zФŒ”±‹Àu‘Ï€ŠÅ‡‰Ã‡»uy’Xc‡c£h”Zc„GF]G[uUkz)A_'=[3EjIV}T\xZv‰bŒ”a–nz•chŒfpœwq¨ksžX_‰PXOTwMWw_Z}a\rTYmT^lHYsBFl<LQ4nO(Kh*AS:KQ6WJ/UR2?g>SQDCa4;S5KC%MQJX3WB7eM,gc8ReHJTIdL4W1´{EÔ|_ô‰dÿ™oÿ ÿ…‚ÿÅÿñÑÿÿæÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿW–éEE”N89pD6x{KŠb§ŽVI¬n)\<1$ZD7\?iL5^€/ldcfS/ld:P‘;,tG320N=Na1Vd<jnGrvKX‘NGx@aO9‹Z'{v@wn[„g@ˆkCÿœAÿÿŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÿÿåÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿxÂælqy«r3_›yr~N_‘Gs}MY|Q_h?MSD¢T,j®Nr\mSJ`O?k…FRzM_Q5<C5DN(\Q-TˆQSO3tU0v‘[aŸtXyQ[†FAqAbh(Iq5BX.[t+HsE>K,KY)O^.P?] QÄu?Œt‹ÛX_°\>w9CM'eM%y~H{jKj–]YiA™Y=Y—P¥w6rˆXXpGdbC†;sU†“ef˜spo;nm-8ŸWVA!TY5ÀO,¡ÿ±f˜}Ê\GLˆ†ˆh.‰pQJ‚Rd](¬g;ÿ¾{hÌšOYE^^1‰eF{^;ß crÆ£]§Z£ØQ¾îƒƒŠ†i[Jnt7†”T„ƒbs¡QMŒ:…q5d~D–GjŸaƒp@ЧV*08R Vm/rx<k mvˆ\J|D&j4.&s0"‡›ek±Wy’<rŠY«‰@‘Á¡u°^Ìžs|˜\ó™l]Óa„7LL'[:Yh-Ps9ls8x‘Wˆ®oižWqK†·x€¡VyƒBfg+t·QÀ³}~Á†Hˆ3f|<PZ6‹qC¹¤ˆÄ÷®z߃ƒDˆŸež‰6±©`íÞ„Êáƒêç¦Ü”›ÀvhšVz…\tC}^4…nJƒB}wTb…VcC.¬—O›pfX±tvq>—Ìe€¼a™K;‡¦tŒ6,\kBÔ~r•”^l³^•{OÁ¿|±½w„˜b¦gì°•±§o¨²±¸³ê«qa5П“‚¾Tbj;Ra7=H"BJ)yu:12BAc/AMˆƒ\©¸‚ŽÇjl¢Fzn@~qLÑ£…fo>²{bË‹y¦‡bºeshCš‰X‘pZ¸²}xXAK¨»t¼µ‰Ð£¤¬ÉˆŸ¶ÿÿÿÿС¤Ý|â’š§ƒ¼ü¬£Ô‰~Àdn£Z¤À~ÕÚ¥ƒ•N]j2^\7}˜Eq¢4HD*v{Z^}:>D)lZ;_V4RT-jQF`“M·Â›øÿºŠÕTTo7Vt0Cf'LW0kxk¿ø¥‘Édp–C¬À|e¤C}C{©Kn‰Boš\Q8Ox-@I3j˜äÿ¯¶ã¥µè“³Â~’©_k£e…¸rŒ²|’¶¡¿áŽ{Ÿ~¢Ò€ŒØqá{n¬i”¨szªMo•LbI:K#9H0[’`q¬duŸhœÑ—ÿÿÒÿÿÌüÿÇäÿ ¼ÿÐÿ¸î•Ñÿ¨·æ›Çð¨®Ä€~ `]uC|‹IcLiwNkŽn›ºz‡±UšL`‹Xx¦cn™YnŽl‡·Š¡Ù†•³]^q4?d28d5IeO‰~_‡ª}’jŠ«Tj†@n•WušXm‡6Sv6Y@`‡>aEbSb›bc^v–hz•F[wUb„[gŒ^g[x™s–Åz’±v‘µ}”µ}€œYSz;K‰[p²^wi…¯es—Rw‘CWk2Gk,E`?GkLWtGVpLib5+19FVFZnQVv~¢®w{—^pŽ[e{TWyQ^_ibcWa}_glR[pHMk@Sa<^_4Qi2>NA:N3\</i^)Ux;7uJ$M69/)r;šs$pœAQx[MVJQP=aMA¤WGÿ{Lÿ›]ÿ²pÿ¥Œÿ¼ã±—z‹¬cŒÿZUÿ·}ÿÿÁÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝÿ¦Œ±C[–"-b33s2ly/_…_—|NŒ…M9”jJ?J]I&cbCœz?`½[;‚3A,d7—g%z£YN©{e_KnnGjlI[lMrXKsxFG‡OfGOif*gsCdm?ÍyAÿásÿÿÆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâÿÿÿ£ÿÿ¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ<mÀ\MC™{=‰µR{•}bžRyzTd‡OFM9zW-_ƒHuŒIRX\gI6YjEÒk<_¸O_N_B-:mF5?.Pk0[{<@gLv.ŽLs›oh{\f„MU‹TYsDjj5S’J‡„1U–RMa4šl8RÀ^iyIGd@`X1€®H¶z[uÀ{i—ROf=7Y2^Q(ej5M~J]p2GaM[U7³y1Çù’IÇšEi3„0P³_jd4XzVQe1Q‹<“v0ƒÓŠy•Oo¬iàhŠÿÝzŠ`„Ÿn]ˆN…u8dX<TAR](pq1Õ|Bh½Žhl<]{Jso:aI¯›>X²ˆk|<—€>ê~DP‡Okj6~‹ON„Q†s;i±^\„IXvJµ…@p}]m‹F%D7.[&\4h•Vb“Sc_5sŠFRJi\8S€=M`6‘j5fNIlˆ:…‘?¡r§šx‹Â¡f†>²™`ÿ×}Vµw|s3Zªdys5„NZq;„E‘ƒIz°€i‘:lˆ^n¬am‚PÿË|ˆŠ~qš\Ž?Ãæ|¦÷½ŸÊ—U€CeLŠ—SÃÁ‰ïïÅãÿ·½ü•¼Îƒ´å‰³ö›ˆÓt©Ý‡¾ÿ“èœËÐ{cçx“tQfÀTZ—Çn‰›cœ|]‡Nf[;ja4u“jµzV¯‡b² kÐóªzÿ•äÉw~{L¡vH›¶d£Áz’±VÓß“xsC÷¤‰rz=‚•Z¢ƒaxxJšfXum@Sg5›‹vÉv™‡P\V5Ra7E^1bxMcgLBa/ˆjUBW#fW3[K–¬€¤Ô‡®¦lz]<oE‹€Tla@Âú–Æÿ ÏÿžÁ凈fK £c‚¬]‡´PŽ‘_be>UM5•Z{nY¢žgÿ£ðÿɼü¯Íˆ¸ïx›`„fd˜»‡‡´p±Üœ¥Ñ‹E4iUCeS@ia8cf:bA´·„˜Ó{›ßkkŸR¿d…¼_©j¤ÏœÅ÷°ñÿЦç~¢œq°¶t…£\`}?“m’ši~Š`¤Ãq˜ÔeŒœ^bzA€™T Xt·klŽ][M„±p‡Í€¡¥v›´}½è‰t˜Vt–Qz‡]u›F\ŽKg‘xÂΦÀ}’·Ñœ¬Öy‡“n„¥q¢¼ƒµÙŒ·æ¥¶é~ˆÍYl¿[t³z‹Æ„}Çyªì·ÿÿäÿÿÿÿÿéÿÿÂáÿ²ÑÿÆö¡Á×— º¢q‡q¡žgy«Lbœ8^:JqAg‡c†mf~FZ~PfŽ_ƒŸNOi<PwL|“|—²muƒ[zšhk•XXHEk@gzXle{ˆWr…JlnO‚¥}•Ïj_”9Cj;XrGY‚_o´r•¸mˆ§htUkuJcxGqˆ_k˜io£e[€VbŽWavEHZ<HSCS\IYrU^”eo´‰“¸nˆº–›Öe—@P`=Qw8Eh6;Z:La?UdDS_!#8;C9OmPYxfmƒ’£id‹RAjGMnKXƒ[iŒ`q—WmˆOa‹OllWWfZf^Fad8]eE[a8V^>TM4uU1…ƒ9‹’WMk*cSD;/^MŽm-¬‰BŸmÄŸvæoÿˆeÿ¢fÿ©{ÿ©þ ÿ•‘ÿ¦¬Á›€Œ¢‡qxöaeÿaÿ÷¸ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäúÿ_•Ü)F{"#1 9_9fb7bgPQuJtgAfr5OŠTUfD^=§>Qºy6r{KB2ud%s6¯€J“°ffâKg^TZKig5u‰F{€AI“S~RP[ŸA¨™`ÿìkÿÿ°ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÞÿÿÿ¶ÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¶êÿ}}£všm”U‘¬gœhª²hQ§ou‰<Sz`a_5XR+†ƒI]cxp?V|DŽ„Kw©jUYuAfCA,*IL+rl5m¥WrŒ`{“RŒ¨Wv¦\]“\c†EqzKIpSMc5Ja6qP8b”BVjVCg5|i&|‹Rd~Ybz9¿}>d—jcsGzŽ?[zFCn:NZ+qa2¾r<u´®—Uf˲zo7¦—RÛÔ}Ûî¦ô»Šà›S¨dy<O¤S•q,~§‚“€Q•¼nq¨sm”dú}X÷ÉupQw–QuzNa}D^K#W~@Qd0[¤Aw„;V‚Omj/Dq@hi1Wr9Ql8{b5\pAމ?–•k¢¦g”ã~‡ŒQœtH©pV€ÃrXœdck?M~EÿE_’“Et8lT&¥ˆZ€ŠT€JV„Hd‚>eQDª–HxÑ~ieBxDœnn‡Ppk<v€0k‹L‹L7XEr™WàÆTºÿ£SŒ@MX(gk;]r<L‡DVc0ˆ€=‚r8f©Ub}1\…=Ž”o¸¦Wzœmd‚Sf‰B¼®u¹Ò½ÅÕ½²Ð¥‘¡xœ§miÂm¤§]ÕýÅrÄÿ©wÉù§‘ÀqÊÞªÎýÊ·çŽÿÿÊðÿÖÞà…µÿ´e¢T§}šÈ€»æ“µ×uš‘[¼”cu¸Q‘œG ±b‘€Mq†CΫ†±‘vÿãÂÐw_6°ºŒÿÅ‘½zYŒ°išB’~PˆyPg…=|¥Wb\3hmEzb<lnN=x+IV=aH4xÜqWL‡L@O\0FO-Um;Px98>@E(fP:vmLnlVf‚S¤ŒaÆý©§ÿœ”ËoÇñ£úÿÚëÿÁ»öšËÎìÿ»¢^®·n¢·]”‹V…uFi[AvˆNh†KMI~YÿÜë¬È…‰¹iþ߀²Õm½Õ|”±y©ì™œ¹‹Œ¿lYK+bS0ZO6-.LK/„ŸY…“]g{;`^<|ˆT\n<hbA€¢dÖØÄõÿÜþÿóàÿ·yÛdOZC¨dqx3v–Q†©Hx–5V†,p…IyNrŸX†t¸ÈŽ©¼¢¬ÐžŒ»£º’šÓž•Øca§d›³w†q†Ÿd…•]sŽI`‚N‹³”Äšz“KOpNl{SN_+=P8foUYƒ?oy]¼€ªÁ{£Ë€Ûv…®€Î§ÿÿÊÿÿ¬ÞÿÁÿÿÖñÿ¹ÿÿéÿÿÂÙÿˆŒnqvYe\Rhn:Da,U\Fm›Xg=V…LaEZ‡>R~ABX5\nXq“kt§bs§Qb:Lm<SbKp‹w«„‚§^VxNgn>jfeµ¹i„ Z_9OjGhˆmŒÅo‹Èb|¶HAoAcŽt ƒŸ»|›¹bv”IbsHQeNs]bsRjhp•bg†ADc+<R)3R2H[5KsZs®mx¨s|¶†Í£·Ñ‰¤Ugx8?M2@V26L,B^8C]1L^6[e,=L".?/AXCHcS^hZUerвyˆ¬Xf_e™e\ŠS[pDg‡J]€?|cGv_ChYBa`4dgA_a?cj:`sFiIxK`Œ[;le>ISPH3Me2hf?‚n?²‚Yå¥}ô”ÿ’„ïŸwÉ£Žò†‰ÿÿ¦Šÿ©ÿÄË‘‡žÐnzÿŒ~ÿϨÿýåÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×ÁïP|©+Al$&6&' 7 H7EO2RJ3MY5PbA‚]6ƒ3s£`“u]‡šRdª‚Ch_XJa`+gX<q_B™qXlcO–~T_@|a+…¢T|¢fm‘X¦‰TÿÑXÿÿ°ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ÿÿÿ¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿµ¡ÿÿ®ˆÿ﹞˿cyŠƒ|Lè•EÉóy¦“„{·cªµshšpŒ~>‡œag~\rzA‹mPІQb”t{n]P_<O^4KX4S].ŒrCŒ“`–´y…Ç}vÀmkŒeu‰ViœSn\OSf8a²QVŠ<Y}=\s=L…H=[+[Q#Uw>_hA¾ˆ-pñ`wDX7‡¡JR€bIK3Qq,[o4h…9Ø„KZÿÄSI>«Š@ÔØ“Ää¼ÒÔºÅû½–ï„uNgQeW*T{JrR8šŽFWƒ‚qJ5ë¦KzƼq`;bZ9ms@Rt>jh'Lt9tV'L‰Y\j6Ty5lƒ=:hHcP#]x@žf>›j~¸‰[«Uw…CŒ†]{£v cP‘ez¯dkÆbe¾Yc~:euFÿ˜Oy‘h‚—MuqJ{–XpW_‡FPzNYk)^W/Z?2|‡R`q:‡rAÊt‹‰P‡~H}_oN}‹Pæ‡7±Û‚¤ RœÏY–?‡•Iž£YMBNy>a](€“XÓ’Mq—<Ÿ¡V„˜T°bv•x£›I‹ÀXn5dF4Ÿo±³„·ÚÆß¯£ÞŒ¦ÿ·¾ZËܮݨ§¨k^Hž‘_´ê±ÿªÕÅ{Ïý¼Šó®“¼…žÊ‰Xb+sžYëÈ|Õ×£ƒcqG›ŒNЀ»ÿçâ™ÿû£ªfMv+™I’È_ª¥kdˆJ~pÿ•pYk3‰vLŒ}L‚q;Ï…Y²Tv—Lc€JqzCqqD‹£`z¯o<W1QB-²tk‰gU\cJ72zcCVf;On1)$<S)D3#aW1R5+~†Tk»W¶¥†§Ò‘¡É€£nºäš¨Í‡‡—cÎØ¢Ýÿ“¤Š\™šY’‰QЉ\¥ª‚“ǒĨÄÓª„¹^g}R¤ˆ‰Ê狳k’¯hÑ×öÿ²·è¤«Óžw¢Su‘YÚpp½Kf¬?Ys<€¤Pkœ?i‚JE^1bcE]p@_@=dgI|’R„œy’º‹ÿéÔÜñ¼ÑðÊê|u“Eag)f}/at4JQ%ZQ8Sd/}uLo†WtWml”·“ŽÅ|¾qo§zªØ©¢É‚m¦h{·iz´tZ‘GO|1IW?²•Ðê¿Ö€d‡gXƒ7Bd49N'6B(U}<KV<`Sz¿g…»gŽ»kv›cwc¢ ¢úÿ©Ïì‚×þ™·ð’öÿÒÿÿÕÿÿ«‹†4Cc;7X$432jx?Oe/;Q9d‚IU‹Clªmx’LfM\šET„<Qi?k”m’Äodx=ix<j€@xˆP‚{Xs†\clH=J.,=!1Hd·È¹ƒ¸XpJ[zVdag‚bn‡NIqKh’j}štŠ~Ÿ±fi~DarYƒ”svˆSJo<BhDHqVkŽGYr>Nq9Fp56\39Q=B]KC\Sh„tŠ»ž»wŒ±nw¡MNl#1A!-A*?I3Nb6[f7WS0NJ0Of4Cf7FZ9KR9>_yª…ž©b}˜}’Å}—º\gDa‡Gf™A]T<f[9jW6Tb4rY;Š^;˜ˆFu–Xj}YfV\†\TtPRg@n`5d™Ff™a“w^¶“Qè°wÿž‘ÿ¡†ÿºˆÿ¼’ÿ§”ÿ¡ˆÿ§€ÿ¬Œÿ¿’âµ™š›žÓp|û–{ÿ¹ÿÀÂÿíæÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ÿM”³)7y& <!""#0$:7<F!KD%XU,Oc<\hA‚Z8{€E…†\”Jm¤Yv`My^WY8eL*\L+I\3‚H>pGo‰_”ŠA–°Yo£ƒçz]ÿígÿÿºÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿô‡ÿÿÇÿÿáÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿ¢Ïÿï”ÿðÏyŸ°>orc`,¢Š9˳]tØŸŒ{b™`ʈŒºibd\uFKO@pt3acT|GŸž`vœu~`H]{OfrC|v>|ˆG9’t—d5ÁuVžVf=_wDLŒH;Z9ÈV$Z˜[[xBjd9]„W;h6AW6aT Ž`>a`q…;w”N¥£`{¡vKjO8_0KA'fu/kk2eb2vh<i Sft_~“GÒ¢f¶èµÍؼ£Ð´{É K‰a@K&EŒ9_?3MT5…z.P¢pbN0ÔÏ\u‰—|g=‡XAˆc`tNl{6[©PxW/›[Dʾd½ºw¶}ZŽXii5âkHrŸw‰Q–ÝwÿÛ{š²¯Z€S\O'–¾S£Ž`ÏÕ¤µâéҟ§Î„“Ì–£°oz¹[m‡RXn8l[6Âb9Xq@”o7prIJŠLbl7`S:€d?Ímq§n„Wvj;hˆUNŒ>d‚A‰QfU¬](‡—_M~Bkq?¢EM|7Ot1nƒ9Ãs>}›d°‘=•œvÔ¤ƒeªz”³s“W¨[hŽERO3:E%}jCÁ¦ ‡Ý¬ÿÁ¤ÿÿÿ±üÏϳe§ïÁ^¢]k¤c‘¥WÈÕ‰»òœÄꛯӯâ»È֕ײ]ßÿÞˆ…Lv{Lj^3‰„=}L‰šfÓjGÉ ’ŸÄp¡°luQ2yŒF¬¬išVfV-~`J¾skÁnKy7Ij+\d7‡ŸcŠŽ`¼i~¦cn}BžhÓÓpFpg9b•Kl\<Sc3OU=O+&5/I6(Kb,GD(0R%’ŠeQ,0L9#vyS¦Ë‘xšj‡hifGhO™gh}JKZ"q‡-´³m‡Oo‡B‚B=¯l¤î£õ›Êÿ©©ë•w O’‘F¢¡WÈ„ñÚ¯¤ï„¨kµ°’èü¯Ȩ̂•£w{‰^ij=¯®ýà™áï}…¶V™§Wu„Gh…:\?ˆ k½iu²\c H`ŒGfrO’¥c}¢e”Ëtµt¹}iŠ>[y@Jb)Sh,8t,‰žiFa*L^@~ˆWW‰Gf‰`‹®o‹¼‹‰Ä‚€µq†{À†ŒÁƒ…½z€©†¬µƒwX\tLºŒ¯Ôš}±Vl–rm–[XXPr1:L9e‰=K[@w‹j”Y~aužNh•MLs=VsiÑà©àqÕz½ð¥ÿÿÍþÿœqšHHy9r–rž¹[®_ Á\†¡d~±RUˆFh¢i•¶|{˜Kvk‰ºrn£ICh8QmR†ªW\™8Di2RdGs…_jŒRc…I:`-/G.3N/B\vº§‹©´Œ˜·kq“a‚žViš_j¸e|£B[€>YuDa|IqŠ\q‡MZ]Abkf‚›v~¦pyµrrªa`—Xe’PMr:C]7UnCSn<:n65]<9c5AeRk–t¦Š—̘žÎy 9>\)?N&5=5NiDRe8PW2JMDnG^‡HSqGXlLYuSUbD?J0=QUo•|»oz¡\z£at°Td`BbhA]b?[_2fP9Z>{„HW|des[gnMfsH{qGƒ€M£ŒP´`pª‚„œƒ\Ø–dþ’kÿ†ÿ´ƒÿ¸ÿ»žÿÅ›ÿ¾¥ÿÇ‘ÿÓ–ßÄš¦‘ÆpoÚxbסÿ—¦ÿ¨¤ÿÿãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\£Ø!9›D '$+)$*&.$*0-+..2<E;SO&YU2KX>JaE~W4‚€@}˜]gŒqea[aqCeaFvJ4|N3Œ{;‚‹R‚ƒLŠ S¨]š¾ÿÏ“ÿÿ”ÿÿöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø¶ÿÿÕÿÿðçÿôÿÃvÿÿÔÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÙçÿÿÇÇÿÿÅŽ–Øbiƒ:_G_Z$žz1¯¹O¤³yšv’~gŸZi›uZqIMrJo^4‹}Nn°lo€gsŒVœnRzs\¤ŠUxvˆo«UNƒU“H=€—L\–‰^oLQ[=`\-aN7g‡AQ‚I‚‹9U¦QYj=_h._oF€‘:w¥\s˜Y¾¢c‰é‹|Ü„{Îts¶eg~RBr1AV'UQ,Yf6Ui3La8lU-ži=undF¢Q Éšr¦‚‚}[]Œj]¡HbkAKmBX—:mW9v¡]B™fg@$°èmlbr‡M7VNK‰s>swHÂIJŒxX6ê†9ÏÉ‚ƒ¼œƒ±Z|Ûv|µlox8s“L£’[„¡jcs‰[†¬X¢Åfˆ²€œ€X¾×¥Ãî“ÞýÄÂ乽ޯƟ‡Á‹hrE‡=@e%9\#>Cj\#?U/r?'O“Z_t?hQ+¢v\rgŒšIª–Zlru‡RBB*iÈ]l‘(‘¶K}bBk¬s¸zNØŒc`vJlj-n‚K‰”O¡o$懲~c¯hU‹o[¥–‚†‘ƒ¤Ž‘Ÿk}ªqQµ`DT%pJ-‚‰cíšdÿÿüéÿÊ ÿÀ…®]‰ªXgz?{€F©¤¥ª®ŸÑ¼~’SÆì³{žYñé“qçiƒ™R¾…`³ªtÒšq‘–LZˆKY£>u`BŠP)dk3eb0©yc“ebV, yTv“SKg1hb0•qNj‡C…ŸQ¿ÿ¶¬[¯—`ŒÂsÿÌëe:Sj1¤^qc:”g]‘L(%&*X_?SD)V´:Š„D†«I†eIyU5…}UŽ~Uuei±_WˆAZv;ކUXg2Xx2Á¥[d¢9[a(PK0‰~[·z}µ ‡‚gH×m²ß„•Ûpäñ˜¸ÿ’«ç€À¾…ÿÿçˆTŠ“_…ŽOƒ„ki¬N9‚'k32£_™žeŒÃ`„€JyCcP9¥{Øï¿¨Ê€y˜Qˆ°gŠËed—Bj‘D`‹9Y~;|™jÍÿÔÂïŒT7suIZj*X„3x™V\‰>Jc2eŠL\xHbˆHdŒ@czQ{œwˆ«{®zjÁd“®ˆ‘Äuªl~¦go™_b8FX5j€z|ORbKl‹eo†a^ˆQ\J\mF_…4HX0KP2kbIu‚W„†Wvœ[k›y}®‰”Ç{‹¤P~Ÿ[вs¯Ë’×Þ¡ÑÕ“£Æ_h‡g‹®r”ǃœÄn•»Š£Ú‚|Âts¸ng¤ciŠIcgƒžeo…Lp†Na†Ss h›Óq{±ac˜LZZp‘argn Wh…QKo=4UFcyj†¯‰«iq›i•¸±á£Ý䉞½NR1I{1H{8NE@S0L\?\ƒf~²y‘©{‹ºˆŠµwz©uv _f”JQt5;\CV‰]o¤Xi¥eg¢OV€Ia‰Yk€‡œ¹šžÌ–˜Èoo¥G]Y(C]@a€SoC\jDmvPqŠXt‰]n„ms¨yŠ´N]o39T11Y<Lsb˜_xŽ_|›l†²je[EdcDi_@khC{^?{C{ŒLtrU\oHHZBRN@…G.zi/cvLˆaXl^h‰[rZàcJÛŒNï“‚ÿ“uÿ£…ÿ®”ÿ¼‹ÿÕÿÑ£ÿʨÿÛ¨ÿž§¨…·mn™‚^»nƒÿglÿ¢}ÿÚàÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõãÿO†Ð!C‘B $(&0'&=.,$: (#**12&;6. c@„~9iœX€fOfMX}fGhWDM+YI(XI+vK3©ƒ@ŸŸZŸfš[û±mÿóÿÿÐÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿøÿÿïÿÿÿØ×•ÿ÷˜ÿÿéÿáìÿú{ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿ´…vw±X<viCCFC?aW/‚u,˜–<š—ll¯XctbgrTlbIrh;dmB…rO‡Pº·hšÈ”z›ƒz_bhtHƒA9v~V‘›VMŒr<XA\M$Ö¢=ŒÀŠSŠ]f‚A`‹2r?j“TsnPWqM_f(\uCE‚;_Y+h€,6VHTQ"Ys7‰ƒD¢e½„½Ÿ™f§KžXYh1Ae.In.U]'Cc;IN(—s/A™‚‚Z&±¹]p¿V–jXx=\~8a{C]mFÍ€Fk¤tl?CoÀ[EŽc–V1²ÿŒ]ž`‡JnpD|‰Go‡_|C’f@TYmV-¤¦Rƒ›nš]n{a˜EÞì‚x®~ŽVN€Y’e&~‡gĬe´À”„ËÏÈáø¹áüÆ¿àÇÅÞ³ŠÆ›ª™s´œ[ÈpQ¡c®ˆ:_KY•>PW)Nb.@6#o>&ušh_t@b‹=…rG‘³\p©W˜|Mj¨q¨¡W~¡hu‡5‚©n„j7˜„N‡Nbj<ff.›WÆŸfŠwDju;‡zEc´Vn§Z¬II£™ˆ^aFdc,x Y¯œc»â™´ÿµlÀm>a1tLMé~tÜô‰ÿÿ¹zÕ~Z¯b2Q.”nKŒ±l¯ÂwxÃ{×®x¶½n¨¡€Õ׊çÿ½ÕÿÒ¡˜l¢·s¶¤f°’eÖ¬k²ò q”Nj7¬5ãÿsoÿ[`—P„VDW>!h6$zM”‰Vr„<S‡2h;d€Aª™iÇ笮…j½‹€ˆ©p£™fŒMˆfŸ…_mK0`…<nlADG+ER+‹Œ\œ®K~›J«†U_‰@Õƒ“ŒÇ[v‹Tz]'p]?—§€„ªt{°UoŠEаdÄiÊ£gql6vJ6{vMOM1J2&K?#U@2„hN±Û…Ôÿ¶Ëÿ®ÁÿŒºÑ‚æpµ³´æul£L‚L<tŽO¤Ö€é{„º^˜µkÿøÉÏîš”¦i‡Zµgu—L‰dŠª\o¡N„‘dÀæŸÓOh›D[‚5e˜Ao¢fïÙÚÌÿ—uÐ[bŒBcŒ/m—H¤¦‚‰¬Wk§^ÎttÁXPq/6R'=;'Jg=OL;tŽu•¼j\}iŒ½v¨efƒ\cqERh8o}j¥fQ~=Hb=ES;Oc9Po<RR8V\AWq4Z}=nxH_vA†Žd ¤[ƒˆ^ƒ¤Ÿ×³™±qn¡R}¡i‘±tĘ¹Ûª½Ö°ò xÉbw£]s”c†¢`w›j’·Š¡É…‘»x›Re}?\vIg|Mgr7M_V…£f¥i ÀŒã€žÍfs§W]kDa^Y~}i›Å†²Ú¾YZ„s‘¿ˆ‡³mm“iªw§°u•¶qš¬n’¨p½b¬v–Ðzº^qmžÓ~–¹ab‘MTeKR`Rk…bt’Yj e_E@U2LgOTz\u—wl¥ppšVZq?FfXk‰˜ÃŸÍš¡Âhf‰CWOub‡£\nPn…K_rHea‹«€žÀŠ˜²a{šOf†R^ŠLQ}NUqJVmHa†^z¤thQ=ƒ[8—i5ˆwK}nWloR_jPOWE9D=2D478+G1!k:!tM.€h?xmC|RoƒN·\FÉvAâ…iú’vÿ¡uÿ¨ˆÿ£‹ÿ¦ÿ¶ÿÁÿÛ¦ÿ̬ÿ˥¶¤yŒWZÈQHÿjnÿŽ›ÿÿ´ÿÿÿÿÿÿÿÿÿ¬Àä>c¥A;iOI10g9N?%("& $6$a72T(G9/7V$F/-**?!4!.&UC†m Œ™Dgi|{fo€CZ’sCpJMK3YU*rR4nY2y{EžmC¯ŒOÿ¯nÿþÿÿêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿæÿÿñÎÒÜͽ†ÿÜoÿÿÜÑÿÿÿ±]ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿªÝÿo¯•‰b;ftA42`C1623RM.I\+eR'cPH–oKŠ»^ˆ§qi˜seqWsoAŠsM¤Œ_‹¨_y“qmŠdDjSuE4_dD\rC—ˆS_Žj‘^>xxFu}Mwl< ƒJ”wf|W–‘7“•]‚„[>uJ6I&š@E†_N]'A‡<bY5xŽ<uÆZŽuTK|UJY+\a*pnCc†DvyEN€SNk8S=T9[„EiF‰¥RK°wzl<´sC’¿W¸„Mu>Iw6(]5`;¨•Xd§i\j6†ŽAsh™t>–¶xtY‚MiG—QP¬uP|=Xl9U}D³r1a„tf>Y€@‚h>ÿƒP…ÿÛƒ–ZFŠY<]$aa"œ¶k©Ø ŸÛ£|¬ƒ½ÜšÈâÄÃ뤟ñ²±È†²xˆšaª©o«½’tyh±||ØqŒå°ßóíêðÿÿtÿßT´Q}ƒ*N±hW®]`‰A–—Ov«}€²p\”XšÇmc\tf1d|c|iEto=d~<lrJšiTtNqk<‚C,_e>u§U¶ŽoLp¬C$Ÿp½“x’™i»z³k¹µ‚•د{¾v‚¥gz¢p€•kºÅ`Ÿÿ¥{Ä–:T0l¼}ª¼›¤ž†È ŽiP ŒnÓˆ”¾ßÿŬ뇱g˜PÿµvËùž›z›‡T‹„Fÿÿ‘ÿÿÿÿÿÿÿÿÜèÿ›ßÔ¦W”w9`u1]g/€‰r`}Ep{FŸ‹XeGÖ¬w‘Е €[ȹj‹…W_òĘX»j‡WŽŠXj‹M”…Wþÿ²Ž¶zޏr§Ñ}sM3fW4…‚]±ÕŠÄÒ«Yf7lxD\š<WP8\?@{T=toNˆ`zwCod2I8#W4)<3"80G7)W^5¯¿‚éÿÍÿÿÕÓÿ³ÙÿÚuÓ–…ÝÞ¢¥jÄ»zˆf²Á€ Ô‚§Ò€¢ßz¼ÎªÇuž^~…S’¨cªª_w™M•¢gŽÄsªç}iN¥³‘¨Ël_–=S|.U~3w‹L¢ž‡©Í‹©ä~p…GP|)Fs$In+kŽW—Ð…–Ò{‡ÍVAO/N?2:I%G]"AX0f{jršo^†On†d^‚;OjE\€Dq‡vÃØ›t’GfyL]t4Pr-Mf<Ob-@T(cbLj|I€–Mœ“ahlU„¡cv˜MewO §“¨×‹š¨awŠGu’^€ƒ`”¤„ްpФyÇÙ®ßÚyq>U{9Gm8RnGexYjŒ\T‹N\QU‡DMs:Yr=Rt9IzPv¡i~Ábw}ºë‹•Ïp‚¦IWi8PxBD]Aymw©Ã}·jx§y¿œ›Á{o—P[u@b…Stœ[mYz©io›}¡ãÉÍìºÉñŸ±Ö‡Šµz~®[ew6?S"3M0OpDRg\h”nv‘NPg'1J(8U>Nj_p”ijw67@)<[KQ‡ˆÄ›—Ï¡—¸ˆ‘»o~šWm_ˆ—dm†WjrHetTnbnˆe}u“ kubx¢]ZrQo„M`…Tg}KXlDUz_OVKzZ9lf7q[GacPVcBPV>Hb1[T8S`5T[:_X6gZ9‹V=zaAlXHs\F}_B³pN°SÉŸuä“yô’oï£zÿŸÿ™|ÿ°ÿÈÿä©ÿâ®ÿá¯ÿÖ±ÿЯµ„”uc—]Rý[Jÿi\ÿ«¡‹›ÔLS¢8:`F71`U1shAk…WJc5u`)E>*$ #&("F%V:4J.XI4Gg.@l:JS,3]+%@/<%kH—p%‹¶bw£leˆbtqOY…[[hPwhAZ€?Ua@h`7yz@ùœPÿîxÿÿ¹ÿÿöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿé£ÿÿüÿÿÿÿÿüÿÿÿÿÿÿÿÿÎÞáç¼ï¿®à¹ÄƇÿätÿÿ®ÿÿÿÿÿÿÿÿžÿÿÿÿÿÿÿÿÿTjìzMSIY5S.Qd^0qb46:Fd<)ul8oa6LiBhK,©|3e¦e7E^^/-gg6žl9s ˜gŠ^oƒK[‹MT\FMU@wc,X}ZrNM€WHgEBC,T_*8YDSBi[3of5a‚Ot‰9ªŽKk›nFv=?].MY$e0ZƒCƒs5·bHi^Wg3š†6F€XXS&|\1O‚KIu>W\3j;VhHgs5tŽILkMn?9šoJž¥wÉnŸt™—\S¨“S_<„n;1a=B!fZ-Y€SŽCwRV…j…™ES”XHp7K^,cn/›„9MÍIR.Œ@%”…e™¯]½ÀuŠ·€k¥Wk¡MªZ=ÿ·ns·žKoJCc$L|2 ^$ªÅ•Üêž²ˆ›ðèŠÕ½§£Eº×‘wî¨X|GYb6PtG“c5k°šfS>IN5©‰I¡Á‹·®u›‹osŽ™P_¨c\iD_~K´wG‡Ã ]n×wq~:[o:ct6~JL|J…{4_xPxyA’´ŠT¬ThR*}vCª¡_«l™—mÑzLùreÀ°¡©Š¦{xˆvsqUP<¤Ç€xž’ovVTZ,ŠwKƒŒMu§Z•ì‘tŽB`ÃTkk=]{>PY)ˆ iÍÎxÐû–¶ÝmÒÑm޵j¸¢ZŧW·¯p›ˆHššVÿ¢]ÿüãÿÿÎÿÿÚÈhZi]?Vi4ÒLGÿ”•†PVk7¯dp}J…©goXª³ˆ™¦p–’PƤyQÎʶ¸šg÷ƒj‹•d‘cHÿä˯™vÉ |dd9fb:›p±§mmxBgwDmA‡®fâɸ–¢h³À‘Ù|@M!VH*y`@v•PktF;D!XZ*MN*VO)iT3vq=†…I–Ódëñ¹ÿÿßùÿÚÆþžäû¸Íò—”¹v\•Rš¡g¥µwÂö¨¸þ“¶ç ¢ÐŠ¾Â œµhz¹Rk†=K[:shH†h—Ëy¡±w°²xz’PtX|œeU`8OK#V_3V[?sP©¬f¦´sxªHež?l§8Ki,^–G‰Ægz^šÆr;9?:)DP+:L$Q[AWzB;],M^AKsL_…JWzH`€W“³’Š“YfœR‚šN^q=Vh-ET/@i@[‚E\„^SŠHr–Xx‘WVo@oUx€IWw;nyz€¸„¶coRm“h_¤Xrž{¥Úƒo±Ze›VrµPjžKZ•GU„KIMh„_š±yʆŒÂ…š¿r~¦VaŒ[v¯q„´t‡Çv‚§f‰¥l´Ã¢´÷mLc<z~f…Ãux =6VCZdiž«qt¦tš½©ªÊŠYZ‚Fc”Zj‘JPhT¶z¥ç±ÅóÁÆã®ÅÞ’ª´kh„i˜¸^c„;EM ,N-Vo;dŽcr©pv£d_™IJ…EF}?GnARiGXp:6[BW…e¶‡£À†’±xœq~‘_ns<SjJq‡Xy˜]x—Xl‚QluGd}L_ˆw†¨v}šuŸ“Q`bDQ^@QrQ\vL\s@NkETmIYuAjw@auDVeCJe;dj9j=uQr†XvrXo~JkƒRuoNkjDjd@i[8|k?Ž‚D¢œ[žªp›•…Údiì{Yâuÿ•zÿ }ÿ·‡ÿËœÿѦÿõ°ÿÿÌÿìÑÿËÂÿ³—ý¤˜Û•|‘smkggPH€PA´UA n?tKŒ‡I›–`›©p“°€a³*‹…#@?0+4;6B%U9ICXV9cw3U?ZzCGu:3N:->)5-^4‘\#yžYskVŽdfeMeu<_jNgI„rEz|XÀ‡ZÿÖlÿÿµÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÞÿÿµÂÿï©ÿÿÑÿÿæÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåÿÿÿí¨ÿø†ÿÿÿÿÿÿÿÿÿŠÿÿn~ÿ†Gÿÿ{ÿÿóêè´ÿïÿÿÚÿÿÿÿÿÿÿÿ˜ÿÿÿ`ž?ZqJP/gb-=ŠG^B2Šc.jT1¥jC—¢d•’Ux’eorWNY1€g+UˆD^^-R{4WZBÿ^2²ÿöf‘‡r‚<StNRu7zn:rˆ?qŠds“O`rE_~;RK2ld-Op8Df1F9)_f&Uo:yy0jžOhy@H\A@R.EQ!šX'Y„Tt~@UmRH]A†p6c{MCc<JV!Œd.noAˆ•X`•TCk?A]'Ue$]x>nzGNuSEp7OJ'^i2x†DkkUe}U`jXMtDRZ:ZlC]gC[{G`z;~pDz‰_ÁÚth¿–S›K>2Nf%dj(t¤P‚˜Vt¬{pAyC’\¥Ò‹·Þ““ál‘j¨‘L¥×T¥hEd)?V!Rf!k`%m‡Dr>x€Zj˜q¦„8¨wıužì¶ˆ•cU|QFR/E\/m~<?mA†:,„¬yЧxk›ke„GVs'Z}7j©_vi2e_'mT2|l)ŸD°ªee·OR#s<&‘ƒ_ZŽJq—J‡…J[‚LW=Àwr…Ü…ŽJ¨·cžñ€¸uFÓ f·¨q–ZV´Š’‚ZP’wp°›„eeZt\OJŒJVz2…nNgx1yW‰‹[Ÿ¢dªÿ±·–AXuQWZ3VX;Ub,ŠÀVÖðˆÅ凾Þp¢—XŠf6†J|žP—˜PÏ“n†§O©‹cj»gvHKj,kr>‡Ç€Í††QªTVe,a‰J“pWe¢\}‡EiÆ]SZ.¾vN”™bDzs»”}™kÿ¶¸¸ g”kLÜŽˆ_w¤g²£gÊÍ›vÌ`7Y"€YB“³m”…S¶itƒL\H4»ÇŸdC0«±o’uRl–M’dIµŒgɳ{‡QŽNÏ^°duTŠœUšUÜÇ’’Âb‡–iÿôÄÒí²¼Ñ‘ÏÜ—¨¡l·Œ`†U«k]„ Q¥§‚›¦b³¥£_–žsÛ⨵±x³Œ~ÆÔŒŠ•Weš[®±|‹¥kŒ¶tj½QG_2Yr7SwA}š\P›5?m/w¤_“Æl~Î]v›[k‹F\|0[~;j•Sœ×ròrpšEŠ”xÅã›{·EKq;E\7VcbxŒ^XPŸÔnž½be˜X‹ÎjlŸx‹°lt®it§gv²`d¨\bŽFOeEa|\n”_|°v…£s‰¥a—£jx”Iis<NpB]ŽJu™|šÌx±³de{Js{ƒÄs~²wšÌ›“´wˆ±lºoÁq¥áÃùÚÿ‡‡Un†©pwºux¨ez OdqHi‚W”t~`‚£lµgm§•ßÿ¢w¹N}¥h{™i€U\Qc {™Ñ|¯i€—z‡cjzM[ˆVr¢h‰¸mm©j}¿Ž¡Ù²ºè±Ââ…Œ¸jnŠcz–an—[m‹KCrRZ“[Jx>[rh¹‚Ž¿‰Á‰‰µsz¤Mh{;PdIhzZf–[p™Sm•eƒ¡Xf~JOjEP^29Q$5R9CbH_ˆa™³Sbm0=R3Fj[h–„~¥nk“``}EeqFWnBSyKNrI_€RZ}LlpR}ŒNmWHšeKfL^e2qˆA{”\r›kZjim[e{LlpYtgLokHlcKshByƒIŽZÉ—c”™liƒs•RYÒY.î‡RõŽuÿšsÿšÿ´‡ÿ¹“ÿñ¢ÿÿËÿÿÔÿÒÌÿ¹”ÿœÿ·“ÿãøª’ÿ}þ›sÿš}ÿnÿŠn¸¤t»š|͵lÇÓ‹Ö°h®žApKYFVa.ng6pg6S`>vc>v=j‰Zg€L5zECH4?e$2d/J7,`;l^+zLS§[fiVn~;dyPhvX›wIÿ°Tÿÿ•ÿÿæÿÿÿÿÿÿÿÿÿÿüøÿÿýÿÿÿÿÿÿÿÿÿÿèÚÿâ€ÿâ‚ÿê•ÿÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÕ¾ìËÇÿà–ÿÝÿÿÍÿÿ¼ÿÿÿîÿÿ…ÊÌ«’]ÿÉKÿÙƒÿÿËÏá½àͨÿ›cÿÿŽÿÿÿøÒÿWy™bcJztATšV¬w:f´jqcKo‚G³e8ɧ]œœ~®»{€®:y\[K%kv.Ry:WZ/r^6~™QÿbHÿ…cŒ—_t1’†Sa½bˆQjžZy„fY}<slEd|IPd7ef1rb.frFRs/bj6QnDo{7JjMeP+Ud85M5UM"gx.s?@ŒWnT's’PwŽZ\ULST,yR3HϪ\Avp~`3@_6Rj%Cp3eN)t”UgX[ŒTfw?‡ W?hAe/<`5Wb(uŠFw£eu¦ff’O^€NcV<~wAi„]Ç–YwŸ’£©`G„o<d&A]•t r©}ZXNjv7`§F‘l;¦qŸÃŠ³ÉŒjË›¶Æp˜Üq·iCs2I[$gk+c„Ls}QIF<8W#7L[S!Mi5¨{<š¶Š^«vl‚CVl;‘›>°ëšt«qt SqƒSd†YVuIH‰:RS"T„HxD/UyGDL+ST'`y4ކ=̉ixE:c7[]-uq@nK—bRæ–[AaK›}L€`Ø…uÁ·qÿÖŽÿÿÏÿÿßÿÿîñÿ½Ÿ¤`GŒUK©—yÄS»¿}§×ŠžÂ›–´Šƒ³{T¨b—¢T€ÔenK¸¯|ÞrtFj•VmŒNŸªUòÙ¤ÝoÒcak9jk1|œ`˜‹Shl=‡‘BvœD£¡\«½u®€UÞŸu…}MÇ’p˜pQƒŒJ•bm˜Zˆ’T¥_K¬V—Ñrot@mF5–Ršwcλ„‚ăjn@¸„z~’S}l@ÿ…çÛl™S¤nR¦zÏy^‡Ag½KwO‰«dÀ©…¾p“ h{¿ai•<žÂ‰œÊužže©}c¶až–W´¢mryH³¼Š˜´j às¡Îjx“IÞý–Àÿ”‹±lв’vŸhÃø¼Æí³ªØ—ÁË«´k¡iTš³W©r\„SƒW²qŸ‡géwpÖ€cÎwo½zj¿°s‘iJ{c?a‡A|ˆ]š³u¤np›I\ˆQŒ‰UŒÁf†¾}Ïl‡¹|‡ÕnžµsÇi|¸V~¯Uxª\†žn†ÃfP‘<ƒc‹žO”·w½TV‰@Lf@WbI`uQiaH]V5HZD–°wÇ|•ªv•½{t“^‰³„‚±xm‰R|…TIu8d~h¼²z€\} \h—a~¡bŸOo¶fŠÀcެ¢Ì{ŽžPci8\}Qkna…™t’µk{±r£Ðxˆ²t·Û‹¥Ö~£Égk‡Tsžq’Һ߮®ávtªPl—JlŽAOtFc„_‰°ƒ†¿‚—º’¿ìÒÿÿ£ž½Q]CWaY€›{‡›os}NFT.<U8>kB`‹ev¹nsªu™Äš»à‹ŒÐ¡µéŸªë›Ì挥¸r›jšWx—i}«tw´€}¹xs“IO_]l‹{x ‡¨}„”oq˜]v‰GSwGLmScxQkŽFd…;N_/@d=M{KINP‹SU‹IM~LaYnv2GM'?V2@a[\“|y¨w~œgs‹]–^s…Wi‡X^‚P^uEUoBpkO„ˆU^—gB†ddYTzt2x”Zm‚fŒ€W†h^vU`|No~O|P~ƒG‚rQzTt™c†dŸ{T‰x[kwz€RU¬P1µnBÔt_ç‡gÿ•nÿ sÿ¹ÿÔ—ÿï´ÿÕÈÿ·³ÿ¶˜ÿ¸¨ÿ´¢ÿ˰ÿÑÄÿ¿ŸÿŪõ±¨ø”Œÿ‡|ÿ‚pÿ”xú·Šò×’¤ßµ}´°[‰tXmWVbDbR7‰d<XwEncNWxCFZI<T9Lc3tq9Ž›8d·];|f:H.P9%ƒM*RƒLyiWs•D‹ˆeïŸdÿÔ…ÿÿ¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ÿÿïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÿíÿÿôÿÿäÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòÿÓÓ¼á꥿ȇÿ±võÿÿÔâÿÐ’ÿÿÛ ÿÿÿ°„ÿî`ÍëÑþvæ½dzߌïaÿ°VqÎØx¡jËOcmX]o?T^;ak5mxQ†X:t€QŒ…T…yP‹lJ™ŠKV–}D{Rjn4\‡CYy?kS4`V;gP6 kTɇD_«¸qW. ±GŒžo„¥bu•nWsJMlC}f1¦“jQ¥nYg;`w1Xv?jq7g†C]€Tk{>pkPkv<jcCF[?tc(†oAÑ>šhˆ f±‡WK…fSI/Vm5íc:›Í”mŠd?bI7=)1399OF Vo:oq7W‹P{tCTuca}>XrSCyIKl4]j.jqA¢]œ·–‹Ý‘j†^i•C~”:h§`¼[Ê€\¡ÿ´o—iJºU@n&“f}Á{QfNwŽ4Š«RsÝlS‰G~~I™¡U|ÎyªŸ\^焇AK–YH]$ci1~ÈxIZ]z-%G*-:QV#š•OƒÁ†{؃‡‰GnµT„–Kž»lq¯_£šShÁ_ƒBNy=CL1@@yx?Xz[Qs9=[(OZ$iŠKj|Dœš]“co’OZ…Nt‘Q}‚HŠcfi:^u;Ka/fCv„Z²kâĈÿÔŒÿÿÅòÿºÓÿ oŠnoB‰¤gpk\¯g]¡¾ƒÓ´‚GM¿Ð³õ®±Û h²|Å“X¤ÿ¿R²^o™U]I{…Eg~;–¥T¹Ú²‰]·UZ„AH\,cj9Pa4•fL–VŒ¢s¨¡eÒË ¥±s‡´cv®M–£a—‰Ww|HtŠD{~Hy—EÝ¡‰§±lÐÐwž[œzY§Äp…wN˜‚iš‹p~šfŽjKœpSi}Cy™NzJû¦ƒ|‡[YI1º|`Øþ¶£”mŒeUµ{cˆœmœv^¯ˆoॗòÙ•ž´}¾Å¨ Ê…¯…V´™a“K£ªdáÉžÃlp·]‘œR£›klY:ŒySǼ€ÙÞ“×òšk R|‹c’¤kâá²›©{wˆOž˜`†œOjG–hL¬–iºèŒîÄ•¡¦j~†J”uMãªpÿ§v›ŠRZc0ez5NN)dƒQ‰|b²c¥¹{ŒÇn¦è‚È߃¨¯‚¢¦xªâ™§Å‚ÂÞ’†¾`‰°by¯hp‘fužn›™NW~8t–Xh–O˜¸z Z‹ŽN_‡M\€GirC{yIyz?YzV‹³u“Å~‘Ãzy ^|“l…˜__nJmfOxVfŠIn…_ª³m…§Vp™Sl›Vf…Nn|[rQ∕±hqX»[\ƒ=UyFV|Pg¡t„Îp¯Ü’懈Æiv¢n’¸rŒf{¡a~‚e‡¥•¨Ò¤«½mzŠNi”Kx¥F\†O^uHmutŽ·fw©lŒ£ôÿ»ŽÄTn’\u±]ošk|œ[dp@QwBN‡[o¯tÄ‚Ïxzyˆ¹Œ²Õ¬Ï£¨µ~³·z²v¨„¢ÈyŒ¨c¨wƒ½Ä„޾†¯de˜cq’qz§qŽºcušYeyH_sK`|?XeOY“tÕmbŠ+:Y8R}`l—k{‹iª©Ì}ƒ±f{¡Tau.24'=I;N|ax›qu—ik‘_p„cv–f|dn‚Xd|O_{LX}Gnd<]}RA‚YI]NbH0tn6i†[\Žq_ylmsLn‹JnƒW`ƒZewX}d@xm<wkJ‚…a”|`’zQ‘ZecYZ U6§o>»€]Ì‚Yêlÿ–gÿ¤yÿË‘ÿÓ¨ô¿ªÿªÿ±”ÿ¹ ÿ¡ÿœÿƶÿ²ÿÕ©ÿßÉﺯɤ–é…|ÿ„tÿ‘y÷´ˆŸÇœVŸ¢XgkXU;Di:L\6{i7UyC\YC]f-^SA|[3|E‰¢aŒ¢^w¥fVgT\LXV:fL.Yn3™g=صQÿðœÿÿ·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöÿÿïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÿÿݸÿÿÿÿó®ìγ׎ÿÁhÿÃ…ÿâÿÿðÓïÿÿÄx÷»vѱ›«ª†ÿ›Yàÿƒ…´o’O… Y¥¬U`ŸTu|cNŸLOkI‚R.aˆHpmKnyLgzOw|;s—YƒSUˆpadEwrCb‹Ytl2hƒXŸS’F„‰E¬x@gŸz¤:Ïm˜qh¤p^V‚SR‘]Žr?jzeyxRb€@`\<{pEnO‡‡KW}VEz:WT1ei4M[BFd0Nd,dq4oŠDtNµh‹±a£ºn³Äz¬˜²fƒ–zpuRgcJyV6T3/4 LI^d0mh:X†VRyI]c?MƒKJk5Cd7xn.©µSt€YI—\e…8…¥S¡ndžqƒ‹Bd—aq‘L•~Il—ië¯Y¶ J§c^d~ŸBP¥pv|9}šNœ§UÎÀq¼ÓõÑʡؼ²Â‘}Ô©k‚R[…DCq7xr%F¿hh‹/3x@(D0CCS sv5‚˜V{LŒÁbf™]|–D¡Ë^zÓ~ÍœT[¤…<i9,C!>Hes;qJO_:[q4~`1S‚;Hq/c~A‰q8mHˆhv®_‚ Qn†Nƒ¨ul«NTŒ7vŒ>r–]ŒœfÁiÅ™\ÿµ†öõžÿÿÛüßÂòê¡Ø¤¨›gªÈ©reA‹}V¶·pL©gŠN-±ŸšÉ‹ŸWk/—˜F›`°dV’LCK#åTV¾ÿ¦¤Òy”Da5‡¡MHd,^P%IW6g;-w¢sŽ™aIW'iQ5£…]¥oEÓׇéÿÌ«ü²×®m ŠOyŠI{‘H‚G«Á‰ŒV–ck•E²¸m’zT¸ˆx‘gYŒÅš€gH¶`sŠH·fÿÿÒÔÞ“ôÿ»•Ýey£K²ŠqæÿÇÄЋ‰ÉToƒG• nÄÆ„¯Ï‘³¥xœÜq~Ñhˆ¶^†¢Q—€aá—wz„U„«ipŠQw´^¶Õ“€Ñ\}¾gR‰5Br&9o"dY8‘j—Ë€y›N’’f‰¬ezSjm@—] 䄵ê‰Åì£Çw°Ìƒ±œn¨ºh Vž¢]ªu™•b¬¥j“Çg¥’`t¦IT_/FS'frP¥à}©â„±Ôz¡Ôu—¾uŠén†Õf©Éž©Ìt…§m«Èq‡ªd˜¥ƒƒÂ‚¿žU[“;Z–Ki¡Pi«M‰³t°ºŠ£ªu·–pn€Nv‚\sŸ_qŸKb€G„œj˜µƒ‹¦]€{Q‘®]}¢nÿå ¥¡V”ƒKsƒDk„M}tlÔ·tx¬Us›Td™QcQx¦sްzz¶„¡Ò’®Ð}Œ°YVˆN‘¹‘Ïã¥ÃÕ’®Û¡Èì §Ç„¯rv¤[RqBv¢Rdš]Œ¹“©ÈppF]–EjžVm To—^u—DPzcš½eimK~Ÿ~»Æ·ÒÿŒ›Ä¥¼myœ]–‚M_`€¼}‰¶¦Íˆ¡Ç—Ìw€·u‡°Š¶‚‹«c{ŽJa|M•†Y‡£pŒ¥`n‡Ph~ht¡x}ªˆ‚ÄŽ‰À~x›k_Œqv¡pÄm|°KWw0FaAUtRS‰€–п·î‰11F5D_Nbv@BT>Mga}”€›¶‡˜Ì‚Š”H6O/9WG]dQ[kUdxZh_jˆjj¡uw§kˆ†RUzQ^P_{^Hf-J_FH[;8Y3MB%dZ'`lETrVeqS€wCh˜P`ƒcEsX:YN^F2gMyT+€j6¤iR¢zQ†_n{c…cV¥l?µsI³`º|oµoàuaÿˆeÿ¤yÿÂ’Þ·£ÿ¢ˆÿ£…ÿ¿›ÿº«ÿ¶§ÿ´¡ÿµ¥ÿÅ¢ÿöÉÿêÐÿÖÂÿÈ´ú· ÿ”ÿ’t碃zšŒErnJE@gC,}y2\“XDbQB?/BJ%KJ1}N,wi5v‚TzŒRd›Og„YUkNOQ@r]7¢FÿÁcÿÿ›ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôÿÿÖÿÿëÿÿàÿÿÿýɽ©Û¦ÏÜÿ˜iÝÒ§Š zþ‰o™O®…‚ÓP€sÿ‡Ud˜P†x~n¡CbrOWlI?fGFC'iK'lUW]HYa>dbG{lD ŽS…ŒYz¦f££jk¨j‹ŒyižONs_‚`2™P}”]f^axCs{5˜‰A¿¸h¦¤wk‡[iqRsu>‰O[ydEg:@a7Yi,px/œ@×ZxŽi€‡a^rZ„FjL]eATF;Gl6Wh,Ya*tl0¶Î\j«gmQHqM§i4¾¡lœ¼}Ê¢s•—nUteDj=Dl7Gf4Wr0@X:¥`,W ttj<ˆd_‡hFnDy{4HpB™V-˜ˆ^¶Ô‡Ï¦a§z~“M€²bssHtd=tš\o£R[QŽA^ì¨CT6Cc$„n$NƒSyr(f¬]v”;…žHŽ©fnU~ˆ_‚@›šIˆlYIiZVi2–ÈQÈoH¦X:`-9]'G^$t:nž`WŠB‹©En°c«M©´XÛà€{Ö“œ×pl–Y;e6Z`/g?wYDoBTV*P]0Nv.Ok/½_c¬cN›OVe,ˆq>u“<³no¥x|›\xd>Si9c1–—WÈê€ ×Œ§ä®¹_ž‘g§y¤£ˆÒ¾”›vЯ€©o‰O§›aÓÁzsÎŽ6j+0;£h3*A$u0™¥mT”=\ŠG+Q"q:›cD~©r`t5¬EdpAqq:ss;T9%X;,qmR–gFOL)gqCVy<S[,¼ŸrÞá¹ÈΣ›×žcœmŒ¹^ŽƒL“˜Xw˜SqzF…yM¶{›ƒ_ŒgNxfVÌokܨ”Ý©€¿‡c¡˜o¦tbÿÎ Ý»Óïßq‰‚W¥¯xš–e“ÚjëרÐÿ¨šÎ~ÅÔžºåŽ’ËlkŒ:¥^|_Ǹ€–Q¢˜j–°e¨Ì{uŽ^£¾r‘«^‘§kdŠ>†oM|ÇChbA|”QµaUaK¢ˆwhn8|“MoNÍÒ™”tÀÚˆ¶Ç“Áæ²ÍÿÜÍÿÆÕÿͨÁ|»ÕèÙ³ßÿ¤¾ÆŠ´ð‹¤Àc¿¼{^œB]d<¶cq¾MvLƒÇXn—Oµ¨—´¾ˆÄµtŠ´}§aŸY›–^ª”\’¬ ¥Âlu¡Rx¶xyœTt[}—q‹Ïl’“vo˜FWY7X]@icL}ˆp²µXj‹Cj‹R‚™lžj}‘Sr{[œ¯‰îþ™¶²hw QŠ‹U•d‰T†‰^|—TnId‰\w—w‡¶}½…†ºy‘°kŠ«x˜ gf†I_qRxtXš¹ƒ¶á¢¯ã~x™R_{Xp”GAW4bjI‚ `‰]}“Z€¯^v¡WŒºw”Ä`u¢TqD]†]›ÅtdAn‰Ik††âû¡¤Âr~™UjŽ^Ø€}Ày~®n„•h…¯i‡ªal]r¬x‡´tš·zsŸ@Qh3UtE}zNz“\wQk…O[€\piq©…¸„‚«nh’adŒb]z[ui‚²KZu-JhQtšs„´ˆŠÄ™œ°tm>Ce-;VDOd86O.:V@Wwn‰©¢·Ðœ®Åu|žMSl?O`AUpB?_BQeZo•}’ÅŒÂ~…´wt¢^n•Ned<h54Z@>D+=A$EI$HK-OY5L_7b[Cys=c`SslE`R,M?CC/SC!fR,|N)¢a>gM•yZ~€_“o]§sNÌxPÍŠ^º‘s¨¸}kØycÿ†dù‘o׮姓ÿ•‹ÿ¤‚ÿÕ¨ÿسÿÔÁÿ½·ÿ´¨ÿÐÿ×Ãÿͬÿæ¼ÿÚÂö¯±ÿ‡ÿ†wÿŠs·”u_€p€aIk„@Ld@QE8T'FP*Qd(^t?fu<Wf;xa?v…>–…KZ´dŽkdÿŸQÿÿˆÿÿÐÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝÿÿîÿÿÿÿÿÿÿÿÿÿÜÞÿ髳÷¬º¼… w~uFš„E]A_]1S^BH^3aa@P€<y`7TKTd?Jn2eW.;Z</C K9rN!b¤[]€Q>LJF?1dX*iiBgvK’yS’•Sp“}RgS]a9\lCKbG<L;RS3?v=Hl8…p-W¥WB|RZ?6fN2mu2žwE_oQgpDVpC]d5Œn.x‹VލN’¥k‡“cjaeï‰GÈ‹x_ˆcJa1QV%Go0D\!ßp+gâ˜^g]€qE‰iGkšeÿ¸NÆÿð¶ÿźÿµ¤ò¯†Í“v¯emPS´QLn>Id1Ca0`Y+‘}DC¶Œ@Y98R&FBW\*]o5z};e•]PeMc9U~a_|E[u3šv7Љqdˆ\}y?·¦rWÑ©M™Gnw,WtHVn4b‰6a…1m=fÂV`FV|>Xt2V‰1gh.w‡@l±\’ÌqZ£iPX(>c0AZ*du*“QZ¦g|‹-{ÁWxIh¬aƒŒA›«U ©i¡Àz‚´fj¦`aŽHfŽGkœN>xIO`,V{/VŒ;½±J¢À~v«]?›<dP)Yw9‹šN´½}¥ßŠªÀa·À|–ÿ„a›MùÃt±ß…Ìÿ—·ÿ§ÂÓnžÃ}ª¾’©¾ˆ”³Ž™×‚o—•QtVE¼MMŸ¡}ct`^^@wGj\,S«Zjt5SˆIQf)Sw<xeAFH&„mFZ{7U~4{q:¼VQÕ¿“žÁx|jF½{[‹c@›YŠl@n`1°±nŽsPɲŽÚç¹¼øÂÄð¼€Ú——Mh—@’L’œiĶqnp9ot8Ävi˜¨z‹qS¬pa£—sÿ¥—÷ª†xxK{uH…RAÿÿûÑ®}ªvf®¢„jƒLrlEžmM¶¢„š€dÛ}u’¬nÇÒ•sSqŠDŒ—`ŠÍqž£j§•T~ˆC¦€U—¦`ˆJ¨xhš¥oqžJnuCmq@›Àj‚¢Sa†6ЧRt‘BÿЫßÿ«gzC|±Oq‚HzvH“¤`Ñ瑸͋ªÊ„ÝÿÞÀÿ¼¾ýÆã‘¯Øç‹Æ×‡·å‰¶é{®cž”sºÅ~ºVag=yuAq{R¾Î|rªQž¨v|§Q hˆ«TsW_ˆ®hy™IŠžVp•TŒ—ˆ×‰ŒH`s;uy]œj¿_owDdl?ic@}VFŠug»±do¡Y’“gˆªj¯¤`¨‘Q§}^}’f³}£°n•UwŒHw–RŒ€FƒUlœKg‰;k~\–§jˆ±s—Ó“ŠÅ“±kˆ¨k¦_Ž—DLz:V~BdŽVžÄò„~«AJi4[nJIu,0I&8D-<A$>YOg€¶q¢d…—dsŠN\€@_†d˜Ì‹®9>S.R|h¨È“³»YjŠL€›‰äȈªÖeq–FSY±^o¥Td˜Ql’md_wˆfˆ–PVJU~ByySrŸVZ‚Ux™]lœJ]mPrzaekqžbn©YWm>QhJSzVjŠO\€?NzLq’oƒx‹³ww¢cf˜LZe0<T/AX0<R-8V6Eb]z’«Â§¦Ë~y§YkˆIQwSjŒFRrAWsPb‚auv’°†š¸_]z:MlT;U-0U1-@+C7CD8W,AI.QY,o]/k…:[€V_YcWOEXW:Cm@NU=HT/oJ/e-zoHfK”‰P›wW»wSÖvSãaÛžtà ‚´œ€°Žt²zmÏw^ëˆgý¤|ÿ»˜ÿ¬™ÿĘÿÚ£ÿÙÊÿ½·ÿÁ²ÿ±ªÿ¨ÿ®¤ÿšÿ²Ÿï°¤á •ÿ„yÿ‚jÿ—sÿ—z°œpY’kGt^kf8e–=o‹I|z:lœfl‘dx„SZg;jgA¶u3ÜÄbÿß«ÿÿ¤ÿÿöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÏäÿëÄÿÿËÿÿþÿÿÿÿÿÿÿÿÿÿâÛÿñ«üÿÝ“ýð³€a‡SaxCgz:@n<6Q/8T&[W$us9RH_tB9rF@H/OQ$Wl/:e5,V.1Cb;„o5L®wKiJ^Y0gj5y[5~S=¥yEÔd޹[}^¦q/n‘QcrM\q;^f=p„:l‘Gƒ™<‡‘bŸT¬`k‡gZ‘HTr?bhANg>?j<dO"}i0d~?oqH€Y°|Shˆ__~<l…6‹—=j£Wf«LbM˜FÔÉt[ÓÀPS9Ud)µ£PõÿŸÿÿÔÔâãÕ•£˜hQR‹aCnORT2g?<H<Pdz.Xj>xX8Ž–a3±EF(;e-wA"ŠœHTw]Fb4Z^,Oo:I^1O^&V‹1Rv9U4e–Rv…;‡šWÊœgZß[qAQ{;WY/`pHY=jŠ4€Ž8x¬euaY‘L_…0Wp4”¨Jcš\}|>D—W^s-_‹DiJy©Qm‡Igž=Š·Dc„U‚¤SIdA©œ?Øø•€¶ng”GGS/†g*œlp^6ƒJ6a#Xbb‚4oGƒ¡f°P‡xFv¦JP=UW'RšJÌ•P»ÛŒâùŽÿÿÙÿÿìåÿßÿö”´ø™Úÿ½ÊÆ…ÈÖœ¼ÿ°¢è¨ÀÂÐÿŒƒ¹{i›^uT„{H–<¢†yŸr¶¸ksšlraGW•Phb+Kx;R‚BPp3se;ĆXdo>ƒ>e¶[\T%eN5¨žqÆÐŠ¢É|§§x‘‚Qâ¦vxhFÿ餮oWÿ£wªÎ’ÓÛâöÐÓìÅÁõ¹ÅÔŠàšs’Dnw=¸¥ZoƒQpP–ƒZ¬’~ˆtb…xX|hTÿþâÛ‘ÿÊ›’TÁ§|³¡…¥£m…]TnwHkŽG{_L€‚UŠ€V¡S>í·‰ÔÑ÷¿ƒ£¹cmG•Æn€£MwŒDv‹HØ«}†«T ‘_}zR€tUZm=ymGs•NX‡3k‚FLX+lbCy‰NouGÃÀŽóè’—Ô‚£c| Zn„G†¾pÒð‘—µ\€ÂoÑ÷Ÿ·v}´°v“]ºm‚¯Z޲T ¬N„U¯¦Vv~J‚UqSd•>_t2ciFš•ÄiÖŸr¹²X—–U¯§lºg€£Z†Az”Gk†DS<*OiP•Wgl>c„@\}EŒfš»o‚œWŸ“Vyi:yoFgmLÃzf||N“{cŠŸY†”T•RmuNnwM †Z“£g‹‡@qxQˆ•Yt‹Kn†KsšEc’F‚¤`}§Y™¶m«µ{ºß™¸Ý‰²Õom¤[š£[гUsžTuœQk¢m‡[nk5L~67S0^rEM‚1+@%6X7[ˆb‚®s‡·tš_l…[}fx™iƒÄ…§Ë–“ÀMQw@bƒaŒ«q¨Id€Mt˜a‰£[n‹Oj†Y™°h’hxª]lœ\oš^|Ÿ]e„Qu«zÏx®^k‘_u°^‡Ósßiv¬EMZ9@^Ol˜což]l™QMuCLtCTuP`„QkŒIp}CWdOf~jx”hl’bj“OOj;N|C9d=Bi/:U0>_Qt|{–¸å»lx“XoI\mCTnQpixŒOEdHH~aYƒj}Qds0Kb@2K+/=*->%4;ABGS&<Q0GU0LH#MJ,LJ;VK9jH4b\8KxDE^FDa9g\A…s8`Gi_H|d>žlJÄpOätRÿ‘Zì®zç¦ˆíª„µ±Š±‰ŽxhÎdÿ‹fÿœzÿ®—ÿ¬ŒÿœŽÿ“ÿŽÿ¨“ÿ»³ÿ´µÿ¯¨ÿ¥¨ÿ£Žÿ ԗ‰‘ÿzwÿ‚sÿ§zÿ£yΚ~—˜€¤«[‡Ámo›i–{J«ama™firNÇEÿÆeÿÿ£ÿÿçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÎÿÿÓÿÿÿÿÿÿÿÿÿÿÿÿÿÿòÿØ”ÿîÆàÅ‹·×¶k¹ŠW|Ver1N‚>Tu6Zq3Zj2do;x„GnžQ`~N<yN6\0u\+nœ>h‘JUŠEa‡?TFvgG}‰Bk·{gQmV8qg;ZoC˜c/Ó†Wç–’h|‘C†{Y›•I¡¢qto`•_‚vQœÀ]̲f¥V›oˆN9t\2Wv>@rAPV,3R&h? ˆk8qqEÓ’e‰}waqPaz@m;º½gŠ×§ a«°z¤wŸ¹q³±|oÒ˜y¸v±±bÄ匥® ®d“†e–Znn<o†J{‰Dt®dPkUv‹Bb¸a`k,Dk<AS*.1(¡S‚ÃŽS®f§Eij?U}DRW/Dd<Qg+>h/XS'\eBTŸNGp5žp.\Sdx>q“L„˜K§Ze¹|\•MP}4U‚C^‹G[˜DX8kBгrzºaG¤aGdhu)IŒ<xS!>€^€5'U}oXB.Yx/p ;_œGWsIuK7FoaD>,se+éªN™‡ƒ‘Ä|ŠÎ‚“µs=oLaJn£]M—AWk,<U%h~F[”I–ðpáu`¥I8w*3@_}:´™PÝljÅÒƒÈýÒ¾gïÿ ºË_»h¤“M†¶TϺi½ÿ½Åñ™Èí®Üܯì¦wØs„sJœ½nzÓo¥¤^ÚÓ‡ƒ—f€dK¥˜g€Yl™PÍOk£Xvs>¸‰R˜dw„?ß¾Œ™¼t‘³ehW6u~KŽgµ”sªª{ÿÿÑÌÿÍ®¤aýyl´zbŸ]ÃÖ’Òü·ÜýÍËÿÊÓû̸븺ƛªÍxÒÂzû¾Ÿw™P|ƒJ¼•aeNËx`™ˆj…mSç´”¬±…™Ü‘yÚl¾ÇŽ™«l„¢ky~J¥nN¡¿€|‘Wކ\¹¼€««bÿ…ÿ¤“x³YJ^¦Aвd…¹cœÍ~Ár¹j”‹ayžV}oFs[@fpC[>ke<qŠMSz9Cb1jQEƒ^RutXµº†yšOû…uUÁHqR”Çr²°{?˜TÓì¡•§dPA2~pO‹œt½fžW»_wE˜UÒÉo²ª^}Ž@‹GfYEUj/ed8…€dy‘B‰—Jƒ¢G‹£VÅj´²]e„7`‚<Xj@u†Oœ¯fSi>RS9‘—Qš“[ƒ~Pîy‰Ó»ƒÿì£ÎÅ|sJSd3\iCoYªÏo‹ÁY‰—d“´gˆ¤b®i‹ŠLŒQŠSp|<ru<|•`¡œLiFtO{\‰™TŽ™Oa‰P•®„¶Æ“é¨Å§al•Z›½k‹Áv}¶a}§`Z‹GF‘UiiS¤dS£poUJ‘lX±…xÏ’‘Ò“žËÆvhŒSgzPp•s‘¯s»Ž¡Æ]h‚PcR“`rŠDMn=_•`z¤Wi‘Tj‘U`‘Ji†c}`{¶g‚±qxapŸt›Ö“›Ò‹‘ºv‰³^y¢`„«vŸÚ{ežSnXf›bh’gy¦mz«ljŸdg›NaŽJXp=Qc:WY7Gg;NmZgWX…fr¡^q•euig[X:>V2AR9RYSf‚€¨Ê‹§Æq…œEak:ST8TYOgrWo…YcŠasžQ\nDO`?HR1GY:,E=59$:>NE\Q)8W52A5.H3 ?!/#3%/3"=%'I0!EL1jF3bq6lxTxQ]sPXjIl;ur@’iEËrKÿšOÿ™xÿ†í³‹Ðµ·¢–¼Ž¦œx¸}pêt^ïkí›áž‡à•‡ÿ‹{ÿÿ¬•ÿ¶¯ÿ¹¦ÿ°¬ÿ´¡ïţ䧛ˡ•Ö‘–ÿ‰€ÿ”ÿ«’ÿ¸™ÿ²Œ¯§†Y”}m]b`>{wM‚—`µ¡aÿ¾zÿÿÿÿÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóÿõŽ×쩞xŽ¡d¥®f}j[o>wMO@3Vg(Ro1Mr/A_,OI,gb3RŽB\]BTw=s;K€JMVB;[5:A(Y6 sZ2X’W†‰Tr–Novtr=Ql:M6sAÿY>}ê“£x}’I¨oEó—`{˜}~fW°xD˜¢x±›kΧ]à••‰¾|Urh‰O,Š€?hˆFAoE\Y(h`,jb9Ÿ‰T·œtºinŠXqƒS‰rFyiWb¿\~oWq;X‰XiQ:V£P˜l;¼«j»Ô…Ç™EhvoQ%Ò†HQdLVJ0}F$}•`]\|R9ƒ HD‘]TO'Fk->V3"3!y*º¹aX£ ;eG_= [wHQ†DKr:QxCSu:MsDMd:eoBY}:V^2Z‚KI[9XV1„S0s²nWuY™W/[yQiu/Om<Yo(q8HjKR‚5dX#au'BX4@i&ŽDJ•Z; 1-Rq&?c3yf-6dCPZ(@VG75q`3t[,Wm<Zr9‰€A~šZv•Oy‚DyžV‘IŸæ M®hPf+š¨R°É~‡Ú„ŠPVŽ8dƒ/b]9ŽmJc§tlU?hWDÃ_>›š{‹´]Si+Mt4o‡;j©VŽ€K§ˆ§Ø ɵÌê¯Öñ¿µÿŨjå¨mŸåŸ®ÄzºÎ‹¥Ûƒ–¾lŠ]å³f’˜M¶’GƒCŸÁl§´n†‚N–—LÁžMÑšUŸÐj@oc>‚ m—hžÁ–ËÏ¥ÀÒ›‡§w« lµŸ{‘Zפ™ÿÿÓÿÿöâÿâÔÿĬÿ§_sN§X?àzRÿ»”¯m‹†S¢aae0~G¦`drAjpD˲¨ŸÖµºððݟÒÀ„´È“»¢s‰xG¨žkfs@{†SŸ§n‹—g«¥qÚñˆéyg•Bx¥V“i•Ãm}‘Civ?혎ˆ]}‘SrvBmmEeGsK__?f@Fd/pO`‡<aS:`oJ“«i_‚1Lf8öl{yÇe}‚PŠ•GšwIw„Mƒ•Sº†jª¬acœ]}§r}§ay¢W‚«\•Ðc”¾\´j¬·kŽºKš©[s¤GAj+k~E‚@Ww5u;‰–R³µi¯ºnàx‰Ð^kU_pG|zW†”^~kFt‰Fv‹U‹c…’câ—°ì¿åÕÚ†ÃÊ~¼Üpx•W¢‰m¼kmyE‚‘e°Ã„Å}—Èm¥¦a¶Îj–N}lBŽ„L‰”Zg†@dŠIg—X|‘Wj”Pdƒ@k†Tj§VˆŽ]Tu}]v—dŠ›c¦u¢Á‚ާg‚¤€•”{¤›„£ª‰ª°Œž§”£n‘¥ŸÅ ¦Ðµ¥ÖÝ«Äæ¤²Ö…ƒchEZzXh‡Pv Åkf…HcMy’aj–O[Fi‘]†®sy¶rz±jйXj€MjˆW€ŸoµwЏlƒº‹•¸}ŒªlivJm~RaŒ:W„]Š©‚‘Çu‰»€”ºz²Šˆ»‰›Ïž¦Úˆ†¥Sa^:QJ0EM>ec9_sNZVWoV_’`iŽeciws§{‡«OXe1EP#5?2=XUZ†mx›m´\_F_c;M`.>I-4OEQmL^o7=@.?O=Y}ET|J3;31?E?cW!Fv:>[E7M6/M**>2-A?-Z$42)>+!CC&Z>%SN&[^DOeBd^Aƒ`2ŽB‰‰Ps‡[•yd¸‹TÝz_ÿ}aæœsÛ¬ŒÄ¦ŒÑ–¸ |®ˆ†®€i¿sgÐz`Ünö‹vÿ™~ÿ®Šÿ»¢ÿ ÿ”ÿ§›ÿ££ÿƪÿìÁÿٿ帴ڕ™éš’ÿ™žÿ«–ÿ¾™ÿÑ£ç™zžwMiVšZBÿ±Sÿì‘ÿÿ¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéûÿÿÑÿÿÿÿÿÿÿÿùÿÿÿÿÐáâÒy±œfoƒNYOe]WS|G=jGEN+I^&MU!Ra(Jv7]m*Š…;U¦X[rHU‡HNa.N[3OQ4Bo3.R'S6kL!‚Y.|“RŠ£aeÂng•gZs4p]1wd@Í{WpÈ\‡yaw»XxmTŽ—C[Šej]?sa1VŒLkf=œo/á¯{Ç•yk£~WgNk\)Ot5•d8Qs[me9…˜RŒ^¯nr‘uqHd•TIj=|a0ÖA‹ã¥šµ}QÂz¬Hc¤lx‘MšK’Põ}\†äÑbÚ‚YeQTe9<E/po(FTUX5ŽS6¨€[KÛp1L;lP3Z>F=è°JR§ÈxN[¿u‚N±™i`†ruˆJn¯`Y“`p‚Jp§gyˆZ\’OXW;NM5A(?U*NM"ph.Y€V¥c5\¡xMr)Jc&M9'Fm$xj R cU…$0`#@6GX»QLË BLAZ„4-T.F^'U›@CW-ZH,afCidEScGBP>5],{\'³»z«r‡R«l—¨†¡¥‚µÍ ’ vh·ƒ°f“Y2ŽGbLU`'D7*:<$`C^…DE{4Zc,zžJ^lC¤ù—¹^Êퟆ~\x¬wT~9HJ%¨kV·³pÏÕ¡÷ÿׯõÑ‚v¶”WÅÿ±ÊÜ‚æÿ»Ùÿ·»ÿ¦Ù‰IŸ”qÌŒFÜÌ|®ã{•À^‰NŠ9€Š4—ƒQwY5Ί}¬œr u]§Œ^¹à¢§Ú¤¢À‘ÃҦܯˆ¹q„Wkµ^V{9^DÕt†óïÓÖÿÚÄÿžkd3µ}YÞ i×·hŠ€HxSU _bl5}ÖghˆNvh>¿„pº½¢ÂÖ®ÌδŒa¶¬}Ù·¥±á…¿a©¾‡qHqœYnyK¡oV×’rîŰÁéšfI›¬lˆ¤_„¡akBoŠMž|X¹ŸtuŠI«‰e£¾euŸH„±^u§Lq’IuQ„XšÄw€§Wˆ§b~œQY~/O{?qdAÍnˆß]^y9OS.k€H“´al}M~w\ŸzžË†¹pl€Ju¨Q£Ó|™ÎoÖëƒÊÖi‰„F¦…MŽº}…Ódp©Yb™Wµ„r³Wœƒ]®ŸdÑ”yš„U•¦`¥{ÑÕ’ÎÜ›žæ~ho\Бz´d½‘wÝ⯺{¦{«¶už©a‡aº±|‹ªZzœZ–¨i|•CyƒSˆ kr¬Z~©ZŽÌv©Ö{Š®_q…D˜Y’½v‚¹]¥Sr}Y~–cЦVm’;o„PƒŒP~‘X}]±±„–^`¤o”ê}x]c–]eŸeS=` Tg—D_jFo}LGU6a}IMzG`Q‚j¯‡ªÊ„„¨ep•NcŠJ]w5^ug¬ÎzyŒAk{Q€©‡ÐxoQ]‰Fp“n“·ˆƒ¸muŒL\‚Mi’O[‚Xvoнs‡¦exŠVoƒGMd1U}IhŒ<HuKXodƒw_vzr‹”w†¯¢Î©¯Û¤ºÊ{‚‰=UoCX|GZm>Wb>MlVkQ_’is¨fhs„lvm’Ë™µáfd€17A4=oQb•[nhy¤„´Å{|©[hŽSTr@Et3@c79^DAl38G1ESEThQf‹V1J(AA1hZ/€|=PŽR>oU6Y84L'3?G-^QHq5;RA;4/:?&@A$O> [Z/Tj8_p8xi>‹ƒ@€‡Sx{U„‹c”\•leÂcLâtQí–uý±‹õ°Šñ³…Ü®“¤”‡Ÿp™lX¹hSßw\ÿoÿœÿ—‹ÿ‘•þ‘„ÿš‹ÿ¡˜ÿ¼ŸÿéºÿõØÿäÆÿÆ´ÿ»§ÿ¬¤ÿ« ÿ²Ÿÿ¸ ÿÓ©ÿÚÿáœÿ÷Ÿÿÿ½ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤ÿÿÿÿÿùÿßÓºì²~¤—W‚^u`Jp”Y€SLš]O\Qac3CNGY69c+6H JI[]'vy0–Dm—^t…SXžbRu:ON6ZZ0Hs6CZ-CL<‰L!h‘C{tO¦‚;®~u¸oY’Y¨x:¥®`Š£…a’Z—…V`Ë]|xPn Al„\\W9uc,WiBHh:h\$šj7¸‘i}‡iŸ€`p˜XZjGiz8ci5³‹NˆŠmÿ”jš®ŽdŽo¥s>tÀt~|=JGOe7%¤Š>°´ˆ¿ë¨‹ëq_|£`ˆVcÛV»f6ð¸}¶Ñ¹n²—oVKXmLki4uPP–a]q8KgI“Y)AÈp=H0AI#Ò¢BQ’šL\<g[/~N¡o§®rn±‚GzN•h3Ÿ¯o{Ö‰FiSkT'1ŸRbBJ‰PD`3AR,IR+|V0C§v_P%—s=Pefk'I>/VL$Ot,VK(ay;;,EDMA P[MžIQW)X«F^7`Lu€[hL=jAQR,]`@}lTRpF•œOŒ¯|§u†’o‚—Zh‰WFr4N_%uœIˆÇyR²f€¼ŒhƒQt’JJj8md?m•L³³|„ЛÅÆ†¢_’Åx†uMþÈ’š»{kzƒR@u°ƒ“TY{4;S2Q)!|‚d®¾ušÃÂö·wÖ—¬ŸUÄð¡áÿ ðãšëÿ»©ÞÊrK¾Öx³éÇÙn•h‰´XW}E\c8|`Hnl> aR€‹F€“Z“™[„€<ÇÞËΞ™Ö”»Ê†×äÉÈÿÒ†ÿª˜„]sÌyuƒA4l.ƒ,%Ñà¼Øþ¢›®P‹—QÛÿ—ˆÿ–oz7ɉcNƒCQ^+PA€Ag{R ”q„¨wÇ©‘¢Y…€]Œe{žWŸw_‡]§±l–“R¢“l†ŒS’˜W©Rί¹ÿ¡ˆ²i‚¨dq”I•yNŒ¯b—‘nÏØ©ÊÿǤû¥‘îxøÿ´y¨X¬Õ|½b˜§j¼º‡¥Ày°¾}—ŠU˜Ä`x–Hgk?¨Èƒ— i µTžSw¼Q_wH³o‚¯r–¬…m‚FwpN}nFL<Rj1wˆG“Ái¤Çg~J¢QV‚>o~U™«n~´d–ɃˆÌÌ¥ÇyU†BlO6w{YPm9`qPŸŸd{QŠ^»¤mtŽxµß ¤µqŸ§…âÑÆÚ˜Þ·z¯¹q—ƒTože…½n¥¨{…¢GnDc{?qqPu„Vx„Ir˜I¥¶|ªÃc‹ŠL|–U‡£hŒ·i~¨f‡¯\m€<X{Qf~Kn„C„˜HpŒR{“RoŽK{¡a…¨“»™Ùæ†Íj¶nm‹RožY~Á_g422%MD?n^m¤^m OeKWhGiŽf“²z€[p‹Ye„?Zi1Uu\¡Æ€w™Qqejvt§¡‚¡T`{5ZyFi|ep}TjuMg”Zq•co¬fj¡g} ^x—So•_y”<Tr'Ty8`„G`C[i:PU8PdNZz_jšs…¡uŽžx~LRU:\yOvWx”NlŽF[‰`YsQ[…ez®vˆ±t€¢`k’p—Æ„¦ÄcrˆEIx]{®p‚·om”cmw²€±hx”it—sŠ´ea—Zg«r†º`k‹PWwJHjV_‹][8‚zMoLVŒa:‡n8NO:K%;C52P/iR"H}95XJ05;?-(BM&PV&`b5rp<\Id„``fE_l:vfE‰nAvzO~w]—oS¼fHìvSù¡lÿ¨ÿ®€ã³’´ž‘¹€‚|q tj²pZÒw_΀lÏ‘xÙ}åxÿwjÿ’~ÿ·ÿˬÿݾÿæÆÿçÉÿþÅÿÊ¿ÿ̰ÿº¯ÿ›–ÿÇ“ÿÿÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚ{ÿÒÎÿáºæè°H•œTBTXR)tf;J‰XuZKFŠJEL?\])Dl:P[Q@q*LX&Ii*Gh,gb.€€5a^„~I[š`SuIEj7@X3\J,W|1VZ>–n0`qF‹jO¼mAªz¥nnº€¸˜P¿Rœªƒ–“s³³WdÖ‡p„W€~:e“jUe6|7^yQG^Db\-rH)¼†^’{gv›hœp<¯˜PeÆh}mI˜ˆX¿ƒOkh|Xd€[¶“H_ I]/)@.6v¼eÊ[¸Ø }Ô©¤“UtÆ}|†hj¬O¼jT¨“kõ¨{•¾ˆž¸Œb—{zn@§¥N[€Rc0HV:?^+“b.`°tº”MC‹@Z2Sg'[g5x…P’Ÿa¼¥}l¤Ž9eBMS&zh=¯vY^ä–H‚OK[0€d/GpWAL&*N1H0slAS¥[k^0cN0MY0\R";D!VK'@K"Rg%]"*(SEE]&hy8S«`x]-\”hVsMOa?^t.e{:Oz7MK-nn3xFg‡bb”\ŽvAr½†|¦Yx^Ak›`^ŒM]p:zXU“Xrm4xœTL NZŠ=|›Rdn1Šs8tL«¯S˜Ç‘—°sd¹›Ždÿ¨m¯‰c ø‹k¾€=¤NUa5n9N‰H)>2!9&¢_F˜_Í÷ŸÉô²v¥u¤€cÅý¬ÈÿŸ¤¿‡]J7†w>wÆXÀµZÇÿ¨eªUN[0VY/MU0]3+‡Y8ƒeDytHÀŒg•‹rb]A{d@Ħ†´é¬Ã¼~öøÆÔæËÿÿÿ“ÿÁ·Ü•¶ptŠPSM.¿®n¶û…Æï˜…Ôx¿ƒr¿§c}›]ÿƒ‡g¡dYU*r³VA]$toIcjGl{BtVfŽVƒ¬«Ú ˜¾p¡†XÇiš§et¸b’©tƒ´]‹¬]tˆIŸ¹mòÕ—s¥Te…:[z-•QóÂ|¢X¯œ{½Éž›ÕŠ±ÏŽ´`q£P©Ìy‰b”˜e™ƒi¢©nŒ®i ¦`{}=ƒ˜KDd-ñŠ”—¡Ep{9`~<{Mz¥T®®•…±yw–Ue‰Tƒ¢rc™P±RyƒL[`/ƒ™Kz¸Mr©Szºcy·W_‡7a~Hp}T¹Ô ¹ÿ®›Íz¬Ô´—ÜojtI‹ \{šP›WŽqVwvMiŠEvrG±´•·ªv£Ô‹Î¢Öÿ¹ÆÏ›Žl²Ò“¬Õ‹³É’ÐïŸÇhj@j›BcŽHysEch/^z/dr?¨ j«¹]x}Fu…Htœn—Ài€±`§ÛwŒºUy–Yg—LŒ›j€ª_‚‰b‰¡e‹°w—¹o•¹~{ŽY˜šKu T‰´`i›WŒ½~¢Ëun:>4+4,]aZŠ©j€ Vk’WU—^t¢kx ahJeyT[l0EP4MRL“¬ƒ‰ªk‹asBW`;Ub.Na/Ug?gtPp„Mi„Um•`‰µv…ºcf‰P`…Paa¤Á“œ8Y}*Ov-K_AYs=Qp0NfEdŽh€¿}Ídh{<SZA]Z*<A,J]>J\D_bHUoMgŽ`b•au›oˆ§at‹S^‰Io›`vf€°cpœ`€¡i€§f½kŠºr¿y»uyHLWTbzf|„y¸‘Õ…šÀr‹¥j†£msžejŸaln8vwWgˆZ[ye'‚l,F\+8/-6":4LAdL+Zt4:OIKJ^7&bP#^p2re?Ÿy=Ž˜QV¹}]kok_7b\0XcAkJ;ah:huL‚bIÂf<Ù˜Uñˆ}ÿ‰oÿ§}Ú±—¿¡½ŽµŠuª„m§ufÊv`ÖzfÒˆlωxâzpÿ|jÿžxÿÀœÿç¿ÿìÖÿÎÁÿÓ±ÿÞÏÿÙ¸ÿ¾ºÿ½®ÿø´ÿÿæÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿÿÿÛÿÿýÿÿÿÿÿéÒâáÿ¨‰ÿᎃš :ez#A:,3"U6qV#WhH\zH)kG>4'OHgd8K~G9X;5:$>@"UL Sr0‚j+^“Z]w>XrDVm:[:Xg:Xu:[h5k^8Ÿs4h}WnL‡gD’[IZpk^r”T˜‹Etˆl…xY‰ˆ>U¡mbkA…L¾l{L޲Sž±UpÙc°[¹˜K†©h–«v‡§j”²g¨°jzÅ|¥cR™bmrH‡rFTkNˆp6Ég]”¯a4wZx|RšˆP‰§dz§g‰‹I˜jrÛ‚m«p’’JZ¹eÑhCrwªQCךbpÔ¶‰‰Xg«hD]CGG&DN*Zb(J&°ºƒLºŠEc<FN$HV'ST5e\-_\9¯mHžì”Xžu_œ?gF\œP¤ƒI`Ä{^8ažXAX4ED%B]/Yw5EmCo?6rRFN"J4!XZ S‚;0i5:IWl#;`5gc7o„O¡sR›£zIÆ€l‡=a„YDoAIGM7Y?Pr6ei/w˜WxšZ‚¢Y{XxƒUbxTJN3ZK%]tLau5xKp¢jU‚;p®YžY~„OZŠJ`|,Jx-Nq+^zHlhB†”s™hh±z€z=p‘PuO7ŸVÑÓ™´ó¶S¸z`H8JŽA<Š9/`"@N'žQ±Ü„’׫ܛRMšÞ_ªß~ÿÿÆ1w6yZ4Œï…ž—8×t•ÂaÿJ{=lV47F/]H*eV1pS2“XE‡lJhL0fƒC€a9|O6œXd¡{\¸‹… qy¦]WõfnÿÑÿÿ˧ؘ[r<bU<ºæ‰õ܃ÿ丅VQl.uw?¤yPDa)bx=mP\|9C].@h!Mb;]S<˜šŒ·Ì˜·½›Ñ¸™“µq™œ` ŸY˜ÇZ«Åˆ˜áyªÔm³Â‰‡ŽZ„™_ižPQh)]r4w„Oz›V„šV›·‚xµY„Z‡—Ug<±Æ–Äz€žR“†T¸‘pœ”iÞz}uJ^n<Qd&x^Eª¢q¦±bj•IzœJz”U¦“`ïÞˆJjy?sˆWs¤hr—Zx{@^ŽI}±†ˆÎsu§Hˆ—P‚ÁQq¨CMw4XBt±O—ÅlØ…¯`l‰L‚‡VzX|žOt‡b‹¶gPhrJr–Td•M”—lq}ÿ÷¹·È~Ü싲¹k€~V¦®p¡‹\ŽZ’f…X}’NmŒIj˜Mm†Np6{Kwƒa…¥]ÖŒZŠ™KkˆS–«SwC\i1\d>q|BknEtyFtƒd“ª‚v•‰±Ò ¹ç£ÍÜ›•¿v€™Mn@p¨[…¨[m—c™§m£š{ƒdFfT;GN-A^?enOl†TsŸyÓߤ¬Ã…~³omŸJf…LhŽDd‡QRnJ‡ vƒ³jˆ¢Zr}KdpEzˆIdŽFU‡Vz§hx“bx¥eq¨i†³t‰½cc—Ll’Nd„P}œ^{@Qw)Nx8Gh-K_6Pj<J]To¥‰¢Èsˆ™EHR3BZIUw,-:+BkSZTRoQb‚Zj˜gws‹£_iˆNRwPl”[g“Pn˜Xt ^}“Sm’Cc}Bf|c‚¯{“«cv~N]u>;S9Pk=LWl§¢¥ê՜Ưehˆ_]zhz›dq~WOH0UT2[f@aiWF}dDrn1SJSN*_n/G€DuhO—sEYš]FhqJDEYE(J^,ZTBgk=£dEvSXŒr|XOdj6QuOXS;vT7Z„B|lY´~E¬¤S¡ƒfímaÿ‚[éªvÇ šà“{ÊŸv±•¨Žx¢†jµwbÇ~`ß…jþnÿ‘qÿ xÿ³ŒÿÖ§ÿéËÿÆÅÿ¤ÿ«ÿ¼©ÿ¹¬ÿåºÿÿÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÖÿÿÝÿÿþÿÿþ¸ú׌Á¾¶Ž©Ÿ|A€l>RF87+KE"Bs3?S,6B!T; Rq.7pO<B'ED#ZX/Ju97o@6H'@K#GU+VR(|g.R—WXh2Nj@w‚8TJPgDVa1da+^q7da8]}@|`7ˆ\>¥_FwYk“\hSw‹@n‘[™oF_Rq§Tj—W•ŒJˆºh„²zv‰]´Nž¸q†p^RO]DPS.aq8f}C¼}QÀcp”gxZk„copTbnD“r5y¬ah‡P–xCpTw}S{‹XXŒCx{4eIšl@…‡]v†eyd;|ªTSr^fR+¦72‚¹q¼‰Q˜ìÁH•yDO5.8);0@[ §f0Çœ„wª„;ƒYFQ)<k8>G&Bd*WM2ʾ\’ÿ®FUa<L"LK"€b2N§‚LO<kV1OyFMZ)kC)WŒEXWCdL/s•N@~UYp55;.:[S]3e3K|-Sc+bY,îÉkµý´[»˜xLQ‚g…7ršz7«cZ],_k6Iˆ>[8P[4>I0F6hc0'aF0EN$C< \o9hmE{°TeÄrl¨K¡žZ”¿reUb†:lH„œDh–@P‚LEW$Ti0my>q[F›‡HwñŠàÿŸ=ÔsVP ²LAàЬi¸•BY.F_'tƒ;¢pq£[y®Yw•PquN݈fkö¬¯½ƒÁñ€÷ÞN¦Qåá’hÆw‡§aŒŸSum<Z]-o_E99'?4gA(rF1Ÿ];…–Vd{FSd:v_A¨}XKyD‡ŠPÚ€Åñ®Mê€fdAˆˆS“o\Ÿ„Rÿµÿÿÿ×x™XœÐ^M`-SX,hk*£YQ’ÜŠN”RniFO|:˜´wÇÞ¬§ü¦\çMJ+hR?Œ_]sjF‰~„qUŸ¡b‡–V£ÂŒƒjÁÑ ÿø¨ žii™Fc|Bx\Kj)k|?zŽS¥\r˜RŒ‹oˆ¡rb‰AnyStŽT¨r†–u‹¶Ô±‘‘RœqOª‚S˜qU{uPRy>ZtB U‚}I€y>o†>YwM‹Ò‹¯ÕžÉûþöÀ¤æˆ“§UªÆ~}“Q†£g¹×±ÄӉе\¥Y“Ìg~¯Tj™H“±_hŸLšËt“¾_Žza°ÿsÙS<\1\”Z†˜»ç°†·f]˜Lx£Zp²Ws[£ª”ºâ¤È{‚¢]y}AskJ˜œ`vW‚R…Ÿf€¶iw–YnžaŒ¤o™¢y¿YwbP¾³”µÆir Z…¤~‰µspžUok>Mr5LCd›Aan=zkGaNŽxŸº¬¶Ø¨¾áœÛ—ÚyšShˆO~¥{›Ø{¨b jq`u…]™i|P_u6E[3I]9\jOrŠ_˜šs¥fƒ¡^s–Tx‘ezmƒ“`~¨„˜Ã`qŽIh^<ni6^mPy—t¬µºš_f~Un…]l…Xt’^r{QevXv Vfˆ[w©]€”=U<g‹We…9>`<UuHe•€Ú~}‚DVe5O[Ox™ihx;<a=X}hvŸknRe|Tb|_ƒŸyŒ©[m‹Sc~IiVY‹XSyNbŠP]wCff8G\@;bNo˜Ocr<HgCQzDQkI`j,00;S`sŽ‘x˜X’Šf…lp…V]mK?C-MN+OZ=jiS\YU€nj`frDvP|ŽiŠ®p¤~r}Iq_DOE\T3qj7‚~HW˜\[p`nM<Uc@“RLyl=asZVOLeS@{d:s‘P ]jVhiN]=×TAÑrG¼…qÙuðœoÐ †¨¦Ž¦•y¯‹lª¡p³yêzmÿˆeÿ¡uÿœŽÿ–ÿ׬ׯÊÙ£Óq€ö‚‹ÿ‰ÿΨÿâºÿÿîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòÿÿÿ¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÉÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜÿÿÿÿÄrÿÿÂÿÿØÿÿÊÿöÙÿÿدɿ‘» ˆ§Šg }^lcNf==qFAa;DX,,]2 7$0.S?Mt*>TC.Z5<H*PP*cs3W},QkURl4Dw?:Z2s\&>“PTY6ll.e“H]jFG[6EO,ea3T|>JP*ra6gFwb?ª|CŽ˜Q«‡[cŽ]s‘IEšU Z8Ô±X„ýk €“A…„`c—YOpUƒj+`i@Xn=Xs>SV5JO/„T.‚ƒP¨°}›eˆyG`^MZVDC]2A`(l\ FuEzj3fvBZ]Ult;a¢LV›ITŽEZu3P„>Py>Tp9ps?¾ƒPcèŠMeN„C3¥pM°ÕŒŒ½’[š…<T?/:$KE\/sÉ~°{•jYyQFzL3J.?N‹m-¿è†É¯Ž`ü»EgJ=H#7A#XB–s?]¶™Jv;Pj2ET,Zk3>H6@A(YFU<Tµm‹K=‡_7h*³Z"]‡d>P*E=jn#Ô‚QÒì‡ß ©hŒæ˜ª®‚“½Œ‚dœZoŽa—apªD—XUR05[1Ï<"A™bAM2+8,HCZ`0—H¾Òƒžµ„ÿ¦L6jb+FbCTk*Sd4p^(ƒc³ZYANw;86%OW/â¡`·ÿ¼ôí“cÿÂ2f0.-t'Ÿ²ƒbbN¶ftp.´ww†KT‡ADK&Eh-½m@“²ˆfŒ8«¢m}·F”µL–±s[A,_:*x‚M¸ß…jÿ„E£Dg¡Sf÷xec3rs<„›T³Û‘¶{¦lU©~dµ¬p¬Ë…ÁØœâÙœµæ›ßÚ¬ßïÀÿþÖ¸õ½ ·ˆ”Šh¥nKˆoO•jÅ`|ŒXDO+^a,¬€g³¶t}§bSl?C]8aS³Ú¯ÎêÏЉ6C!QP0jOBveV©‹b¶¥ƒ“s]Çžªžt{yM¡ŽeÄ♈²V}~LkƒDa‰<Lu-{{Im‡QP€8×pY¬yW…ž]l—Oam~§ydŠPxŽh¼²ˆˆQ]r8nQ5ic6vj:•\:óa’P7‘X>nCŒšQ‘\bŠO¬·ŒÌÛµÃà¹ÀÜ ™hqCSj{Hk¦Y¢ˆmšR¸jvœS–R’TrZÉטÐu|]g‹DXQ3ƒz\€®S| Ob–i¡ÒŸŠ«TeeLÇßh´JjuAWu?rzi¬¯qof@w•RW[9k„O‹–M™zGs§Y|©Z€ˆaisEq•Jj›GhL‘sZ–`w¦c…¤gŽi°~ˆ’kˆ•kv†N\w8_Ln£Dg|Q}s9ijKj£n¢»¤Ã╕Ç •§Æ…‚p{¨uˆ¸¡°Þ”…›az¡˜µŒ”È›ÔÓŒá£e‹KhqOf€;C\6]m>jk=dxMzŠOkŸ xˆŒNrP‹tªµi€›ImvCqHj|]‡¥h„sO~t>Yj>jwH}‰FgI]|Ga‰W”[h’i‹±dw”B^yCr—Ty“Lz”Rc—]”»¥—GPT6gY@nlgš´gq Y‚¹ZhšcuŠ]x}HgVp“g¼j‘˜[}uJklAW{^z¥gw“Zs RbŽKQ„S`šZgžSi};H_=TsIj‚KUnJbs*$4&+EJVyNasDR^PnU\¨z]ŽvIaO,bn;j}IlpUqrQ]{hnojo_FmyLœkXŠœ\N©v2h}?DBWIkQ+|n;—oH]ˆ[^um[WAd`8w]6€b=]bAYKNzO8›i9“‰Kp°imtgcf=JYAi@<’U:šjJÕvYöˆ`ò›~¹¡Ž¹“…·ŠgÁt£±ƒœ‘‘ÕmeþtWÿoÿ“~ÿ¡„ä´¨¿¦§…‹¯‚yè‚„ÿ„€ÿ¹“ÿò³ÿÿìÿÿÿÿÿÿÿÿðÿ¶ÚÿŽªÿ»¢ÿÿÅÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÛ¨ÛÁÕÿ¯bÿÿžÿÿï¬ÒÖ˜–|È—i‘žu{™vfj6xbGH4QFMi5Gr@?Z6JN+IZ.>]2WX0K{1a]<YEJnA__Cb|=bi-C]YR>W^/Tm@ga9:ŠGL`;\\*;u/3L0PG(Z^$Lg/<h7SO,qY6af:}r@™i?‘‡V…Ž_m™jІHPªcƒiC¥Hn›yi€RR‡;|[Ex‹DMŽ]C[*\[&czGizQXX]bBbm2‚r8–§cIŽzde%F_3:M%C[FW ae-a„?QvPIrAu‚@r§UfX QU¬lZuFLj0ir8i€Gf‚FÀ‚AÞê…Ç€UÀvU“®`‚{xeµexOb’Yy?v°}TgFd@42X:Q#=¢a\‰<tK«ø‘p^m€’Svšj8†Y?8(9<UBsA+–°fRˆ~JW4X{8BG6DG%>q2ZD'ˆP(žØ†ˆng¡UB|<¡] WŽXQj3±\0€¹~iZ›¸dx™ctL><jAŠR'WFGK`-Rs/Pd-QT4L~FmH-‡|T”¥l€§kNcAHB!qQ.HQ7…‹Dv²kƒHx§`—SL©THe <b"LT9O!5JQ[(œcG`¸k>˜P6R$LX1cH£že—½t]¼~JZ-0h-*4£W,žbg»j^h"o—Fg¨Um€FŽBwÎxYkATn0f‰:pŽ;|•@¡«DUt?VK-X€9m’7·ZÏ݇»ß…ÿØÿÿÿñÿÿŒëy¤Ô{Àë™lºo{tPt…Bvy=yD'XH™[Y¥Šn§§t¯›x׿~ÍÍŽ †]owCtxE‚Z½_¡ÆlDr+D0"aU3™ƒP »ˆ„Ìq†×gIT0\8-ƒ”xªŸ~n„`Y™oHp9vH<yaKpmRvxK¬„Š¥g›eí²€•Ùx³Í‹Ådcu@dv@r„FfŸNXu;kQ{¢dƒ©a²ª]w˜Y”¼ Ì™Œ¼~ža“Žkm˜CwjFq\A{g=‚`;RL.h^:YwPWy=pSAŒbR—œQÑŠ`˜Ÿa“xU–˜k“eZ‹kMiW7b~>|¨=JY0m˜Km…Y„¢a‡¬`g”J‚”H“•Jq—ažæŽ—Ñjž•xV8Bc(/8 G\,HM4ÌOk©•d{¬Xb‡H}Œ]´st´Pq¶jy˜Z^„A_t=r–LqqUŠªDv‘8t—L”ȉœÌœ¶è§Ð×t¶Á⊴¤^|PŠvRƒzO q˜ÛŒ‘¸xg„<If/CK$?L*h†Mz¤{í‹€Çd„¡e–§m¦n†¤v¥¼€Œ»v„©er†o†—{𝔫Ôxq“drf‘‚±¾©»”Ÿc~–Voœd bt’RkˆG\y>N\8cp^}y…´|¦XSrGk‚`œµvž¨\n‹Isy]’l’”Y’•\}9EN*C^?bHb…So…St•\pYq¥mªVm~8Xq@bBaCXmCn‹V’^–ŸJVg9[S?jx’¹bz›a~£Sm…Mz‚NouNi{cŽºnލa~Xqb9ZoHVj[tˆIarLo‰[w‡eu ht¡`yšOX|@ExDN}DVhEPSaŒCIv=D{LaFVx7GJ*EJCdgP~mTŽo3bTMƒdBYROKCNQ93cF:BB=S+fW;mw=D‡\/glK;6LU XT9em8nh=cb<WpPpS>i}B‘vJ“‚M}kNjqJyXE•a<‡}Ke^ex_‡X@]s>gpSo|MwsR»fJákI×…p¿}³Œy¼ˆjÅ“mµx ¦€˜|¶lUìfOÿbÿ–sÿ’}ÿª‹ÿ° ÿ¦æ´ ÿ›ÿ¨ÿÄšÿß¾ÿòËêëåæ«Õÿ—uÿÏ‚ÿÿ¸ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖÿÿÿÿÿÿÿÿñÿÿØÿÿÿÒçÿ·Î²ÑÁ—ÿ¿ÿÖ‹£éŸf›o†m\‚[l\Gr‹Xc¡t.‹_'3?'+N,Mk77f<BX7Qm6GO*c?+a€C[ZDML>LS:YQ6Ib4eW)Lz=jlZcx9:m8kF5O„5IQOG_+=e12[$:CAb%S])Mm+fo8RoCcU9hf4u‰C}Dt{ReWGX¡Nj‰JV“7QuBcz@U~@ev7h}EOe5cX7[a.zQ3¤hK]’pQeYmk;_~9ybA@‚nOh.=k0>O$]n%`C_{FuŒD€¡U“T~«[a¤Vp’Mz¯Wi°aT‚UXv9Y{=Xk?mW5}•NΗL¤òƒex’\‰qPj¬Z’žO˜ eqYc•UFpC/V*DH Ql&GC]6¬_ðÿ¡5Ÿ?B$ÐŒ>e¸šif>3W$?T]!ƒ†I‡dUZ¥iay:cq;{Q/PO6KU3KC/ˆz2µëˆjƒuX„J@o7jQ!de<BK+¤r,`”s“…HBpK5<Ee V<}nDAQ0in.<t29)GE)gvCt±g\‰Ml”OŽ˜^r·}V]€{A…T£Ìt`¤YP3Uc6ÇVlzFR‚;Bq(>l%>€1T{1Zq8\_0„¦mm¬iQc9W\3n^8lmAd‘N™‰Tu}E^pAT{@nb8Í‹W{ÿ¢Zy+y…Ga¯qŠu7††Q¥š_nN`„>z¨U†¸cIK(ž¥\ŽÇp˜Áj„°UеW›»h£ÿªÛ{•lù²cÿÖÜâÿúÊð¬£äœj°m¸ÆpØÿ¨mÿµ>N%-/4'.',2tM.ã±€¢¤`’¼pnyJhe>U^6W=!–H9Hv2F\1”^ž«mgI4€J¥ÀkFá\A2&g•¢[R}VJb?OU<YYA¬ne±zhxtM´®}€Ÿ]’™V~i§§tÚo–Óiˆ„Q[v@zŽJ†Xg‘I|Z ®vÔ°g…ŸN†£{²ë¬Ï‰—¹„i Xdz<\z<u†Lkh=¯ÙŒæû·“ÿ†xÑⱶܧµqxºZ•ºR~_;Á‚nwrHƒR?\zFCj4<\5«…o©Óh´b˜Ðuj›C|€?}žOb6b~6›~?d‚;›‚\Ÿ©w˜Ìn…›b€¥dr¥PiŒCYS5mn?ryB… M³®_¶TiƒIfb?‡z^o‰GpžVªÚr|°T–ŸAbn9wV@|˜|¡Á‰‡¤o‘©xšS‚¯„’º~®†–¾xKk¼é¨“™k¨xˆÖdG{1A]-=gEuˆ¸ÿÁßÿ½×ÿ™ŒFIQ4e_I^qFr‚ZpyKooNoOcuM|€”À_mqJmxXz¬k„°w¤ÂŽ–·yy¦d¯h{ˆ\wŽo‹±y}¤KR_5L\V|£‚ z̾•»av“g›ªgkuVs‚Upw[„qSq„bŠ™_`k1?U5Km]‰’Lh”aˆªu“ªb|¹j…³r}²[cvAa}CYj4e…9^{;buAnyP}¢eŠÁ^o¶l‚¾ƒ’³OlLXjFfwOfsIttN}v¤ÇqŽ–Yu}RfuKWFW†U[i@b_IujR|l[y™\s˜Yf™Sn•]u–^e]^‹gr«do›VhTp—O`ŒHZx2IW1@T=NeI~rUj{KXyV9mN(U<.63I3 HR'i\;sy8w’Q€”^`d=’w`RIVd)KwNQZJca>fb9slDvnIxkP•vL††RžWš~F‰ˆ]|yXisPjvIgkDxmFio9kxZWeWhWGtX:žJ:ÍZ:Áx]©…o¾kî–`Æs¢žŸ¢{†e›ibÀ^RßmSîvkÿvlÿšqÿ©…ÿ±Žÿ¸ÿ»¢ÿ°Ÿÿ¥˜ÿÿÿÿÿâÿÿÒÿÿãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòܯÆÎÓ©˜ÿ©ÿ´ÿÛªÿʪÿíœÿãÉÿ㯖žhW|szCAwW-@E1#”Bg¤z<l*QW29$Q8el/zBoˆH1yT50/`C9r?,<1<(D5AI2EV)UM(t\3Q†_0T?0=3]<Am&/PSI3Id&Ll4J^1XM%G]2Za3ds3g}GglKˆŒ@k°d€¤e]¨iXnQgj1~œHb£g^‡<d“@Qzblf5TAIU<\)X…E<fPKQ-_^5vHf˜_k†OcRz{>f•[WuXU‚IP€?d~1Ro=~k:–ƒG{Ïn~¾r_‹`hŠ?w”Nk¬ac›W\oF£JQ}bqJ[p8sx@±|J«÷ƒ…Ö¦O{Jgc+“8Ž»de¥a‡|;O}_.9/EQ#Ug1y•LR|\onBæÙwfå·9pSaS)‘‹Qi©g`kIƒ„Bo¦hKhIY?-XD/yW.Ž¥Q–yXT†\zm3paCc`=¼N*Çí…‚ÁaÈV?}AERai'Z]4‡µbbr_a–GSxCOw)<8.hLWwMIrCSž<3h0Wi.‘DÃÚ“]‘lu‚Re hi{BwwOn—`{²h¥Ëv{¦^Q»\RŠC’‰BŒÿª\šWVƒATo+hb%pk(U@uR(xA0™T6ƒ·j†jAœ`?«rZsyN^u@bi@h€F|ƒKs–G†¡Xš«g–PWŒCgv:_g7`Y%;M%fk-g¡U…T–´pz°u^Ÿf»²uºÎ•z†JN«†XÎR6ÿ×¶eg<tm5|µNí´Xÿñ©Ìò¯ÄÚ“}{HèiáÿǼqpU9?S9:@'uiD•»iÿä–ª¯p¤Ì…¥ÁsWžJ–yBcL4<1 4!4L%}tSîÿÀ™ÿ¦>n(JK(RÓÞ:W(¡]V`†INU>fD7imG¢rin™V•…fqxR~€R‘‹_†“e˜ž_sTx£_”µjg”Dd{@vˆMk†B{³gXj:ËžvcZ/ƒŠnÐú¾Öñξ𶖾~Z†Cdl<ƒ‘_šS©YŸ²‰Óö¾ûÿÛ½ÿ— „e¡‘o¥˜Z†ŠOV®ÍqÔÞ˜Ÿöƒn\L®³§†È}f„R}dEµ·qš[– jd“@j”@k‘:Y„,j8vŠ:Is/Hk/y“h’¹}’³™Å{|²{‰º}—¥v·ÚvšYœ’jÂÚŒ¾ö‰u¡L:[*_a/Zy>cPdzHo‡S™¾kužMwƒMn’grOPk@[O8U`6hŠc…‘htq»yl¹ÍÿîÌÔwk‹T—¿p£Õts®AKpO”Á½÷®Íøœºðš¶ä€kq@NlEVw6Pu8ds9CP+TnE`r6}vG’¦†…§C`qE`xHvƒZ„Rm{S~—dtRvrBblG`kZ›j€ŒK`Knœw‡®‹µ„¬¯“¨”SgWQ•˜qy™j€¢okw@{dXŠ“`„œX}{GV^K|‚^rsIt—ì»q‰•c~§s‰¹y„²dn}Lt|3Tt(]y-Ob?_x?fI~™o™Ë{¬É©ÎƒŒ¯YqUkrNh‡TcyEWiJv—v—¤kƒ‰KXYq¡s‹¶jw‘Qe}KgmY}Pƒw_››d…Uo¥QZwVh”`e†lu¢k{£eo•`nŽSkF_Lgv?Vc1QX7V^HyrKe€hInd;dP-Q:+;.@)%S=`O-‚g@xˆM~›h\–fE‹}g]Qgu4G€P\dTeq;uq?¬cIuFlkg[tNerLt?±|Mƒ“TN‚eKeT_^/n^5Yn;Q_;POEID<Z6.\S)~X:‰Q2¡a;™ZJ¿gRáSçˆl±•€•‘Œ™x‚ŽeƒgaŠXI‘ZGÙUKÿnLÿ’lÿ¥ƒÿ¡“ÿ˜ˆÿ“†ÿ¨vÿäŽÿÿØÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêÿÿÿÿÿýÿûðÿèÆÿëÎÉäàŒÙÓz°yqŸw·dÿ¶aÿö”ÿæ¸ÿµª¿¯ˆJg‹60E[S(+e='+&P)aJ(IU?IEA2M8L=8PA!…i2e†IRzQ0d?98*[O Rb;8]688&0:80&>R<@"uAA‰=7:E6?)G?$S^(1lN?@"F`"Ud%Zv;_c1kc1SzGpw<_ŽJv†Yg©]g™^y¢bu§iRŽefqA¹œ=Uelp7l<Mƒhqj2EKUe.OW*[M7[f@rq?”‘\±Á‡u¸l€[nŒN]Wlp9{¦bz¥jr‹AIKU_*u]*›ÅR‰À}sË€i¤h~šY‚¼f‹ÌzsÊu”¹q{ce{bIyINx3Uf4q~7íwH\ÿÉ=eH2<CBk^$Y‘R[w;JŽH€wDhWMY;DŠZ@T7Ýy2wüÆO`ZqDuO0rBb©nCK6sB&Z^›elvJZnCin:œ†;‹±sÂS.ÑyRl›M\e*˜Aš·w„Zg™N\c5Ii6mQx•QhlP}‚E]hBV‡2I€E;O'ld6aH;nv@V|9Xp1…j0lG0™Ö„ ÌŠ‹Ð€_ˆeJk>OK/qb4™™byµ‚jY?gdA\ŒFÁšI«Ö‡†·dN•OT-Ji%bo'M^ZL*`X,UT-‡zB]<ai/uo=ye7„`Dr…RY~<gc?e—cb–Szx>o{GWz:k‰GQ†?>^%>U#Zk,e3‹`>Ÿd…™f»~|œsžµw}¨`‹§Yg©[@ˆ<Pg8hm6¾°j¨Çƒ®Ã\±ÿŠ’£tv†JŽO’˜M¶ÿ¦}ŒT«Ø¬ÿ¸¤î‘ÍʉÖßÃÏ¥²½€³Ñˆ|xOshN“¥mAK-AZ-.5‰ŠEtŠBîpÞœƒ^d8_f@ap>›’NLA°„`w«S}g?µmO”zQw‰T©ph¢Â¡x¨qr„XzdEkzE‘œhjƒM‡Ž[{•RZ‹@zS9Š‚N‚¹iÃn¤¥ckw<ac8Œ¦gËÚ©ÁãÎÇòÃe½UNM1z¢`l™Em¨Kw³^…£b£Æ„º¯yu–N_e2CG%kP8ZP5`W:u´]wTšževšH†SK|_AC>*U>2Ä~e^‰<xlCr„=k‡<oœKcƒ7º´TŠˆ;Rv3Zw=gzMza‹©m›R‘‘e¬ˆeÿÿ°Ûf”}Hˆq^ãÕ–ÿÿº²Ýv›©b`;Sf0Td>\‚3R[@†^acBliQx§]s£mnIN\*Yl4]g7c|=~“f¶×™¯æÐàõ¶¨É~®Í…Ž›Z™Òm•Ñ`T~L Ÿ¥Äò’®ó¬ß‰ozCikk€¯ˆ‚œ^Xo+HM$HU#L\>fr5UPH‘¸—~ HgwUg|>lcAue=T{Ju›mkŠ?Z‰EhšYq™Z‹LJb4Tqh›¸š¤Ã¤²¾‘“†ï¶pcdX…z“²z”³{vRs|`ž z£¥ZoxHhvr¨„@XtT£œl—‡=XlNpj}{¨_s‘Oas(Ga/BG,A`Fa€Eaw:h•Z†œd‚™Ÿ¾q“±zŽ´en¥tx©f{Le€Qq~_‡ˆYipD\as ˜®‰†®ƒˆ£wœWt€Ul‚l¥ kƒ¢j™«s–•ip—fl¦t kg†[[‚ViViŠK`h9\\<jm2IY8MmFkwFWƒvUqdHbV7eE#V4-9/F=(Q[/op>|zGxU_Š`P{fi[Mr}9RxNRoTffCco:§XH}eAglYftL~qIjvA€pT”sPW|QSqQSi2SW4M]0XQ0J_5I]F\N3R[8[[BZK0YG5XE-—D+Ñh5¿‚XÚˆqÑ™sµ ~¡«Š”‚~qb…aN–gNápPÿˆ]ÿ¡iç¯Î ˆÇš{ÿ’jÿ§jÿè›ÿÿÝÿüëÿÏ×ÿð¹ÿÿÚÿÿ½ÿÿÿ“ôÿ²‹Ž§}ÿ¯{âĈƒÊo¤y£™ÿ£ZÿÖyÿÖ˜ÆÔ©`ˆ,8X*!)_?6q3?@'*((1 2&&/*<A#e`(…<[I?P>:0->:%?T&AD3VE%??'1I)>=.>TPH&gE!JP3+PP)31-oA6y<OG/mj/|h/`zL_xEjlEDj8cF8xs7tŒRp¨gs³hz¨g£ll{]r‚T\›=N}\hn9n3]Žqpj=cwXQ†LIl<GjB„f7ÕˆDωv¨vpcZfUiC™t:mš[†fs©LLvERY,<O)VK#’’CÈp’É{È{Ń›r¡¼f”Ä}—ɇOÄ€0GE44%HB#CE#MU*@Z'šT …«R,›‘>5Fl$Ti*c]<M{AB@&Q0I/sv4†iGvVGßÿ€nÒ½[[W}z;iŒj¸xAj·:`GUC*ªY5æ®{ÿ¦‹Ï¨®—¸¤òÇxž~{xouA¥B–{Ro”Z¦rG¼Çd]]k`=|¨bwzLbˆV„v:UUƒo<‚”BªoCT?QY#`c6XoCVs0VIa[6dq5««mp¨yaxFFX6Wa,YV0HrfHT•X]žER`1}R0©Ott]‰vF\u@Y|1Dm'bN&q€@Pr2py=r¬W†º\‰¢KŽ‚?vz?bd8 u7i™[kƒ/=N3lL,…˜_d¢Thk4^¥X’UdÎ?†>;T&Nj%gŠ?.V3>C#lkGzªdy‘Sz…Rf…EŠ¡a–·b†ÂoD„;„M1‚™Wo˜S–c=€Þoˆi>qi<UE·¨QƒÞzž–[Ûð±Ã€bã°eÉ~p_>sW9ƒG*@*¥b;š€\¹±ZR6ŒcDV(J1À†£ª‚œfg‘Jh\{?X`2`nDªqPukLeZG„m¬qax€g{Vµb™¸Šƒ˜kšbÐËž±mµ\[6v‹F_‘TtoDÅÆ’ŽÐu€ªT…TXh.fyFÀt}«ËÍç˶Á’€_lžVx“\ek9j˜OŒ¸gršVŸ¾z§Ö‚’ë‹aŒLešFLN5’WLs^AvT>dj>ž¹u¡[k€Qhh™Ã¬‚¡{[ƒJ`S8ŠSy‡?€‡9”G˜ŽF|ƒ9Sm6Fd3e\;zhK…“Nl€CygNȳáÛ€¨¥U‘˜P™˜j~ \¤¹m£–i„ŸZmtD\a?_„;k‘Qm–\e‹IQl9b~Dƒ•]‡•gu‰Nbi9`|?kv:`~;V`Bgkz´Â|gSŸx´¿k«[¦Ôr¨×^`yO™„£ã°³Á–¢¢]`bEisZ‚nfmc0<P$?Q#:M!7?)MQ/@H_²Ö’h6TM6_U9blGm‰Ry°nŠ_‡_¡¬|¨Àxƒ¯o€¤bl˜Xhšv•³‘¯½—¡nuuyÿÂ’ˆS‡yd”™k ‹”hzq^°~©™LdgN‘ˆz‹p>k€a¦‚Edz@\wJgvSe{Wou]}~HYv7Mi<awJq—„ŸÂcf†B‰RtŒd„ŸsŠœ\|•r—¯s³r޲gnˆJel9Mi<Mb:IjBU|kpŸŒ§…»¢£Ä—¼y{·z’”]~Œ[’Žl˜}vµ“n{¥q{¨z€©n‡ŒVt‰U^Z‡‰CO^1<P7Ud<MpMc–Zr›O\‰w?€jDWWhC9Xx9OƒMruL}ŒJZUTfP\\>Gm@2`J^@:cK(Yy=PrL`fGmh5li>h_?]kCRnFjd@d\8giAW{I\UFOc2Cd??R5CW-uI.th/{}M…wQbI^pQVYDZS=SU1fN/ª].Çb=íƒWÞ’sÔ€µ•ƒª¹”‚—pb¨qZ³Ž^â–jÿ›oÿ¢uÿ¼ƒ¾ÌŒ«žÒˆp¸‡hÌrfŒ“bÿƒÿ³QÿÓ˜ÿå—ÿÿæÑÕá“͉}®ˆ¤™w»¥|¥„¾²mÿ®ÿ«aÿ¹—¸¦yD€ .YMOi)P>-3&5 !'#$2+#79cP"q“FT„Z=Z@DF(IH.PU2Mg5bS>Ua5ffAC€DNbCMi8rm5KwIkd?3sP-A6';D63]$R=#Jv+]P1pI(RlAMm>Hi,fr3Œ™C¨ÃZ’ÒŠwȇrªoiŒcZ}VjuDi‘?L‚o`h<}‚9pšf~™^`qhlmGqj>LjXI@8_Y*9[9GB,bK#mv:„SihHT^Gbl1=c25F'H>¨R"¢z?±›‡‘ÍŸ~¨o[Žn^†TpˆKj–GZlD0H9/=".9"24;A=L&2M.GQ!ºPZè‘qƒHYpG1f2DH Sv/hg3NwIlb<‰p5‚wPÏQ—ì«MhnWi/Ok7_l7ÓuI©Â“TKá|Wšžƒy_“€TŸ{Yÿ¢fȾ¥œ‡mØN|œm«‚=”{FX¯ƒ_ŒB œ8|ŽH½™_c³}uY/noBwXHgiJ”N†Š[@r@Ne*d€8^ˆ9Kr/‡n2€k¨žeaˆR·ŽGVÀˆ€pA„´hÏŒc@EzOgT![t<s`2OO,a„>›Âi\²lTšCOo0Js.<S#LP"‹‘J±]rzQs‡Hj{Cp~7o8šfh“QŠ…L}ƒD}‡W,>1L6‚8˜Ëiœea•O´„NrܪHŒMKd DI"w~A<a9;Q(zzKazIn¬Yu¸pŸÛ‚§µ|–Ú†ŠÃgg¦K6w7J9‰U6oÃsGd-Iehx6r‡B‹¾[qtE¨œgvwRj_;nY4„~JÖç§Î즔Àa—R–rP‡xL»{]‘UB~oO±k]ŸlT–XF‡IBw?3uw@¦©hËiŸÆf¦eE˜‡NkV?qaLpzI›ºsv³izŽVhFjZ‘”{yžO¯žg’Ät’“^^€=b…@b€?ntZrƒP¢Ÿhk£FsŸH‚“TpT’vc—®}Ÿ·a“KÛx{¼ra‹F[—>n“U†˜\s•K†ªi¨k¿°‰–ˆY‚zOŠ‚N‘`“Ñqv€JZZ5sgDž|T¾ŸqÈ̳‹c°šdvmK§xTid;¤xIˆ5˜~A•Dˆr<|=qŠ>\‡KxŸY¹m¥ÿˆvÛ^^‚JѰ…¹Çr’šExNœ±v« nŒ“[½“d¼¤{“žcÑÅ}j—<††P°¿o‹J|q9at;ou>rs@ƒ\›ÆfvªT…´KhG„c—²Žo{7=3"]Q;e…?ƒ•X—Æa–UmžSo“^‹Udz=MY7QHEphGNX$94'RO7Ze2ET+JK/MG4\e‚¿èwcu3JP0\W5Xk6`s[—”r˜Æuвk‰¿m‹”r’¥nƒœrv©pu£z¡tŒ©z‹œyœ˜}Ï´¢Ø¸l[‰iƒ–y™¬tˆŠY¤˜p”ˆIdyR¢SwmJˆHq}Ds‹Pˆ€Lm‚YlˆWŠ[~„LXwJ\vVjŽ}²¬™Ö»rw‡KgnR–†R‡QmzEdyR„U}€No†Iax,Cb0Af8@g=OtBNrdr’tuŽx‹°¢²ŠŸ¹Šµ¹|™‘SpOpwKjbF`lQe€W`\u•fzYlŒ^o¤fdL_y?^u@_kA_†Sišcs£ZV€eKm`C\In[;…~3‰‚Jq‡VK”],m_E:GMO-;_@=J=TE)T['c^/XiGUgJd`;To<UXENm;Qg:@d?bH6`[1=f?GWB[Y*K`)Re6H`2b_3tb,eqCeoNimDw€Nu{XZgNc\;[b1n^;›T/áh9Ñ‹[Ó}lµŽl¨’}¦”vš‚r–…j••c¤¦d¸™j͈fÿŽmÛžnŽy]egaPÐaIˆ±e{•j’>Ê›Oþœ^ž‚ÿ°‘†¿jv}mùˆ`ÐÁr®½•ÿjÆœd“{Ly]BK !' `7({662;$=""='BRK]$lf,hAl‰SPwJYX:lU+jx<kdBzpH£lDÈjD¦sL¥x\›yc»ŠkúŠW´Ã‚€vwm€W_bRM]7K[1Ac+SN1<p*>\-ii-h‡EX|KWlGzy6xZz m¬j·rx·}€¯jq°pq£mr‡NJxjSN8†y0´˜cY_>?SGU&UC*M_:LwMQl7PM1OO0bk=b{>U_MGA+T?I5UfCe_-Aq>w;*“Kÿ•{t›¸d?Œƒ[l¿_L]Upa4wšJG³O>x@Bs>@v8@x0F[&Nu-X_+^o8vO0F–iH\+@a3GS%be0]ƒIoJ+d„KÆ`6Ó—^Íî£R›Sl>ƒ[6U|JPb7‚~E¸h\ʆZ‰qgˆ]{jFv„S…OàÓ{ž‘|mzY£n@…ŒW¹†Oš~Qxoq}@hŽ<qŠH‹›QQ°WNX'?\+~d3›•d¯¬_’{\Ä‹\¹lIhQ>S\'Ko.ai9|†M^dA“b4•mOR³€UtAœNs´~¦l<dpHEˆHS}8¡ºaãÿÔÉܼ¯ÒŸˆyZauKZ|;d€?to8`kF`U„j:i—Gu‡B…¤dcJˆ8{•T•ŒM®{“’EêÚ•o»hYz-]ƒ8;_%‹ƒHRˆ7žBœÅœXŒDiŠD\‹:c}V^ŒQTe?R€Gtk<ŠŒVf<.OFyZ3dPCQ2!•11b|_ol?Y•QZh;<X!:6_X'¯^ˆrL©€ayf”Æm‡Û‡žÖ„ºãÓÿÀ½ªv¬¬c‰`¢ƒYŽ~U’rRëwkÄ—n»™yã“„»”ˆˆzb€\OpgV¶žqŠc‡<9“cRfG‚Z?®~m—ĉ½Ö£¨ÖŽ¡‘S¡¦s£i ‹vi¤Sz’Xi>yO¤Yr•IX™F^ƒ7qfMœ¬evŸKc‡Cr™MÑä ¬‹S|SC†¥oGe4kxObIY‰AVyCqtAQl%br5j‚Cf•D«_N‘_TÕ‹…ƒ³Jx‰@Å‘}®Ž^waP¥”fòÀnìY›VHUU–]JšOH¢nR{C~|G—•Gœ„?uz5“Arm@™PŽhš¥ZŠœuº„µÏw²ÏbÞ¿x±’X¡‡Mx„GŸši•³Qv‰K c–¯z˜m–Tv±Wpkœ¹gu|;X~1Xw@fy4XJ=©}NxŽCrŽMt‹Hk—L{›s««jwc<DY-6>)dnJ•Å\¤¦M©°_¨šS]{<]~J„—`|‘\jzQ\_Heq8EO,BT+AD,Tf5HT<VW@{{‹œ´\fnV{£[p“BTj;bbFiya‘³†¡Ï•¶è‹V‡Šm¤«—ªîޣ唒ºxš”dš—[duTšŠ}͘`qtMozWswdow„[ŸŠn™ F‘¥QiƒO—\v‘T‚Jbal•p“¶‡Á¶¯‡WzOkuMph”¥…ž©‹«§i‘€c™„[‡‰Le€G^wC`b8]M,@U3Kh;Mv3@h4BaBVSRƒ\T…cl“hfŽow‹_{‹d‚‘p› ezœU|€LiyG`uG^oL__BLcRa™fj£_r©n„¶o~ ZpzIlsF^zPh‡Zo™Yk†X>SDJH9O`/dd0P]<O_>u\5nn@G‹\]sVHsE8nVHG?HM+NV2bd8Nu;KqL^_@Um-N_:[a8Ys6G†DN^GEZ7BR6GU0M]+[S,JY0Pd>_Y5k]5htGagJvjDƒK‹‹[^’i^r^Nj=Pf>~W7µp/¥ˆP»oa Œ]¥…rvTšŽ`‹¬f—§{ˆ·w‡©zœ‰_©{Pª€U—‡b‰”ZÉ’X×rC{ªt€ †š™J¹TŽ”držZwbtO_‡XwzTÿ_C·®I”® ¬‚ZahLkiH"yH 9!M)_q%8mO7G6;/$"77"IA`X)ox9sE‚˜X]°n\rZbmAhzCfq;ekAUyVmX>N_9SD1nA&ŸT.¸—a’t_e]pbAkb8UaSOP6LY3YH'cw;Ts7k€=R PTsUZ`8VR3q)g eª^‡¼xŒªiz»xq»€w«nt¡i^nR+aXF,}i$]„aE‰=2HBMI&TQ6eX3]g@JsFOeH‹HelOa[\W:HX3_S-[{2^aAMh7S\?ŸƒH~…|ŸuAPœ^jQ1g»K8AI9A)QH,ow9 ŽT¢á~Ò„†bf¡]|JLqPRY2Z I‰|9DJWA&:U+ET,[n>d?LP4 d1y•vͳ]÷µfqcRcbQ4Ma?|y9”€N†ƒQÿ¦[•ª–…zYaAqfR¬‚LWMGÐG/¸}k p¬[Ñ{Ž•^tu_zqGt‡H‚Œ9·ˆN|ub•YK}Nb[&ÿ¢X”Š’guMgjBCdE‘LWt?jw9x‡TG€UFH*eH%xk>_™opN5ˆyD„‡8†„FˆžP Æ£ªŠ~\Kc5€g/e„T^{@dzJov:V‘Oqd,™³ii~PgdF}¢[pU|QtˆVº]z·t©Ê~´â~”Ô„¬ÚfÃiE|GU_3yu2•¿n_t4MzAhx<Vi.Á›^uÄša…Kˆ™cY”dXQ,`^B5K-3X24a/9P"(5*@"1I)iw6™„L^{FK–=?U)Dd*eu*js<UM1¤:0À‡os5škS°¥w¹Ä”Ôß¡¨ð Ū{Õ”gêeYªeDq|@‰Rá˜q¥xvÇ‹}»˜€±„l„uCOC'H&;-X/)®SEÂOB©XNnI9–de°¢ŠÁÖŒŸ]™nCƒ‹Yt…Ub›K~œ^dnJi€M{Œen¢]kzOi¢M}~Ng”Ro†Mo¡YqžP™šXUšF<X0ioIaH7`BTr7FM6RO:h…>Xs-Sq9k™E‰¦y·Ö‹œa‰“P~´^zªY…SwzT¨§{Ï´ƒ´°`]BwS>SG/[94SJ8yuO“jB†}I¼¦Wg_0|tK‰‰OsvKƒpX¤‡_]]@u‚_—°|Žf‹`Æ©m†¢b¤Ž[‡Iuu<r€;faDhlEoO€—a¡Â“»ì£ ¬rˆ“UW‡4Gr3Nm:Yw<olFe{@`ƒF{“Wn„>bpW—¼p{xC}ŠPœžu‘£[xqJ}~LrWŸ`u“UX†Q~¡Z޲l£lƒ¼{v·pk©Zh…Pu}MvŠK’…P[b<\]LŽ‘r‡¤J{‹\‰dnf^–bf—es‰]z‚a˜ …¼Õ™šÄftšo«Í«Íÿ“¨Ò„«f‡ŽQ}ƒZ„‰gŽk¤Ž^…qNhuKkwa‰•rˆ“t¹Òš´Ðk¯_ªƒÀ¼{¾Qt–z²Ñ´Ù¸s›z]]ŒƒF[uO_~Z}˜kœš‚Ùg‰¡U€ŸOt”Mo…Iq‹Nl‹Jbq6K]-D^+CQ:Vh8Nu:Nz\\“xx¾™’à—Ž³]ngx›ar†Rq’o{¡h‚¤i†‡e‡†Vx[“UwrGfsYw£i„¯z… cv“`r“bzˆRh{Jh€Tr•Wv€IfiS4J,HH#aR$Ls6Ba<ZJ7]U6]fCnhF}xJa’NX‘g_q[MrEYmFPl?UkBBkCK`BdT/Uc.afEoj>o‡AS‚VJkGWj:Gu8>c?MW0\Z-Sd3~d?ls6jyRnlL}aB€e9ŒzGo‡WzycguQ\pQ{cI˜o>|N†kXˆiRŠkIfE¦qJ–žbš«vš¯z{³dxy\Qf=¥J•¤]RŒf[N…v>§lÄ£bÎ V’ŽnXuZWrYUvBZm9Un9ªX0…e)hyV>mLeO3as:)U,80#^>A|8DUO*U/.)0!FEDV:ŒG'gEpqe„“M¼q_…v~igzVi{Wr•Cq’UV[b`IM[5FW8MF-–I*¶n/`‘zk_ONL4cB1fpGhi>2Z9c7!\†9‰žOl¨XÓŠ]@âw-;SG;s_&|žSk mdag^Q•Dv¢cišgStYJg</VLH6#wd*’\Xº^OsWIlCU`6VW7JP?ze7œ’Tb‹glMShl?SbGBZ3WP&Xq2lm>jL‰VN¡{J_H“…B|šj–µeA\X2-(2-!HC#®xB¬á¡€”™c?Òå}jЙªÀ`UԄȉS~÷“dÅsY›R[‚BO}:gpByw>TkV/fA;Ï¿uÏâ«dÒ²eK{¹uGoPVq5¡f7{©qWiOé^=¯€Í—syxjškQRJEaD,åIoª‡zT?·xT¥£pw¸LnMxR/zP†E¦§dª©whXi˜L–˜L†£ržU8nl[[B©}Ltâ’ {;QF7f”VPP8WT4yyDo‡Kb—cb‚A™‡A™¢^«·|¨¬y ´x„ž^NjFjx4‚a8rl<q¬`‹–SW|:qj/Š}LeljZa9kZ1µv_ƒFo bnv7„p<€nLÉÃyÖ“q•°ƒ‚°]·š\|›qŽšnŸÆ}ZœR`}:sxBBi(Ia&ƒx7Gi0hB'‘v[`u\7\1CY3o‚bp—kQjTllCXd?†b@wa=_~AooEQlDJc5Ka/A9&I.¤[‚€^l€GfˆCS|849:/sd=¼ŽkÝê«kª~Q¢w[ĉk‰a“±vß©t®â|Ó‹p´t¹mmsBGi718!PB2f8/’RE—vbˆTDE7.K8([<+y_G–dN§cB–bGSA.p‡Fn€E`a3Oo6eC“KwŠFh€E{œ\¡rX™Go}Ffa8[w2d…8C<(‚~Y^>Tf"F['<Q)Kf3W`6Gc,Xc<„ˆJ–“k‡¦n“¬f{§UŒªc´šW¬Ÿ^²‰ZÌ~`¦žg¤¬‰zÃd|C,ƒG=lS?¬„Vf@(cF4rcCÕ‘z[\6Õ‡k–R~g=KH1ˆ‹[lUC`}O|—h«sŽhN†KŒfµß†˜Å_z†L”•V’SŠ¢Y~›Jˆ‘Y‘žWNx’OvŽJz¥RhLcŒHp‚Wx‰MošUkŠEw†Nt—QvœTuxE‚vTƒoR“m™Zc{AdyN¤y¶¿z»óˆ¾Ra|GqpUb†]Œ’}¶Ñ¡¯îyš¸eƒ‰N‚uMzsMi‹Jdg1nŠ<f‰Ec‚R{¯’»Ë¡£Ä”µÇž¸È…‡¨cjzb§Â ·î¨¤ÇÀꜽó‰°Ñl‰ŸMjlAur]Šœc„e¬—^qoO•œl›^„„h|¡²ÿåÄì›hº™ÙÒ¶ÿÀfy”Qž èsyzRk]—šYy’W|[‚e‹‹P`wKo“i–Ñd©Nj—Kl‚>abJ~ƒQw‡c–£Soy6KR1RcAb}Pb“|~Ò¸×ÿÌïÿŽŽ¨am‹u‚¢v†•by¢q{§ry™c~ _vŠ[rrTykFob7`vHaˆRi†YiL]vZv}S~yUr„J`tMaxKhh>[\OBS(@M(VG)lV*[<YyHT\CH]=Id8e`3|l9u’Yl•l\eV{VWoKMl>Hc<Jh9eZ0\[(IjElcIdn7YlCfaFQo:Eg@Nd?Yk2^v:pXGkB‚yBf~Y]iUp]B€V2„k5pd@}cGk@u{OˆlS’uCi€U`]HZL/fO.¬V9f4ŽxQ——_‰Ÿa‰dbŒ\dZOwG0€\;QIVf\ze8iq;}kMv—RdŸ^k‡WriHWk@M€HVzA7r;TF.LI SX(Px3L_=sP>AžD8KKCC#it/TœFP|S:o=+Q5A8!OW"FP=‹[4ƒœPmµw¬YxÅzX‹‡CVUX:8ƒd0l‘O`~YbsEnaBfS9^S7XR2mS=”f4\wGHZ\O='cE&Ih1>d=59%gT(’=~´jV—\–y@2€=OHB]z2kˆPa¤ER†[Jg7GM3YG#OL0=U0I`/OW)RdCLZ6wd3 TX¦YZSLJq4AF&NA'sd9U€WPQ>WY>GfNZY/nkHLŠ]^xC\€>z‰D•Sw¦lZlp§zGÇf°¸lŠ”iChM@4:=,„`4qšb}LWRƒWSOAÔœGäï´ÿÄÍñÖÿ¡Õÿ¡‹ä™dÀxWy\gu8N‚1Je*WQ3Kt<¸o:´°·â m•ˆ…`DCqWlr6[„GÕwCrß™eK>‰_C§VMrZw«jixT|pF—€Wã‘n‰¥qNƒc™“`UŸoŠpAšˆN¡wEÓ}\°«…zÔ‚f‹M‘‡GÆs`¸gy‘M¨œ]Û¬vž±wV‰IdY1s”XT€Yfi;hmJpm@q·anža¨šL޹s{sGq~E²ƒFˆ£dy”TdtHFf0Xk&€p3ÕwP‡•dHŽSdl-º³[sqL|~K»dŒŸapfSuL…S*S_>x2M_.|^>ty>€E•O¿Œ°¦e|¸Vm›IfªWmŽK\u9Q”Kee2Xv3:_+5h8/08K'WlD=tJvpGcsWWk3g±\ų~Éæ[¨kS‡PLt(t˜OAs@X5"ÔgRuE)¨qŒ™Cß¹}ž^‘\vÜpIw0~l3±˜p‚F©pO¼¶‰¤jL¯Ÿ[À«sÇ«vÿ®ž´cˆi®¯{€„M\`6wgCe^@vrO}Mœ\KweQw}GljC^X:—[E¸×z¨qYˆP†“WmkLed<fw7Zm?ef;nIt†Ja|:^•Djg7a‚L\<\x4?G+Rp1?E'¯qLM[(N^4Nq9eŽD]‹JKO,Tm;^w?bl;Zn?w‰Sw«[…¤r›©pŽ’_¿™p‚Z¬…Wº“c°˜u”±‰—¿d¸ˆUÃ’^—ŒLsŠM‹‚UuxF§|TžˆXv{N°~Lzu>PcP‰¯`x sžÄ^x•^޽x—”e¼d~I™TÊ£\ÇÆp¶ØcޱP¦Éx©Su‹MtJm˜BW‚9[•V‰¨]pPlE}‡Eg{IŽ¢S`w7_b9k‚R…ŒIm}K¯…[Ûrç½…¸zY©`¤°zÆÁ|ž©eÄ¥m¼Àxf“K[i<wkJjyVœ»ÃùŒˆÅm€¡W‘Ž_²g¥§Vwˆ1Wt@pr?ctFІ^’n™£f‡¢w}u¦z|“U{ÇϦ¤Ân²Ú{¥½h£¹`~”KYr>`jIm‚Xw«u©Âwo¢q¯©r””k’œ…ª¹‡›¢i’ŽqÎÓ£ÿêÊùÅŽ¾³b¨x›¦t”«m“¦h‡˜\‚šY}ˆ\‰ƒD]xDbQ|ªh±Íl—Êaƒ¶Od‡:P[1U_E`j_‚‚[ІGrr4EV9]~h°¬ØÿËÝÿŽžÉ_l€Sil£{’«px™^k‹gv–_n‘_uˆV}~Jtq>qp9XkQgXjŠP_‰Ud’Qc€LdnG_xFeK]ƒAVDfzA;F3BL0SC-^Q)}]2`‚HTdR_WDLq<YgGg\5jtEazS]taar^GzNGgOJZ8Ce8f]-e`,Wq:ShCXd4VZ0T]3O[;Y[<ed4wv:dnEi^M}fG„oDplBHaDOU<_R1WM#MG,ZM,o`-i‚?†~U€mN=oK:MBEL)KS,YR3pN-fM*me=bv?izK[pESK:a<)bF'Qn8MT<VZ0Ja1{g3˜F§Ýuð€À{“eƒÉgqÂ`Bžd9Y@DY"]c&`~=3vGvP>X™>[j^g`9nw@K}RP\G;h=:S7ZE0V„Bw‚\z•Jƒ™k‚¥x¢¾p]½|9poA>>UE)pk;suJ_‹RfƒFMfFPJ9nK+ih7sg?„l?ygFMi[bG6HF1VQ-Eg2TZ3‚ˆ8Z§Up‚LS“Df€KVœEr„Q‚s9h˜^pœUHšj3G,(? 586=[NI‰@Kf1me?]nEq[Ir–JPšOTbC@w4IQ1tk7NzTDkJEG/c/i|P‹xLx¡bq¡nˆ§lZ†Wm^A…N¢w›|g£‘X¬Šh{²a€cUn˜]U…v{a6a›[HmHeƒIj“X§™`´ÊjÛáŠ×ížßÿÄÒÿ¶´ÿ’šÂ‰gÄ‹€rpXŠJMM;]]&buB¢¬Qv{oµ‹T„ˇq|i<c9Qc4€ŠBšÂiþ»ht½Âh]<xpCiaIlg8‹_+©²f‘½vÇhÒ³ƒd•gq]:¿I:v¢zP™d€ƒCjœI–p<ŽyUÿRk³z^£]_b-¬Y6²Õ~Å‚kº®…´…q¢W’“J¼€Œ£oyŒ\«“Z¥®y¥¢ey“[ˆš_§r?`’]€ƒ3[|D…p6³ MrœWFk1Y}7b|9LyDr|7ozFLkAti;–àz¬žcÉöšÈó«±}]pMP`6Ok;[u1P€8Ia8X{AayRUl= ºlk>[u2>T#‰Y5rŒZMi8p„EO–[Wf,Œ¯m•°„boDQy@Fe*Sc0Xn2\m<O’J{–Q‚†VÉ”\¹’j…œaªl„Ž[€¼ubU“nKwh;\ÿ{aÿ~ÆÿÍwã•Ê·]ŽŸHg€Nfe9riCúdXÑšsÃj\„Sÿ–wüܰ¶¿‚Ù³|üÆÝ¶|¼‘g²Œu vdÿÝ®¦¾u¡¸mŠYŸ¢\‡P±gNè‰{¿¢†›}V«‘`›‘[ŽV~]…–_q~Fjx<_~AZ[9Xz;GZ+ptLjDOc3^pA\‹<lH€¸ue™[‹…LwR`z?]s;\r>\U8Hb(H;&mF5jvFs¬Zeñp{¢aw|S‹ySŠzR‡r]•‘njœOÉ‹bË‘e~cž®ƒæì‘¹Ü¸Âf™ƒZž“a’ŽQ–ŸTŒŠW„’TxqBœW ©}wŠO¨„}£XkxQ³¶„þ¥ÿæµÍUˆ²ušçsªÄ}±´dzœY¥d²½gz“QbŠNg’Nv—`‹¡Ur›BW†B^@kŠBjˆP¤ŽNu{6ooA‚]q}H™d^Ÿ¡aƒ{aÅš{· h¥¸t•gš_lr>`v>zs:ypGm…Gcx:akT¦¬£ºà³áz‹¢^•¡_‘¤V‰•?iŒ8Vw=]v4Lr4q|?d„Kt†Y‡¯z„¿Œ¡ÆŽ¥³cavFyHI–—Qp†OxœOg†HO`DQwS|™zÓõ¬æÿ¶Úÿ³¾ñ|ƚlj€—d—x݈Úϧÿß®ÿÊ„²Ìºè‹ž¿|˜ÁrŒ¬_ƒªg“¾]œ•Lr‰Mi˜Kc’FhI‚¥f§¿h›ÃZw¬DRf<acNwe}–Io€?o{=TlH\un•źêÿ”´Ûp“ªZ_zRa€eŽ¥ƒ³³_~RtuLds^{iˆ‰Tƒ…N€‚H`zPp™]v[~atj}§cl chUb‹Te™Xn—TmŠE^DLW=AX=BQ5UQ7l_5bsAfvOjgHQvG^[NdT7nl<PtIRcV``IPt@JxNVW;Vk0ao9Zn7Wh?M\:RY,\d3Ue0IY?UB7M\6R\6XN,dU1a[6g_ElZ6YT4DV<JJ/EM#=?'NB&aX'qd?\tFSwVHSBNQ;LY4EW9<O7>F.NG#Fc,N;,OW'J]1LC)S:&[>%Q_8>a;E82vB$Ÿ{1¤ÒV²ê~¾ò†‘ß‹§¼qÑpN‹i>UDLX0mb)kŒAc“Zb„Mr„L=”N,NML9!Qn(J\9Ze8YuFF†PxqP`VUUWdh;u‰_ŸŽm¦¡ogä`™ŽPuasXBm…AbwU_iSfmCh‚EjtHxo=Œ`FyyBltI€Z;inKLiNVaHZl<_o9†–IX¹d\xTlƒ6g SiTn±V9†TF>-\P%„i+6¸f;K?BT"1T6=D.SIOU4[n=Wf<c`AtyH‚—SL©ZJUFbe7]tImmK[ƒPhyLxX6pMacIlyIs˜YƒŸu}k\ykFgfL†uIŽb|¦_m“WMgF›>&n¦f‡†U—i{Ãgª}syZ’Žf‰v^š±c¤ÓoÅö†Óø§Øè’Áùµ²öާÁ‚åÑt£‹;N?>)_S3²·H\ƒroa:–„Euºw=qKT\'o Rµ€kŸð†Æüˆo¢“|ŠKw‡SaiRxt9ž}Hû©gÃÆ—Ú«y“šz¼ož¤hx²wwŽfk^‰ªerMËU|Š×H>qbeŽWNk=rN)Œ~GžšV°”U’ÏzWe•‰I®k¢šh¢ƒY¦‹Zª€Yk„]g˜OXWQe(ˆ†>Ys={q<Uf5N[.†g,v~X`~L‰‚Dc“Z_w<go@Ij1Œw0|Þ ÿó°úìË«ŠpNpFJrDlp4Y]7RhCmt3gmSnK9€Ur†TRlIV}BCc.iM&ŠˆG‘gdƒF<nIOk.Œ°o¡³‡pœrip>‘vEŒ‘Rœ’Xo¦`zh@fpB‘›dNl=\N(KI'kq=‰§hf©WO‰WoC.ªsVi’^—Ž]žvH¶X=ÿÆ©ÿì¾ûιÏò½FQ.>D)`A+’eA”V:×”kÔ•^¶Œ[¢ÂmÿêŒÆü¢ÔØ™¾ì›¾³€ßv§|W¦z`†|B}ŽAÍ—hÂ{g¢„g«uTšmL‰sÈhX„b“}U„wG©„_¼Ï‘˜¬u[q5an;yj?iy@\^8„uAUt@mvNbjFU„BT[4}pQuˆU|zFoj<RŒ;NG.-?#/L(Xi8^vEvf>olJÙþžèÿœ«©dyOŠtR¼•wÎé’›á|‰–h™bÅ yÁ—w¤›wØížåÿ§¼ý‰œ±a°‹a×r\²¥O¦Ìe¨ˆbS‹K¡¤‡Òÿ•»di®aa…;rmL«žoä˜mïÕ‘™Ä]žµ|¬Ç_¯›lŸ©Sn“E“˜apEm|Y€“Uh3cwCu…Gj…@lAj‡Lw•J“Yµ—Vt†=]|B”]›žP”L‚pJ‹`P®wb‡zXƒ¥`¡`’[_ˆH{™ct[tUz›Maz9]l?•{{µÒ}ŸÍk|˜N™o¢\‹¬Uw†=d{9[€3X|<bQxšVcyMuŒY}oW~mGpzP~¡JaŒC[’LY˜Rj’Qo™Zu¦wŠ´t›]o…d¨¿‹¾â”ÄâÁç¹ßÿºØÿ«Ø†¤¼“Ã⡸äšÅÏ…®Ó’®Ì~–³kŽŸe®t’ÅfÃo‘±T~‹P‡¤dˆ¨[q”Mf§Ip«T€½b“ÇbŠÁ]m–HZ‚Tv|Nnr9azBf’Nx™Pw…g©Ã”Õçq‹ª^Š©Vd‰VyŽb‚V‰KklHYoNo{`ЇS‚yOk|Omƒaxš\~§aj’Wc~PisSp|bŠ—f‚SnŽ]všeoœRb†D^‚C^V<_l>VbGUaCrc<kEfwXVwNIkHZ\@]`5^tAUoLLkIXcAdg>E|IMQB`S,ZO+QW6OS9`]3td1…i<sr7ja=~eETyEPYB_Q/YT+SQ8XP3`W3fK7IN3=I1LC&@L&ID-JS0UW4rS*iz7\€`EZKCI5A9&EH/CO+HR+5R+=0,I;VV+LA)P6)f>"qR0?o>&68i"R¦¦K¡ÏvžÎ~Äub¢j5gZ!I84*KGh^#Oo:ZSBds=xiAE‘Q0eJ]K&A|4RV?ns5‹žW‰¤jX”jL]_cC8eg8\{PhXL²gH§¡\då£e|‡h\FS`=gI;fc8gnKy_;t|I~|N‰sG[o<XRLLT3G=,UA'[V9Ld=†u;c±W\ˆ]_ŽQw’Ewª[ˆ©cf²^M\0}JG1(‡M!X·R:VXK;(;Z*IG.;8pD%S•LD_<DM=kC0s„JW™USOERX5~D}±aY‰hI{HS[8^T6`x=ruNm“X@ZPVI+P]3n{A{¡Ye€T€~IY—N8MH‡A.Œv:‰œpÄ}ŽˆržyyaZuQCˆ—L›¸XïÁeóÿ¬ºÿÉÕØÎÿª¨û´žÇr q¢SZN‹}>oïhf@a”Ltc:„ˆZCŽUFU.ßz:†›n¥–|¾ÉsÏÿœm“n:j{@`zK~‰AwW•—X·rZs–t…[rˆP…K¤rWmzgvpKgžN¹S7Š•iUJByS-ozHn…K]JƒŽUkŽdŽ‹M»\‹Ð˜rrKˆ¹jÀƒUµˆj_vZhm;lq1^‚CcpCO†MsŠ7p~Mbf+_f9bb0UV#yh6“v?XnFXm/˜C‰“XU}Oš‰<ÁÿÁÅ󿥇zrƒRA‚P.ptQWu3m›_clIlq8k¡_Ž«r~¯uNk7]t@@€9L_&]b6 Qw‰PtDKg;‚€Izª{‚”Pt„Wa¡YŽHˆ¿‚öƒÊ¨u¾–hel8k…Xcx@ySGn8RQ%yrN@:#TO,‡UÍ„c€N¬’d»í}“`¾¡eÓ³˜Û“{ƪˆÀ‚k…”jëÈ•ÿµŽøº…«rÚº®o߯x·™b»‰ZÖ}XÁ¦€³©k쇖ŠT„{Iz|KY^/„”X¨~VÍ•i~nU£jQ¥”w‹¬o©¬k¶mI¶nTÿÖΈ‡_II'YP,ptBrzNƒcx˜Tbf8kfAi‹Q\rAx‚VŒ’SiU6XL,XM/j{I5;7/=6"_ZC{„N‚«]luKËÔ„†šQm`=eeDlˆRugM¶£„Ýû›»´vœ¡Y½¿_Öª`ó¤yÙûŒÉÿ˜¬àtƒ Uš©[¥U–¶OªÓkä c’¬]¸”O~yG¡…a‡w[¿¿†x¾V|’Jš–b•¦f’¤]“§\u‡Mw‰Hx—J}Eh€C`~Qb‰B`wEky:Lu0\l8ƒ€J}¦_mKkŽGx‘Bq—J‡¥QDj‰V»Ÿr¶ºt´¢hr†LnŽN—¡VnvFZY;VW.ZiBƒ”]¦µvÏ΀«¿dµX_2t|Bšq®Étœ¹OˆŠL…”n“Ã]“§]l>j‹Ca~;b}N‘}T‹…aŸŸf•¨TdFrOwZcŒ\l’WdŠ[ˆšv¥]hŠc~Ž\loAVj<Xi;]uEwS±…¦ÔŸ³×ªØÿÆÐÿ™´Ì™Ã䟰˞»}ªq‹ªf~˜D_u`ž¶…¢ÄhŠ©\˜šUc“¼lŒ³k¯`ŽÅg“Ák ÒrœÌh“Ît‚µw€°iƒ¬`Œ¯^ŒšId‘Cp‰Ad>s–N€žP{›ZŒZtŒU|„Uk=dtBYjJh~[rƒUrpIlxD`rTdnShjQl€[k“H\{CBh>X€@^s@aoG\teušs|£\k€MY|QUXDb^BOuEicG€d;u|=nmUUfPW\Aj[>l_?irIamTknQp{NqQH~[KZPTP-TM!ZK&\T-n^8}^:ee8y`:Žu<qŒAAqWGN>YI&UL%OI/XE.^X/XM4QW3ET2OP0QV*OQ'K]/OU1pY-f1RžS?pd@P5TO-Y_4Uj@7xG&S<80K=NU'OS(PC(pA,iV3FmDD5L%ƒS’¶JŸÓv„ÐrQ™c*cL3<%%P):#B9<[#)?%S*Ot%Q]9Ng/Mz<_{IT‰LplH¥Ÿ]u£|XoqUkJRN@nL/]}?ImO[K7ea9£W8¤‘JpÉ“u`bVeDfL:e[7\lBkZ;nW9rzKs—Xi†V\|Q]”BOtGNZ:Pd;j†Dq˜SnŠ]|žN†ªi‹¸dÀq„¶n¦eiœb7fW:?,tG%cž@Lvl>C&<I/:K$HT"Ÿl6PÚl7VKAM3\S1vz8O‘W9:1Z. “y;Z¬ƒ€ƒVZÈwU€QZxHYvO`sFFY?6\1ZC(…u9p LQaSwT8c‰Ke\?hv@e€OydI¸xPg§‘npTy|Kf‰b„H¶Úh®Ð†Èæ€ÆçŽ±ÛƒßÔwìö‘°ÿ¿t½Žqdeª_š•E£åƒD{i_\-kx?‡€HHW5LS.ˆ}?¶YQE‹\Ï«p›ÿ¾a|o²r<…¡o¹¢^šu¡e7¨oJjZW‘K6~lKeVwa=jqRTfM„m>fyK†‚OKaFXR(‚‡K|ŒX_SlL<³{S“d_zO· Wqµ‹ÅŽIŽªsVV8Ic5VU#GW+†{/ToAUp8‡}Ff’oˆb{¦|Dšj€ŒJr{»sšçŠ~ŸhR…Tgn-g¦Za_;«RÄí½evaeM[œnMd8sZ:ha>}€MqwU_j<muAÂb™˜kjsKX†9™{JP~DNp5®U<›Ávn`>œyBY{P•œ\š|aX1‡eFqÍ{sY”xD¯¹¼‚ÜPv|FÞyZ~…\šcC>u:PY,CG)XV1z]7âw_ŸŠ]·‡Xµ§kÙ°…¢Õ˦›šjkC¤„cÿ±›ÿ¬‘ò¦“É|Y³xÔ—jݤ|°j¨ƒF–\¤n[xi?ɺƒ°¢ Ž[¶rN®ŒZ†|`‡U©Ä†¡OåÂ|¿™a±ši¨†`§žjRÓg¬~Už|gÿÀ–zaw€Pel@£`Jר”˜Çlm|AdZ4buLdQlt@~x;uf4^L8OJ1jO>QC+6;3< BD(@L&gd@ÖÀ~jU2’•OWs3“lHˆ²i£ e¯•o˜„k¿Ì‰·¼{‚£^¥Œ[¼˜^¨”_Üê{èç‘Çÿ‡«²a‘ŽK‚‚Iœ«`¥ÊeÁ³`žÃV®_ÖZË’g¡S™•[ºc—Ñn‡ªTŠ•^{cº–d€x?q‡Oo‹FmŽQZšWu±gk„BPr0a‚7Up4XkAvŽTvC`y@X~6cl5{‘S¤i¨¦]¿²‰•›dªº…ÒÒ}³šm·ªh’–X©ŠWŽ|Mx~Gj|M€‹dˆœ[Ö|̶fx—ShˆIb‰F’“]™ª_•¿fŸ«V}¡o¬Ä}ÌÀ}–OlŠKk}9`G‡ŽbЧdž Z†“XqŠ]ƒˆXˆžxŇ®t}²l‰¶hs•cŸf|£Ue’K_~>Qj8Xk>NkDazh”jŽ«ƒ¹ãÁÐÿ•—ªx¤Ä–·¼u†BZq?hˆO`p?_[R„†d™±i‚°g…´f§ÊiŸÑrŸÓv½q”Îk—¿^Ž¿jšÊfƒ¾z˜Ï£±é•›íš½ù‚¥×]u™Ae}<Xq8uŠLsFhrCaoHgTwˆD_x=UmC[`IcnVg}RizH_ySgtQalBZmI\tXjLfzD^tDcƒ=Vt;XoB[sXu„ZxP\pGTkL[iIltL6zS:SSUM3cX/Zf<RdA[]@dj;X^:WU:Za>[iCNs?WgGIeBAS>AU5GG$XBJU)WS5`T1]S2I0žl5oŒUSvdC^D>T.AL,?@*KB,Q\/]]9ik5Rm??^EBT3]M-`].Uh5jq<€~9bJg{YuzIƒ„O†Yr‹ZDa0dV&>&2(>8IS$XS'mS.ga4Kh;0T/GK6‘W'ާIs´t9zc;DC0F"6N"6L$<M'@T*-P' D#D.L_!Hl7nh2‡šBn½ox¦w¡žmO•zDLfUS4Tf,[c=xa>f‰MZkR^[4LpATA3œZ2™„@y®‹^n^eVKolLbŒQ€fFƒž\ŠŸo†¨d¨¶r®Ýs~Õ{U”a\†W‡Fƒœiv¤r|¬tžmgtX€|I{Š^Z{VXZ@7T76<1@B iW4v‡AC•e^4?l6\_+ve/ºxEu»dZtVrF[wM]{L:tH68(oA#o€Kra§`\fœZM–uYlNrzMQ˜eXmGJj6cg:Mk7PS5Pl7^b;T^FTg<IUNF6/q@(‚ŒGˆ«LJ]^?‰t7¼¡DªâŠÞý…âù Òÿ¬³æšÆùƒÒÿ¥³è¢z·”±¨YiÇ›u¨f\PIXtAEpDcd%AsKJV(‘;pKFxByU9”„Mÿžn³ÿÿH~h^)œ—Mœ}flNAWW9lV0ef<o]@q•NWoF…R2u‚^PuT††?†iJMA9Os>\q2F6(|˜AiV@žzXɈg{eZ];Ÿ‚D_—nŠ—RLgHCl-Jb5IW5Rb/Th<Ff/Wn(iu=WgDbC2m:'qP&x^6›„N‚vay¥^ƒ†Cy’U\˜Ynb3Ìk«·šy‚W‘œbheCvfBS…MKU*jy<kB3„J9]K+…„S€o[Ø—»ÑŽr{XFnmJ³€g¬Ÿn´m…b_‰T^‚I`a0[W9vb<©tRmº}–V…¥tÿ’tÃÑ–u}i‡zBƒžk‚tA‘o?Bk3[m-{|QUj7ŽuK¥~a™{Q°ºuž®y¨¢a»“]{[šyT}«o™~QÝ…bâsYÿëÜÿýµµŸqÅŸq›ŽW³¤o·±k²s²U”|XÆÒŽ¥šk¼•`jK•xQz™N–•]ÿ¸‹uÈ}ÄrRÀ j²€Y‡ˆ]–bGokAŽaMœtZ¡¬~ÿÄ³ŠŽf~‡]mi=•œ]ý¹¤‡î`M\S/qKUo<tt7ˆmH`t6CP'aC2o‘LDH(H:*E>3^™_\Oc~Eãÿ˜L~-jƒ8r•W®j±ÅŒÆ”¦¥†–š[œaÆl™É¶ÊvŸ•]¶Äi޾N—½^«Òf•¥exJ›®e¤Âi‚•Iª§a¡ iŸ«_±©eâqŽ”M†”L¢P©¥eŒNm}S~„P‹„DMs.Yw:[t7[ƒC}KgˆBbj4Rc,^p4VyMrŽYp—Qdj3wˆ\w HMs2qyJ‡¤S… `³º†ˆŸNžwîØ~»£cÜ¡[µŸd³”e†^ŠU“‰_¹w¦X{Wµq…£Uc}E…˜A^†Cƒ¤p«Ö†¨®\€•s²Á÷¿•ľr„“Xes9ZwE|W‰fˆ§Qs„K—t¸ªm”§l™š`‡ƒW€…RŠz]šc£j~§eiŒF[}>S`:Ta8X`Ce~Qf{RMlSŠœÆÄw}a–¶a|˜Jaƒ7RWw¤bgzRƒ˜gоƒ¡ìœ¹ÿ—®èn¬»a™ÄmÍp—¼dºj“´Q€œYލa‘º‚¢À¼æÿ×ïÿ«ÅÂe~~K]pB\o8Ui9_i>b_Apt:Ra7_nA]xHp}Uu‚R]sQ\€\m˜^s™jx—iwbw}KaxPh}TioG^i<U_:f‚Id‚K_}B`u>^}Gh‘Qe—G\{GsH1Sk@Cg]DJIGQ5dX3bb1bp>sm;c~CQuRL\BVZ8bb:OgAUYC[c>LuH0gE4C)89:HR?'YN%HX/vF4rw1j€IW`PZYAYi8Oa:PZ;^M4ge7w~?q~H[UIkVAY=ZG'x\,vy4fƒOYrFOZ;ZS4dX4|b;‡pAf‹KK€Z0fK&K2$+A*GMFT(`G NR&CX/EO%Sd-}r9byGHx\0S968'E;DR"4^6?;5U$4R"4W(G\*Rm9Qp?„s?бT†µt‰©nG˜s3`hHD4Pg,Qh2uU2‚n7`‰X\^Ph]1VnJYA5M[6ŸB2œ‡Ed›ˆˆ]O«‚CtžV¡}Yª¾h’»ƒ…¯|£«bo¶vLugj`>sz8k†Oxari•mZ¤rV~cb‘X“ŠN?fGNB<],Gc8Il9lzDƒ˜P_§nPkPXe1@^5F@*nH f/lyJf‚PZsPftN=yM_P3Zk:}xOua^¥hr_KgŽDY”„m’Pe‹\6yLaB'^s0]†5U`@t†=G|PMT4Xb4b€Dg‘\vŠS´‚QhÍ{HCn\DUI…t.˵Y¿É„Òý‰¹õ–ÊÐ×þŠ¹Ùžs£‚˜[ ÂrÇvZrYQp8zn@;ŒK>U)AJuj.j€TgT@lS6`k?€nCÿ qÉ÷Ï™ÿÜ’ŒkŠXe^H]R>be:g‚Bd\J‰I.ZUFie0nd8‘€T_hLw¡Llp=]T7ZP1Z?)às.l‰{’aEX86¯U0§§wN‹amf4]m:Ov<Yh/“r=paމ_djBVs:Pr%M`9Vs<EI-<5&II!oG&Ue<\],pL_sM’M;f{Eh†D‡tDU†^[[(g^-f|Jjk8jj8aœuct=J\:JU1EF+XK(wxHž|bÿ䫃‡|„Œf‰|J…uFÄ\@Œ—››[Ú²w…™lZf;VnTxxC€šhË…RŽ¡yr“U‹sVpNÀœvj}QºnEt‚`‰tQyg4^e9T{H•’g}uNÀ—hʨ~²^¤¯}šƒW{L‡ˆU¼uS™œsdzwÉdºaÊ£~ùË”æÆ¤Ñ‹n¼ˆbßœh¿±k–«\µ‚_Á¨lŸVÁ¬^«ˆ\µžZ½¦o ˆ]Ã^Š[ÕrVÙlr¬dµX§™X¿ dTv<tm>llU’[B±œuÝ™°Ö‰’MŽ•\®·rĤtÿ‹œº]jDu]BrfDg`7yK4iu4z‚P[œP¦oHkžOcxDo†Hž’hŽÀ{›ÂwÄŸ^k–Aˆ¢`“Ç}žŽ`…pJh6w_9˜k<išM›£Ú캽æ£Ûj¤¡Jxp>~°U“¦kÎß§qÎWye= ›} Ë€©Ão‘ŸN•˜^ɼ†ÄÇh|‹Ng{Fv S£t]¦”fft:_{>]„?ƒwN\w>frB`xB]…9Uw6n…He¡[^MrzTx‡^kGa~H ´zx˜CV„C‘’W«|Õ±x¥£_zbŸÆx¨Æs› T´—`ݲxòŸ~Ê¢cÀ¨g¦¥|ª¹`‚…R‚mU‰ŸW`™Bh}DgH r¥½| «rœ°|š±e§‘g¦“RwzEht4b}=z}_«ªs’¯Sl‡QŽf¢ŸiŒ[t‡Ii†K`iATfIsŠW€a“Ÿl{EYn?Ql?^|I\SlŽg²|x’Seˆ`~{¡ß€Çe~“Jc€Ak‰q–°i‰¤p¨á–Äü¨âü–ØÒow<PD8okUˆ¤b‚·Yw¨U|ŸFj•@aHša‰À¦ÕñªÍî|~²J_@Ut=R_3Jg<X[Cd}Iir:MP2UfDcrU}cƒ•d‰i}k•Œa•ky¬v”«g~žfu™fsT]{Ni}C^oBSoEfwV|uCZf@_}Pn¨`z¥Xb’O[?)Pm2ObRPOBIU;iU<Oc:TR<wWB~pBe}GghLSd@p`>Zq5^oAf@PU9cL:L4H? 2M!24078!DH$]Q(`h+br:]rIehEog;mq<_zIcn?ls:”…Kr‡NYx]C]L;R?UK'_P%b].Lg?KL3UI*M`-QT1O_4nW3\d,MoJDeD5fC6J+ID$<M'@J.LI <O ?S)]a(au-fƒEFpF9T<&I)0)@0HK'4_*=I'JVWp+p”Em¯Q_ªecŽ^‡“S}¹^jŸwjaR~aOYKUgBT{?Rn?_\4bk:OpBkY<qu@P‡ZSV>DY1iS)§f/z·X†œ|¥Xu}\‹T‚¥d}›]}”`gœej‡Yc’XX}Ql}CwˆEZ…]GjSWh=[d?peC{†OŠ…^Rœd^ˆUo“G`•VUpFMV<lb>J’TCW;IR/2=%+6 -.s4–u3WvOLG;c_1ZzJi’A—UjŸdz\]z<T‘pŒ^5n‹ZU™qFtR'O7C(cl%_†8‰uC¢«M¥”CNQ0.–Y1y‡is_D¢ˆKZ»^[bPld7`GŸ Q¨þ„³ÌƒÀÂx—Ó…ª»tm˜s`‰L†€B·ÆjŒÐCw[ac*‚w+}—P=zI4M&]Olf7Wj@VP:TE5bw2sŒI†›Vÿ×|—ÿÿŠvcgkHmN9_mArw=a‘X__B7dAT?-]a-‹K5j‡cnIHeJGH#^[1cG-vF0{³oˆCGI<=2%Ð]:„°›ErRV[/]b/Be3D5$OD+iP1qL4iŽIOs4^tQNpI;i;Zc1WF1ZpFƒqBllIrj5bvMZg4P_0ls9V^6Md-Ek5HX+f^*m’iO…Sux@\’ZJW8S\7Rm3d?Uy<›z?Üv_‡£õ„[{ZjEˆuL[B†|MºË™É‘{u}Uwi;ngH£€OÅœe¢ƒXinŽtJ™~bc‚Q®r?ƒuI²qEŽxIpj;ƒoF[_8‡oA™rC®…PÕžhz}F Zš´mŒ™P…‘T—tF¼xPާu¡¸t¿¶|Ï¡qº½ÊÌŒÿ‡bМ±œnª]¾À}³§h— R²¨fŽR’`y{F›uS¹‘fДlÝ}VÌœm¢¹x²«hÍ¡vŠrH‚lL…dG^h7W]3ŽŽ[ŒiFŒvQhbBnp=œx[ ±pÿÀ¤¯”_§o_ž´i•SU}ƒd„bFswMf„L[²j¤u°•MqO4œeW¤Žw©Å’¡Ø’Ã…~£_jq=qy8~uBÿõï[¸MUN3Yh2‹}Pq‹MºžT…ˆI‚rPµ«tœ¬e”Æh‚°L{–b´ÆŒÔÞzZw:mxS¡c{f<YjBŸ¦l˜·r³Öv–½g «x²Í{ˆžXP¤Š\¥¤Zr•eo¡Tƒš_’PlKt¶dqWg‹IpKeY»†ag†H~GgDXvM©¶—°a¦Yp£K§m§¦e‡a€™lžÆƒ“¸jªªa™©pÍÃÕ®p¶ jïpÆlúv´‰S„ˆ^…šP‚ŒGT5dƒ?Qu=w{Y‘hš—m¶eo‹Nu}JªuAmz<`„>m~L””i‡ŸNw]¦d‡b”žj‘§a••jœ“^ž“e¯‰Pi~CjoBPrNkžgf§Y\…Pd\išo·w—«t•½‘¾ìªÇàŒ¤®^p{E[rKw~ŸÈyœÕ”½éÖô‚¦´PZd:@`:7V8F^Gtœ^®YoŸLiU„¢Qly<_yPz“o—¿„ÄÓl‘®Se†Db{:Yr6Qm9\]:\Q6[K;RWDUxNs‹_}tOenRnˆ]‚ZzŒR_~YpxWgydo¥„„È~€µgk—jp—]m~E]q@`kGgw;\‚@YŠPp—as§h„£UcK$klAebQYRG[_>viPal@ZkN[Z>Ih>VL=UM0MV1RO1aT,f6_FT‰tOdR>^9OE,AY+KA2W@)TW-Qc7Zb:ko5Tw=JiBU^<`a3\x;nrW}|N}P_uWNgK6[;KG9ZB(DJ*9H-KA'MH!ZG(kJ-Wh8J_68X8RP,^Q$Ub7FmCCeC9J07B1DI.HE*PY+Vy<[v>Ta6?zA<Z89Q'&F 2;J<QW+?h-8K.Z?vx*z¢U‚«fr¯op›rvdh¯ka—lYrWJnGNY=a[:[v=XrD_k4`l1nŒA˜vH€žRv£€XuO_Y@zm@Ÿ’L¨µ\Ɉj¦€v}eŽMx˜in¥cXvachBu€A`ŠMmƒSWXLhRIj>Qf7Fb8ET9i\0Wƒ<iyFs~<sŒH_Ÿ_Q†_A}G_]=dj@9H9@4.O!--.7-1A9#š6!jFK\Jkr?žKƒ~O‚—dO‰lT<5<+VG?gR‹K']¶Y>t0U*LG ˆq*:€KyP0¸wDKiVX1]tLUa;P@3UU1ˆL/iªNSpTRp@”Y0÷·Z¼ÿžžÇ„¥jr–`¢¸V‡×~d›P«¸Pß‹L{[Jc$dp0tp9FZ<CY09Z5ANfZ+dhEjv:o˜Hs‡NsP@tY<ÿÎetÿÿbnn]~J}];^nHr†EvkGUoUsxETwNnj8_kHtŒUgTVb>Qo4klCqQ:ÿH«…|W^RS;R€Uw[/_n<hjcrG{d.—Š][^LlS'o~Nu‘QS~;Za;klLT¨_Bl?XŒ:goBmc?[W3Se=[u?s[;WšbH‚ODX,MeAHšZW_,So9N‘SrI)k~™imY=e=P>)Y‰C\Z(Yv/‰[GÎ o™[O»«}iS~€j—†l‚‹iŽŽS° u¾Œl…—e¤q@®‹sÆ‘f»ƒ±†k•y\iˆ\kT>´tSg˜q_n8niD€‚XrZ‰q9q`3rE|v?ˆ„Gr…^šsQ„tR• U…{>qt:¸qP‚cå…kÖ™d¶¢t³žxµÒ•ϧ•¨ºv¯ªtÈ^µ„hír¾‘b’œd’}C¦a•¼hsPwªV¤˜f˜yOº‹i²É‚Ïâžµò—¬êŒ§°i³vP‡•Zž…\TGÚ”„g€H~}GgpG¶qYÍwdˆtöÝ©~µx‰cŠ~]|šm¬kä¥ŽŠ‹f»ÒÿÙÍåð§}A~vV©¾ƒ¤°‚Š¡€Œ½Š{ªzg¦^rzJ’rNZ|Aÿ²Ú¢ÿºw³[‡°YˆG¡‘Q•¡QuLgn=ge?k~D™„RËc‚¨ZŽ«qÐè§“µ\‚£_zGV^0On7ŽY˜š^ºp”È[ƒ¸[‚µi|˜KwnDµŽpµ s¢®i„“WjOv|TˆŒeØØÿʶáltŒF…¤]T”QON\ž\UxKSm3OnJ‹–X¾¨m„¬`ƒ‘L†¦e‚†T£Œiºt±©z•¬Sr„Vډȹ{̦m¸»ƒºàÀ¨gšÂZ`q8tNs‹Gq–Vi›NZ{:Ru7Op;h{R„‘s¬¿…ÆÀr™†S}u>rHm„Es|P}ˆYzX‚˜[†–WtŒR†}j™ŽX…S¡šUƒ‡AŒ„Ao›cu§d{ŸjŸhŸaƒ˜a~gŽ®st˜Z{š`¤l¥Äލ¼v‡¥j}š_o—aƒ®‚›·|°à¡½Þ‚¬Èg~›\vwdŠn|‰ÎˆˆÎ~޽t‚¹rš¼§Ð…ˆÉkm¦Wƒ°S©`‹—UiˆF`}?Z|EXv<OV4<C/;I5CO;YT?V[@ja>R\=UtEopCqlPŒ…Zž€HimMp©v›Õžºá”¸mxž‹°`mGarDafC_tF]†I`QmždtžXl}P\^$We9JGFXCGiT6ŠvIvhTemOUxNBmPRDBI?)VF,QW*k^- c.c¬LKB^YSO1]K'OR.XZ5dT._X+NV9RC.PU7R_3U_8me9qp>zNfUV^SPPBRP1EY*P_0J`0RC04;*42(KAjAcO%Td3R\<UZ4U[-@i@PR7_V#il1LyGL[?O_?[tFURg„RTR9oAGC1FY.Cl/8_&8?A@A9!<?&%A%16 Y6rm&t©U¤au®gzd‚š\q¯gU t?ybEK>FJ/ES5S]2Mi4Rf7]g'xp;”Hº±\ˆÀ}ƒ]—mF˜T’°t”¾t°½tŽ»q‹™s™Ÿhr«tM}cNPB_`)Tt1[m:OoDgpIRyHM~LLrMeX/E]?WR7db-Ym9^X4jd4e L`‡UQ…M_oKa]?:v=;606T+6+2,$2)u@•rBjs8^kCSsB{vBg‘mhRN>vML@4_V.2}CRF%d(E¨a:W;Q] ™k+Ux\Ni2¦v9Z”LSgIae.8rFCC-TJ(X*b–Jeu]T—MuKÑ _“Ãy}¦ox”M~…Kš~Iu~W£CªÑDƒh;Q(BS&`P(Ms=jT:…\9S«YE[=vl(]ŒR•?5QtQlr)btBuj>ÿÂ\–ÿÛSt‚i†AbYNl€?bpERd>smFfgDLRFTX6gO-plIp[AU–U]V2\L.±V8‘Œt]µi†SƒƒO?O:T6$›Y9vš[QrC[b,§B*TePˆk(h|FQ€Azn2WrIHcŒ^T…<Jl7TJ(`K,Ue>dj7y‹Qg]?…‘V]vT[qJOzAl©fA™hjM,deP`|R”lExžodHI§}ZmA6<&U@U{.a\3a„Q[\Btc?;7(Ša>gaKjnKµ„UÿÓ¢ÿ¸³¨s_j9noYzZ¡gR–|WrImq_naT}m8ŠpV]”ZmvP„‚OxxB{}Qel9kuCgEjs2vk7€‡VŠ|Hw˜Zs…8xu9£˜[¦m@©xEædàƒz¦¢†µ‘xσo¾‡tÖ–}ꣀãvä’}ÿ‚••jgmT‹W—ªci¢H—‚K„–R}R´§qÀÜ”ÆfŒ¢Ll›S…tJ„V”n?„MŽm=x™RkƒG„‰TwoO˜b¨|c”r¦É³¾æÔqÈ[nz›t²½´ÿ×¹ö÷ÌüàºÿÛ˜sŠGld‚º—‡µ‘ µ¥š¦„~o]˜qLˆa@ksGã·±ÿÿÿ¨¶vˆ¨czšKzM“…P‚Y•²`ƒ¨PŒtKw>ŽƒJzEjoB›n[©ªk†—V–QksCt‚T¡h¶»h|…P}ªM¿\‚ÀWn…BlhEªuM•d~ŠHsf?wIª~WpyJ£’ŠÕÿ¡”Â_bŸEooU´Æœ½ÿÏÞÿç¸ÿ¥Y}A_…Tˆ“hˆ³b©£dt@¥°‚›£h§ŽyÚ“h„K”R„U¸“jÑ»i¨°o†«k¸Âz‘·oœ¹onwBt‚R{šK{¢a‹«`€˜bc“Kk€Wº¤f‘Ÿn»`Ÿ—jœ–`„KjIfˆK—cŽ¥_†£_s€JxwOx€aš¥x¢°pŽ¢U{ŠA\}9_ƒW‰šŽ¨½amŽVnˆLSp9N_?KhMŽtˆµƒ´Ó‰•²j‘Á™¤Ü’°‰««l…™n‘¬g~žf“œ\|Npvsž°u”¡Uzešµ£Ä쫶ᘞǕ«Ùƒ™¹‚˜¹™¢Çˆ‘Äbw¤Lv“PhuLa„N\~GUu<OuHiuGac5;I+5>.;I:GdBUoKt‹Ots=R\<fQG€uLqtDk—Sv¦e…¯|–´m{‘ci¥~„«adi?_hJf|Ro_lYu›[~žVoHQnLMHIY2[J=QX7~D:‚p>[rR|OGZ}@@wTALCLE/uM-kb0io<¨l9]«RJ¦GR^NC-gO&uO,j_4cc8Oa2EH.PD*PH*\K/oa3ˆxGŠmJkˆX?c_=BC48%G4 UG!`l1Sr<@hE265/,4=B?i1`Y)LnBZR9VW0Rc1OmGSj;Na*YQ6}e5|”LŸ¯l•ɃfÀŠSŽk:mC@B%DP*?R+/[$)<*19=;H<E':E%S1g? jl9a†Q^kGhnC~Š>x¦ci¢qKˆnM]GM]8OL+Qo;Gv@Ql<Tj-pqC ˆ@²¨gb©m\`a¦c6¤µU™Áy”hrmVdˆM{‡M}•QaŠ^PbPJY6Oa-V]&We6UlBY‚I]ˆW^…ZR“bUxIDeCGV8YH)FkDF_8hh2h:V…HKp9Mn@NQ65g6AD69[!;@#43.9"A2€D"Kb?H`7NH+~q:l©_4ZTF4E8zM4ƒ^1BœrGk=K]1FU(Bb,Ru)ap6M‡:fd0‚|L¥…T=oMSJ-T{5Bi@O_2R_8~v.}fnUQmGaS8zt/wwDn›KH…?]w1dz<¨œE?…f6G&:DIS,VT;\‰Yes@—ƒMOˆS<d0k`<†FKO>=P#~Vr¤Kt’W³¯W¡÷ŸUk€£ƒCfŠrV•WZ‹Jp}Ws“aeŽ]g\QBeCVN/VvLUy<u\BM–[g_M”³r¬šq”–‚dkTo‘PzvV|y`q}N~sG\{D…x:SqMK>)Ut5Sh=Zq+W{>h‹TaˆTX€I—|2OždIi<†R5W®cNƒO@Y4‹Ku¥€cŠT]y9PU6Ÿ†X¨aZuáµz}\uvPŠb}¨m{xT{¸‚;g@lk8{d;{l>pˆR`W@jk>j}ImpHwX>~iF€žSÿ…~£•{‚oYÁlUriY[gLØcM‚—y††\|€l huP]8_T/…†Av \…´aŽÂk±Ó‚†R“ª{˜ÜŽcºtt†LY}Q™jVµ¥ˆz¬s|¤e³‡YpxLgU4g[;ˆwJ¡Ñ…xˆ\ˆtU€}J•pE×…dÂm§lsTsxPmrDcpD~”Re‰?k6€…Iˈjïÿ¼Öÿ¸‚¿m_•?–a¼xZºu\’§l¥Ýxaˆ@hwGv…J¥‹e³ƒg´‰oƒuCl|N‘”|£µ ›Ö³¢ÂŸ“¬Œˆ¤h„†HÍ xÁºeÿ»‹˜„GrwL‹£|£À’¦Š…£{T\;Ih8OM1g@-bC6`ˆH²™ƒÿÿÿš«c¤‚`“€S²X¤œSxIyiE‰ˆS“vJxH‹T`ŒE`g<z‰N“^“šVš¥^‘Ž_€—_£•b©§d¢²g—Çf‹Âh¼÷ž|¾YtˆQhƒN|—KwhG^V8_e9peCnnN{vS©ŸdŒ§k¬Ý„WQ›°§ÔÿÜØÿÒÆôd{Js‹lš¾yŠ‹M›uT…yD£ŠiØ„s骪o|‡D‚ŒKp~\’–YxŽV•«o®U~g’®v«Àmƒ“`‰¦Zu™O©n‘¤XwYœ£r’›G–€Rr‚N‹°b¥p£”b‡‰X’“^““^›ŸfŽ—k¡¬nu„Xy†Wyy[—“]¦ˆJzEbyKdPjœh‹¡i…¡`w–O`Qp‡YwX‰b••}³‰©d{™l±¶”ȶˆ“©jƒšZn_|V‘}UkH[j?Kp^†—iœ™Z•q´¿ÁÇœµÁ‡ªÀ›UlyRfuj“‘q—®e{¡KhMj™ejœjp£WZŠHdP}zOp|JJn8=Q0GE9EF@\gRr|Bku=MI3SU<gkA_uCiyMfySj„Zs’LW€gv§w›UhFdzQhŽmr¥lŠ©_v…LazK^nF]uPEOPX4PV8^ZF^S@[^>QO@oZ7by?ZoR\XFeP7nT5V^5bW7ž_4V¬X4Œ›CKYLC!WK"U?#HC,ZL2j\._Y2S^BPT?]L7sJ6ld?ikK[_EGF;1=267$G7!qK"n,`vGFtR:^F.>)78:E@C d7$QG(TR0SX/qW4eh:FsM>l=JQ0rG' u4ŸÁr‡Ð—c¬ˆQx_<iF:P03H-E>&?\)4P$.=%K@*BV*6E.)B"82L;HP*Fi3NT+ic,a<myJWwMJoRFW5BS4^O2Ws;KzPSrHGyAlqEƒ~<|˜iv_ˆœiš¨Xn’gKxcj_A„|>ƒ§]i’b|qMmnLTuJXe<Zg9[^>ag8fi=cJ`ii‡]Y‘fKrSBoHHI4KQ.@hC=\6Ld-Pi3@e5O]1Ah8LbDQu58^E>N%;@$A:$5<!02's; 5N4C7(ˆT$ˆJH¢n9VC-D&<<!8C%[9$V`(Dl87X<AH(qn+V’GWbAQx4ab0¨6D²‹OT/ij/‘¥M`ÕnU¬fTiK†k1I’SdzE7Z5AF'JS&~V(l‘@‚yB]{Nƒ=Ah6>'<@!:A(8E,UR*S\.uz=V‚G;R/8O,^Q)OŒFBm:8U$?DVQyj*„’R½äsJ¡ŸgV+ggDJnA~U(ŒsR‘r_‚mUw…^{}Zy|Z}cˆƒeyzo“q_nŸ`IK5LG#tQ.lbLmC{lJ…¢]uv\IF@Ya.Kd'][%Xn;Zu:Vg*n|Fdg@ll=ˆqCXtK]‚<WiHOc=HU8€r8²¢k¿ÿ¹†û¶]yMeo:Fq>]L(–R?dpP¾ƒWzÈ«m wT‰Y‹”Wg¤€Ç–dL¨Nc;…g6‚z?ŠlLoiPqT=c‚MzO>x~JreC…JdD=«jV{ZLÿí¹ieQ[uBé‡dºšvqƒnðˆb°‡o‰es¢F€’LojE™ˆUlQj†UÎ{PZs=Vf3‚l@†d_†[Š…C€\‰œ_|mE¤‰[žz\ŒWx{[csV‘†[”³{³‹n²žl i¥‡]Œ”`½©o¼é›ƒ¹q®Œ[‹‘l~}Rn{<_f9^r*›€Dʬr×àš›Ç}ru?zS~~Mœ|R·£_·V¯¤u‘ŒI™ÃZ‘}`œ}S…fO«Ša{‹Xo“[„˜k§µŒ¶Í ¬ÄœŽ£ta§S^—?‡¦g”Ç`È«`—±Z‡©n¢¿fAC#8+N-%RB/a];aI6RV:`[?± q¿Ëÿõä“ÐmŸ’Q›§IŒ”J©†Lu„?vCXyHq¬fzL—ª|—í†h‰Bi’HmxL²†`¨¦d¢¬g¥˜h™ _™˜cW‰ˆS”¦b½Ïu»Y‘˜f†\gp?iU=pQBvƒ[zGˆyBq~=Uf4dnLÀÄ•¶Û”ÁùÆÈÿ¿¿Ý}ŠZ~tY¥p ˜„{¡Y}vL|„JŠ¢g„Œ\ˆsS”vXwxG}‡Yq“UivImwLj~Y‹Wˆžo{œbœ©j›Yv—Fp\•–iŒ¥[^~FxoS~RhLr–S£°s¢‘a “^Œhª¢m¬{—Ä‚™¯€Ê¨{Ž“m““mš›X”Qk„Nni\‡ˆhЍg|ŠRewAc}Prj†™by˜Y`€Ka~WpŽaŒŒRg€CcyDk}W€€c}³x€À€…±lm“Z`|]y‚SwZ„®b~¤jŽe¡¢fˆ“dš£o‘_jcEGUCh‚LS~XaŠJU]7YX5SiK~gy™ZpŽNjUqžUwŒZ†¢iq‘KRW,?9+8D/EL6ZP8V_?`qD[~BSpDRlIHjUY‘oy³XdERybt›c|›MgŽJl˜^‡¥`yŽOkzAUs@EmGPwNd†VB_&j[9_s9[sHDpEMW=eH+il3ng;ZxKOTP>J:EH)G>*ZG(T+c™IM„“DbX?N0XL,SU"\U6hZ4oh;llCc`K]]Fg[6Šg?‘…SSnXAIJ67+:-K4!QH$aY'nh8VnCLaK5dB0D057AHCE=C*D=+NH'HJ0b^7\p1Nw>Gx=DlA`S/¬t1šÉbs¿WštL‚a?oS6N881,G@B\+N]4eS(Sh>AUD:F,9G'@K&UD'?_6>G6M[&^g.Pu5@]8TC';I*AOCOV-ed8dn=S{NUZMZc8ixMƒCm˜_…‚X‹¢[oŠgh`qH}rC†NcVlpRll=Ug>eo;re<d{JdmHZk?b`8m†Na™`c‡[K…]VrT=n?LR<OW,FcJHn>O~<AIIu7Wu;b‹Je™QT‘K8cN>KE;=H*L>#ZB#gX1Ow@QoBk0™~N=‡N;>.AU.BK4JR(Lb4T`=Rj8\|3P‚@[d8Pc-KU0Pv.o{Iš¬`Cqrb4b¥WmtN…t@“œX\Áyx‰YЬQe©qT‡G;]:3I#^YMd.r™7tvIO—L.I6=18G 51!:46(W[`j4I›QX`:;u6Nd.Ti%Ha#/Y9BMQjn2‹”GÿÙgZ¯Èkg4Y€TL\>gQ3zc;pR=lU?ieABZ=eR#Xi?hS5DL6}h;xoQW¹`AG3:%j_:•ˆJŸº|wœw„uQmZN^EOk>Id/EV"?Y$8S"{Y&<=EX/Ti>bpAV?]‘NNkDKL)h=+ŸuJ®ÒŠªV„¶gmÀ„a³uf¬f¡^l‰\_ˆj‹rL¨³„x®‚ƒ·ru”e°‘h\ê¥}kMŠÀgˆ—U kR‘…fÁˆhdr^ku<†xQox3nsS¤wbdTKÜpZ¨’†£‰uvf7Ê]JœmX]zZŽZ3p‚?Pi.g®nwsGpR§ƒWlµ|^˜Zˆv>Tj6n}CQw@^dAhŒ^[q=‚‘SxoImsG¦zH¶»Œ›Žf’s[¶•x½¦vƒ€[yLŸmT“jÚn»tKµvWÀÄ’®lƒ©_—«TŸ—XeŽGWo:Tr&›;—¯P¦š]jmJxxK…tFrrPp|Aˆo<„_Dnc>_W;oV:‰_6hM9½‡Z…uCjI9uW‘~j¢Î¶¥œ—tViD€_Ii:4kN¤›]³Ë{ã¦h|ŽO‚’L;“GEŒO[Y^§dMoE]pPyŸp…ÍxzV –cÿdz«Æ~¤c£f…—S¦–[{~M€‚WªÎ{ÁË„^wG›‘z´c€£LÆú´ÿtŸI‹ŒP§¦]ŒˆO¢²o½žq´£n³¥b‹¡\}¯U–®b¡Ž\‡mHw†V¦¬pªp¢«f{…?s}=]Q>ŠmC_vBˆe®Ô™ÎÿÑìÿÌ—Õt—ʆ“¯mo†U¥ˆnĆgbv:luC¤·k‚ÈosOUsQdmP¤{iǵm‰ƒk¨d‡LyPŽx‰½sƒ¬i‚–[€ˆN}„U{…ašÎg¥Qn…Bg~L‰¡[„Q…†b¥‹c®”g¿¢Üò¬»îªÝ‹˜¬l°–qq Šc£žQƒ‘bˆ“^‰ŒpŸ ax“RZPZ„IVVr–io™ih–T_\h™^cŒFVCw\ŒM€‰Oy’† íϼﬖÄz„£jªy~›`o”d„©s›·‚«¬uˆŽY€„P™¡g”¥Xˆ›\ƒ¡mk™wv±fh?8f12^12b=EeNi}?Vf?g†SzŸHq”KeŒ]n†FO[@ESAIlAQ[:ghOnœooÀ€‚ºka–Yc’ea‘¦á®Áï‚HO}Sl\t‹?cr>i†H^wB[yCMn>QwOZ…Jd}Le{B;b0OQ>TV4W[5K`?PV7cK0`j2lh>EwM<MNFI49^6AI3]?$—X(b¤PPŒŠKkjL_<[f6pb3hq9skH{i=lfHaUDmV?¦h9—RZ’hHSb9A<*3+9'G+R< g_'\|;`dFH^?@UF?]:GN3>Q/FU"OW%^`1bf?XpDWKRzCi<n›G\ˆVŠvJ˜žO{´qy–u‹œdmÀrJ¥Š(mV.1/C+UDvp7tHQzL=\O>F+>C+8M*J3 JR(@]D_`,W~-Rl5=r8ZS+bi4FgQEJ8K^-^N,Ai4R[B[\/foGk‡Ca„F£w=ˆ Lv¢}k†ZW|RfxM@nNYC>og2Tƒ?X^?Vb2XO8YJ6Jk;=K4Q<,`P,_~DPkQSK<CcDLgS?i2JI3O].`\4ctC[„N_vIm‹Bfªcbœ`V‡X8nN<Q/YP*ZY5Dp:ST.D`8RT;|\9s MHqNF>.=I8OJ&FV:PL-k`3YZ2vi7c{ALe@Pq9YwBWqNž…6¥®lQÁ’GXYNP)`T6fX=QwJ`{W„w9ƒ«bl®so’\6vH9A&<P Sj&a_=Yt,T…A?‚E*E(?-FA%!1"/'MX!WZ/¤o;d{UNShB5I^7Ls3>d(5P7JT#YgEn‹Cÿ£UYÞº‚pIlghƒgYiOY]>yS1zo7ƒkF6E?wP&ÿ±j\_‰‘M3b|\p3) lFkÁ^lM6Šd1§ƒQŽØ˜˜qN’sMŽ›dg˜RPxLNk6H]3Zk*yfEN[9\l5Pv3mq9^}RX“@sj=a|QSh?ƒvC‘Â|„WG>ŒKc\!cX1^R,Ž…Hs•[nvF„ÇwŠÉx{h~h;l¹msoPÒ~SÅîák™sœœVyÁs‹uP…|`®eMzzG–nk£m‚AžuX‡e¼¦Êw_‚dUŒbK]hCk†X{„Ik}S†G]rRKY' ˆcz†bv„TÄœÂÅ„§Ìjšcd¬h[wQ[b@n˜Vui@SO/ŒqFSI3JD/aB1ö¨ÍÀžˆ_ˆ_l¢\€nD‘_¦vN²…\ÿsa–¡rVb?z`†L5”kP¥rˆ—Ry‘YrR4O\(¦L½Ñy^vB[Y5`a6YQ5cEk„K|’WŒ…M_n<_j@kH<WZ=^E0¢bˆ¿lVP2hWL@PA*AK54I+/'63#II2‚žFpZ2~|D†V@et±gXx9nyIƒ¯s¨ã™¼Ð—Îþ©âù·Åò›š³n§©ÿéÓŒ¯g©|`¬‡d£«rŽŒ\’ŠWz`ÆÌ¬^trIdyQt‰N–Þ†äÿ£ÅÓt‡bެd€œY…¼[ôjž£jª“Yw”K‹SvšO§¯v‰°gŠ¥e‹”nº¼’œV|uCk‡Fm{FeƒQu›^hŒS~‘^©Ô‘×ýÌåÿµ}º_‘¦hƒ†PƒbS¢zUtjBo‰9kšH‡¬d¢’pÝ êœ{³ŸumpOŠdY¼¶‹Ò“rpSl}Dˆk›ºm‘µbt™LZxBcyAn‚k³Ù“°[lk@q‚O]<exB{‰Rˆˆ^¼p§¯–Ñê °Õ}¬Ì‚·Æ…§¨{©±u‹¯j˜¦t™ a}–\xXdƒLs’`}«uv½nÈŽ‰Û¡—Ö•´kx™iyœ^m˜[t‡Rh„ZŸ³e—³mˆ¸´×ÿãÛÿ«¤É{~œi‰˜p£q}µ„Ōͯ±xÓžZ«ŽV“R…Pƒ‹\³˜Áð±Âß„s°td³zaªjl²vr·q_–B@N3`u<k‘E`|?d‰T~¤]|šf¯pŒ«V€‹Kg’t‘¹™§à› Ö”ŽÄ€x¡nn‘’³Ñ¡ÇÓŠž±\dˆLcƒJ]e3>U;[pHbJdwBWuD[…Rg’FQq4FX:3\94J7@?.BC*8G#J>*WM%nf2l}6JwRPIFab9=y;=HAeC*¡`/p RV™—RglRUBL_9d_4eu.`qF\g@ZcD`T8¢b9‚?rŸm\rgSWO7T:%?.& 5%Q8cc$I†=ZgIRY9~_:Š…E^pTQ^BXd7mZ,ob/tŒF}“Vq¬]t©e†Te§[ebYyoB†šTŒŸf”§hª¹†È‚Z´Ž:„o;C<O=+fS*‹l7nƒPS}S<bD0<-9C&2D$>/"VB:W5`N0Qx.Yi@S?k?„h@He]JVGB`8;E.AC$J\1\R0Re<Wa:bo6…p8ŠHU‡bleDfRLƒRU^EjwD[}DOu?CQ:PM-GJ-MN'IW3ER83K3E9+PU+Hi7WG/`b7H†^AfB=SC=H'@T)HL,>M1[H*oh.m“N`’WGvOEZ>Oa4JX0QK8R\2BA*K3+G>-_S+f}>D€`ƒO4bI\jVWiGihFLoELI0K]$DU'evD”Ozše=}cL?#’w9_ŽnPlCQU9Cn=UF2n{8emPcnWhu@ƒw@R´j*ZIAC JY*b{.FgFZl'e‡<2U<"2"DHK"@@%Lc$g]8KoCc?1`Y3fk?O’M\cNJu@Ea'9\"BJ?T,OU)rt1ÃŒI¶\„d—[V‘\AaJ<–V;]rO•‚IQeO99$©E+~l\LBª]c·kffCoM9’Ni]^pK žX^¼ˆÅ|I•abJhp;ÄcB„[R`U.QJ1IK'Ym.€ŸJ“]¤¾h|·w’¥]î”—ÿµƒà‰™´twg¥~YHŸfGr9Ot5Q‚FbzFh”Mll;cˆ›wjm=yƒCM¨fiK3 fÙšl»ï®è׎˜’y“±uww\‰Bµzdž}oxC±·tͰµ¨}¡¸~{æ“u»o‚–ls€X¥†jzx\ŒƒZ—ŠdNW,Rd?—‚Nh]}tQoWÃ{ZÌyjˆlTÕ‰z{ŒhWp?loB_O5HR/˜P.ezQw{fk”odžg‰ò¯ wQS_LqF‰mC„ˆ9Ÿ”Wê–`ö~|¢hb`Ea`2q•A¯\ª¤uv‡UTl:~G±¬Y‚ƒERh8dh8fe<§oPÌ©ˆ™Ð™›ÖsžRPj9’a9tmKx}HxŒD§ƒaŽ”T™Ìlc«ÿÀYuO†¦VSœB@G.„rPÿÿ‰Ö«ZPJ.`]9_€Ki~C‰bMOx8y\F«¾°Ô€½µ¾æ—Ûºƒæž†âƒ¬®†ÿøÎoU¤Ž\Ÿƒ]õĪÁÿ§Äÿ }¨a…ž^x–T¤Ÿ]ÉÀi‹¨Y¼¼oÒÆ²éŒ†”O—›[¾ä¶Ô…š¤h®µf‡ŸR„I‡‡WxO†žK‡gI“vJn…1Rl,_g4Ux9Yp6AN*R5-`P?wD4{dÁã´ºÿ´Ïù¢Ðpf’Usx9ZdM|xRm’;t§RÍl†£Y£…R¡”k®«‹p¾ze‹…aÌš‡´‘d•t]ƒNz˜q¿j¢[sF[‚?QoFršºõ ˜¸^g„Or‚c’Vk|FVtD…‡dª¹†¸Îy®Ì~›½fˆ®w»¶Š ³w¡¾‡¿Ô®ØÕŒ¡›_o’Xe—dw»u…Ο²øÄÌÿÏÐü½¾Ê¢¶is’ap›kz¡pНk¡XaS„…\Œ}hœ¢ž×ùÎÐï«©Çv¨it“h†z–«„¥Õ«Äþ–˜Ðg™]¤œd£®c“¦Z…aŠž‡ªÑ ´Õ€”º—®Õ•žÕ¥¢ë²¬ò¦œÇdQy:Ja.\n<Z}AX“Nk™[vTxšg„˜C_oH`h^yz¥ÁœÂ¢¨ç’—¿q~‘x‘°x‹¦rŽ¡fv‰G_rBNm<EhC[o?Wb.Ha7X…Fj‘TvRh‹DKh:4O)/=',7&79#A@ CF#_T)hb2js7NjM^TDSj6;b=CI9fT.£f-d©ID“DNeGN0C_0Zb6eb-U~DWdJ]fGvf9´f;’wEˆtYr\O^RMKFC.U6;>'K> `X)uw<a™GZt[bT;a4\šPCLTJ>4LO*_M+†P%€5u°c~£b€¡Tk³dO—gbbPxt=t˜Nœ[«UŸÑ‹šÀu»’PœwJoSRU/Za4]q2_„LI€Z=dO8T0=Q.?R/9R06B+8C(YB#Ur"`rBa|9[]@\J0\I6Fe<<X>AI)DQ-AE1FO(Ia-Qn1Yl-dw>jr=Z†Nk|PRMXPDƒ}=c†S[L>Mm6AS7>>%8@%TG(SV)W\;DX:YG8fd8c‚Fe}Ab€BHrVJd=1V<D>%VS!BY0GV8:G*ZL,Gc5HQ9BM/?X.RR5ZR/SP5HM7H^.T_2HX0[c3‰n@_±a¬Ps[o`=…M:W—aBM>JP*\<©˜AU_RaEC_52X"UO~B}NURrGh^9FYPbU0[„EEo@FUAN]0Mb=dS)<ƒERm;^‰Jlq:X‚=_Ž;(V1/7" 1!17DOBX$gO0}m?ltIolK]YIka:o›\eJ=nI?]);U dQrP9NN;Yh.cx9p‡>v}G]i^H=)pE,g^?h>¨¡XazdcQ6«½pY6;áT6•‚huWŠpI›iOžz`µq¯¼tÙŽditP‘lGc™POI,>H(D<SI$OI+n†<s‹UX]8dU2\n<RZ3Ž>ÝÁkÿŒgÿÿÿ•ÿÿ”ŸkŽC]b?¤b2qc@zwLak8S‘T›p8DtWm:=_2po2žžXg²p‡‘X©Šuðç•ÿÿÛ²¬zŒ p™¦_¥„h˜xj‹•j¯]¡œf…XF|hJ‡aI«|a¶¸ÉÉ©‡Ðš–±{ ×™˜Å–KeD^YBƒUEŒeQo{B_gG–e<`yI¥I4heFrK7l4,^hNQj;[J0Vs@SgC‹pG„ƒh…b£‹hΪ¡TLr„KUyLrv>xkAak=[›i´Ÿb¤×™‚„I}¨Nx²>«¾qšÍ—lŠSl€S®¬o~´W’ˆ:vEg²Qm}=ª¿sÝшðÄŒÆ rvžWNy7:>'fF3¸’Y{h<pV6mtGòzYŸgÏÊ”®ä‰‹ßo|¤RyfQÿ³•ÿÀ†¶‹Zqb9I?+{oZy¬lgc€LNj4›gd|Nz|TÅÿ” Ìuéר斅ÿÿùÿô¨ŽlK„Ÿd®Ë˜¶ÎÐÙŒµªg ¯p• p¡¯^¢²Ur›<˜…L—œT†•HŽ~N‘M£ a¹°e³ªg³Ôx£Y†ŠQ€žV«V–|Bv‡Bdt9Ya/Yy/d~Ag‰<Sd>¬kJi~PflLX_CEQ1fdUŸºrê壩ڛۥ”¼s\f7ŠZH‰H„”h’[—|P~Ÿc€›f®žoæ”pËo¥Ži£”[œƒi¾žq¹¥pŸ‰Vp~P†¢^xŸK[z<^€HniœÈ•ɲƒª¸jilFŒf–Œ[’]ƒœn{›o¥ÅŠ®ÙuËi´\s‹]{Œq•dŒ»ˆ§Ï²ÖŠÆŒŽ»u…V†}Z’“¿Ò³ËþÅÂëct–Xc‚OpŽ]sžy…¬q|X_‰IkzElpY Ž‚·²Œ´È‘µbx£cy˜^m›duŸw‹Š®Èi€ªQt™^³pަ^‚¦^‰[•Ždƒ¥q‰ av™u„ŸŽ¤Í§«â±²æ°§ß‰œÃf]’3Bb2S}Wx§\f‘Jj^}®jv|7LsEaNl‰_|™p}¯›¢Ò¦£Ó|y‘u’¢r—£hxkƒ”U\|MZzLVvIQe=K\.Cn>\„@[tE_~Jo~HevF-M4F)1T-2S0DO0FR/CW5ac0_h-[s>Tn:Bd6CB3II)OV.¦R0h¨N:¡’GQ`PM*I_.Df9d\:Lt3RaDY[9v`6‰Y=w]=o^<^S?HN=[88hD([g4g^;cf9ut@L‹GPfT`G3ŠY1;^?UlQM8FU69U<FJ.pW%r‡7€¥]¬TmËlm¤~rŽReT`hOxX;q5œc˜¦pužoE{f9LE7C.PF*ƒp6t¡U_œsXˆ`TzLZ}V]nADsG2eG6K3U;$_d$TvFMrCNT1CU(\?37I%>B3BE$,P-0=*I>E`+NX*S]3Yh3j€:c…GVƒ_NsOƒ}<Q“J@[QHH1IS$HN0IM*^R3Lp@bW@bx;edHV]7MsFNX8eH'R7ByB7a<-C+9?IAhl8OiMQR3Ji5LV-_W-F^5FX<4O1B;)LT3W[4sh8Pi7WRAQd7ƒX7k›Tjo\laLbP8ÒX>Tž[`uT‘¯Gf“[5N9=*JZ!Bb37p2„R)AŽXx<.h\,KhHct?]s?R{I_`6`9`j<AQ5Ql;h[4•©Y;tUPm-[o2EQ6>u+1Z2/I$MV"Ab,?Q1gB/SL6[q7ubKƒYA…`Bw}i[™_R|=Ad3aR$IS985(S0"SBp€A~ãrf´xQA?Uc>K?0sI.oUDî´Ogͨÿ‡Y;•XgDo^>~sG›vY²šh‰á· †]»¿ƒ´â|[rri5`oD¾M3ˆ®nP¼PT^-LE'`N3P[7EB%`H*CY:SN5nxFOgG{†G°[mVBÇ„Nøf•ÿÀn“_:p>3/Cb2XK*Be9Y`+Uk:Zz7]ˆRLp;Žk8…°grlz{@“rUñ׋¼×‘†¹rŠV¢‹^Ÿˆf¤—pmªX’€R[p\uo[XMAχjÿİ풊»ì¥ˆrFÆ¿‘Ý›m‰fKf8XK6f8&y^C\ˆA„h<EeEhE'ubB¯OCbyU[5/YoJPuEPO8cP=_aA‡o<ƒ[?[L:†jHr^BoP9fwEUlK]m@og=q[6…e=ºWB•}JœsNhžIl˜Ao‚>¶Š]œÇ“_Zyb™¯{™Ôf|Cƒh?x–G…GŽ®qiˆqpGˆ’XÌŽR}ŒYN}@th=¥¬‚z«qxšSbˆGvsG€aÃ䛼áu‹½V‡¹j{†^öÉ™ÏuHS9HG6EO1LQ+–xkÃýϼí˜}ã„°ì—\²NŒTÜôŽìÖ˜ÿÛÁÿÿëФ~‰‹[º»›èãënܳ‰‡·a•¯i˜[¥Ÿc§«R_=dz?•†R}‡J•Y³·sœ˜Ow€;pBwItfGn{9qC]{6u`Eh‰=~‡Hdw2d|9yŒDRy>[yCbD˜”s’“]†_QpfEƒ|^ޤa·nªá¢·è¨ƒ…TgQ7ed7lxM–ƒ^¡vLnnO¾‚hŠtË™€³—f |[¯yZˆZƒ‰QumW¯‰_…zMlwDs¥gmžWc‘Cqžn‹À|™£cjZ±¯yp–N‹|TqmL€un¤“`c„‚Jy‡\šÂhƒ§Xxy]¬œy°–½þÄÑÿ¤ —Xƒn`“jiEPf2CY;kuv´º•ª¨q—_b…G`€]yž‚§³†••eonIil?spDfxQ”ŒZ¡Ry–Xv›XsŸ[i`r¤ruªgx—Yw›Ra“Du™Rt›Xe|Gr‚QvPopAgpC_oEcrOi‰jz—†°—£Ò¢›ÊwuœUm=Ee.AXGgwRlpA\g޶\g„F]ˆRfšTd¤|×”‚Ç”–Òª«Þ“¡µ~˜™`mm[yŒŠ¶¡]k{I\nOeaI~g:Wi8Uw<Uq8Cg@TxANrES„IFW*`S5Jn9ThLRmABoDB\EAW9P[+ek)Aw,1X0:>%BF SR+o>x·MB©˜EUdRC1cS(Fx4OiEVk=FM_QDwP/RqA_\O\S/ZO0QF5IJ7fB8^V0YeB\[=jq>;‚NLMH\W3•]=eŸNa’†S†WBsPL_LQk;em;{8‘£P·´TƒØvu›”\`7y[<@6r<sp/loUKZC<L;>E*FE)KV,|d<Ž>ˆ oršyn™gy–`cv][cO[`?>lL6L@MM*T^-Nl8Ai9:F0DG$>H&/E+1C./: 56;U(:N$>L-Fh-8e7WV0b+h…KYŽO{zU~šUf~eDTAGM?O](BY.PK)pJ)ni4g{LlSd†TliNBoN7Q?ED Qh/Wg7?ƒE8e=7S&_\,kyHPoWEf:LX=RZ1WI4SL4YS6m[9lY;mR@KS:NA-Wb0Fa9003YAiz8t‚U|~glcL˜k?˜”T’ÍxD}V<U9/W-2?(F?pz1E†Rck27XLOS&Sj.pm6`e\ˆR2zQ><3OV#4\,SIU[(˜xWDÌu`u=Xo5Bn4Mm?Ez4CP*Hb&a]%MH6BI.5I2B?(jA)t}DFJH_S6nI?\D3J’ELK)e.cuXXTAZN:‚t9ÒÆuÕЃN×´H=/z='PnW‚Y1|OBÆ«ZÝÁv˜Ó‘kx_ˆš]Ž›thaJ®„Kÿ‰_óq^Æ¢‹ÿꬥ·Œn·osqO^~Mh5ÿù|xð»JŒ2W<%RjBFY5KM9IF9@Z3O*Y-Rf2°DtsFelC6O/cF¬](p»q_rIExF@]<Pr>;?)ˆd>P\c…Lq˜VU¨azž`w‹SiŠQƒd8ŒŒf˜Êoeˆ6pj:ŠS—xTw`Œ‘T…¤_§¬ƒÐ”‡½|y¿šètÙ„dÙ¹€t˜ocxGs„KÁ®†xçœmeEEH9_O?uSDvvAQ^?s\9WgKeI.žf7ŒiPY=3o•cW`AU]=K?,S`<bo>gS4QU9toA¥hL_hL‰kH^Y:•}__iLP\7RE*YE%g\1je9‘?pŸFY–[„zB¥¸ežh¨´Œ½Œ¼¸ŒbšW]d6Uw1qrI«ºŽÎÙ²Çå·›·|m›YjƒRiZ;gj@‚’Q†œh‚±dY™Doy7“oVÃÊŽªÂg“º\œ´keººu×Çš“Ò„^{J[a?=e:baCãÉ£ªÓŸ käê—·çu„°S•LÍÑ‹èÝÿÿ·ãÔ€·‘l†a„jIq[9fj@j˜N~’XxU}ŸaŸQ€¬X†®dx[ˆ¦YžŒb¿œüØÂª¸†‰_js@^U:fi@]`4jwDaƒ@Œ~FzˆDw—Ph˜DUv5il._|=Gg3^a;q‡Q–›eƒnMwgAteJ…¤kφÍúÂ´ÛƒŠ…Thr3[j/OI?yO:`L;lTH–qPˆ~c€ˆb‘vW»†hÏΕ¦Ð|£¥g¢¼o¦¯lˆŒCVoDˆhƒ”Ldƒ?n‚X’š_iiAk[H§¢€£TujVe}QnnOumO„u[…Ju«[‰ŽdœŒ\h™zœÔ¥åКͦ}™be`6U]GmsGVW/?K,;I->M3RO4QeJ|]aLm~qš¤NgY6a[*hi*QqGh¥cg™Kl…IqŠIi‘Pj“Tpœk¥lŠžau\u•C`?e†Lƒ•`‡ƒFZf6Vi7U[.If7Jd-?N4SO<`kLbzgˆw‘°ox”DIc1Ic5Ie7GW/F]5TƒU‚¡U^–T]Od™fkº¶Âý®´Ö˜šÈ¨¯Ý£ºÓŠÍœX‰{p°Ž®œJ]iFX^FN_BXj4Ql5FW8BV;U{Fb…H`}Mm~N<H-KP(If2WfB[dEOdC@iHA[>WV-Mb)E_,@U/OP'jd$rˆ;š“Vp \9ŸŒ8Ww=D,OC"^X(kx3qLV’S^qR¨R6jr7HtcCMIS:)eG&\F.\L9V[8KV?\U<}w6[¦_c–}qŽZ‚†[{‘]lƒoru\xŸUzžcl¦W[’Xi‚F‡k3•‡:i„Vjyk[ŽT>nUCA2†=Rd,:Y[?].C\-JS'_R.hX3ehQ~jKjMu|UŒ…Ma”W^bcPG9MU63iA>P=LS+Eb3UV1F[,0I45;#?C?X+/S-/;(A0BJ /S+PD,Ek-KO8MK&]k/[wHrb0›¤QxgQ`XcZ8KU5VO1FP*HA0O: _Q(W\3„e7tyDltUQuQH[I[`*Et9QV7eU-D‘LMb;ej8\uEQcGPY7x]4ru0RjHQU2WF6Sd.M_MIn7@d@EKBrW15xG?I6Ma+lm4„…J‹™ct‡p€™\fMºeQWCLf<8eA*J*c@!V˜<@hNDQ)Z`.lm=C{A”C+Ž„Em¡o8…e1J/FL ab);tPj:!£‡@k¯uNzCU|:aF]‚N=PFG%Q_)Nˆ28N1HJ0_L<'-+x)[˜Q>ZC?A2VQ1T=>XO1M~7`)zbFgbRR_U\7ši3¹¯mPɨD<+hL(YJ1Šk;€bR¬ªYÍñˆw—f–¦C¸ªl¢¢k¨ˆVÖ`v¨m`°jõrQ³ml¹Ä„‹¸…u”cYj–˜WÿÿÖ۷h‘Z{~6ož`y‘]bUI}ESv=2i<?a3bqH^x=fY4?Q3(-$A=D[6ŒiA‹¸rI”cYm?8oFD?!š‰MQŠKpH||6Ty4]…Iw„EU„HRr8Ú…Cz¤ScŒAahFŠ~JslPŠnIŒFÓv|SFhI6ySHoF?mG9‡q_£î–YQ6Y^<|†TtuW˜J1ˆÆwN5"P9%tv:dZ9TN>Z:1n@,acExgHÔP1OƒSŒ‘nwq[]nMveJgfJ„a=qL-XF-o[7^^=ah;f}V_qG†]AˆtXf¢oTS7FE,kS5n]/Og0^b2±jI{E•R<¨{¥Í‘€¡qµ¦}^¥gizF9u4kjMªÑ¯°Ò®£Ó ‹{_\pOW˜[S‰OWe8•™fe’A|•Ne—KOx<…>‰Q‰¡N‚µb€›VžZ DzÅ{ªØƒâ–†Îk†ƒPhŸT‹‘g¿s\„•]Ú‚£ÓxM€uDÑ«ƒt‘T”VJª`Wì•·É„½ï„¨i†X{ŸL‰‡MŸƒU‘”e”¥V†£[²§rɵqäªzÿ»«ÿ¹¹ôÿ©¿Ž^މR“ŠLrqC{pQvn@‡ŠGw‘I{FŸŠFŠˆGˆ‹Ifw+Nj,Ul/O`0Ej.vxH†^¨£a|†At]©Ä‹´è¢Áﮚ±W·|Cag0SH5kG9WI0rBF€fI˜kJ~jY½ˆv”p‚pï¾”Ò»v•©i¯¥~ĸg|t>Ys5c~BppI`„8aˆEg‚H]|Ffo@ob¦ª]qs`…`tmKbWMœŽUv¤Z¼cmiPq—Š»ä°ÏÄbreI‚h[xf>IU:PUBcmAEV,:F 1124&<H+Fa;joVfvCbp[~ˆMR[%J_&J_-De8Nr_¾‰–Á\kDe|BfPc—JkŒHbŒSi‘]r–Z^ˆCZŒ?^ˆ?anErfJƒxK\i;XrAk€GY`2;F")>86kUUƒdl¢z…žjpŽJGm);Q*BW/HW.Qk9\„[o§z–؃—Åc±|ѦÅð“Á—›Å £É”š®aq‚K`Œ~ãÁ†µ@\jY~…Y‹J[v>UcBOdRbš\h¤TmD`cDStRSL#s`,]Œ:B…WB]RRK8F\<>`?AR1>L+<E+<H*WN,œf,k¯M‚‚h‰„SSšs2bq,E@8<%Q>X\&Yq:Xh=]l?oi=om>NpO7}[9O@HJ1RF-VL5_X9W`:nmFš„HŽÈjɰ‚Ÿ‡€°pryeg‡tN‚ Qr§mkœh`–YIwIBW9WX8vl/wOV‰b/ZK&7/E5?]DS.Tc)Ot4Ne;ch9mzDMcRFXNCF1F>)FG(-O1192=C MJ$Nj4JlN<V9AJ,KV+?\'/I1;8 >N(@C-:G&+:(5+?9;N"^U(B?:O;MD)^a-N€Kˆt5i’HXeNB`=HP-7R)FH!;Y+0I.@><@'QR,_v8W}EaqMVqMQTXm7Io59o4UR=fx7ZdSaDC€RN[;HU.YK/w[,IdH;R1NT,xj/i¥[o’^h•VK|XWY<j}Ag‹I^„MeOj‰I‹“[d”lMgPžŽ?J¶ƒHjDHi?AsA6Q4f[7Bp96R+OQ&Qy8Yw??f<Qm-gw7g‰IAzS,D8IL%uU#:VB?4$pa(`Je‡EKtF`3y aK_bJs+Tm>cP>CŽ;XB,Q1$+>:k(`G=XBO<1`E3@`GQC'Uy.Pi;^e0jQS`ML^2Wn7ÊŠE˜…Qѵb|UXa:šf5‹›bÁÇa—ŸTq¹U§X³à~f‘yus:šŸX©‚Lž½ƒ”º~ª±«£|ȼƒØÕ›ŸÁžÓ¢u×ÿÁÂÇ’Otoc/uR=mS?_A.YU3mJ6nNAnwKiŽONl7NW3:a0BR4CE.j@)aM=—K4lª[W’PWt>Z{Q‡›XI{Pab6Tg2Št6\„[v‘N}ŒFgŠE•ŒI^|5¿d>sT‚kWl¨m‰€[ˆ™_fF4UH9OE7XC6vN;¢RFÑxnÍQe8VR'@U(2F*Wo;VrjBt€ZnUZy8HG)M1%GjMb†[ntIboHjnIºVMl¥myˆjY^=Z]4byY>d5[S0n^6ekF—†_j~XI].}gDo‰[€tMsoJFj6dY8owG}‰JRu=ƒdIek9\a5e;“shng=¤{^jÊ…œáˆMe:…uZ²Á›ÍÀ¡“Ü¡cVuyJ³¬……®ur€P”ƒIm‡Pž®fn–IUu5heBž‰^¦VqŽ>YN-zJÛÔª”Շ߼Ôð¢ºõ“±šf¹{¶–du„Vªœy§¸g›Îzkµfx’V¬že†|I˜gNŸX¨{Q¦›iíÓºÿÿÿÈÎz’³^xZ€xLk…DrEˆ•a‘˜yЍ„ç¶Ê‚j†ˆ`À–u×ߥŸ¼‚ÃÅ‘]ˆMsƒHn‰IŠ„_¶Ï„±fcz4}x=‹wCi‘BIz38P%<h-Jm3h†OzŽR§]zx:~‡f ß–²çª¬ÓtwƒHpo7Wk?pbHcUA[O:OH9bMC~eIoZG˜^[¿ˆuº˜©¼¨ñÑ‘«o”ŽZ~‚DbtDyEYxA|ƒMj†LgŽKhTƒM`b6[lV’®``|L›rn½˜wzZ––v¤§nޤ]zj©§tŸ|Q€iL|pXˆ|a~‘d‚šfy‹N_iHPdBBC )--7"F\/@O,KcIUm@ZgFen2B[/AQ6EdF_rGZsNj}Nsr?e|<UvEq‘TnŽRfQa•Rn’[vžhu«`j•?\Ge|N‚qZÀ‰NtaHRkAKhGQmVD…[K’y} s|n‚˜`o{QoV`‡>Di+<@&:A/Lk@`†Vqœvºs—¶dv°rˆÁ˜¼”‘ÕŠÁ~‘¯z”©fz›Xe…d¤Ÿ`”˜Hh}Sr™Vr‡HV];UF9fra—ÊtºS_w=IYHWsGNL1‡X,~Š:Y™WnzZUsN?oL;^?9M(3H(E=">H#XF(}V*F‰FuYVut:H”g9Uo,;=*3(56 9;"=A&HJ-Ld,m`7n7ŸpK\¡TJ…o^\PaiAWlE_cJp{Jnœ[§Œ^™Éwnɶu”zšin”n„z[•›Ju¡st‹rjœUa—^rpKaYAerRmwAP…P:aM(G1&=%G>!Ek#Cc?T_4Iu5Yj4r4q¸PJ·Œ/rw(B=+-G2Hb"=zEDU=YQ*Wg5@iD7?8=?#JT,IX/7Q2;=(6D);?%;0(4#$ 5*HIV_2NvIHY7Wb6bs5^ŽQGwF5SLA6#8Q&4E*:E#BN%<Q%>U,CK+FU-`e9S~ARzMZtWZwKM}MHrDYd,hn+V}H~mIb›RzXyše[‹`YwEhzLek@DcCIS9S`7gv>^‡M`ˆZ`ŒP]…Zu’ZtŒRa‘M€yIY[{…RŒ‰KYu_zV»cPŽagKnŽLU“gdŠMFŽ]4T7=L^R LW4OY3Ec7mb* ¥Mn±pLSUqC@j>4T/;KeL!d7\lBSH5__/€{9J~GTcNSz==a2HJ3eD0*a1`.9?0R/#Ol;T]<RP6RI9B:0<A,dQ'Iˆ?]e2hvIETESc0z=s—bkiJÁk/ž×¨_“{nm1±™4T–Vxs"ž5€§|tŠZ]`JM9akQ„†D‡W€kFužYs‚]« X¨¨e‚œ]¯¯løŽÄ¢owž}dˆSjm1kN3\U>JP)7E*D7mY?o[0X†MQmB?Y6N;&8>$ '=&GD#r:$fBE†³p{EDq@ p5a‹\n~Hh‚Df~Ddq;Mx8Qw5\j1pn5~a8‹Z‘¯rewS‡wVf»}_œgf‡\š{b„l‡dYßÅ€dšk]|OfˆNEg=n{I†mEfG/ÌcB¦µymLTTQp8|„]„¿“™Ä“k´…j©lf…O‹s@uß™~LG}€W[hItgDv‚UMK1ye?vkJš‚bbi?V_3alEkZmcJSqGF€EwzOˆµ~ËìµÊŒƒÒš[¼yTa>DX69T-\eChY0¼´Ž¬ÿ¨Zr5£”]½¨†›Ë‘ ±Œ‰œj}Š^…µy–Њpª]Ž£h‰¿v’šZ]‚:`‚AvyAyrK|Ubz<_~=›‡Y¬¡e£Å€¦˜Z¶ÑvÆÂrÉ–e¼µw—œc«ƒU›a}¬X»Ñ{U‰J”—[av:co?œ…bžŒRЀtß…jö‘b³™W—‘\Ó°xœg“‘V^sC’ˆ\ƪ~ÿ¤}Îe¬šl˜ˆ_“ƒZ…f[¬¿†Ù³†x|Gj`;RW3|cPÝ¡p»•Z³Rƒ‘Dv’X_”Oj†D4u*Jj/K}9iŽNz®my§P\t6lˆaœœ{¼Û–„Gih@_lCsjNnqCtLƒtQ”rK~WA–\Z–xNycC³{bÆ€oÍŒˆÊÀ¿²lpšNe•Sm–]m‘Uj‰C`Rƒ¥]yEkyD†oJlnYŸ‰i˜¨q—¯dÌœ}ÚŒý£¼§i –\Š^…‰KZL6W`?Z_M‰k¨µ}§¹p†“^pWdƒe„>:F-:@1CY3GZ;KVDO_QmqAXb.HZ1L[4Ic6Ja7FV1GQ<Ug7Di9Kk<TwE[„=XrFf–TkžSnXq•aw g~ SeŒTyŠTŽŒZ¡}RŽvMdrUaŒuv²Ÿå¦Ð‰¼dhH[b=T_=^uFqwDgz<Am2?f?V|Of”[m¢iq´w{ɖñžæ´ºî ¾do‡Xo‹[y‰Pp„V–VwƒSn…W~ŒGguN_e<EO2PjOp¦j‹¯ch…`tZ}ˆJON3pR0nf1WuEanV\oQCmQAMA8B/8K&LC%=N$MG'NK#D`:nE7†p4W¡hD[~1><*0)$5 *3%::RMLj+PtBzY=—\/vwBŒZg‘_‰}e„fM{jSv”Uq®u Œa޽rh°–{•{r˜ba€dzYLŒvDb„`m`ZrŽ@r–Tgu[dbRZnUSsB;s=2P-1H7I"UU*Um.H‚AQa<O`8Zk7’Y4LJ=†à‰:çÕ(s˜(4)>-l1I}5@[SOR6Ib0A];GO:F\6GoDBmOCY;<E'0F/4C.92'@'.:#?8\^"_€<J‚MYl8^w7pz=fŸJ2sT9A18D?A%>Q"<N+>Z.RD"FX)6J3E8'SN.[g=YlDZpRXtQ\„V@‰GBX7QR+aY.rd?x‰L›sXsR`sYdc;Wc;VX4Hb=JU>NM7_jArŽGažbf–Z‡°ib¼qZ˜``„Mhz>^„JYsLos?ssQ¤‹Y_Ô…^mgvyAxŒ]m˜kmPJ“b:dH7K*K\"I_96`5:K+``'xo:jhJ]{>UŽSUw@@†V3{IFR+:m/2H&0:FBBU#ea,X€4QeGOp0im@Xn4Nr5EP%?<)LB4”v9tpRZL?>E1XB.SW:{`6i´i^xL|l;M~a\j7mœGN“XBk0X>$¸S2r°qgªnm–EEn5Q>SS<U7-mK) _8yStNmƒNeR0iLe™`…YAƒM?_A6ˆL4œJµk‘ZDßœYk§^ ‘Iy…V‰pC\tDRp<c^>O]B?W1i:ˆWUÀuid4LWTtA[W?]O:dj8[O[”Ij0fq<;d1lATŽT^Z+aNdl?|‚0†½dT”KNv7fj8hoAY>+–|WErZc4(ÓcGpÄ}SK6a:2IC2t4&Í{~œjq®mž¡cdÔ‚o¢[ab6Q[-ÿ_Jœ§lû‹mkkP\t@—©‡¡Ã•ÁšŽ¬|®Ï“y§p\ŽaŠvLX`9]]IQ\8RoJXxF_[4yc4|lQucHBf9Qj=cqC_f@otNm]QtBtS¦…ݘ¨€žµŒ¸xc|Sg¦yR _hN==Y,¤gTŠö—WMl‚E•¥h‡¦en“ZWo>‘º„®Þ¡kÇxxS¡Èo{¥Qk~@b„G‚N™¨ae™Z~¡[n—GrnH©i‘|G«nF…–Z…‡O¬¯t½o½¤_È‹a§ˆP²—P}•JÞ’WŒ§VO¸·uŸ§`ÏňÂá{§¿lñ¨…¶±z‡¡`‘¨V˜ŒT’‰K—W}}T…|\–ĩa°Š[¡€\“}]˜mSwqQq`¬³|¸¥„sKtwDkk>‹WBW>|vS{°QiŒ@y£Yo–T`Œ;UP.R{1Ys>_~P‹S_X._a<›£~‡£ÀÜ…z…GerBa^B…\MˆxIxZœ`y‰Q†lP‚_Q¶xV‚kQ§sXªlRxxQ”b^±¨p–¸aqŠGnU}—\i‰Aex>vDsJnzDi‰KЇZß¸Ššâˆ¬Û‹ë¿s°¢s‘¶j£¬k•³k„’R^_A_kHl“uŽÐš½îŽž¯bzlPqk[zž‡±¥w”ZjlKgmLus\ˆrfŽˆq{€LMS,>Y0Hc:GuC\ŠO]‘BDf5G\FWp;WxK[ˆ[i˜ew˜PYJn@b}Hf”Tj˜`s _~£[ˆ‹n¥¡j–‡]†z]ŽzU‹ƒr¡ÍžÔ›«ËžÔƒŒšHST6=b6Kt3FM'-+*B<FlnNazM`„U|”cz²“ܧªðÍÔÿÕÛÿÏËýÂ×~„˜V\†Xf€NfwAXsOŠRn}Bav=VqC`iM‚w@e]5WlB^ŒW{_Ž~X{xF_g?;N/JJ([U1Vh@LrQUgKLkA@]@>R*:M,5L(6E*M?%@J"BT2w>/Ÿs)@¶l;S5<7A6%,G&,A12C#SEh`!JŽA]jWcX4…^0³s<Wj{ypdWoOBmnFl_Š„Uw©_j¡wu„aZ„VYdR{_>hI[s\ktC{›?˜L˜‘Xx~r\}_IuR9`@8P.DMFS FX*cR.M‡A:VH:<4G=#Ii-œR4Û‡@‘ä†7çß-bŒ-1'K'cPQ‹KV|ZL‚NRfChh@pwIsŽ]S’tEja<N1DP6CU5RW4Ii?DtBIf>bj=d{BQzQcŠLa|?…Œ?S¦U5T5d8@Y(<Y(EX)BU.CL,DH$<B(IT1MN+L^6KgEQa;amN`{Rf{QM|FFe9Ka6aV-uU0\g3msLpc,[ŠMF\BHN->@'C2#_],U‘U^}SmzQ{—T†²k¹nsŸsjšbU’aOnGKf,^P0w8dh–hX`¾gevgww9xŽ_YŠXpwLFtIB`9:W-_`)RY.iN:F#JS@M)5B-`I^r6c€Jvq:q£`b³vX¢f3y[1=2VL(Y‚BEpCD\,Zl<eƒCM…<^s1V‰5hGhPjelŽf}mEyjVi|]iuU|nIÝaT„ÿ¾Srfth0OyWnp7—±TJ€gfj0I=1QS+L6¡`_¿Š4jRMN*Ri@Xo@b^<JX7m6$œƒHbˆ\sY9}i<gdGaB/`S1[I7PH/yX6s“\orCŸ´izšMÏ‘N…hÛ“^r£}‹‹ViŸcvT8GP7^X+aO3dD}b£ÀlsqZafPTY:mR9ªžiX‰kPp1_€->l,„”MBK<j<{™\sMWd1g[/X]>Pc1La)ngDX^yc@DŠSN4${U-ÃÀ„v±†{‚dIMeS4}ÇrgG<„‹d‡£mˆÁrƒš_fwL††Cë|M¹|LX3)hyXn›p‚‹¨v¡Ã‡ˆ¬{×¾˜jšaXU@qqUdc9f}PW¡weoO]k@‚‚KVx=QqDYsCPa7jˆPZT[lF“wFoQ2{vW͸ŠÌ£‚ÛŸ‘e˜½‘†ÈŒ‚¦q¯¤‚À‡‡„OGo@•Œ\‚å”W€;e>{€Ra|S€`e~Pª¢v—£w‡£o¬aowJrtBTp7n…DcœJVe9io>]x9l|Mh|FvŠK®qyŒZyzJ<±•g¦Ä~¢ÁtЇYlŒCnžW®¨]¤§[œÈa—ÄkÚÔxÿ·sÿתîí}Ú¦eèÀ„ÿ¡Šñ´€Hq…F„…I‡zT…mH‡pM‘…PZt<^GŸ…d©`†Š[«Œ\œ‡j¥¥o—tfr{MoZ?{Z>^`7aaIº•†›É…w¼YYx6i{>fx@D\0Sl5_ŽY‹’Ypq@HS*HS-biF”¤{¯Ûnr‰MŒiFtYBqfBŽ{O„U“Ÿr˜¸pžl²šn¶ƒn“‚b yd¶€`ª†Yhc;[_K±ŠXk>Md?etbq«`Tw;i€Hƒ›[q•Wy–RhŽX›„ÿË ÿÿ¯âÇrÑ‘sº¡o¨Àp›¢To|IaaA]gP‡”’Îß›¼²i‰‰Rz‘p–«–Ʊ}¤™o•¢pÁ™_¡{R}nY…†f|’S^kCXwO_“Q_—Zk¢]u®kk¤SQvA[yI\rFb„eq˜h€™n…œ_zƒ?Se4_{CfKn˜Vq•Vj^‰vº³q¬k®Œ_€b—¥¯Ô¶ÁñŸŽÊ}˜¬ar†K[‰W[ŒHS_9;I%/;$3>-@I>aeKczGgŸ}•Ö¦·â²Àî½Ë÷¹Êü»¼âœ¶iy k{«kiSWuRk†SˆyEdp<]`9T`@_iGklEf[6`d;VsBUeF^dGl`A\bGRK-WY-^n=OqOMiPC[N=VE6P75J.9F*BG'<S*LK'9T+BH6u6*™d.C¬o>_ˆ?;AL<$8H)/?21=(=O&hL [l(DNU_C]Z0‹]+up0cTq[NTS<SD;Za@{j9w‡KU“hUjZT_=fU@…b9o—Qg‰cq‰Co’A™|K£‡JtoW{eEiK9Q=2D0/G4A6Q!bC!:„/*QJ-;)D5KI Mm<†O<ºl/w³nA®£0Zb;>(e>tv5a•[JaQiK^\6tcBymKZ}_CqhLgHdwAp~Aq‡RtXkžeu u~i|£m‚¨nnÁsv¤}i®u^¤ydŠ\X†E@”MHh@Dp/:p88W1<K,7M&MM$IX,AW4H[3Ka2X[>MoCRhFCv??[27V.:E(MH(bX4TKtv9Ck<?B,AF(-E&M0#wg)w§la¢lu“lx˜\ˆ’_vŸ`‘ppÀ€Vz\LY>Di3bW4n}R>ZAŽ\7^¾eVeW[i7[pBS|H[I@d?E\(2O,JA!>D0/Q69?!0[%5E$<<[:!gK$GZ8^f7~z5™ŸV“¶‹mÌž`µ•„ nN„]?S-o]=hy:OpKSZ9h„:j˜IdzB‘{3”gt x•šTš·{“Ÿtu›_|›Yÿ¦j£ÝË\¤vwn@QqFys8Œ§TnqJOpGQg-Y~9lw7_zCh^2Mf?NJ)=9/`J1enD:iHL@(Z2bE0nd2_ŠDYb=’lIlpZzdD†pSp{Tc†MwoI]‡Pnt=“dE˜d~o`gxCmQ3``B^~RQS6`\1gsSW6'cK1¥nEaµUSgsQ†œZ`V?gfC<l;P\=d'Hm;G3 ixCe„AbQ6‚Q0ZkF\:(MZ:Fx7¨>/zŸkvi\”U^i=sPÍ _ºá´œÌ«eµzžiE¶t+*$]7'T8Ž[³¨kŠQ®PlT‚]DzuSwnJs‰Wnh>–u[›‘ui¸y—~TVi^G5[P:PN3brFsyIkƒYtˆal•YR}CXsENg9mo:~Ž^drNœ¦cc‹WC_6VZ.‹~R¾¯‚‘Â…¢O¢·€Ÿe‰ƒ]‹Sœ¨eŧ[€S¨r€ÌvP4ri=Yk@WS0BS+VP:\pKYj:c…GRW.Ld/Kc,Jh/fj0_l;\vJG[,Mp.Ÿez¨mm—O¹k‹˜[w…Mœ‚\ÙÖŸ¿ÿ©ºÁwpŒFpv9ŒšM‰‡U’ž^ÇÕˆäÿ¬õÿ»½ÿ“Ú×|ª Q¤˜uÞÁ…Ýȇ߯ir‰E°s~‹RŸ£Q¹`ŒÀy´ºzœÂw¡Ã„È€mˆ|[ ‹\¨¡pÛʉ¦±Wb~0Yk*d{7„‰I†wM†”_žÉ›¼Ø’¡±qT¨LJm2cv:Qd?gy=|‘L[‰D]X3D>-hn9\uF–®t¦ÐprmGtuZ†Š]‰|I†j]¥šp¶´†ÜԻݣÄç¤Çë¢ÚÈ…ƒk¡£o¡€KpfEsŽaw’Ff|H |UpY§jq”EjƒHrŠMˆ]šŽ[ž}S¡œ€¬ÑŠÿÕ©ò许xšÍ|‡·ei›Wzm¤py¤„´Â“¤ ekOsY²¶™ÇãžØÆ‚´¯y›œYwƒcz“`‰’h€ef‹]^…W`Y{™b‚ºu®¶u”µw‘²ef‘Rg‘ce d\•p„ªr•Zx„Pwp3Ni7MqDhKrœLf”Yz¨}£Õ•»Ê„ÊšY’~PŠ‚j¨³œ±ÞªÄ܇›¬bn˜UjŒSu|XyjObsJ`t<Kg:AP4EI3S\E_…]jŸÏ¡¦Ô“§ÔŸ«àÃÉÿÒÉò‘ˆµRn\†Œe„Hf‚SˆHk€Nrn?fkA^xCbpD]a=UT5_k8W€OpQy…Eto?]qFSO']^-Uh9AdDHZI>Z?JC3>M.5Q?657?5(GP,VB/;_15>8n0/”]+B¥c7gŠ9<C95%33%;4"<>"=N-AX*]S$=t.>`G?P/KG&[N%b[*^W9OU:NK<XZ6e_8kd6Q•W\‚^nˆ@bOjrPctBfR]‚L^mApxG„yHx†SLaZSK6Z6-G@56 AGCb&^^2[w.GdQDM.SF*eP.@n9@_R]P-€a4i‰S?‹s?]GZb6gJXŽWEYEgEJg=^hDwuAcgF[gEhwA]rELkJeM3š`+¬”H›¬w‚œlˆ‹Y˜ŽO¥Ÿhšœq¢ww„Y®e‚or~QR§ZS…UZk=K…>:\>6U1;P'@W0CV,EV(>V/M[-Gu<RaEH{4IjL@hC]e=pf?mp@`‡[S{E,P;A5"QG%HP0YG0ƒp-v±suªmd˜e^gRlnLy–U¤bw΄BjnIA!^]4Mp4G[EGT.b3O²gNgXQd:ho?e}C@uJBM,HV*2Q0<3"D6!+6@E-M&3?$FQ!:K,?F"NZ-Rk9Zn.~X+¤Y¨ªvµ½—sãÎR»©[{_K[:pV2QY0L[)m='ML7QI:a{,ŒaCv]K˜k?²eJªZO”M?“iI’‡ašeGz³|f¤‡Ux7|s7P‰OnF.TW+Qa*ZK1k UEhLI\5<J->a)Gd+[M:dW9l]@d™cDZ<_<+so?†‹Nƒ[K†E1tB-eb?†hGneRl~OO‚NM_>\f5XA.‡O4d¤mO‘Wk`5Œw>f}RMe6pB(O s@G)\C(~yA‚ăÍè~—ʇ[iDjl<Oc8FF1?P+Ad#Vm;Yr>biA]ŒGIB,[4~H-~oA–hHW£hdv9–b>vš_oŠ]…RlŸc–uF¦³ƒÐ”“ܰ™¹’aÈw9b<|=1ajF¨U4Ƽ…Ñ£e¾¦iƒÓ~àž…Î„i…LZt1bQ2N/!‚iLCE/…Q1[kK\‡Pfb9{c1}xCk¤Fm…MQ~@or;do;kzIKe8¢hcžcbŒQorHn{Fbs>\xI`…LOk1ZC#Zl2wrLq{IWh7E_:j^5^`5zzNž¢woÄgFa)Uf0R{CEZ0KpMMnAn‚Uo˜cM€BMf6Kx<Ir?Je-Gk9K…<dƒ8C`'Ez7Z_0«qO¿µ‚¯Å{{Äf~™R‹YîØ Â«_Œ}OVŒDvnIt‹E‰Ty•CœI¶Âoäå…Á÷€¥Í^€©YšiÓëœÌÿµºìˆ Ê{°Åa‰¹PˆºTŽ·dÿ ’î£yýÇ‘ÿ¼·÷¼œÿ³„Ÿ€Ö¿‰©Àtˆ°fc¤CY™6mz?znH{gG‹œv¶|½¤r…š\y«OK^%cYLi”JIh.V{8qq@_m;SH*^_0uƒE—žs¤°Qv_7zYC‚sQz…Zo…KwwFyl<vVHß“ìî£ÍÓ»Ã|µ kµÁ}š¢_‰ˆ`¢Åjo‹CnlDnlIg|Kwx_q¬Wtx=pw:ggBptKkxR{‡j›¶ožÀ†öÒ™¢É±Ä•¢Ó“˨ߩÈí¨ÏÔ€£¨cªj“emÞƒÙе؀žµsš’j–¾…ŸØz‚nŽ¢s•§k„¢bfŸVb†f—´‘Âz†»kp–Uq’eƒ£§¼szv^’XxzF_c=TlW…Jak8^rElŒKi”V‚¨ˆÝ¥°Ø„™šY{Z~…ŸÀ¡¿Ü„•¹_tœXp‰H`uMq|IkpEhgMkrSnJal?TN<UbOl„`ƒ©’‚›¾‹ŸÐž±åÅÒþÌÑð„’—I]gBo|FgqDWiA]oBbtEd{GZL[o@\fIhfJ\{Gc|BgtEooJrwKf‚Mb|LNO,L`/Ri<@o=?RB2E8`A*YM!9lLNGJQL6CY:X[9Cc5BB7g=1‹^0G¤f*`~'.G..#35"2@+9<(9>!9M)KY(F[$>a49O29F.;L)QH%VQ'bV:I[;R^7]Z8Žu9~Uh{r•_qšW`ˆ_crOh‡GkyCn‡P\ŠV^‡[Xr_CfLjO::_1.DK.>#?2!IM V_)Ph.0gC99.D8ODUT&J]8EY:YjAazD^RaŠWkŽRc`c]U[JvUOg=Yk<Ys9Bc<H_0Aj:Bi66n0Ge5MS'PP+ST-\`3|o7v„?K}NY_?`k3zq.rˆK`nVdMx€SW£^c‡f_q<>ˆICM8FR.AQ2?a3>S/5E(T?"Pq3TbQYt7V^GebBlzXqŒfc†bW€V[ˆXP‡VU‰`^tV[Q_bPwQ>mpQc‚ZE`HWP4QZ8eL:˜cF‰¦e9›—QB/Pe=@b6AC+Kd1”_1XšO:YHHB*Sf3GxE?Z7EZ.6F*$195*A 42#EF<D#BO0@M$<V'OW%Vh/GK-<_&FSvU%•‘M ”`µ§‡·¶¤ŠæÅ‡Ç´UoEs@Hh2JP)vH6UT>Dl.<>\A&Vr=Z>7{K6¿‡?„rNLK<‚]=ð€ArÜ®lN|²xM‚RFZ4DU;^H3‰i@h°tbbNZ_3r:(MU;gh2a‰KZo>ÈnAn}oHoO~?+ŠRYuHSA(v\< kPkPw†[z{µŽh¸£Šc†qKO8?^2pM0mHp„gx—\vºqU§gWe6ŽV3‚·~oUJDfU]Z9ÐŒ[šÿ´¢`{–][ˆRzrV‹nWN[4Nm4i§US™]\iC]ŒE.M-lW.r<,¬‡ZŠ^‚¤s…Pÿ–eÿœoíÖ¹ÒÃØÉ¶©¦ m¨Š[¡‰hš©t’•kewS¤‚El€7pƒ1ÝqAÞ³Zê¬dº¡c¤ƒbµŽg`vHYk78X3PQ:<d@qN:tkK–aH{RLp:YgAš’[ƒ¨b™i‡£cvGbƒLV}Aw‚]¤±yIQ`7xjFQ–Vqc7Vr>Zf=n{^TEp“A]”UUY5Lf8O…MP\1Fi3z…L¥Ÿs_£ZNj:LFt–^S—[e‚Rs—hr†XXyEHyDJc6Io8‚o<Gr>Si4gxM`?Pi0Rr6QW6ƒƒXŠš`˜»y˜Â‚v¯g •a±W`}<•q”Ù¢‚Ҟǧ]DYM'˜sR¶¿l³Îs‰¡[v—I‹€T£|[üæ²ìÿÃÚý‘¹Þs“Òc‰¸[~˜eŠzS”Q‹º^¬ŒÄU…sPŽ€ªÿ·½ÿº‰é~Úev¢I{ŒAml<j`K”~T|uD]|7uwJDu%JP7ŒŒORq>];Wt@u”MPd0Fk)mzGÎÁux>jN8cZ?pW<ŽaH“vMa<np9wƒf¥ã™¯ÐesJnkRsg¢µ›¡V‚[š£h‡¦W^o=mmIm|Cd„V‰°f\…A\|?al?^`:scF‹d“«x‘ªt«¶¦Äuž·u¡¶eˆ…`Á¹‰ÈÝŠ®»Yz”H‚Ž]¥šaŠ’N}—O„¤R„“E|FZ‘ŽW™b ¦zµamvRŠªv¯î…Œá}‹Ý†±ãŽŸÈj€§d|§t‡»~y ZTz=DD)?6'HEHj‚q¡u5MY.Qd>isCfˆQxt›¿´«o‰_ˆ‰k™™‰°Ëš®Älƒ StXƒ”Vƒ¦KužFv¤Tr‰FsmG‰gKzMopG`}R[†_t£y„º{”əťÁ’¿Ë’µcktHTi:Pg8M_@_u>Wf=^p@LnKbtDYn6UlBftCnw6Pk<So>Zh4Xa:NeNoyIHC<JV5da8<r;'TG61/QF#oC&lhFoeVS\PQUCnfGHpK>GBMA9N0KM6j}O?JHX0Vb@;S?7D:7F.9I0CV/Jk(Ak2Jb8Aa:El=Vf9a[.OW7B[@LY6_e2Œy;pœOj¢muŽ\fŠWXgRS`APm9[eCUm@elEU‚HJy[B`=XS<:O(7B:1J),4(>2TH Vf,,zD,>:2< 5@9> DS,NX8[a8fiB\lG^nISn@PrFViCNpFLlA]sBt>_zHavI`|?e‹N^QPJ?qC5]97Q$N[+S†8ExKDQ->c/Ae8He0cf-?‹<OcB^g3bx:wt@Q’S]jRLz1=tJ<A+JG+:b-,E2/;(H8Kf2VmSBzAAgFUj=_jEXaCNV<_O<}n;’R”ži·…ÄŽ€Á”±‘m£zO’|_nXIjDG`8W\>SN7¥@+K¤bBTIKG<My8\j7QvNja3H„N9lRDS0X])=rJBP/5O#9I)1E=C#)E)1-5?>@5U,9C)EN!Db'I`+?Z,Ca(W\ Vm.cb/iq;›qG•¢y·—¾’ãÏeÛÊH¥XV/TG.>a.3A0=:X8$lzA~rO‘cCNI9nL.€ƒ\˜yI–ia{{J“sHy§Qf[rS9GqS_i>¥¸lN€e[I-TQ(„B*pM4N</dh8o|Lur8xB+[}LvoN`CQB3zhFqqF‡‘_’ƒnúzcz^[‘jDu^8wvGI}]]m5YƒRfS5QuHc]9ŽkHg§^Za2Œ:†Y`99›g@ehWáó€ŽÔ¤„™JiO7sT1si8O]3GY(TR#—¬Q^”^Uf;]?FoBK[6‘bF¶€cÜ‚a~MXÃ~…x<z`?’M1D3Æp1Ä\C¦…S”waK9ˆ‘TKP0aE#ŠW?n‹C[€<G/!o9&ÿ tö䱩ã–Î’‰À’™Ë”—³”ŠW`jA‹W ‘cñs[”£rqUIjR\„aLœYfc5v}Ky‹\WlEЦkduGhb9^h@|jDD‡HW_6O~F^Y<NJ*CM&f`4fjEVf<quGp~UNc4ja:kƒP ¢k[¬iWrPf]4loHw‚e`–axvW…•lšœ‚ƒPNh<{…UY„>ph>Ub3i}Ep‘AGj6Wp1t„MwˆK¥q•¤k³ÆˆˆÊsmgAlT2pSÀè¹ÅóȼôÈŸØ£’Éw|£YhvBnyL¶°v³“d©tW–œ\‡ÍsiOßÈìÿ°¬ê—²_”Ãc”Ág¾‚`Ȥ~£Ã…}¯H³¥fæà–uŠVã{´Ë çÿÔÖñ€¢Ìeœ·n}~Yu€`{sR||K_k;zIsg7zFZ“<I]2~vCRv6g‡IuR‡ ]dp;Pf2i†I˜¤O~ŠKkxR“xJsXDd\Jh‹\o{OarA~l[É©e†©`y|Z·‚m‰ƒl Äxu“FytW±elžKp‹@iMi‹Gg„P‰£q~±TuJy…ProBSj@so[Ž€`‚MkhC¤¤g‡’Ixs1Me/_zDŽM}Œ9_ˆ;h¤Z€Â|™Ë•«a‰ŽUrMqwJcnO[sKpƒXx„tŠYn–`ˆÒ™Ïÿ¶Íÿ™èЦß}’Îh„¼jЧ®À‰ ƈŽÃ`@s<3IDL€|‚´lfx8HY+DQ8Yc8gƒJr”V{[Ž•]¢¯o§˜t´®„³Ìw–±U}‘M……PtŠ[x¢F^ˆ:kKlžITu<PXB_hM{„jŸa{Zr¯t“Ѓ•Êqˆ¯Tan?jrUrŠSoƒDbr;bp@fjDlqEixJkzS]~OW{I`q:Ol7Nq8Un<WpAahAf\3KY8GYLxdH^S?HU@UZ7?d55W9B5,\K,lA-rP7KaHNSJlV;X~Mgf_V\?SXA€R=fŽJS}yf[V[];@jL=IBOX0Q^7PlDVuKXn=M~<dk>_zAYyRTnMS_DLP2<Y;IS/^\,tv8n“Jn‹YY|QOWEIO9TW5T_:JZ<W[;ezQM{RHgDA]9A^53W/7=*3C((C(47&SK)al1:y@2KI48%2F&C8+KC)1U026.4F @L&IS%P^%Q_/Lz=UvEct3cx7ww9gƒDY{Mf`?^c9Li;Qg2>`1DY4Td*y|:V”EArMQ^-er/G¢]F{eUg5Lq2Vs<X†@`†G\ŠKS‚AK|Ief<8„=5J1C@!K7OD'7A/IH2cm2`‘V]}QY_@ae>X_L=MD?H:FD,LP)J]/iR,~eIrL®†Z˜–p°ž{¢»‹x·¬bŽiŸ{M›ƒBeOda8G?Ka9NW@]s6iwDH\6zj,n¦\NƒeBnLTf4Pf8Mƒ?<e@4B$1533!74?E!;K):I$[Z*GN7EN4=M(JQ#Dj1IU8o„69o:QR"p5•zCm‡Wn]HƒqD¬…b¹•y^Æ©HwoR‚KAiDBP6av5—e££VB_W]1"YG3q3)]ŒWÊZD^€u]‡Buk>ršYk?ndF`tCº’]x±mO†XJa.YL(cL,h^?lcIu^>b†P[‚B”u7”{LgxMbn8ug;gvNnOofGl`H\A4g3(d]AZ=3ˆŸ_|Âz\[^b7fwOfa=c“]d{QdŽVYl6q|I|€?ƒw\‰bU³œfÏâ‹|ךN}XTF1:E-Ka3OH-;I)RS'¢ÌigƒR\kO·—L¥°slJ„T:•sS•–_ƒV‘WCl•]ir7—\;`J;dl5Um>yb:wZ9RG9zŸa[D8lMB´|oS@0J2,vUDÒ¡yÿ˪{ˆO¹‹X¸½ƒ»óžá¦´ç¬Ïlj̳֕¤¸†°yƒc²cBމ\veC„sG|_?Gh.`C)™Qn°mkuJfc7OP6…hKƒ^Fm£cVu<ke7:V21D(9M(6P%EP.JY-maDjsI:M!Lo5`j@ ¹xHF3B A^-R`8€}Vˆ•h†£ƒæ „——h]‡RQoGlSV~=La-Vk>ZBm}9Rj7XvByNŒ¨mÈ|uvGßИ•Ò€cdCe„L~^RÌСÄð¾»à»±ß¶”ÖŸ±d‹h£’Ù¸‚®‰]†•_¨p ¡_dŽF¶¬‚¨Öx¹È‰³ÿ¶—ב Éxjy<€[Æ¥}“§bh£DŸ©X€¥U»”v®™…áÿ£—¿MŒvI”\K}n½pŠ]Žƒ^ˆŠj—rI[`Dr„Z‡¼jh¢UoDo‰Gd{@™‘V€ƒPvA[{N£®Wk•3††RÄqYŒ‘h‚¶f|œe£Å‡”Å€Ëvc…Mks5hz]ŠÏ›¤ç‰’`Žœd‡¥Qs„Hw˜Mj•KcTj•dz™YgLxbu‘GX^/`J-`K<lWCviIu€P[l3M]D£‘Tlk4KvLSˆKTsCot?oz<kV–¹~³¤cš„QzzT…‰]‹¨tu·|žÛŸ³ÿ¿³ÿ˪ÿ¸£à•ç¶ËÿÊçÿ°Êø®ë¯ì†¦ã~–²^p€Ml‚Sxmž®{’ʇ|È©©ñÂÃß—“½^Xp3J\>YtPY„Km™Mv”FvŒXŒ¤n…¶| Â{£¿Rv•BrsF†kK€{^Š—M_4Ij5Zl5^w3Ci@_iVŽ”fŠ¥Vl›d‘Ér“»j’«f‹CC^5SkPv‰Mco;Sh<asBll>[oNv‡\TmwNp{Qiw=Ob@WtDPk=DiF[s@Vg4>U9BpSZƒLWdGFLEPG:Qc4ZY;CO3FS:CD4>>*P[1_`AplHA|^`G\uX:ZY=€P?‡Ft†ukgdXnNApF]cIm{@nˆRcWXXZsHLoALhJDe9UU2HT/ZU6aT.Gg2EU<^X,f^6`q@QqGPV>UA4TH-S_5=R1gU5“j/`’^KfYEjBDl=M]@9s11G29F(ElAVvG_bCXY=Rd>8jIC15B2#:F+@G.*Z,/G6<C"GW'@Z$AQ([W#Yn1SuGEo:Xc-at1IhB:S7FK+=Y*KW%Fb(3]3FV,X[/si4`F[…GZq>Œf<l˜KW£“Bv_GO3^\,io5cz6g…?cŸIS›WI–`AiI4Z,4J)36"4:!B1!F="uT*i€H<†[:L;W_&7a7?=0C:)ID+M]+YR+]h9Ri=œ|>kçoZ~Q{QBxZCpXCªdIµŸa…¼›z¹–]¶`yc…XX~R_|P^ƒGGX-Žr3o»Ve™p]y[XA™ŠD‹Áv:¡‹1YB870A$.2$G8 N[)cq:`hAhi:J`8>W/ZI'eZ1y|>S™N=B7<M%S[*fx:Xn@Jj;hsA[wFwlE^…Z„ixCi w¶“iÿ¥p‡ªrRR9GB2X:'AL0b9-kxKŸ[WRwHRh3…”c]uZ‰Hj‰]•vR€°hf_O[wFgs=UKu[3›O;D=¢lEm¢^Sv:gl9a„=fu@j~Ft—e`lTQjR[I2CJ6aG6`T@U\Bå\:€©ržË„VœqKuFaE,ªcAuŸyuYu—\WˆQd?ƒC`O{b?ÏœcËç‚ë·xK[sKhzRKbJH]-G^5dS!šºqvJ|Z´“Cà—Rש‡fT²£gÌ Wy²zœ~PZŸiaz<onF_kMg|@S}Cf€M]{G]`Hf¡UT^K©l^Œk`BF3ZB4ÿà°èïàã¶vš¬kYf—_ÿ¶…¯}§o¦¼‚»¾‰ËÙ–¨º{Ž^†uJ‡˜Wx•pq^Bn]@…wCV~KcaIʯ…e©r„f8Wd;rdDƒbA|cKz¸n]‘T~sOJ~Eib:ycDq?m^5muK^]8@uDAZ+<W/TZ9®¶vR‘Q+I%@I(8Y)`^7pQ1ˆ„Zƒ†^l€]…eb‡ZfJdrHFY1T^8Y|@ci8]r9\Dht:¥‘k‹¬bt†V _£Ãyœ‚PŠc@žOB§^Mª~^¯¬“µÙŸžË‹¥`Ë vÌ•·{c—¬f‚”S¹Áƒv”I}ŠL”¥]{†3qo;ƇƒÑÜ–¼ÌƒvŒGƒaK€‹O„“Xw•Ku¥A¯ ^øµƒìê’¬”Vz•LlfJglP¤ŠnɎxÚ¬†Ç§„––y§˜w¬g¿t¬¨a‰iA…‡Rp–H€{KatA`tEuŠ_¢§Qj„6n~@ld>u`6aR4og?~xSœ£ãÿÏËÿžev5m^]ÄÒ«¶Ò‚v²hh®Ws¨Pgªd{µ^”eˆšg…’i‡`|‡XytayšNVd5NR>fjT`zVe•gr±fO„CHS7hS;bqYƒ¡rƒ“Y‚œi]ŽDJy>WtT”¤q²v}ªov—eys§¼¨Ëé»ÇóºëñÃõëÕþþÍÔùÌéÿÞòÿ±ÎõŒ½âv¬°Y®˜c¤¬mƒ˜NZwDRsFh†Mv‰aœªz³¡yº•hŸ€W‹uImi7_cJuU|CfŒEW{5Mv]…¢‚˜Ï„§Ãc~‹E]rFYXD[L’sWŠY††M[u-@_)Go3Wp;\VFsm\{Ÿ]q¢[‰¤ZktAXM3Xi0A\:LeEq~>Uk2Qj:bq;MkHWƒ[l‡JdgC`UDogVpqLamOnwTX€XX]_YZ‹SIƒb]ŠflmEnHIMGYVD`xA\mCRd>?P8BQ5mU/{‰ClŒ\]yb:ibGFOXF2PH)r<)f>w|nUZOdNW_Mfg?i}Il†TV}OJuK]S4[Z4JbBQiAVl19b3IR8UH'EU(KW1fX,Oh=WcIMb3DW4F:,MH-:X5@D8jK)jt6GkJZSERb8IkHedDC@KhL~{J|§m;‡oRHHW@^X:5s>17H*0';3#RJ*Cf4:fJDR1;O)5H$FMOV'Ka/Ia<NW6xo6Y†V>]TFL+LL&;W7K[1?f*IV4EJ/:R8NR2ce,XGUvNhr>¢r9`Ãm:’šAV@F_/7o=AN4^L-~e-”›CeÃk6™‡BK=BQ&=M-8R*1A.9@$ZV+Uo>8[4A=(FY'K]@DV<FF2@G-I^0[V1Ze?`\Bçy;uÿƒUz|TP9Ng>AcCd\>niE…d9ƒY‘’j‹ˆh€–pm–wd¡vLŒQaq<ƒ’MvŸKUŒ[[nFqt<’U1£uH}Ù›PÒ¥G’v7hDJK2?O1W`2ic4XŒPD‰SKiAIƒK_nHws6‡VFz];O(<> EQ]e2\u:cxJlr<]FIf;aH/Mx@jr4l–\v‚MxzTGyRLe:EP-W?!me2YV>Œ[2k‡jFI0‚Q1N¥qYc:|l9¶Q¨£l[z]€E8~»aâvRÄÿ¨H…wDA-a5*K3UN6Y=%`f+aeEewAAsQž`R¢bPm}iocSbhMkmQg€Y‡b¢¢`±¹‰fä–TmDE`AšO6wŒlb…[zH]ŠOQ|=TQ*vGq|F”¶fì³i~ð¹reEcbInƒR_¥bVz?Po?PY(TiGœÜ™w‘U¾Tâ‚]°~e¤l™‘_z›dx’XyS]ŽV}|9ky?Š`_ŠT÷ˆQ‘ÿ»soO^„N…rOâÇ{^]9qfKžgTÿéµ|Ÿo°kM}©p—`{—ba‡YyH9†sP•¨z޳}—¢lv™`rvSŠŽga˜]ÁvK€€QyuJ‰…L®ds™_´‘YƒwUn}UzdAnƒ_GiFsb=d•W¯Á„¹|¥©x€XúlW\7<c1fV/PwHap@KT-:V.I^6£µvL‰HM]==W+O_2K[."2sP3r]7Žt<€uOj|HlyFfj>gl:hu<fp@U‘I]z;q”WkŽP _~—Uu†O‚}U˜ÇwŽF„tUplHyY„bƒˆLžˆRˆ±mkšR¬d¸‹g™Ÿ`ŽrIžŸq§çŒvŸLw„Au‰CNQ#DM+_60€‹`R—Aˆ’J{T‚¥V‚UušHo˜O´kœËg‡p7Š‚T£”rŸº†œÇ„³žcº‡iú™vÿsZÒlP¦cEgU4lF/ŠbAŠtJˆz[•I}tIWqBhg:cn:‡[1alBc{FgZBZtJUyP_”cƒÌ€ŸÆsò„è¼d^yE`}‡Ëõİô˜ Õ‘™Ñ—Ò¡Ü’Ûyx°f•®u™cwn@kQ>xaX„—Zgn?\^G‹`£q¼‹Àws¡XZ†CHV4YK6f\Gq~KszK~Nj¢TN~K^pR’z…¡pfƒ¥|ްմ•Ĩ†¯¯ŽÉÙ»ÓñÆäÿÌáø“¯²b•…Nri3;?!2?7muEgv=ZvEh…PhE^~Ml‡QMj5;I4KL4^Q3MP1TY/Ye:Qe>f‡@[„3Ja=n[`Ÿ¡\x}AdfD„aY”pVi`G…nP…}\–‘g¥N^p2Tp4ZyC}jSw—k“¼]{F]`>oP0_R2Sf-HX<Hg@\r;vn6bo5QiBIs\‹©iŠ¥P_s@lfLƒq[‹uLurMpqOtwWz}czŒs—œ{‡§{†©‘›¾`y>l{KVwTMwP>aE0M9W6,pK&q[1vbDolQfnWe]W:HG110I5"¡Eu5<’w<RXEP4EQ1OS3NW4Lg>Fg>;S.[8,uD#OQ5j\>Xi3BqI<fC=R,?R(JQ,RY,?Y=LV<K`,BO6T>'NX-O`DPW>|n<Q†NUaNG\;]F:On4[tBxyDœ¦q~µ„C•'QOE5#NBZK0Ml1;uWDXEJ_5GX<[O2>z>0QJ2G%I>MM"A]-CQ&F]-g`;t5M¦_@UW=J0C7%GP#Ol4>^@8O8JW-Rd2_{9hDlt>P‹LP_Jˆ]3‹;B„JgpO]2Ci86`A4D,KK)n[/d=N£U<mc,J*57/=70e5X^;8g<7Q2BF%FW!PV<Z]CHK9HE7Wn6[e6Kk9[\I”[.\‹CIZDS]1ZyRY€Wl~T`rWyvGh~XTUJ`R]T6zl3{ŒDc©_f{J_w7`v<CbIQ\.Oh33K3r/"´X,°Äy„ÞµZÁ§j¡‰MŠ`Hu>QW3pc-r—Nm¥af^f•`~‰?foIh8n4BO+Pm7Y@g†Bi“KyˆTe©d~‹M˜³cpÂg‰vFŽ{?TXPOV4Qd5E])AT*K[-ˆ]/Le8—W,E^F@+ti5NuYlh5r|Iâ’Kz·†[VJgA4£l5ÿÃw’ †—Úx<uy=W/@);4!@.#`C$_o/aiFh`Hwx;rh9cC7Z>1…xC—‰fs¹q±}Cž|`®™t–˜x“Úm¹}U¡[n‹VG„aQe>un/b‰J[<z`,fŽVr:r¡Q±ŽM‰Úr–m“£u›È•n«hoš\}Á~Qe4›e8˜nP…õ·Q@[]5¸h=Àº›|Š`Tr~Mf^A”ƒOXfey6v€TwyTjgMƒH Ϙs¦Ux¡`¹çœŒƒdXoUnlCÿ~PŠpUtŠNm‹MqŽZ‹“aThD~S&<'K`9˜ÔtŒëz´a§s¯™ÿ ˆh¶€AuS‚‡X²¦kžr••iƒ‹Zx™emPunF‚•f‰‡XkJ`t@£ƒS–®i¥ˆNxIy€aIi7]oE^‚SMgB9T.clELh9Fe=œ¸vWh1=p2;?XN%>{38R'ka5Pj4UY6cpH^‘If=Rx=J^+HZ-ezMƒ¯h•Á‡¨°my—V®žy›ÎŒx·k›žg´kqWJ¡›€±ÐЍ¯u…WmeEO…Lq{H˜¸u±¶¢±lra9¯nY¿Á…®—v”݈’ÙzoÙfI?Xr8O]8’„_}žNbšF„›ek«Uro>^t7`^1|uIœšf±ž`{Cgz^p…j‡´’ÈØ¯ÏޞœZ†lD‹xP¡‚K˜€O†ŠZrVt§VeˆCtuBnrN‰„Mrg9Zg6Zg8rŒH–£XogX§”…ǰzØ¡f¯Y…yHwjL†m]¦Œn Ñú«¸Ù–ªÛœº×Ž¢ÏŒ»Ï—¤Èƒ—Žeš‰hœgulHj[7zYP‰“Ux}F™S~³`pšZ~„fŠªhk›dgSm‘QTw>Eb[b‘gR‚An–Hv¬`|§\cŽay˜z®oz|YŽ|vÇ™y¨‹j‰tjŸ‰‹ÈÀ¡è⨿ÀuŽŽS|ƒDbd7BI/@J8StMZtFUyB_†LgJYv@ZkFjvOc…Ld^BdX6\U;oYBabCpuRnvD_†;^;DfA`}Omp8Yd7LM;VZRxgO`Lv^Bzl]¨Œl¦T{9Pn6SnQg€h¾n¡CYq9IU<VS<^W5Pa0DU6Lk>bl8Z^1N\5YiGmlM†lµ_•E_sCbnDef@Zi;UW0FL5KPBjcRiuWdxZm‡fp‘hfj8cyHTiQGdLHaC@];1E;9I22C-ME*hX<;nH6;M1/#!E&ºL„w0MrhBVNGQ4HM0FO1Ua9Nd81P88:)EBFY%EH3hU3R.hc;FrK?f>A].I\2EZ5:_FPS8?W-FN6RM-^^1Zj?{€Kh—MSz[@YE7C8]9&Jl&{lO£žd¯…K‰8\K2H17D-CA&UO+k])YLPih<E9:<1UA)<x18aOCO+JF)HP$Ba*Vc0Xw?qj@“q=cšU[tYDu;<_6Vd0X€=WwM^dCVi?RU<NW1CO(RO$eY%8…DQMC‡O(c’BKm>]CLP.4\3:C*DK ;d.cM8gn/I†d.c?*F))145[5MP'Ee:>h:CQ%@H RL/N]CJU?RZ7P{?eX?Xo6@fK^R8\l/XK.gQ0e€P]‰`_‰cc‹Zfˆ_fLcuOaMp‘Tl•TqiCN„ADoIHX'YK BkG@m5NJ'9O,<O4eN,ŠX*¨€D«Ã|—Ö¨mÕ²hÛU´„]’b{‘]n•b}¢_ZO„Dpžb^’bcIlqDh_=T`<]a/`e3¦yF‰¥e¿Ógv¦iGW9YJ'QP;N5N<$P\+Hh59|B4Q%=KBH Y[%Oi/ry-S‘\L€Ifw;Š¢KšÖmmz[DQGA:3·F(œ³e–Œc‰¨`VžkLb;_=0lbFMLFN3)aU4Nh/_X<^R:`[<e<U†™q|ŽgˆWŠÃg…¤X‚H™nE³‰`„á½zëç˜âÍŽ•¶|dtEek<sActAs[ŠÏ…Šé¥®ÖÅÿŨÿѱ䴤ܬ’È—™ÉŽ¢²†wj8}Nݵ}k¿ž_NP]=V1$ÿWEX¸ŸimKxlR|ŽYƒƒ\dœ`[D‚wBŠ‘jh}aÁšn|’x}I¯TÇ…eàʂβ€w¸jZy?Lh1\P5`J*sK0RS-\@$¿sNWuW¦¼l×ÿ¢¨Ëu‚H‹~BrD…]‰…V‰vA[sJ ŽX‡§tlgDs\@‹nW¤›]Œ rcžiŸmI•agzA_‰WyˆR{›[ar@ŒsK~heŽnv‹iRX8M`=[wJXe==O.rHA£Îƒ?N,?A!(a,DZ/`Z4dr2Q[1pm3~|O}GZm9Li6jW=_fsQƒRrZv„HgzCo‡G‡O¥“\€kHŽ–uÃ謒ƇÀÛ¥Âã¤îÿ¾n³}g«—iUxA‹ŠW¥Ÿd¯ŽAplIšŠi«\go<¶“Nž«YªÄop˜Nl‘To¡TˆR’NrˆB€‹Idu5MW3Sc3LT&CT'asMg…K’tX°…hŸdUÁ”€ËÖ¡»¿½·†¸ä‚ƒ ]zuIˆ‰I}•Lµ©oŸ°h™^mk7IW4ve:Žc4_[0}w;]]2t}J£Ÿx¶¶™ÿ·¼‹]„oEyp@fa/c:7„UD„`XªŒz¾Å‡œy¨®r—f«„m‹”g¥rX—YD‰dJdqnMjkKkqSƒ‹br“_‰¹myµle“JHi;ifDiqH[zJvœ]m{:nYP»”Y‚B‰Æ]¡Öd…°Pkv?p|S…™XU^>g[Y~os¥|x˜ˆ‡~¶‰kŽ…eŽ€Zq‚O^|QcQQgER^Re‚RYwYjœ]už\x¡ew£V]ˆBXrFenA]Z4T\9\_?]_?h`?vpS}ƒBb?`}LhŽU{„@Q`2QF4XKN}‚u‰‰YkmKvdMnxYž‚[—wGhe4N\6_~b¦²p™Vjn;UkA^{Lk„Pa‹GOm2B[6GX>\pGlzC\wIktD]e:^ƒY„ªd”®dgžc\‹QQg:Zb=T\8FO5HN@biJgpIioRq€`†V]O*@m4>pGXR@kR:UX?8`@6Y<?N5PU7Yb>'ZE8-<:3#,E*59*S>%VS%LP1FQ+FN)BI,UQ.Y`44V2.7387XH#Qk/Cc<9R<GL.K8#RP*Pp/Dx9R^9E_2=_NCY>CX0KN.OR*Wc=…~Ar‡QPnZBeF9K69@.X>uf+‘_c˜EhoEIF:W/<C1GK1PN0JO7mN/Qo0,wm68E:8$N>&Ue.XaMU;OY/Ol.nuAaFYtRO`F…\7WŽNQpfbo0d9eM\ƒN;pSEB1:O)<C'/:#0> =CTTUY*<ˆCSP?nZ-g•LI”c;oB0Z658%IABc6UR9aY6H‡I?`M3e6MH@G'EK0LJ2^a6FsDFh9LR)PN7m\9a[<eTEZ“KZgPwuIt}WLƒV@\5?H&[G*cuBy…Vb{Q‡tD\ŸaR~OsŒGo’OmwLcoQ]eETu??yH3_2vPVk/>g4>T0h^6SoO;]>]_2Šx>¤‹A~½ŠtS™}Q™‘eœÄ‹„ߢʜo½€d–\`ŽXpm1fƒIJƒX+\C2E6=H,CO#^_(®j/±Y[{YGyN?Q86B#hOmI%TK:`Y8Šk<TR@R]/C]2?F*SC,b^<u‹a]’jkvTio:Ñ•J¯’t{ÃsMRDFb>ckB’ŒNyŒcp¤ahqHh“gZLFe,$FF1C2#N8 tM-‰l1 VC‚•jz©…–Vœkƒ‡aš]o˜Xj{Ac_:hd7wZ0È£LɽБš{\†cXrTU–Tq^5–Ìn¨Æ‰³¡`·¦SmgG“i@ázœ½™n“albALP4tC&XV;ˆg%¹oKÿÄŒx̤è›]dw_PO=Íb[¼£swf}qL˜€Q„“J œgK¦mvj3…oy€d¸º’stS]z:WU1×q<½œa…U„yTq°tX}UOrG2K+34D<%SP:“hH£‡cÛÕÆù o‡On–Xx:ˆ„=†XngB\g1cD{P\U8ZT5xfC»™fšœk®‹\¨xYvnHˆ_|¦bƒtHybA}s;^l=t~Q–gfƒ[b„Yl†RU{QE`2@;#F>&jjD©ÚŠ@Z5;M(^€QZsB[L3|sDWy=‹xJŠjIca=[c<Wz?mƒHjO]j9ŽrF‰¡Q}|<h‚Bo{Iž´q¯Æ‡m¤pªÔ›³´y‡–^•…^Ä—ÚùÁŽË‚¦ÇˆvxNW_8\t3‹Jhq4ŠI›†Mk„<q‘E{®Mf<gr=vu>n|Gqr>r{7i†6lx:_AEc.nmA`€7Kk/abG—¤ma‚wFsuAvo9HI/ªjQ†‰a¤º’¥½„›¬c‘œ_‘ˆ`”®kv›J}r2€w:um:sT0qc<nˆJo…<u¡JaªOp—O§lÖ˜q¨“^•ˆNEC$<6'PM;S`Rswcšz¾¬‹ªnt•g“dŽsL•vU…Œa†mTZZGbUD€…^‚†_z€_t`‡œo–°l•¼v…·xzf\B;g)<<,Ub=m‰Q\ˆ<J^-jz7Tz;nFz’F\k<@d0Mf3[zAgpLqtn¡„†ª•‚¼›”À¥„”zL][B_Vqžjy½ƒ–Þ™àŒl¹qq^g†dŸnz¤k}¢ks”XTKX‡IQw5Q_1Ob?fhPt{HcsG`xW‡Ig…]”dr…>Za4QT4LICnqo·µ‡›«nuŒO^~BWuEUhM]nSs‡CCj8UuHƒ}S‚sD~<^t9anC`mKxQkyJYtHIoSbŒg~ fwhœRtCR„Rwœfœ¹u¡Ï’£Ýp«OorFkb@J_<KaB_l?Wa4QR2@?>XUDVM+aa6D‚B2`K58=I1'GJ+IW;AW::J6/32-)(J7MP#@D/B)&E,<@$HO*N@"=I*BV+@O/>B8>F/@=!EB#\`+jk3Pn<3Q@4H-@B'\R'co+?x2SM=TX/GoTMcHDR1AM4VQ5pk6_jDFODCG16O0>?-:O#cP)ˆu=`£d6…iCP6GM'<R1@G/CO6XG2NP3YK;yK+iEO–‚AtfQW:v`.J•[FURa^){w7WŽMUgLJm?RqA±p?SŸOS~pfj1nc3lnAo\>9g?6A9-B",9*+00263H<\g(ik6A‡K`XCti,`ŽcYrL<z@<j<LN5BZ>UF*bY/^_4PrDCh:Ib4EI(TB*OP,]_3Xo9D|CKW*KL0Kd=QL9~Y.T–V\[Jhi=nsPK‚YYk8Ra<iuE\yOI_Ehj9‡Is]}šaf–VVoVtm>rp=RgF[m6J|FBf9HO#Nb(Tn.Pj1RU;VU6W€B[{?NvC¾a-gw>JpE`+bK2zj1‹`I©‚K£È{†ê¨Hž‹q_0~q2–†VŰn¯÷¡U¨’DVAuv1y³ZO|N\W.UV,3rP.@%:@nR&‡X/_eGcO0W>.bB/Zf1\O0iF1sB+{†V¥xm¨p™sP|µi¹ŒYVa…`i–`a¢gn}TuFQ„SiA-·xDA©ŸS?7]K,MQ/XS>WaDdP’‡;•ªw›t‚fË{J‚zF˜zFg¸n^qD>E'I@BB#Ÿ?$ˆÔˆ³©mÇã¯ËŒ†Ã‡¬ÌqƒžerŒW‡eœ´||Àj¦jÁ†[jÊŸy£dz®etÂ}xO^PZm/¯ŽQÿÑ—uÍœ‚]AnV8yRB‡qT¿cW”Žqœa~˜Xzšd™ p\¾všs8ˆl…z[‘É’u]7V„;]o8§‚^‰€i§y`É”jÏœdŠ«Zm–[Y~LNP?NX5d[B¹rT™yižÙ~à݆ÿ¥€^]¯bO“9qt5|Pcd<€g0„oUv‘b’œg†jP¨“m›omnH¤[M…nLul=€¡hwwQ][;`oF€š_ªº}¢Áƒ‡Ÿfƒ‘^zRqxUh{^YwRUxLq\ªÐˆ]˜WY„M‚ˆTpsKo‡Hy†OŽ€Q…N¨…Mqi8Vh6v~M‹ akuGWa@xwP¬e[|CpŠLŒ”Zžl™®|˜t®ÁtuI¿ŠjÄ z´¸ˆÆv„À|½Ó‰µ{p®mXƒG_šR‰•[m—?s}An…C–Sÿë‡ËÚcϯTVj.ON*YK(ej4ju7hz<„YV‡CguMfŠIvUvP‰{P„Žc€‘Rik>kT9R`3FZ:[bN££¦Ç|q³_³q¤Ètš†I’bGk_=zb=umBhz]¸§±n…ŠVŸdžï“–ø„ ÊsˆU„„_x›c_…`a“p²…«¾’ÂäœÉê¥Þ׋´o·¦‚®³g†yKmD{P|mKp[Gr]Fs€_”ªu|¨rl¨q€ e€¦_s•S€”nžžgŽ¥[cœPK„8Yc1WP>tvC^ƒ@fƒ<`‰CZŒBGh9MoHXƒGNr>XsMd“jƒµyŠ| Å”µÈÄ•kŽ^?WK@€yc†º„™Õš³à³´ã£»â—”Ówtš]q”o{¢|‡¥y¥swšj€ \Z‰=JmBQgHlsQlvJn|Ig}A[sFqn°Ÿjˆ‹G\k7TX7YbIr€€É§šÑ|zšKf†FW{H~}Q™…L’‹Ru™MWz7J`3QS2dX-XN2YU:YeXo¤gx©ko ~}«ƒ¶²rz¯xy¦j{Ÿidžfi–j€¬—ɯ׉¥¼\lm>VR;Q];W]5RM5OR5LW38K'/B2BL9_K;G`@&oF<7=@E+6I,NG-$K5+1:7:"3$ $445?GTI^I!BO.CP46B8?B-9<(V<#Mg+^\8B`8:T7@O+NT,Qh:Pi4<^-OL2]U-I{SC`LNP.S^4em=[eL7TAA5,>C'=Q-DJ.[^,{z8Œ¤[a›n8YIDN5EU'H\1CV29O8XO4CT1?@5F(Ìt7ºamªxiŽjx‘ZI§kYvns{F^zHQgBnn>qt:w€QŠUXšRZ{WJi:AO95M.CF+B5;Q$AO(,I,)1$&2.+64W6Zf+WtFCƒQiU9KBEcJVJ+^g3YŽBF}OC^E;N2KE(LP)Ja73V6CR0IR#HD-RZ%RV3E<MZ7U^1Jf6K_?…w;Z£hXZ@So@X[@M[,at/~ŒPyˆ`Y€fij=€~?nuRo~O\nJrhBf|MYƒROxNObG]a3LzG=m;=T'[b+Fk2_`(EdI[e4U^@Tk8RZ:fb5¨wMPŽ[RpEQuJDp>@g=Wc.žs1§™P:°™IWGJU+oP5†…L™•_`–_]Š[|DSBDlB7n>tH*Uo7;XILG&]Z!nb>\j;EP0Z;&qE(^r<jg5@4"lE/yž`¨“h`¬r‘§Yz[H}|Em‰clk>ˆvAmˆaV‹`eu78{R:4%žC!™¤xR›WUE~^=žƒk•¯u«Šy‘nØ–H¦Šutuct}[ftYšŠIh²mKjS;Q,/S-);\:‘TebT’_9¡ŽIu‘Mmh8dg3~T‘ºkœ•^®Ð~…Æ‚¸¥s–þ¹Œ¢mŒT€¯fvœX^u;fk,”`ô†“¸}›¤{d›yXxŒjwT„Rƒ–Y~dx›p¯€i‹«€z‡Oˆ Yšœbuªtg~:aa>•b?’|`±nX¿ž{¿§o™r°’h|~^}”`uˆU‚tNvˆUà|g›zh€Î…ßÑqÌÿ©³Ù•ì’wć¬mÀøe´ib_.Šf@j]Jf_F‰h½„Y‡ƒI‡xOevJadDQvCzƒY¬¹•Ö‘‘¸t¡pR]”cDs‚X¤|X_€UV`9tE?kZEfŒa…„cŒZzXzŠS‡dBP`:iW:€Nuh;vF¬•\ei9ˆ„Ky‰To_9]=*cP3[P,…yInˆS}¬et§c¬§oz‹EhG¤Áyy~Y³}‹›[“’x⣋ԋ“Ƀy»s©Xo˜N‘¯l{XkKk}4hi2zsAäv=‘T*‡[3gƒ:nlQ{ecx>oƒA¯š`”W€U¥ˆj‰[]U;`hH†Œk~zQisGfp@Vf9m];‰t…Æi©`‹”T•½„³ÍŒy@hQ5rW:xQ9im=svC|uKˆcAxY@xk?l]:¸Š€ÂÑŒœµh©‹e¤‚f¶‘jÄÁ±·l•‘f«g·]¾™c•{HQQ*<7*Y;3a?9jRA}xK`zEeX>gK5}vZ”œ}‘®Œµz~ `jNHc9aqS‚Sy•]|¨f~¸bV}Mm†Yj›d‹™\hšcu±k€¤hTIId>Z[@hrNgXz§„³Ü©¶ü·Åù°·ºy±kUpYInVAcQF‹€h¦¾—²Õš²Ð“¬¹r•žcx‘Vkb}œu} oƒ–jpa~TfŒL_„UZnNioZ}Kcc5ak@TqDdwRuiQ~bHg\6PZ<Wb`gŸ°Ü®¹¸m‚m1Vl(Uq(]~9e•Tn³s†¯_–AZc1HK-OG*?I2FW:NZJkycuš{ƒ§wŒ v•¨n‹ªk«|ˆª~Š´……À“{Å•…Êš˜ÌŸº”®[jqB=S9?S8QX3LY2N]FVqPOl75F2.F5BE1gO1F~BQ`I2d@0E;;H04T*B1""*&!*)"0/3B=@$=P(PE'S6*FG3<I;5B0><(X>!J\(AX<@P3FO*IP)Vf4GtCJf>Ca'LP1VO.:pQA]JTQ$mg-awI8iO<MA=H/:K.EL2Fb1uc3™Oi³k8^d89;AO%VT,Gd84G/V6(\A)LQ3Pf?kh@dc?xmA}lAÄn@Œ—Rwªx¡‡Eu`FN>HP#_R-„[+—m6tEaˆR:}U4JF3L#,D*)?%/8"B.8M&2M,+5&(3&..!%3//R:b['[}LW‡Q^r@5‡?=TDUN1za6gŠC:ŠQ2R<B=*XM%[n?bbEMgH7sIGD1LQ$aM0G‘=B`GBO+FT=cT6€ˆAS©xcrFZrJDdLS\+w{1uŠeŒxNx©`Z˜nuxL^‹LNaHGk;_qBd}>{vMVpMH_EV]7IR6Gf5O]+bl39f<NN$Ke.GV4QE,PU7Mc;kh9€•T†¦jg’dKqQMO5Ph4Yj4Zq,wk3T~CIjUSP$yX1qwIi¡\ux\hŒAD‹=B\,BL"PI#ad7cˆHIj@?[3UP&JJ/b>$]P*nxHu˜O_£QMƒOcm;x~Es¢o„Vަbg€\q„Ph³w=DDPR(a^&m|IMwJgE&ˆ™S6£Œ]O4–V,ž“j›ž‘Öi“§‚‘©€šj_sRFƒmBk9¦\A¬nW}~X‡…U€Q?‰fM`/;j98I'E<&~A%CsLnQ5rœZRpN[p6–~=²¨j‰½{Ž€IšwMpZ»[Žù¶~wNmD¡±yž _RŒPPm'ˆk8¶˜\ÈÌÕÀ¬µ‹ ›i¡\™}Šf…ƒUjMŽqG‰qV¤{\…`‡‡C—”hŒŽR‚C¦bDš‚QÉœlò²…ô¦„ÚÅ´‰¼ªš¦Œ—ƒvŽ·†µ‡–{fŽga—pR–]–ë‡ÕÙnÃÿŸÒî–ÀÿÑÎÿÁÙÿ¶eïŠK|D}xJ„’mªŠdu‚PxPbQwG-€nEesGkP– hœ¶x‹™e`fAtrOovLvb>t‰L‡_ElŽ^iwPnkNr}JccHaX=€—UƒeEuzSg|LŒ‚X|Œ]zlGjl7l[7xE[v6xI{O^b@}R5{]Ae];pmDc¤T“¬m“©cn¦Zas8Ts.~^°˜o¬·hja;’¡{±ò¥¡Ó‘žÅŒ…¿vqnKa_={r?†VržT_„=\`8llDEa8[M3mo=d€CvY•®nb…;`tCcyF¤|YŠ…TusE~mQ…²sƒ¡d„…O{vJ{^E~g<hb8auJ•›T‘…I¡xP~L¢¶wt‡EfX7_Q:QC*cH8…iCun>lNv…PhxGUV+H;)QE.]N9u_EshCsM–‚`®{‚…]œŠevhIYB4`B6xXBdtJ[mHQL<XB;gOI~T‚’P{]3G=0eZJyŒ`}‘ayvXz™Yi—NOn=Mo<]j>f•Ru¤j²n†™\|c‚“Yt|Db|Dco=YbHnx[pXZp;`V7q\Lˆq_‹¹Ú´Ú…‚}IpHB~ODvU:ET*1K+YSD†iR†xOn]0MA=oT[jNzw\ten—`q€QovC_Lp“gs—hz iv€RcbFbqC^uEmvI{pJ}qJZk>W_Zqއ¡«…¸šj•Thh/Qb*Su<^›r~Øš§ü¥ªÝts@i[6eV1\M(=J-GV5?T8Ghb€³j}¡VdˆPdYh—bpšn{¡v}ˆ’¼£«Ó¶¶Ø¢Ÿ¹t…¡s•«wŒ¢]b{S^m<R`>RqCRqUY†\s…GR\3On7_W<ue8euFSoJCcF>NA=V75U:%@3(-'--2#;#'5$<5>M"@O+FQ.OK7OT1[@+VC0HW8<W?@L3`A(=M+5N3=N+QL']Z&Dg4H\=Ge,G^+HR5YF*CqA<]HfJ#cq-H^=LB7FY4A^<DX5HV4db5–„D¯_L€lAXTBE6:S0EG,(R-J/'U9$LO.ja:NsGBIJUC*Wa3R_=jbBƒy5P=Ÿ|8Oc98 JLRV%Qc/_t3ˆz5‚{:S‰ZFsSDj7Ba*5b/,^6+:&A2EV)7a6/IA):&%5*:3<Z5_b0cyGdPSw>KhMPH6JR0XT,ae,Rs9:r>Oa=ozH~‚FŽ`Z—iEpWNU>hY3T†<@|XBQ5@L6mV3œQW¤slT<}|GZrSg~O¥ŠEj¥ivvSvy@r‡Jg’MKLgZ=gi<VsHbjIQpE?O:mP0C‹dCX-H^*Fc0I[)8\+FX+9_08P.;L/BR0Za.{—Qi‚XwtP]QNz\Po6Fs>Hj&@cV\!_b*=pSAR*T:#}T-vvH_¨kS€DVo0?n+4[(KM"IK)_J#Gf6SV+Ss7R^)Z`8wvD{m@y£Y‚—VSŠQb\3x•UiŸuw¡_YE}qC•²qÄzo§„ˆtU^…]OQ33c(b<½…< ºu_¨l]K™’K†Z¢§x‚€fzG=bO=cP3UM4ƒf0‡\8{yFx‘aU{S~Z5R¦V\lAAg>?I'C*UW5Kn@‡’Az‡XbdfœOs{I“bxÃp•Ô„¶É”¨¸ƒ¹£x“ÿ¼¤dÛÓ›¶‰MŠNQp:`i)—`D«Š]ÉkþÚŸ‚˜uÐ{K¥ŠY““c½¤eqZzhC§xO•¡|¿¹€`›hœy;ˆµn„‰N—‹_ägVá‰Z¶ŒY¢ŸZ°©xÈ¡xÁ£iÛ¿~ÕΕÇΩҹ˜ÒïÄæã©pwev€U†QžòŒå|ÐîÀÿ¡úÿ»ñÿÊØÿŘíd”Xki8|qWœ‹rq¨s¯vq}Gdl;`u>U‰OPe=Œll‘_r[<epI|UbqpCrcEgYA˜h\Q›pbk?~‹fiƒ]z˜LQ[6`G'XP.VP&vR3c‚Hic=bp5Zh=cn>—ƒUXeE¨Y>upSjT:yM<s•Y“±gt€@v—OrªXuLk—Rè°yÁ³ts€Icm@Ÿa£]xi?ˆ]Fž¯wW@Vm4hƒJzX‘§j†²zu¾‡¥fˆ¼€g‡Sb{HŠªr²ä’±Øtv©MdzGl{J„xJfJÊ„l€¨d›°ey‘L‚|S£~^¥rR{sBqškŽ£o‚Ûq`•Efq=ah3qvCYsASj6qJ6_UByjCvhBZFuuFq„MvNjiA[cAjdJklLzjPx^‚zTŠwpúΫ¥šl §u‹ŽandCe`BnxFeP=gTHigE_\BucMsX‡¡_z‡HQY;gbS“b‹—`~„L~ŸPab6OI8^v=\~KnMpŒRl{LbEi}KqjAXe.Lg0MlEm™j€Â†|°_@V.5;(6G29DB`VT–“мö¥ŒÎ†v¢yv§Œ{»hT}BFf*4M#3D?8'B=05]CfŠ\U‚8F[ElpY~|OkxL`y:\…Lc”r’šxƒ npŠVd|S[|GkzFwoK€zXƒ—Zu‘a†Ÿc‚•TsŠ`…£az>]o:Sxb‰¹Ž°ÞšÅѾš_˜m@qK0\J0oS6SW1>U6@Z@Nl`‡¥i†µqtÊni®\d’Td‹^kft—o§„˜·œÁ‰’²uz™i~¥p‘§`lwQkqJm{O^tNGlT`yWa†NJq:9M6NH3LG0RO6AY8H]?ZT@Bh>.bE#>3)"M,?B(BJ/FY9T[:\T/VN4XMCDIAXF8UO/T?-fL2LY;YJ<LM3GI.G?-@M,HN-@Q%?Q+DO-K_,S["@W,TF)=_1ER@WU(Ch67S1BG0DR)Ic4HcBXd@‚ˆDz–Tp|ZMoSDYFGC42K-:>3IO&RB)RF.hcDOqN:F@K@3VN+Q_<OiAekDlv<yoD]T9rt>?8PJ"Rk*Wt3Vn1]p;vp4d8Mt:Ha/IK-cP$L‚;4‘N?\<MI.PZ17uG5W;=T+7e58\9C\4XlA]l;_vJV‚:@tL;R?AO*HP.FT2VK-jp9y“Jd~TœmNsƒR\p[_WLZxA\dEhnA@‘U3G3N?)‘e2n«e]c…|G¢m…•lwwJ_tDSeIR_5ib.Xƒ>Io=ER:Mf;[gC\{SRdM>]6AL8}R-D’ZIV7Db*>d2CT*?Z3Lb2Dd5OV8Wh@eoAo’L]”Q[qNzƒImŽ[_ySTvNEd:Dj%?`(PZ*a]1QtMCc;Xg4LL5n_,j¡I<‡pL^/Jd1Kn.Nd;;g8GB.Lf/Xw=Qt9dq5lZ4fq<tœOg·_\‹MET:oc-ƒ¤ot©yY‰MQR<›ŽCÎ}[ǧxšx‘ÉŽY¡„QiFKa2IY€hË\.¹Ç~¦Ç–‘²}‚„\ކL_mN_O6hT3aU-SW(Xk>q€Jˆ‡h`iNI}Y;]B¥Q*Z–a>[30U)YF/gJ/oŒKp¸Rk’?‹ŽTs²o‰Óz¯ß–ŸufV<I5'vC+{gE¤ÆÿÍšÿüábdOHL'KA'Dj&rV4¦‰G¦âŸ»Ô…Šc“oHic9flL‘dL”~VlrLx\8”zE¼f¦^}f¬qH—Âk”k—e˜gqrQ}\AuS5V6Y/S=#F(°b8ʘXâÂzòð´þ®˜\|o=žyK¾ÿžÍÿšÌÿ±àÿ¯ðÿòÆÿÅžâ}wwW]p8mI¯¼ŽÀÍ‹”[s“ee„Rºœkk‚YStEŽŽdnwPPQ;t`FOjMgH5Z`9XM6trR…y[†£‚•®nTX7[tŠN‚¤at©l]e?X\@WRr‚J|qFz‡LeqA†¡_mƒP›¥mŽ¡\|`>’a@†“fwtW~©a|§nW‰Lƒ„L|˜SewE—“Vw˜O¶|@®£¬´w¬TVa4Um<mŒO–͈~¾{fsB‚}EzŸ\ƒ‡M櫃ÿÿÒÔƒ£ g|“[iŸR©hŸÊq„¼[|IsN”r~¢bg~§ctNu‡P‚dˆ•Z£nDusHq‡W£}_’¤[ÆÀs‚Çtk¯ZQ^=oŠnfªoj£gzÁr¶×ƒÚÇ}‘¤gv€Ptd?duK‚‚SxnRšƒc…Œ]‚qQƒƒ`†~^k×µéë‘̳y®ŒZšn`¯†Nme8lK9^G5aI6aL6`PCqwNpUƒšh®cn‹_‚‡\|˜RƒwOt‡O{”F@G+HR3^m2R`8NZ5h^7YW9^i=okI„sDpS1Ie0Pm.JM2xjKrvEZ^3LN5NVFr€iœsyº†²Þ£Ôô³Èò½Ëÿ²íud†ERr1A`(,2&'$CEFe•go£u‚¹g\¤fZ™JFw,:4%NS,Xu6nY?ƒ`Nˆw^“Šh~‹Z{ˆ\k–bmŒWh‚JnˆQirOlsOo}^yŒ]tŠPtVw¡BXwH`oW£fŒ–Spc@jQC~YBjS2CI1\Y:sb6XY=HkO\…Vy¨m³‰¥àœªâtw¨[dŒYe‰VdxOu„]’d‡¢e~ˆ^r†cu‡^qtThtL]xV[Ždc™`XƒRTpYi…huKDO8@R8<N8RG:WP6MaD]X@EbC0NF,>5V("h>&`J3ZaDDmIOHHT<2\G1RM?QGDJH5PQ8GI7_I.TR5qU?Dh=<Q>B>3;B(;E+4U$=G'?S&<U$HJ!<W&II(=Y&FT5Jc.Hc3I_.L\7]n<PtI\bMŒu:hŸTVbVX]=Ll<;]B<L;2L,9O6QO/WW(wW1FnCAXLHM3MU8Lb=Mf@H_;W`6@O,p@*j:C|iA:BNZ(Rw*Wo6Pk5K`3BP$9V'>L'<J%:L.IH.wB*rŽ;F»kA`Vd4Tl8Z€IYzF\„M`vE|H^LP[`hcCc‹B`‹S?pM;IAGO-F\/TZ;d^<j[:zq@dxBg…PKqO_lM`ƒRm…PwwAQœWRkKocD}wQh‹]—U¦ƒFa…_RPEPa0]_/R^<TWCSk.Tk9I^5QV6`]:dwBGmENg;Lb;;X4nS6AyGET?Ma3Te8Ml@AU5Na2Iu7O€IiŽXgœUf]Q†LX`>T[1VT-]V1Zt9DzHGa+SO!JN([Q,Z}DZ`Gzr8KVbi3€„=M™jE‚KInFMr8Nu5Me;\k<TrBS|7bkCI„EWD(X_.”~6]Åob~HGwBz€I‰˜h[„]7M6c<O¢vÈ]9|—_”95»E.‘Žt^’]{Hˆ¨ndnTlnHÂM/ãÈzµÀkŒVwp?k†\]”dDR@XA/s>5˜–bt’rl€IfƒSƒ{Ga]Fp‡VnWHtGqo2K†Fic.„‘SyÎux‰N•Íw£½~”Ž[‡˜suϵTŸB „…tSGp\Ë™fÿt9POEJ-3F+IL-_m0xG±A²Ðƒ¼Ïƒ™¤u‰°x‰“]˜©}u‘k^ZOtYmwL ŒHª¦gr‚M\€N¨‚Lü¬u¼lÀ°·ŸˆZpH]Q+/F%)+55AI(9W*Hc4pC‘I¨…E™wHS‚CHf8fsEÔ‚[ÉßÒõœåÿôÿó¾ÿÌvÔ€fBNx;ÃyQª£t‹lCja1žcei?xId\~ºy„¹}Á„Þœ—äŸ~Âx•[[s@EG,UB(ØzP¿»u^”KKN-qsIX“Mrw:bV2‹_=’Yxd9[d1\~B{†Oy¤e¼—fƒ™^å|Yžp‘£µ”{Ë©~“¨bjŒNuƒOgƒFiu6qt8Zi<yVЧZf¥WĘXîÇsƒ TuHy¤[fF¹±{‹»p]¨]b‹<pƒ@I[+‚qDÿÀˆÇÖsŽˆTŸŸj…©\„´[Š·U… Ur‡X§¦òÖ ¦§r–œ[czCa€TnX‹‹c¨”d\|Ex¬h‡«c’™T£¦nйf†vX–fHMU<Šla½´‡îìÿ·~ǧf¯°wÍ¢qȼv€‹R“žg–—XŠ€>VCËb[©ƒk¡p‰Š[Ї}ÿþìÿÖg£yM‚lM‰eJrCg|O[gCY]A[`BfzX~ªk˜½xƒ›n“n£¬b†”Z}‚OtˆDqpHxa{OUs?^}EG^0P\AKq5T`+[q1X^4Uc?\n6Up;U}>Lg.CM1EW@FbMPx]TtHUdP{pi›…›¼†¡Ä¥ÂްգÌì±³Ðyw‘Vch1=F!.0/1'GIJ}r¯v”¶w’·v†´io¡D6H(D]-Rq/;N$BF(M>7kaN{vKzzXŠZ‹„KtsDz{Vs‰On?ofI€sJw†Fq”JiŽK^~\u†N‚–Nm€Tm‚Qmx@e^:aZ/WS'F[4`sBRzRc•WpšSoše{¯ŒªÙ“¤Éhpˆ?Vf5QX-7=*JA3WZ>[wG\{Nd|YpˆNatEXhEVnU~Œh“‘c‡‹WZxMQv^y~TJZITLBFQ?9D;O<6QJ0SZ:-O=77;J>+U8$h=,gS0PsG>aUGA>R91LB6N>:F@@M>3N@3SI3WJ0zQ7‚X@TP=fK<U8;M/AS1;_,:X'7Z#<P'JI8T+DK7JV*^X,V?F|NCgITF4no;E–]_d]_n5=`;JF3iW/U~@FrVAWEIO5HO2AX>WX1Pa,EA8VF1Wv6L‰X@bSAQ:NW35V58<*_F i`.=ZPSOWv'No*K]2>R,-E#9:3M#58!>;#IE"8O3RP3‰\+šCWÐwRŒzVgAie6]…@EnMLD3ZB$CA$J:(dT/s{>lsH>xC5Y;@K2JW(UF1AK6PU7[_3of6`ˆFp†]Ž„Nd‡btpKmn<‡„DdtQaOJa^1}ƒIb‰UlU9Qi<P]CK]:``6EM9N[0Qs9GV8JK'ZT0XZ8OU7pL2im6M_FFa4]U9Mm>WcQbKa|I]IQ}H^‡Mvš_‚˜Zw£]~‘TpŽPQ–UO|O9|J6g:HT1LZ0Ac/FT%SR(JX-VK.Cx:>O8TS"De*Jh&ui.b”Sj„TIa`zCm„DswAnˆIe‘W‡¬\g³|Mˆ_FW-\p4z…E†žSrÈ~zšUiŸaacM`5[d6‰žSRVXål6tZ;hLE:-_6‡ƒ8¸s¡z{ŒfF’rfkFÆlC‚“]v[yuH«|FȺ|e¢Šgwaœ‘g~–w}ª]ª‹Ij¢Fp¢NšÁX²Õ~¬°yzÂci‚]nvGs–Lºç„ܛׄqeE_T,ac>j?è}Vßµ™¿Ý¹ Ë£¶»ˆ¸±{vmPƒxKcˆSVeEXzJmt9]fKˆx:¦Àp§¥rÉ‚b²´…¬wYž|J¥g±·|–ŠnoŒU’ŸX°‘n™§mtœbp<ÂvBº{U¹¾‡‰±z™¸zr·yUJOwHe€H{•Mo˜Tv¡Xf›_NnPIc=?m5TG$dd?oŽXžQްG¬£ZÌéÿÿ¨ºÿ¿R¬bD8"Ul8¤l2[h2a[.Zu-Œu-g…=¨§mŒÇ|™©b “aµÙ“¼¸’ÁÁ˜‹º‘”_ak1a](Hc/nv=‘¶lb‘WU€H}‹X\…ESo3UM+}{Ld_6n\:y„Q’’\Ф_•¥S•{ExS̃Ӝ†‰œi–sOžŠT”•R‡¤a{Œ\|•if£_v«Xœ\ ŠN ŠG“OQ–v?x>rR0qS([\.©wm¦ÿ¹ƒÊ€dB\€9PƒGRŒI¥Œ`”Ìmg‰>’›awº`x¢Fw…AƒƒU ”e¹Ÿ|¿¥{ЇO~Fd|Qj–\xCov2hq6‹—f’Áj‘Vo‹L”²^u‡Lv…Wa‚\XhT’}ôåŽÆŠ\˜‰f³°mšŽ[thBšaIºvI™—Sv‚Mfn>Rm<l`AŒc±—o©ŒZ’bbÿ®±X†e—‹f‡KˆN‡‘XzV‚…[ƒ‘Zˆ—e‹¥j¼‡¨Á‚„–a”†[{’Y”~Lz‡CdoS”že„”I`sNyxO]nBXlQhSa‰<Qq3@U3R‚H]š^^¨g]Š=Ur/Fc4JgL^uapˆle€W`lNlYL|b]‡l^soŸ¤ŸÆ…°¸‚¬Žq¦q>BA(<E0DC4IF-B:+]M@ƒƒUˆŒe®¯~ªÐŒ“ÀfWv7Rc/]„<RjAIc=G]:dw?_V;ZoLfIa}@PyFY~Jk—Nb}>MK,I:+`T9n}Mi|e“`ƒJ`pAamJhƒJao<UU1XG&?K)Bd<TsWj”ft•Zm“Le–_z‰¢ÆŒ–¾lp›?AZ19K,0?13%3D0Hf:Vt?[wIj€?If7H[):H$AM.EX:QeGYzZ`†_mŒOWbML]I<RFJL@UP8UR@XbCN_>AF@DI8RJ+oM3o];DPJQV>G3PC=HR5HM=KK;LG:FK;SL9\S6md8›`?\ƒKLlUMiAFj=B[3BP4?V)9^/CS(JP"HZ+He8nV5¯\(¢…Ef–\U†izxW›VW¢xO}mCtA?jDMc?jcCq}KD‡aC]RIP7JR;D`?K\?E\->C)iG/Šo-Kª^Frs]a8Fk>0C@@? QHgX,TxFQ|NBl00H%20445=:K 0M+;1$8:#<6<@!AV*US(‹W0}<FÄ~:kwTY8_o4C’Q1kT6C))<!5+!S0[`5Mc?LJ4:f5<\BBN+JF+pT1TƒJHjI^G:x`/l—ce€PXJXzOa|Cay<FwMCMBgR,X‡KMxK_f1Sl=Va?Q^;<\4>L4Mf5Be@JS0IM&FE(EG,9P0hH4pp:O[F_g@_j;mp5nHo€MSiEJ[0dY.qx8x™Zv¬omª{[ªid|KT€KVfHSX8Rd?R}L>k@;T'CT%U\$BW/IH,Ok+9f@Db-Dw<P{<`z?YE^iQKk6A{BAeDF_+Z[-bi>“d?–§YY¹|Z–_\¨UZƒR„f?…šPx«jljI…ZlK7’kIN¢~`eJŠL`cP„L3J~_SoGˆŠ;–]‹_R—dDƒSigLX\<[h>T^4^ƒBž‹^¿›aǺz|ŠcyŠ\Œ¦Yt¤^]‰Eer3nq:mS0jN(UM&ƒ[2c—L_~Aº¹\°ÕuªÅvP‹]XR2gR0vŠNKuH‡l4„„OžŒ]~ÁǦf± az—evX…‰VmdT–Z©n5ƒuS«´_Š·vr\<whCœnXmk^jpJˆpW¨“k’qM„©VŽ˜f‡Y¡šVl‹P^r6oA™§xÿ¬tÌÂŒ¿°|š¿‰x”Y[€GkuOl˜X{‘Zƒ¦`b~JtŠLqÂpüº>¢g@T)rH…w<‰‰@u‹@ÜqN¶êŠÆWR¥EV\7qAX9a³NRu/_z3m‘Ov”X— gw™[`rAkA”Ñ’aR*fT*‚d8ŒcBbCvJfaœØ…¨Þ—_¡``P.ŒŒ\W†Fj}?_„LkqF‘–Yv¬Xžšc‰¦a{}Pxc:iS9—mO›TH—aO²ÀƒŠºhqŠGxŽRƒˆT…œ`‰Œ\r†Mˆ•PŒAlt;d…E–l›ã¤Z}RZrQS™XJg4DC*ŠiaÛÿ³³db¡Wi—R{˜H™S7_w;—™avÈmL”N[•Dv~K“†P®Œeã´Š™³o€Ei{?sd{¥t}”QYf'fu%–“L§¡h¨Qz‡Oƒ®itÇwr«h–®u™ºy¿ÑšÅ«h‡dEŠ_DlBijEdK|hNzzBŒtLŒqOnpIˆnGnS‡ŒjŸ™uƒ‹ZŽ„u½¢z¡•\¦™X¹ƒO¨€Qˆ¤nºÊy§ž[—wDuQ´˜e›qŒ›bob²}k‰†]ššbx„Mt‚HmsJ‹‚SmuR|›‡¯¨m~ˆLmŠZ£ml“KRT7QaGx“u§¥×˜~®]Zq6J]5TK/II3^^J[nZ[bH]WEfVFu_Mmažr•b…†_ŽtWu†ZYmJY\QmlObeMGD)-/3+<<;sƒe—¦‡¬ÂztŒ=Xj4Y{Jkƒ`t•^d‹H@\0@G4^iDqŠC_Y…¤Z~™JwGdEWj7PR)QQ-VX=r\eŒ‚\o„OfBXk@lk@gq>Vh1MU+ED8DU8Sa`Œd‰qImwIe‡av§•ƦÃk‹ŸDGU$5D(3I/7Y@L^A?Z;Wj6Qc5Rc2DV-AU$+J%0F7LsJI‚OMuSXu\w†UbOB_YFThMTjNPaLJ^KZTEG[FXG?^L6dW9tmE_gHA]KcPGZd:RmBUU?TC:\H9XL<XPCYN;ZbAgo?~hDNsHKSJJ_89`:;M2FW+@X09V9>M,BW%FE(@H)\Q.ZZ,wZ<¯^.²yEªšbŽšjj„o\t\deEdi<mqKisOftSLuUOqOR]Be`DUtI?iN?U8@M(TV2t\.{uGb\cyY,YI4+5EFNQ$Ua0Vq6>q75[.2J(1G"0C.CJ0J[)2k985/*81=3?7?!4:$FK%†C"ˆv2MÐM†~g`B^g=A|M/[C4?.;7(X:%Ln=>\BIP*RR28a>A?*hC#pm:@nKS]<dh4X7Q?\N?bx?_ŠR[‘I[rKEyL?I=\M&R|DChAUJ(eb8Kd=Pd9Hf<]lALRPeH4E466!BCZL-UZ3…xERˆ^[xJW}ETrHV[-SX3;Y4;O'BZ-Mc5c\/q€@wŽXŒ™]xÀˆUyxPN,D`)BS5XK(Pe2EpQ<p6J`&>i;7J!<R(`i'MQTa1Q[/GiC9\:[R*AvAGf(g](d°tXžrb‚VjsGWpKii=˜y>Èp«z`–]hlMk]:q†Nxšob€[lcD™a¡ž}è’ds¿‚n™T£·v‚¡o`ŠPa„G`T=f{G¨Rx¤VRK„xB[xGZrNO@µvNâ©€²’‡¢mŒ¹vg~RAm76)L80[(51795?!aN)e~:t–F‰ÁdªwG‚ˆca€Qmi5zL.~‹F>a:rg6r«Y¨áޱ€z¥hpShb5yLƒ£f–l\«nSÙÚœ£å¢czc„ZD™wfrNq^QŒ\‡iP«“_—¤]œÊ•ˆŒY‰TA’ƒ^kŠJJa0ob6Ík…s_›—u–” ¼–†í¢‘ࣆʋ…”hƒ˜[_j‰L†’UÚ¾iÑÿµ¨üµG°})j<<1KC$UZ$Tq2bv:tZ2i¨G|Y†¥`bÇ\‡†@RŒCt€<`i5{wHu†UrkD]g@Xk>²Æ„q¹y]¯vh¢dp”Yl…T†¤r¦Õƒ¨É‡˜§bC^6?C#^U-Vx5Œ¥pi§fŠyM‹Q‘™V‰‚E©‘U‰Ly‚Thd<g{B|^=_P5“[Jw¨Tg“F›špo˜ZspKk‰Qmz>owBSt9ohEyœhŒ¶yÕÆ‹¨Ó‡¢µzµá¥hÈ‹ZšY…€IäáœSIqX>œ•Y„“Lf•C]u?v”S²¸eƒ¢GzœMz“L‚k9–n?zmD¨‚aެchŽMWwAx‹\Œ£hVp6Qm>Zq"]~)‹wFs|MujH‰”i¯Å‚¿r—™\”|NŸ{c‡Š[{Q‘PvjDwhO–€`®‚U{ƒA}sQu~IyOFvzRtlG¢`Š`‘f˯°Ì܃‹‹KzhBsj;E–dî™h“Nri8toAƒtS‡pT–cLb`¹vcœlU’wc¡[}„N€ƒW…‰Zm‡jÙ¦€¶“Uh‚IqˆS{ŒN_X8SL>vfNƒ§ˆ³ÇŸ½Ý¤¡Ô…o°`a=@T-?K(=F5S\?U_<VL2YQ8`RMq][yp\sqXrkd™un™˜j”“w‘ž~–‹f}]n_>GE56E89]GVsRw›p›ªayy?Xw>e„Ul‰Mi~Jl‚Nv@ny6[h/HhFgyDl[3X[.QRBrvOr‡Jaq;bb4OK.`J<e]EamES^5JJ-OV5`eC_d:OM9AT9GZ??YOqi=fG:iPDcu`s§Žž¼v‚‰CUK7FB,4O4@YEVh`ˆ‹o•™Efo<Mi6Gh5Ca08^:@nCAoOZcrŒ^d‚QVwQZuI\P:^RGZ]OdbLWpNBnP[[O]]GVfE]UEqa=NnQ=TIN<6WW2N[<J\AB=-O4-R=0UM6_L;oP=XoAUVBlG4FY>M@@=@.A3,V@+aa0Qy=DzEEjJ;\99M.><(gF)Ag9RP>^I.mK.wG.k_0Qk:Hf=EQ0Q=)HA%IB2TP6Yd5Jh=NV=[_:K_?<Y;C\:AU*MQ.[\0x\7ˆ†BM‰X*FJ?+*GFLX,Zj6Nl:Jf1Ag7KZ3rm*C…NKYPUV35m>4N6,D+'6-#:;<F*9:"FE,–N(‰<EÌ:pwBK3VU,Ss5F~A:`Dv`6R™QAbNJ\->P22K29A%eU#^>^_Gbh7H^APE5@[+YG2kD jzKeK[ŒV<zS<K;YP)P‚@BdDGS+YV,Tn3Vm?Zj=_{IPjL0Q==I#HO#fH!W€>N?œ‹@v“_a{KZqD?]CAU&FZ)3L4FO&G[-EV5^z7ylJd˜Oy]Hm‹J9Žy@L5[C9Q0<D(QJ$L['>rBk_02€IFQ(L[#ic.4ƒG-D'G?OL"Db9OS.Lq17j<xf/œ’PU®‘DoG_`2P[+ec3‰›@k{Po5v£[u“SiŽVp[”–i…‚V„†G©i¾¬räÄŠ{µz£‚S”—Tt¶}d~FuxJ|ˆLŠX“~X‘[f‰Xio:{y>„†;b™\Ÿh–žu•ž{“¥‰u²Epi<Z.-A$;*H_,94(\:(g‰:cl?i‡8ϬMŽÿß`qYdY8cb5Rc?\zIcŒTgŽhµp³Ãwª¾€—ÖŸ‡ŸkfŸcuœf ̇¤u‚‰k_€V¯—]ÖÛ¤ºÖ¨…Ö¦Âܸ‰â¿zœ}~{E£†X}[‡ŠTØfqU^[IgD+ˆSLuBSc6‚jBßg¦á…qÄŒv¨dOĵzÿ¾| æ®|²ssRx{Ao‰K} Lž»qœ¹g¬c”¶smºŽ<³n>d;9iFcZ>TfAdiI˜£XÈ´B Âb€œIfx4dp?BV#^`-hq:‚hBfzHcScd«Ÿo›ºy¥ÎÐŒ’¿‡Ã€œ°q¢˜chT<tlGb†YasCZg8Qm+¥‘Sœ¥qŽº}“±a|šSmN¶{H™ªYƒPkbDcLro@mTDŒ¥t»aŠˆ]ãËšx˜ceq@hk<Za:g~E“Žd{»zŸ±¨ó´µç¥Ž»q¬ŸmÀà‘ÅÙ‘ŽÊ{o°lÓ´šmÖyQa-ko=`m@\|7Ty>qŽLœJi†@`‚7if>^qE€‚HrI„I—hp…>Wn6Ob(`f2Qk4lqCZ],R~0\m<¦t\l‘\i‹S‡‡YˆMa^>DY@[aX– }Á½ˆ¹¨a’{^™`›xY||FkvAvgIqnBYP:gXF{zIˆaK“€_pü´‰Ú†OpOq|BmzB‘L•yFrhD}mNrs6e[3gJ2sR<~^U‘jOŒ]?xUCqnTŒzNxtI€[‘d®kµœt©¡w“¥\g‡PiŠ]g‘ai…MnƒcŒ©±¾„³Ñ“¸Õ™›Õ•Œ±[eu<GN/9A'@?(IG*AF.LD4c_S{i¥j›[‡wad‹Žf®ƒ½ÉŽ©·lŠy[›z^zkWx„kš³ou™Q{—]ŠšTcyCa{EqJbz@mv>iu8hn2bg6Kk@b‡Jkt?UY5[kAgrA€|AtQ7qO5`U1IN/IS8SY?b^C\eDLX6?A2NZ@aaETdJ[iCXiKrlBVI*>C1ES=]ya¼Žž¾eorH`ZEY\=RXHgcgƒ‘v¨§d‘k0H=0N_;`€?Os?CgCnhGbhFadPmgKeoCL`@DX7t?.pK9NOGWKKZT<aV<^eAilE^tOpjP\xP<iV.QICC1AE$@60@F*EL0cA&QQ1PX@^U?I[=6R>S50r?%R`6>JD(>3',":W/aU*\e=Vr;G~F=mFLR7pS,Rc;RLE2H3<:.Y<%kQ&[c54uK2OA;3!A>&EG0FS3NQ.>Z+BG5;J/;I0BL37X:BY5CX)HX3WV6xc7M•B1rN?G3bW&ix<L{INY7UZ%?M0L;.ud*>’cIKEVI,Cn?3fL/J7$J407.I6<o3MK/Cp*VY0œJ&w‰@4Â’6VbAB1J="YV&`w;‰šTB¯sLTBBd:HS=5K1MI+ir0XxFmi7nW5MSE;F6?>*6N)?5 `Bq‹3_£[L\HyGccBSŽDJlCCX+RY6U^4Uo=Z~LP…SNqKJuB8W849$f:Xc+‰kQ_‘LXW=Yu5Cg>M[;^u8>i55D2CR$7X,{p2b”OZ{UES@ML2rv1H g+UU1:!-733:@FMLm)sŠH8‹Q9P+9K#[D7…;@O58[%@P%5M$@O'_o+IrLP^6zD5h¦YDza<;%;S,ke*V†:8T+_M)k.s¨Yg‰WnŒ]\^ee5ž7o„_§nBÅ›ke„ggŽU’f@\®lcxHbn8€[9Ž‘S•‚[tlDajIUP4[W6SM:yp5°vNˆkŸ«ƒ¼œ¾™näO›y>h7ER.V^3La/^F3ˆ_Fx±Ot®U¶¢kÃéœm§vCX;mC1t^H€a¦É}š¼xw‚T°sGŒÎœ³~SȟӰmÉ¿›èÚ±«•ˆ˜nVeiVõ–[°«†©~²vT·xZÖ’_œtg¢q«q–ÓZ‚wXŒy]aKƒ“mn„KŒp@œƒa£lJãvR¯‘k˜”g†‰a¤\Ú¯{ǘ^Üàž‰ËkdŒN†MšRʵnvµ{€vPƒS§›_¨gj§a˜•T[©bx].‰eBh}E„<•vIYŸqWb)Mg0Pj,Ua3S`3~iE£¾l°T„Àu‰¯}œ½}¯Ã‰žÂ}©hˆ_¤µvt¨bM–QKH+|dAo}Hp‹QU;Ž“Q®mšŸ[”šj’¡m„¢_pGœvO†vS™_„¡hhœVh{H†S’{W†pZíÞ›h\?dtBOW1jZ<k”TnmA÷§àÿåÜõħ¯~}ŠKxe8va4ŠV6¿§†±iɳ‘·ÿ«]ƒU\nGdtCpˆBuœLo‘Ub|<^r5Zh;zoI”¡ds—NtœKmqA†…F[pAIo<>X&If.Vj2]v;Pl2Wh8vˆP¢”^«³|ŒÂ¬|‚§i‚Œe ™nÇÕ¶«ÐĨ쑲¸“´õ¢y_ƒ‘WkŒIxxIpxHnX:_Q=mXLxO§bÍ›rÊš`~vKopHlb=dlEx}Iv~MsXvNWs@^pBYa<_RI–_T„REm_Nhl\vWjc9aa:kgAŠrImtEzzChc:rf5b{?yyM„yP…W{‹]‹u‘¹ˆºŽ¯Ó¤²ÌŒ–¡\d€@ZW7L[7J\/@K+><)G>3`YG„dV¬rMgF†fT‹yNpqN‡‚l¸—o«†]qZ“ZtY‡uZ—ƒi‹YyŒc‚RgmBcsLŽOcuGli4af0Ph7SsGh‚ZEcf1Pb3]a?qo:rZ3JB(<9%>51OaL[ŠW\J]xIjuSirFL\=F`J`sPŒ„MZc=OUDXdLAE;:LCQ_Ja|]Ÿfš`n•]w‹bspHYLWr„ŠÉÇ…¾•Ij^&6<#4=(EW/L_9L`0?T,0M,/N)4R->\6Be5D`=J+0W/(H2)*5.03,<5Q6!gE.ƒc<ptKU|a9_[7B;8F'78'E:%>N,CV8JS8RS=OR>IQ=9X9=G7\@*xH*KL8F?;5F.,4/7)E-LK+TP0lK*[`/]kI\mDdtANkKITA8H4DC1O@&SE!„]+Ed33EC>A(8D"8C,3E$BB!?P'7[>=G8ET/Oa:?\5OJ7]X)Ic5N_Gd\;np=<ŸHUfMzg@L{A9[9MG'HI#5<%Z=)ˆt1@˜mKQIXW4\f<TnNWfKClO9XEOT?Np=UnFEl4.U3N:'š=b•AP®’1QM0=+EK+p]0Šš<\Â|Q{SKX@Cl??@6a]-Tt3fP0WO.VL94Q0.:;C:"6R)3Q*QF%vr0t“E\ aI{Xd_BSŽ>FgFNe/EgA\j;eƒQoŽNgXW|MJfJ;Y?AQ6o[%dZ7t;@kIu~As³RZUXf?Wb7:`1=O,Lr/iEj“POS^S8PA!RK/}s5[º/|q#?0)0,84;AN!\T$}•F:ˆd4C&/APD$Q„D?jQ?U)DQ,4J)AR*bl1>nGDP.XtCmmD;¢n=E6KCSd'FR,?a1Q\1hX2ntFjƒTˆ™iL†hbdF’O”kJŒ]{qR’xKZ©kj|QuG\˜fdr8uh@ƒcC`o?ÍN/œ’[zgNcP:Pa8eo@bq<oQ2‡V>š\C¶žl´Ô£rÄ ]xe`Jci=x@lM|kMŠ“A«×ÈÖŽ÷ÿʈÿÐ[“fhF ‚e©·z–¯qOŸs>gK¢cDÆ€€”{w¹‚°d¹°–ñ‰x•œzmEkmL°¨uÍ•tqø¬_fByd4Œlº–„‘—qÿ»ÈôŸµŒ¢¾ ¾£™¶£ˆ¨xQ_/˜rPcLg¸Š€dI{^Ozf:Ö|[âÆ©®‚œŒ_½ v¬Ø•x¢txŒXº“L€‹V|^=pdArWH‹eYˆ¥†§in¤WjNVGWz9qŠTQz:^0‡ˆR\zP\d.an+kDdvBJ„Dgz5™•E‚H›²d”º{’·|›°w¼q…¢T‚¨f|š]x”TtQZY6s]E‰uKKV~8}SŸ“d`œ\š¢e¬®i™„P|yS“s£Ÿg‹„L}®d‹‘hˆ‚^’`P teÏï§j³kjR[O/[]4VM)D?%Ó¯“ÿÿӼ踀_¼tCtEDH5š•’»ÿÑ–û™’¦tâÿ°¸¶}pqOoµ_žN[h8aX0Lh.T@,}Z7Œa4\L'Š0"JN-]nB_{NRu7<R,G]*J]#Pd(Zi6S\6ŸsP‰M}n=ŽJ@goYAˆ[O›sd–w`®|aÔobÎyỉŠÎÛ—¬s™ËjŒ¼\€ŽRzrIo^M„odŽƒg‘”j›b½‡X¯ŠgyWˆnEq`>je9}sFl{M‚k“OX_1QC2^ST€cO„WGrdXmŒ®z}¨cqyQ{iLpcGnqLoxY_oBSl7Rm5VrDŽw[}—^–^x‘`ƒªz¥Ç”ǰʒ»È““Á‚k¨U`Ee„E\p>N[7OT<K\BdpFv‰Q‡Šdw„OfXEufFhoJoQ”yW’}S™mZ¨~]˜|VeGqWT veŒk™|YrOkƒ[~^ƒV€u?WqG]Ov€W•iO•xFhn6XY>W`MUaDIR5@H-5?*2E<Qni|¬r~¨al“PoŒVwVcvF]kHYfGr`Kk]LNfXfwbz{d”vU}~PcŠNs–hm¦m|¤p…s¡‚j`yy¯«Œóo¢tER_>AV4=T0=\.7U%;D'38$..!3.!68"9B-CZ:JlS,770#)2(!3(!1.$21)D(s;)wd48{X.WZ868BK1LE-KJ*GT2H]:BO>HO2OH3TK65S54F5H@'VA"JB,T=,FD0@>.T;+cC1LT:DX?GF+L9VT0tT4bs?WwR6`A4G-26#10M6OX%/G4C4,8A#9D01?-47%BB)SJ&6c<LPBP[2'Q:-.(N=qP"hq8P“^Vuai_FpŒCoQX{K@yN7Z;;D-:;K8 L*n‰ACxa@H<BO;aI3Ti5YaB>T9KY4Q`6Jc??e;Ei6Uy88h5RE-—T(W²UCŠ}Uf@W}J|€I”»Ym¹Š[“R`„WD|KFOEQm0/T:F4%UE&SR7VS<BZ<GO;TU7JT6QS<qr6q‡@t‡NG‚ObU\–QR|=S_6cr?n–VZŠZQ^@Da5Oc7Nf9Jg:E^:`N(g`/^ŒL€™Q}œ^pGc„EI~EH\;>`1e_1išDsXN˜W@`<=L)G8LF"¶k9zèžJž4vV3Q5)E28A"<O(PIn+8 q/K80;T0iY$QTJgAHS0DG'KK%^h6GsFco=MaIrT8V¦c,qg>C!<a$FG(TW#Js>u[=on;tˆV‚¡j}wdŽn[h¨y¾ŠKr«houWw_>€Y=zF¢ZfÔMlE[BQZ<SX>šT9®Z4lN:mc>oˆQp dY›ejUGY`BzŽ\™Äy—Ä‚’±€„°{r®‘ti„Nz¢\a‹C‘•U¤ªa”‰Xÿĵ¿®n¯x™d›·zfvMö§cwª~m•n…‡s°®ƒ¥Ý¥“ò¨“‡`Ѹ“¿è¿žr`ªuH{O²‚UÊtR•̓v`p¸’¸xYפ㿒ÿÌ—`EîuYér`þƒ_šzYS_,}o:D:‹QAÃܘƒsJv~Fas5rDæaCÜzO––n½»ˆ¦©†Š®voŽtmhN‹e<qdR`‰Qxgb‹}`ªn|Õq¸vx®hy±[`‹Ft—Gd™QZq9zdH\oRQX-`l+§ˆDŽkIs{Jf€[…œMƒš@Á¹l–ñ‰±h‘µ‚žÌv€Œ·}q§hf‰RgzDZg?‹tSŒˆe‘ŠdˆŽN¨Ðjo”YˆƒN§¢jœyL•\”®k¾²†åˆ}®\aŒN‡–W “S¡€\}`MÍ¿œÅñ²§Û‰x¦RPx9JM)Z5$.;$§aJⶉÏ⥲ވÅð“¥ÿšS¡HÞhgÿÿÐêÿ ™Õ’Øÿ«jŒU—Vs‰My‚CeuLX„7fx4S\-_H3cgHN“NC}?A]5Mw=JUAjLFT.L\8Gh3>b'Da+X{EuŸf¡ªw†bbŒ[` cŸ’i¹£r€Y—pMÄzÞÝ®¬·’³î—‘Ð~¹¾‹®¸i–¶PxD{Ša]ŽsN¬ƒd¨cÅŸŠ—“]U¯sc¬r[i;V@+]?(Z=)^PN˜izmCgT:rO<•\KXCrLF{ZS¦nŸ«|ŸÊŠƒ²nx‚Nˆj@qkK…W€D[i8Wj?c~PŽ”x§Í€|ªc‚¨Zž{ºËš´Þ— ƃ™¼·ßŸÌfy™]|ªf…³jz²`gœj{°ip“Lˆ®j¬çŸ¾ì}…ÂiŽÈw}Ìk]†I`]Hƒi[£u]½w]ž|S€cIqYN„]]¦xk¡že†™U¢m’¢k«ehŽW`‰Pr\}‹SpLluJ``9c`Zmž‘É‚h‰TNV9KC-@9>clhšÁy·fx¤QfGmxHRk?sjJ}hAhbPŒlcŸ‚WjkJ{XA\N=[ZJdyNj–t‰½†ƒ´¦Ÿ‹½ª›¿¸‡ÃŠ^£qQ—eG€dY”‚NT‚=Jl0:J%28):<%8F"(6 $60;]HMw]1W;3@<$1-'",7'0,D.b1 d\/MaQPhSMZC1]DCH4EG(LU+D]8;G4DH+IK+KN/@W23J1H7%JHSQ0_L2bX3lF7wO8kU=MH>=K9?L-_K)[_8~[<Xe=>\K>A89M(/R-7:$CF"4R,55->7 _D#?\/2RC<=,:G(G8)HL%<[?.;3!;+&2B2gI}f(oˆAVŽZ]|[i‚Mc‹NGwGJU5;j4:bC?O+VDwI%X}:MfWKL8He9bmJJwB7U8Ha4Ai>PY:Hj4Za:o|Bh¡PR>SZ0if=…s>y¾c¥xnb›_“ÑukÁ‹u‘_„šKišd`“oE‚LDcHLV;\g<hp?`oP„pQ{‰e}|`YvSJOQnc2a„@R|Qm\=€‰C_»nV…af„Dm’ZL{X5XCES0Eg1Eg<A_?KnBXšVsUŸ•R¡Ë`bx„U~LoU[ŒZk„REYhe@x›If¤cFyVQa8Jh58Z0JP)Ál9tä€X‘zTrTPuEJY<>Y55V)=E"ˆa%S«`2}_)J4.3oCW™GOdH8N19H)EW5U^5Og4Rg:HQ2P,z—^M’gPmHq_2BS6NW'brDc…Ydr\}“]EkW:0)„M0^ƒ`£rL¯]K‡VX]7VuI]q@qT/žy?u¹‚Y‰Ñ·ŒT}e‡^IŒsN„§r‡³™µx}´…w{ˆ{_‡Æs‡Ðƒ~€‡Âyžµ‡²Ã}—Í©ª¥r†^°ŽKmÁQd<•]@ÌÖ„ª£vʸÆx~¨…}lGÉŸv¢Þ¢”¨r±Ì”¾¹’ÝÑ›¢ã ÞqSÿª€ÅÙ±™È޶“\kŒX…•Y‚•Y£Í‹«¨}ì˜e¹¼‰õ¿¡ÿÿäp•gs‰\uU´}^ŠoZJa9M…I«l=lcQ†sR¿ÁЉ…ZwˆT°¤d¦YŒGgŒSd|8÷“aά””›oߪ€²å¶ˆµ‡ÒÈ¢€_|`Jh_LÄÐ’ŸÙÃñ’|¾vr¨Z~°chŽWpT4”Š[‚™Rov@VŠTnG‚n@‡¦{…²jkŠ>l€:ÿ±„Óƒ £r¿ð½Áÿ 蟃¾€ptJesFxuS †n”˜g›xW›ŠGŠ¥^|•J¥—K¦±`†sE°…c”¤h¾•i’¥f}†Wy~L—\˜¿sŠn·–…ÿÿàÏÒ’ Ìp]œJWo*Ss/VR,MX2l”GŠÇm·Ð~žÙ‰žÕ~¹é„è~¥Ï†ÿÿÄõÿœÊÿ¡Ôÿ§€êpƒµM{ŸD]’EgŽO\x:k|GewCViE‰ŽY–Ág’àul»`a`CuŒfcCHE0I]/Jc9Ij4Ad)]d1¥œnÓχÀžkÕe¹©o´°ŽÛ׉ÿÔŠ…mº{~ÿËžuP©YC°…U÷¦}ÄΆyˆ_oiQ˜wWwj@_L9|OB’V?ÂUJ°Z>kWL”vXkLcu@NO;NC1<?1QYPŠo£‰`qxK„qPŠw_…‚Sv]P|eUˆ†d…ŠQu^J—}Z~V|—[j‰Nu}QuƒKnx9[r=[p6{cRØ–u…¶ar¦[~©k®s±¾„¡½w‰¯‚ÁÊ–¨¹gfH“a˜¹s½Ò’ºú•°ú”ŠÖo‹Ù‘Ó욺⅜ç¨ß“ºÚ“Ž¡`zeR–jX™zbŒmažt^sS…_KoaT‘~uŸ»w€™KabCmze€•_ƒ™kq™cnžp€ª[vˆYŠˆZn…Ql„x¦Á§½Õ˜´kq‚<TL1IE:ZxlœÄ„™Ë…¸dXLZ^@TgC_`AuW7KG9fLHdHeeJmU@eN?cQBttVqŸx–¦|²‚m™|vÓ †Ï¬j‹…LƒkDsX0R]Ir‘WgMRv?Hj2C`5Ks8L„@P}2,L**K5=cR`tiHT62^C+LA&<<+05-+'21 91'U5 LM*pO?WrHGtU/bR/<?<D*AE$7D*;>05I*3;.8/%;;%+C([4+\V(;[=MF=OT6uA8VD1X76K:/Q>4gQ1kc8]f>k`Er]>*mH/CG:+"H;NE&PB"CD.:B-N?*lH/PeB2WB.6:/-%60!?32O)47-)7#.6!::?DSI"rN$`r:TpSYaD\i?Dt>GY5TW2@sB@_DOZ6a\-Pz<M^I[Q5vv@W€QBdNZf:EzL9`G[I0Gu9]N/ro-YšTRfOlW5Xx<}wOšS`šed_N˜d=š¸St¹f¡r‘–]y£]iŸhWyURb>XbBmiEkwF…mD“rNu_QhVG9G:?1+`J$`‚=BuGR\6‡s;r¦Nm¯kh˜eQtT8S?:L&G[/O](K`6`h@šU°Ú‚•ÐŽµq•°^¬d|§Z’§TŽª\~³owÂqDzYyXcyFWuAIP2@m1CI4EF/QY4›f9‡Ä[]§ˆ\…][uLZ}K6sD0G&?Bxg,n…R>‰^2F-/:.d: d”E;oNFG*PGKZ4L_-Be3Ep3F]/uh4V™YazGEuWPI0H@'hE$w|AP]>nk>c“dCLEK="pm>g}b§•WhœlU’Xr¢f³Ø‘cÌVT ‰O¥Ï‚‰šˆ€UŸ•L”«lbŒhÜoK}¸…o´k¨wožhœ`Œ¢q‡¹}Ž·~‰¿‡‘¾p¦f¾¸Z ³l‘±mŽ¢`®O]mVb`?•x\•ŸmãœfµÍ„¿šmbŠgŠuCÈ•s¬¶~Ãí¢|›w¸^DÚÛ‘lÃŽ_mLÎiGÿ~UÈþÅŒ°t}wD¥Q aéà‘›Ì¤x}cÿŸ„ÿÿÿŠ¥s™Y™›bz_ÄnZ‘–iw>nµ}ÝyY¤r„‡m˶l¬€¥sFÀ„a—·Œ‡œ]„}`Xÿ‡MÓ¿—“¸ ÔqꚀÿŽwó½‚l}I|‘j°“wÈë¬Äÿ¿Áû¡ Ô˜Ái|¸g›®pTT5PE,¤pf¥`‰©SLJ¤³prÓ—Ò©‡z¹…`ƒGcŠ<Ó™WÕÓ‚Áï”·‰ö²sÖÕ˜Ãè¡…´yvŠfišeš˜o«Ø€“\…–O•¢U‡¢^°Ñd³Çj´²^ «hž¶u—Áˆ¿s„«a¸•^˜ŽY–¢l½À†Æ¬{á”}ÿÿʹŕr‡Yc|IHj,_w.Xn0lnBt«b¥Òx¬ÖŒŸº€•žh¡Ÿe¤ÄXâ³Xÿ«fȵrÞÔ¿Ø€˜¶Sn™POY)p`ClšOaƒDq†T‚ƒ]‰”YP޲e£»qxGpuQŽž`lR4T]9Lc5Y~M]t;Hs2Ir.’Œdµ˜iœhŒ`š‘k¹×•ØÉ|æmÿŸ{Ý”ú¥j‹hMo`Qz£s‰®|ÃЀÀ¾i¾Œh€xSbcJ_SSkXW{latl]‰l^k^Ty~bƒlKifNo^HdS8ZM/dUFlU©p[Á|OsG“xC‰zM—–l¶Ä‰¬Òsp“B_H8zhWŒdˆ¤b|OdŠP‡ŠHcv@]GMz=7=!UA7†[z RxJ|†Lr’S’¨e” T›h”©hgGw‘Z‘¿z¬õ¡Ïÿ¸Ìÿ²¿ê–¯è¦Ò»î–¾ú‹®Ã‰¿×¸Ù‡©^|a²ƒu¥‡o¦}b˜‰e†{Z{t]‘¤…›¸VYY'50&QI>lzPjŠPy”n}¦{±m{ h‰«h’¦_©t™¹€§Á€£µjx‰CV_2W[L¤}¤Úž²ï¡©Ý‰ˆ¦dnvE`dA`^Am[;XRAvYD_cIbmE^^CUO;QXAZvi¥xŽdœ}[yRqŠbŽUnƒM^o<Ma.Fd>]wUrƒXaŒLZ‰LX€EVƒ@Y†EYƒBQw=Ai>QdHspSWI4k[=ZwI8rV<R]<CH1<:,?.K?+WT1`M?bOANiB9aR4=;8=)0>#B5=T*0T8+D14B(A@(7R.ZA2TO3MhFXcDgcBFRB@3<N5)LA,V=4XD1[S;`b=Oa>„D7e[.!jP")49%0:42%@<#DD#UH-|M7CuT5JU2>1)5*')#7&9@1H5)71-6!<4#,M*>9!I>ND$HI/KK-RO-Ck5JV.TY1Ph>FyJ@YB_X(Es6PPAl8KŠXHZKl`;g‡JCk]NS6V\/4{:LK2|^&]ŸDI’Uoc:ww=`|DdbESm1D{N‚\9wµOZ}g~Q1u~BnŒT[ŸVK}YTlGceDQjARcF[h:D^5BH:MC%5O,7G1YH#Tx/?b=TW0fp?x„B~“MU¯x;~e2X6@E'<M'B[-Mf,MºÄj™»v¬e¡]…›XwƒPmwEuKp’WjQ‡Z6ŽŒQ‰ÅymÎ…C¶y8qWLB1bx9[~N^Ÿ\|†S‰•O]ŸicƒX[xTYuE1nE1A)E:#oy4ktT;w@;E:9\1Yg=n›J;€[<[57T)CW'Fy3;Y4SX.Hz2jZ1T‰XutE^—MgwK4^FZR1Ll>Q_<x‡ETŽaBZ@d<"†›Mz›d•f¤m”Æ‚³âŸÿç¡p¬~^dB™e5½ŽS‘ï•tÍ–z²sošf`pCeB~‰Bx£dr™]kœ\¡^ŠÃ~…ª~‹½v„¯ni“YxˆH“’<s“GŠ·g`“[gf>}rO§|QšdLnfAœ§LŒÓ€r¢k`†R€‰W™¸o¹‚cœ‡mˆƒi“vYŸÚ’‘ˆfc}Xwb;¶…JÿÁ|²m…@u‡Eæ_ÿ¶„„Ηº~fÿÿæÂ«|ƒI pŽŠPˆœPÉ’NX~@¸TyfºŠZ—p¡”cǘXc£h£w:¨yB¿œSÀ‡B³¯fn“I¤ŽHÀ¤hÎ¡ŠƒnÍ–_¿Ò‡wÁx©tP¨‰x·Ž‡ÇÃ}ÔÛ´Õ‹Òq”½h²iW\704EI%¬iƒ®ev‰KÕgž¾€¸ò£Í°ŒºÞ©e˜Ok>„>ˆ£M ¥W²Ÿl‚’f‰ŠX¨›[{‡]œ¬s…°{’—X™}J† cy¬Q‰Ó{ÓƒÏêžÅá”¶Ù†Ž±f©ÏªÒˆ‹¶rŒ£bo®b|¢Z±¤b¶½po[™p]ÄØ•±…\¤‚Tx’YLl:_h.Rq3db3oS0˜_C™¥e‡œZo‡QezDŠGq˜BPq1lPFŸ¬e¬¯[|žS´iJ\Šam˜d†®l€¾n–¶dŠF|j9{wAixHidBkU3ƒ…_km;WZ<iwHgnWtX\…UDo?^eP»¢{‹U—}O}n@Žj`ÿÈœ¸»q“ŠU¨\ÿ©tÿ¹…œž^ŒfL¯‘h”¶oŽÇ¥cp]F‡YP¯pišˆvšx_¼c^Áxhɇp¤qX¢xf”^uLqfKvTAjU:edPtƒVmw=‚jL“ŽYu¼WušRy•_–¢\Ÿ”Lo‡C^vPZ‘{N‚NqŠEhn6nj/Ya-`sFft>=@%68/X[;S[+HW'GX%GR+hg9^r6Z‚N¡¡ax˜D[€Rš»™×ÿÒðÿÇÚÿ°¯Ü‡¢É{˜¶x¼ÂµÁ‘›²á¦µä’’Ãy‚³z¡¹—ÛÖ–¾«d¨h«c¢h™½}‹¯GM{02W&9$LS:W{YoŸ„¯‡§b‘NxxGslBdeHƒˆ^’Êv‰³l€Ÿ`\ŠMVtEu‰j¥Â‘¶Ñ¤Â†£[u€A^oKnqPhtE^kMykQlqM^uJvw\{uHbkF^}e‹¢|©šd¦WŠShy[d„Q`ˆI]?Ru;Ts?Wl@SkJrNmLmŒIc‡KW†E[„F[{:Va3FG3H\GPI,|L.tX<kcVUxX3meCdZGZLMZD=WFI@9_>*Ne36ZJ,C</>-::(W@Jn3FZIIJ=GR9UQARZA\WApM:fuFwuaYPCpZiBH~I4fZ;]V>]XB`bCS`F1X;Z4(fC"O7224K=@^0A]BAa<RP;gI:½l<Ršm>Yf/D7-J*+=+42%I< 7V/7A?7I+3:));,86!ECE?*VQ.Bb7HI5B[-?_1?O-WQ3Nv@@qP`e>Ey?kR<`l5=O?Z<+‡[-MyJ;XSFN3W\0N€7IoBeg0w€9YŸQ`ŠQSyJES>GN%fF-Q…;™sFXÈeAoiGE2Wg:muAiCd’W\‹UQuQfjKNxCLbF<T42A36=+9A#FI$WW,Jz8F[8TY1Vc;u‡?¢´S‡ºim³zJ¥zPpI^{Dn•Xž£L¡Ù…€»xV˜Xic<^`7Up;^s@ˆt?m‘SPƒS8P9FL(na7yV4§m<–¥_iÖ‡]¾ƒuŸp¯Ànf¦vYcOŠk>XžV]IQgRWW:3sC4I3KN)v|6M˜]Il<V…Qk…OfzSbxGIm?Kd,Bp>X~IExKB]4Hg8H[7ps0R…Lb\9rv9y†Md‰SbŸUNŠQ]ŒGs—]YhXAq>l:'hzI‡S›Ø–°õ»¸é£Ì“^‚XH\/EP*eX3‚ZC΋Q›ÓŠÏ‚}Åz“³¦nhŠU^…Id‘Qy™T”»q¡ÌŠÐÍ‘¾Œ£–e¶×yl±hdNr«M‹Äsm·t“O7lY7’bAi`Q€zI°å|™³ˆ¡Œpu™d¥rTaFcA+ºRF™˜„µ˜s®é²„‰\^€?t˜QŽš`ª¡pj mlŒFeh7”tDÜ”i}‘hÿ⤟‡jft=q…OpFƒŒZª‚fa˜]ˆ•[ϱŒ†¬~³’o¤É£ ·ŠÛÊ‘kÛvM‡™t¡‚‚Ÿ`w¥idqI\o7¡};¹˜e…›`¡¦[Ÿ]eT:–iNºˆxº•}¥›qŸÙ‘Ænˆ±[ŒŒ[RxS*> 2I$Pk4¦Wr†HRzJ§xT£ó´ÒÉ͸‚ËΜk–Vfˆ<j€7m?n†Ac€L\_5hg;^m>dw3h_:kQ{kpĉ¯Á†ƒÀnì³u»ãœûß‘ÝïŸÅ÷˜˜é™³Ý–¤ÛŒŸ¾‹°ÉŽ’Í|Œ izX™˜e{¬Y®zY’¥ahZ>„sNv‹WLO+p`CdˆZIQ7>J*:2&ŒŠZªaa—KXyALq;Qg3Wk5tzO‹™M®ms¿N_Š8’l,‹ŽCn“>}ˆ>ŒLt±SV‘BTt@rf<zk<po_”¯mVV8lZHv`€”_w’^‰–~{½ƒ¡²•ƤptŠW†‡SmzY™½“µî¦§èœ£Þ€¯·j›–[¾ZÿwŽŒY¦mJ‡]²Äˆ˜„P„j]¨—z”·€¸½ƒÆºhW d¹‚t¡˜mŸ‹gªh‘W‰zPnoDgZ>peW…‰h{}Wz|S˜wP«ŽT…{NÈa…–iŒœ\Tw6Wd3^`2r{=e>Xx.H^+H_0Cb1\pBee8?T4>U6U`,A_(;Z+3O".K$9] =d(\t7o‹Gz”FhŽW±•Æè“ÅÑ®®v Á„‡±ov¦qy™Â‹©Ñ£·Û–¨Ê’œÈ‡—Ĕő½Ó–¦Îp‚©e–¶a}¬k‘¿m®Tt£P[:Ap,<`6Upg†´‘˜µp}Vy‡TQ‡UY‚PmxNp€]—¯g‹»^в‡Êƒ€²hcŸh‡¿‹ŸÉ–—Ê„°ZeƒE]~a}d{“UiƒRkpYkmOwqO€iHsh=ZnJ_iªx…®\d‹D[rEdjWj|Hj‚Ds†9V^&9E)9D;L]Oh‚a{ [dž]hŸ^h“R\…CWm1?? *75:E&'G7 O4'i?/†d<y‘WiŽrhsoXj\CYKCA=\I-6^;8@D.E1*C,8D-oD+Qƒ9KhVwYC‚BizQWfQnQF~S>Œ{Gq…^uzcisZnLKyI7‡O<vhFghUL\LHLI,H33-KA#EZ1]S5o\5dvERŠV`oLUwPÄyP±˜SC–6KdO@0Os7>T?;D-FA!L@$7Q9=<6?I,2A-::&6:![7"RZ+KsAGxCAiCEL7BV-LL)X]8]yJc}UO‹SXcJ4N217$L4rb+LrACQ9J]5V]<Ua3?qF^U/u2r©SOb9mKGV<KP&YD*ob6›ŸRUÊw:rhN[3Rp8UeDX\9pPAeŽDW™^OsVLL;Ba<J`=F`6?]<IN+Of.Ys6N>R_5Xi8azBHr´eoŒ`{˜Wf‰V\J_c=|n;¸D‡—h‚¥[cšX]ŽEa•A{‚?k‰F{{Ge˜LJ‰QAcLFW05\6=C,\N,za;–ŠM¬›Z¹æŒQÀ‡]nNTnGnW6b„>\rF[rTUM48qDDB-KM"…s4`²fp‰VNnVGK4KU2QvED†E_kBdjA\‡G9c@XK+Y†:MiFTY.A]'GC(LJ%OY3Y[8S|Dvl;pUk¨eX£bVTm`I{·sÑÚ¢Ìÿº®Ë¨‘œtj†dS~O@a+[S2joCmbL†mFŒµlŠÌºq©Ùm¶‹ZUl¡Yt¯[‚¼np–Àv“̄ēŒ`Êhm™U–`¢˜[ŸÞŽnÿÑbz`kcBlY1^E/«¬L—Òˆ€˜ppgMmkF›@0T“vQ`A§h@ŽyYã¼{}Ô©b|Lto<y^v\BfY9˜˜Vt™TT}Qgl@srD–s:´pFWG¥qIˆš}ieV|{]ŸrF½šeÿ̘ÿÈ¢…v¾ˆg‡]»Rº`…Ét–xEºs:®H½v:ŒzR‚~I`uLjv4œW„±|~P^`HfcS›‰_ËŒoº“p¥}g§´u}µkl}I„o=2K#7@AU+ƒŸPt¨YPqItsFSÿ›rÔ®mÙ“ªeŒ™Wv¦Qd‘>Uu0cV,Q‚GFO2Pf?Qa7\€=d˜Dv—Mˆ›Sõ„»ß›†ÍnýtêÆÓ—_¼ƒS´„_Á£{®ò¡œÉ€²®uªÇ|w‹M•¤t”¬t”aŠ•[w‚Oa~D€pW™dœ‡`V–pQ„b?YdHTc71O1Q7#~X:®_l¥dr¨xm£tk¼r™—\¼}Ïú¢mšKJp+Cj)g@`Š1U~-ƒ‹Nºmo©_q•^u¦cu¨aš§f¦œct`Zxev†c¯s\}®jŠ¨Š¥Ò¤î✙Q`M1t<;Ÿƒb´å¦À÷«´è—¨ô“›Èuůc•O§pTÂ|R|¦RfŸ[˜c“|Z³±x¥¸oª§i”MƒeAwdU§‰o“x¾mŽŠd„ˆWl{QŠˆ_“ŠWumJ~o\—Œk–ˆaˆ˜nw˜X˜qS‘xSzY¨{]Æ›eft8Na2Me6Wb9am=Qp0Og4Oi7Q\5Qc4LM-gQ3_`=Oc0Dg-F[(;W+;X(?`+@e&B\!Oq%a„9q£Vª]¥¤ZƒXl§u ΋´r‰¾‚–È’Ó©–Ø Õ¨¡Ù¢¥×‘˜Å‚¡È¥Ò™²É‹ŽÃi{ª[rŸoŒ¿v“ÓiÅmz³VS6T‚=RcᄆŸUt‰\|ªz‰Ävw¬R^}Ih{\v¥u‚ƈ™á•µò—©Õƒƒ¼|޶—¬ßŸªÔŒ¡³gd“Rd‹sŒ¦mƒ¡`~ŒStuTnkLok=aZ4N_BR{Ti‹gy£i¤Uoˆ=Nj0K\2_R2\_5Uw/Gl02X46]FJum€Ê„˜ÖuŒÄwŽÏo{Å^k›QXz?-Q3@8'^<3&1:-1&I1!}D+ˆsF]‹]Wg`KOTDOEIK8?Z90PM30<>7(:F)NN0jQ3ao:qdEzdCwpG{dHojJ™ZI˜^BjL|_c…dZQVQ?AjC.…W9jlC]^VL[H6EB,4,RA&]b5Vc@f\8ƒ\3‚g>uŒMkºpym†gWigGOoTGpNehI>wJ9?A8>'8CN7BS)E[A7U;1F20<(D?(OK,MX+`Z2^„C@‰Q=mT;[@D;1VI,Yn>gpLU…L3lU6KC4@-tT)X‚D.^R82$G=RN'jd.E{A^X6€Š@n”XJ–]JcU@d=G_5[]2‚vE›²QRƃF_]MS1DY2FN3BZ1OO?…]'l—M;d>MOHC&KV;Sb0Al9GE+]^3Ur3Vy<Xz:\ˆEw‰VOqŠZvwM`|LApHZWEyz9’O{Œe„‹GmšUNwI]d@fxCgƒ<U„<_k?xo?d™HI[FfBEs>OJ\“R[X_„QŒ}Rµa{«oyªaF¾z_|_F‚AUP&DyIUR>5cB;?'IS&Š|:Z¤^FRB<\,@E6n`2p—KY£bHhIIa)Nh6@[:NX.Tf09X5?L%?i96S$GI%G_2_R1Dk5YY-sˆQt™dˆš\‘½v¨×“¿æ§ÌðÀ‚¤„PI:v\*‹‘[WyW=d8UO*\c6XmFdhF¦xF~Û“‡´n”Èu~¬wqŸc‹¾g‹Îuw·m©i{³u¹wˆµmnjG¡”G„Çz}†N„†Cæ’WÂÿÍ\ɾYkD_c/zrG–ÑsާdX\Q_7@C&f?&Ôj>x«ktJ€sQÞÜ™bºaP9_U(_fFTK9lh@–º`Œ‰Q±Ïƒ…‹XqwG~R€ˆWV‘`T9’[@}dZˆhuyIÿ¢sÿ¦‰·Ìž¤mPƒ„P ‡^“lœ‡T‡œk†BY`B]zI\q<‹‰PzTTƒIg~KŸW°ŒiZcN‚lMŽŒw°§ÂÒ¶¤¢z‰}WwyIcb=QM2;D(.- =F,l’Jj“DŒ©eü²uÁ_r¡NZ£c]a,pd/ys3ea5eX,eq6K†=gsCežYu¯ky¯e‰®a“â†wøn¢N¸²X×ò€Ôæ|¹m½Š`—…m€›l~žy“Šm©ŸpÍÒ‹“Ãl§Us}=SqCª±Š–Ђ›c‚¥V|ŸZv¤mÛìƒÖƒ¦sêåŸiµvn”UbqHeP7c^I\—ib¾€‰ g°vÏ÷ƣݜ³Ö•{[ÈÅ©»ÿ¥d”YUTR‹GcžJ[v6Q†9]ƒC™d§²j« X„x@‡†J‹…V¤¶w»Ë{«¶n·«oɈ¢Ò¡ÊõÇçâªÉ‘XE<&:;#ZR6~ c²ñ›°ö¥¿ÿ½Ãÿª Üy˜—S©uI¨Š\roC{U8—’K›±k¤ÅŽä㣺ю¹¬t‡ªnƒ¬›y¦lŒyZ †\ƒ…]€mU|rLŠW¡›aš§d§¼u‘©nš¢f±‹n•]wˆTl\Á‹d€uRˆyX{ˆARo<S^6Xj1\_4Zb;Qd1Li+So7\t;N^5EC-G=+IU+Lb1Lj.B\+;[%Gj-Hk->n$GmLo"fy3sŠ4Un6f`Gvt¿…¥tŒº˜Ë´²â¶Û¯Á椿ë²Ü‰–½r…¤| ·‡ µlŒ Xz’Rt™\‡ª]Š™Zž¯t˜Çu³^f¢g{£e‡¦miy:QSAzoiŸ®n¨OfšNeŸm}²†™Â†±¶r£®s«¸‚·ÐœÑ™ÆàŸ°Ík‡“Ej|Fexdwl”QrˆU{€WxoPja4MU7NoRe‡gu§es”_u‘R^~@Mn2>\,GU*ML(Pa-Mp5=g?QtWjŸ„Û—´Óy•Æ…Ö¬Æ||µ€r½{g¬jUo§]DI(,R/79/T>.WK2_D?YN;DdBJdGS]LaKCOSAPL@3J98B4CH0AL2DR8VR3PR1WM0WD6dS7KU9x<:}W3~aEo‰XOyaVWQfQ>oiFikO~eLmbKLgOEFDYP+FmA^QHlJ2UN6iJ9€W7´uN¥ÃoUÇ@erDD6[I+tb<[‘T>v`<P:;L'BW'WZ*ah9RNN|UNsIAr>Fi?FZ@dY3gX*ic7djD\ŠHD’[:fTLK7W`0^xR^‚Q\zOB~MVcFz;:{P1M=08"F,OO!g_(D„B}mG^ŠKidQa=N›_Ns`\xKZt?shH™žHDÌŒ=TY:R(3C(JI*I^4GeG`e0er+Wl=6‡YGID6W7HK-Kl&Z\:OX9Wp:b†Do‡En‚Hm|IqYEON,LP9MN-[Y6gk@¢€Mg„XqmR“¦J]¢wZxY^{WU‘_NxMZ[3Js3JP/~b.bœO[ZlOs~Oz†Wu˜]p§i‹ž\r¤`tŠb’sUŒG{Õ|JÅWtZO{DT~U4gCME*lu1tŒNOŽRC`@D_1RZ=z„Q|Ÿgdš_D†SOP1Ms4JV0Dm5Jb=5U4T=$>rE:P8JR%Nb4Ga22Q*bT*w‘Wp‘g¤¹z±æ¨¾ßª¹¶”nqFk<<_2qU,mxOeuIMa:Vb=e\7tu=prL¥S;šYƒ¾Š…®gt˜hˆ¹k†Î†{¼xu g~™luX„Xt—}b‰o¥€T‹ô–kƒ`ko@zzE¾m=‹ÈT…YXFŸ¤a†ìc‰WGh5KZ<A]ARfI¦fC¥¦ylœŒ³w^ðÏœ›‡giZ`h2ŸkQ´ä«“Ù¡„ȉJ|WxˆL°£`l˜`†QœšiK‡sL;6žR7~r@j‚c¸nVʆf·woxGzƒJãuVš{˜‹o}’eli=kNS“i¶Ô¥‹Ï™‹Ð{TxV|ƒg„wjň_¥ƒ^¯‘\Ëœt’„g`fBCg4=B*49&I;#9D(kzAt‘WXŒPáÆ~ÿÞ€xµjŠƒEy°u[–Soƒ=WNco;JkGpn9•Äy½ø ‰Ëw–ºWi|0r0Ä”]Íÿˆù€o«FÊ¡M³Çd½¸{ÿÿûÿÿÿÿÿåÿÿÕíÿÌ´àŸÐ‚u¥Zz‘BJ|>yƒd¿Ñ¨¬Ó™€Š[zUq¡Y¿Ÿråâ¬©àœ¶~ÂÔŒÈ䎖¾l‚’WYW>„\BÜÁ”ÿÿ¹¬ÿŽ‚²oõÛª¾þ¾³à–tœiöÖ§§Ü‹{·w¹~·f}¼ql«`p™O¡ˆi°‹U `1tZ5Xd9qf=~mF“n[—–e†‰P£a®µu¬±cªrJ´ˆ[lQ0?B/P|8s¢F³a£¸r®¼l¦L‘oBleD_yEdzJžpM”xBUL0\O2~hEº¬z´ z¼°‡¹¯˜À‹¢Þ°¸Ó–¼¿‡„™l€}_ƒq[ŽzYƒ‡_li} u—À‰—‘^rlJ€\OweKxhWy†SqkH”iWˆgˆ‡Qo{FnrI\pC\hAdnA`kAYh2Rf7YJYŒE_z7H])GF"+.-#5-:5!=@#?J(Gb3Hs6@s-=t.Tv-Tc-Cb%0>)Xadœµyr–v’¿ £Ï›½À‚ª´r±¨u±µm£´j¥kz e‡£e“³bq’BXx>]…Il’CLsCs›o¤±k—¸u•ºx–¦[u•bn|EAR9Oia“mvŽmh®dt§i‚²}ŒÁ¯yu¦cn•X—¢l©¿Œ²à™ Äca9Ia;XaW{r¥Tk–Ls\~Xwc:I_>HrVl‹h…¤cj‚EeyKcqAT_2?N-=C$19 6E(H`9Nl<Y^O}—‰»ñšÔ~Œ¸v™½x¶ˆÅž©Í‘¥µ~ jˆ–X7N1BE4aM4EU3)/=0 &L%j@'^n::yQ:WOI<@\E5WY4MP9^P9K]7=UEII<>O5CJ/FL7FJ7QY8WV:yi<Š~Jiˆf]u]uaK…XAwiKvqNoaWdOIPZHmT;ƒn<CpVUTLGJ5C;5e:'„K*•~G¨‰d]¾qA˜wLSLXW4~€AZ™ZOoOEm6Cj<Uc7ko4yxSc„Xc„PrsTzwGg“Q>bDRJC:*E:"VX3uh9`‚LNˆbQIJcM3l‰GS‹YZ\Z`‚>|¤[cWDjM8L-.P+@>!DR_P%^Ž:_S<dSQD2tMy‰4iŸichJfK†w?¦ÁQEÛ>vpCd@=S2LS1Nb5FsBCY9NN(cX/P`5QqF>wQKZD_d,[v<ZlD]g9\{:Ir9de/@b4?L1MD&Ca/dd>]jGŽfEioJo`Arj6wƒFk‰`„`†žhP‹b3C:CC#=R0GU#dg+`nApi:[ŸMXoWgf=oŠWuƒRw’V[†Qdq?Kc<wW, {<˜·bdÆt_“iP‹OCgMU|CLrCi\,B„EFK3R`1idBxˆN_`VsEDœ_NN3:\,FY&O\(Jb75X6Z:)8s;?C6Sa,La%Ch,LL+px>}¨h¢¤vÌÜ›±Ì¥}ž“^m~fLa@I]BZX5ne6Z‚Lom7NvR[c.X[;[Q5qe8›E{Ï{oiŠŸS¨Þ–§è‹ùœ¨ÌzaÀƒEuDI.…mTŽ}[›|]ÁÛ‘sÎÀ\[9]€?‘iI€ˆbišVàØu¯¢ƒ‡âŒV³{P^?f{?kJsV›‹]ÿ›iˆÁ‹Âžo£Û«³‹ep¡W¢¦Qç¶pçĶä zq‹ŽQ‰Àma”·et¶o¦^Ÿ¨nq£o_Ÿtj¢sW‡arxP¬ŒVŸ·}n©ls~V’|`ŒuV|=¾‚Uˆ[x„J³¤z‡œ\ħbõ®‹§‹fÄGU~M~O™˜oŠ›z¡u‚²Š…§ˆ¬¥•€™^ŽhXqMMV<@Z?JI0Uh:ul>hi9}®tœR]H"KR![^6m‚QAG$vV%˜g0pU,~h5jˆ@o:Ò¼nžïšuÉoD“=Cr.—^¹Ö ¥úœTu<ft=y•F¿¯bÿÿ®ÿÿÆÿÿºÿÿÈôꘫ¯`›¦b¬ff…PtžY•½€ºÛ®£Ñ‘n`ypwª`—žoÄܘڋ”¨}Ëë³Æÿµ¯íŒ°Æx~¹r~Ó—–µŠÊ³ˆûàu‡yNùª„Òÿ¹¢á”µ¡ÎÿÄžÚšÛ”™ÖŒŒÎv¡Ô€›ÌkƒWµtZƒvRaoG]_AdxN€‚Hec5|iFp‚KSxCrd8ˆb@qn?Qh:›pFcr2`v:‚”Om@ze9iU>`O(3F"7V4YyO~‡YzˆP€GY;s^<slCnk;°`<—vW“¢kb‘EnqNª›jš˜[®”p±±z™žkŒŸet‡RŒ“x›°ƒ‰ŠÒѳZmbAydO‰tNzfEƒwL…ŠO‹nGšwL“DfyFn{[ˆU{yG~l?fBm[4h^;v†\t“LQr8Mj'<\%(D(A$#H% L-)E/3O5C`O_šRb‘8^ƒ-Rq&A\)Rj)4^-B[_©y«x¹¿{˜¬Sx™Kr£Nd‰5fb3ka8utWv–et£\{—R[7Po4UCeDS“XtšTs‚Dt„m±r™¡XudœUr{Fj…[v”{r½›™Õ~{¡K~Z¯†–š¤Ë‡†¶hgŽIpuRžŠd ›Jgs<B_?K]f›ÈÏm…¦Mqž]…™Gej0Gg8PxJd‚Vr…G[\2I?.OG+EJ(;G)KG,;D(2I,B[8CW.9@-P`fªÅ Ç呞Ñrn u„¯™ª×šŸÊ‹‰²u¥a|~HS@/rE'CE2$25#"1^(fH*Ng?4kMFPOPS6KN:^L2gV8gU@;V@D@<bP/Ya8^aGZXI[kQhlJo€Vj{[]gY>WQe6=g:-{G;†D=hUI`Q@SPGŒT8€\8GHIIQ82?640.M.!>&~u?qkŽscY´a=‰jiHIk|>L|PU`=kr2SYWmHgg8XuBa\KtY9_xK…bN‹Z7m‚KA›f:TQRC0Na8PfCe`I>ˆS7bSdJ8c‰@C‡aifZ’¡J‚¾v>„f4J=BDB]"=Z)CX'n`.nŠGExT6Q91F+I<vU!m¡OSœq~ˆXœ¶V´Òrö¬nµzQ©i?[O`6Xh2??0E=H<(Rd.^k8jr<TxMLqDL`8Jd/>W4CG*ML,Ms0Jk2S\.`d-SrAml=p…HrM~qE_mOegJmœXz’T”‰Hr¡aJpP3?.=2 LI)5M2LM.V`';Z9_Z.nr<R‘RVdHJT5[Y/aw:Np?Ik9FT/PV,YT2€b3}”FVœbT~Jf~IPšQAl7hn+3†B>5%XV%^f:C]=[U-ˆ?R°fGi?@X%5U*E/!Le/<nFWM0VrD^\8In@Gh-Fm5PuO’W…¦s²ºy˜šs|pW{ŽW¡|VTxh`k=JT9BK+gS*`w@rsFQ“dMB9LI(VR=}‚9zšP–k=c°_¡®Z§×‚ÉꎔىÍvj;JCU4ri?v~Unc@ÿtBsÿÿevh„’D±oFd‚a‰Ku€C–’J¸¬qƒÉxb«qBV9B6&a8(aS=‹C4{|Uº˜`¶ÀŽŸyz™i¤¥^µÃ”Êë°œº‚¡–[ŸoMb‘xUŽ˜m€|R‰~d˜a‘£o‰·ƒƒ²~z³~y´‰€ {jm‹fe‰^h‚ZavLgyCqqH¸–V¬—eµ…XosF“Ç{”Ƀe·ue}@m•b†a‚ŠT¿Å‹ÕÂŒÓ諡׈½Ç|·ë¶¨ëºj°~s¢m`—ll›df†F=V,ND#‘]+`;,7Ab4SY6:\2*2?<&?i/RcDAT@WF$Ve2¸kI¢qF“ª]d¦LV•:™¤[á婱ô•q£oØ›aÏz‚–FÙ»fåð«ßö õΆ´dX‡A´ªh¤¨_ZT4v‹S´ÄÉÿΨ‹mg=zT=x¢e|U«À}¡Å‡§ÌÙí¼ÎðžžÂ{¨Ó–¸Û“ëè«íÿÆÝÿ¶ëùšª¶ƒÃ¨†Öÿ¶›å—øñ¸¼ðж|³Üˆ®ß‚™Çf¾ßp¥Æc¥«`½‹V¨n®Úƒ~·gœÍn‚™S^|En|eµ¾~ŒYutGpa=eW@tfGye:{}?t•D^|‹FdR5WF0=H*6W3Mc;Va=dSF{dF~eA`d5aF4gP3`V5SW2sYD™lOpŒRf¡be–Ta†Is‚P’^a‡ZlƒSh{DnoQ‡‹d’j«˜x–•_fvT~kZ…qUskFiSHzmPVsEwj<puBŒ„Q³–q“|P‚fE}iM‰tB`e<mrJŠ•XyEkwFOk8D]5Ds@LyCJ~IT~MIuGHsH^vf£½s\—CFv7Gr=Bq2E`3IqFYƒp„´y{™sªØ‡Ÿép|ÏdwÁWX•5(J%8 ?P>ta“J]…P[MS<T‡F_UhžPh>V}M„–¯™hŒzY‚ƒN‘œ@k{Df“g~¯„œšh–y6ZU'So8oŠe•°}™®x“§kˆšOW[&/3#UJ/SgDdsLdq“«Žë¿pQiŠEt{5Vj1Ia0T^<ZnK`t>AI!,#15!3?!5>-?K4IS;E]9Bd9G[5=X0+F@oˆ„»Ý“§¿€x¨„†ÃŽ¡ÆµÅ‡‘«w—[qyFR:.-1'3,'6"*-1.J7(bE+R]=GnI4XG::@@A/S@)PS2[^@H]IMPKiX;gvFh‰`tƒfo‰mj–dY‡eNla=KDT82OA3RB<_J<NAhJEDN@LF<06&I%$KN&IYE6H;Q57m='›Q7l–Vƒ…€…|VU²ocˆmDxJHmGp]=¤t7R˜OQYLZf+Oh9WdCmX6i]?PxR`VG“M1mˆLK®r[’}azfqrOfŒYe…[YŽ`k^jZh‹fŠ…`¢¦[iªy/ed.H8CN&>d'BN#X_ iŠ?Qˆ[DUF6U4=V+I`1xf:€—Ru²m‰—v¸Ä]¿ô¥zã»vƒxht=TˆCP‹Jix8M}EF_RGQ;[X4V‚<Ji;JZ;IT3Gc39]28N2B[4PW0Qs1Sm2Wb-UO1ra2ur9co?lgFqmHrsN–{Rr´brŸq|‡LL†S1`?<D(K^-:V1NJ.D|7?U,?R!MO&NY,]S+C}=;_>_Z/Lz;Mp=9b9F:'Qe6CR?Q_5qo7W“;T‚@g†4S‡9M}.bt(5u3UH.OQ+D|G?Z<JO+ˆ_(Z¢UGGL]64k=:=;ba/P~UYvVMlH‚[HiZŠW‰½zj¿—€ŸbnuŒUWrSo}E‡‚X¤‘X[‚^aaFIi?FR1dZ4au;yk@X‘WIS=RM'RY-T]4G\2XT6rf0ŠvA‘ªV£ÊwƒÃ}Œžei¼kHqP]j>~p<po>QV6Ô`8Åÿ¶l·µ˜ƒD§ŒLyxHgsEW;”¦Tl£rž˜Kw¿m@ˆhI?+~I-\M?_C/pe5–Œ_™trjHulCÍ’bÝ®Œ´|\>qrA_Z4RV6”V8dY=dY<ŒkP“htŒ] Pƒ¬r¥¾{е‰s_qqLmˆUg—m^vTOZ5OaNMd9ˆg?Hs7`X-‚z\¿ÿ²¾×‹}¶uX„HžQŒ´md¢mš¢T{xI}Y5of5¸oUàÅ·þ–lÒƒ„zVzO£˜_d‘jMuPJ^8–ƒR;Ÿ`?R)hiIH[@Ji9XV<[jGZm7‚€Hoœb/…HJ8)¨ŽsAxFcO:[rLru[ƒ¨oª™t´€ÄÈ‚ãÓ„ÅtÇx¢P´¨YÂÆvµÿ·˜ü¡\«WH.O<&IH7’h¡²|æù³ªý¿VŒ[€mCvŒKi–H‹\ ʧϘÍö¶ºôŸ„µoÂí¦²ÿºÝÿ¸éÿ°åÿ¼Òü¤ßÔ‚ì³ÃâžÅò¡Ùÿ©|±[޹b©Æ_¢Ñ`®S”¡Zˆ¨mœ½q”´j¦Ñy®ï–—ã—›ã˜|Ö„s³zœ¬ÿ·yŸqF„LwyK“•g·l¢’Q{pBuŠC—qCn^7m_H„¡h]¥n_œ^YšeT‰XnŽk}¨liŒS_`>YI,VB/VH8XaDfg=gd6ncDv}Qu’Q_€@Wg/ˆ}Q‰Tˆ|TbpDOkJV…`rµot²_Ž˜V‚¡|Š®¦o…•noaqv\s…ObmGcuFbfFŽ[Fƒ]HlaRƒtY’‡XsyElrT†Nl{Stx\iqKRhAQlCVzImŽ[q›gi td§|r«|£Ï“Ï~{Ð}Ù„e²WGg8\zEiub‰Švz¡x¯Ô˜Î퇫àv¢Úom«Q@~:4Y)0H(NR4b|Mr´‹×o§Ot›buÇ{i¸X_ƒ>WƒW™ ~À«nˆ?cd/co-Qh:fdM}dNYS06H(5Q*Gm/Og7ixY‹œl|¢csŸRL|;5Y4CW/G^6KQUgzv‹¡qŸ„W—pDk~AU4Om5HV2DM7NaF`‚F?X.*3!/7'6@2-;2EN2CP3JX=MlJKqHRv;El=_~e¤¸y”ªy…´‹¶}“±sŽŽeu€]z€b•…`.=04@/>:+):&<-1$'H%3D$+C.B.(]9"Qf<2dC2KK828M?,_P0TcBMKIXRCzkB„‘Ysš~„ƒ‰Ši…‘jcœpPpkLRHOF>MG=tA=zF9US?MAA=;.MN1-J,h+-lN'ejG7SC4=CF/-§9# ˆA†§ƒœum€£`\©w|u^hŠQ^‰qU`?3C1H7&G_#LQ.TU/Ua@mX?_i>qsU‚cBŸzWž¬s€ã c¤»eSf[aBR]HnV6g™Knz`efHqrM…ƒUUyZKlMAlA@mB8g6DP0v_#YOA|c`Q7`^'[q4a~Db€R…†XsžU’kφP¶ð…QÚ½?fqSI']h.Z€C_€GZoAErFOtH_uGJ{RFc=Fc:Hf9;b:=J.PX)Ko?TkEUr,Ot8OY/XP+‡[*_m4i_3c`=YO:YA,Œn<„®^e¢g`ƒKlw?Wƒ@l€=eŸ;O›NXz;<n55R&3J4C":F IM#_e6R…LUiJUx=_p0G‹QWpIXƒRm‘Xg™UbU^‡-Z†/W…+R*R}(Ou&Zy(;w=Y_9U€Q@nB7C1vU+f£W]xK\L6iy?W‘[{ŽVu¶dkºi¨©rx¾‰‡¨o·ßŸªð¶p¯Œ~¢gn˜af|Ja|Fit<gp;ZX1oY(ˆW:YeA^sBbpIZ‚QexEJoA>_:?^0;\1K]9?D1@J#MA&\s1fm<d6v˜^“|Ip¦mWjG`j;ZV1ge.mG:‚ŠRîmeݰpŽN|~G‰a2^oEWh7¢¬Xƒ¾|z¢g“tIk¨dl¥u{“_w~Gs‰N‘}W»Ô “¸•¹|^°“QÛŽQ™ lUyNRF)gV1O`8gT3qL=XN>udA§†c¢ om“ZƒD»¥yÉ”nÍ¥z€Œbc¢±r‹“lQžwdpAƒ{Em|cŽ’qE‹YRV0¿lE½òª¦å¥„ÉŽW‡Dcp-op3o=š¥kY£yLaIUk?´€nÐœŠº€`ÇÁ‡†ÿщªtxˆX“{e‚—o^•bqj9i„GXn9—¨Xn²_Hg?QA9KOBNX2h„>]@\vF@Y8ÿvik“vdwt–xy‘mw‰d„H¨‹Q³Ãx–ŠPt‡G•‰L}£^gAj•?Ç®p²îu²lZ‚_c‰\V“_Œe†£i¿ºqί…Ûu}Ic‚?g’O|s«Ì–ºÓ£Äý»®Ù¤‘̈µª|åã²ÜÿƸÿ£ãÿÁÂÿ¶®î‘êáÚÿ®ÄÓ–°æƒ—Q‚Kty7xj4_{Dy†V›¹v°Ït—Æi¥×‘ÊÿÀÐÿÃÈ랪΅š¿|§Ë•šÈvhIf_;\i?—xXŸ„_¡Ç‰ˆá‚… SŒƒQz‘F…~F„X‘¢b~žf–®g‘°{µ‚”®kzŸ[€§\h¦lh³td‰X]U7LV2Ta?VvE`\4k^<ec5NS7td;ˆB‰JqtAaq>hB¦S‹¾eoši“º—¦ï˜€»ou‡Tƒ}W~[{ŒVq‹Yl\j›mvšm}—tŒ«†‡²¥²ox’^q’jo’PesIarNbtP]sOSrKUnGh„Lp“_y¡l‹•`‚€aª³‘³Õ~§´mºÆu”—<=0C6!;J=oqˆ¥’³à©²Üsžµb±Ðg…ÀagŽVUƒJ@n.8Z3Pd‹Ã Ñuv¯RW…T£žx§¼_W‹BfrX’†T˜y<cV*LL)>I)Fa6Ne?txS‡‹I\i?Kc@Gl:9`/<TAdyYt”o‡®†²nkœRW…ERyK]k]p}tŽ¥v‚‘T^zMg{@Wv2Of9Q^9DY4H_Lh}SQqDD_=BX=J`>Wi>Za2EY+?X1QoNT€T^‹UTx>G^@mrMrh‹¶tŒ¶rЧ^czSfpXxzft™qKK/9A1A6,=@&-G-74)^/).H)$86E))U@$XJ6WP;<qG8_O;FEG?:@M:GA1p>,zm:uƒWiˆg^xhe`J|^HYxPV_UW?:WK8QO:NO;bC7RI<HP?MH/nS3AV0UL<V=5g>9<K8E;:9@.‡OB“tEbˆkªjbzIub“‹VlS6rW$99-0C2?X+YU2WM$IX=`R>nR6Œj=±…P•—hÌo¢Ï„FÖ¾Co„AOCGN2wO.^ŒA>ŽPZHEne5W‰UMkQP`;H_7PY:InELoBum/MŠF9xWGV1kT%ug,mˆBr˜U^‹ZufHjL¥F©²QQÞ©2cn=A-NK*Se8Dk:S\2bm0_‚O]uSSuII|TOtJIvK3P?<:!KEHe5Le?Rf'Ps/Bd;LS-G\&CE/KO'0>'98$u\-y NsŠ^io@MxI_W2Y^1j‰D{‡Ho¨AU¤a1A5F(1L,E5:PW+ex5TˆRXJX}Emw4z„Sz˜[pŒja]ELQ8SX-Vr'Ty'T'R},K{"Ot)Io$ZF[r4KB=nHLX>kn>f R?xRR1!‚z9wd¥k~»mË|œÔ—™ÍŒÅè¡Âܪw´Žz’`fŸca}UX„OMk=Yl2Ea9=VDGV6\X5s~Ax•]†ˆ[aœdS}YUyNg‘\XzOTP8AQ6;O2?1G7#[l-ICpp>Y”XxsAhf@…eBZ{T?i>YN,Žh2¬Y¸ne»~qœgV–Lr`2TT)X^1¥S‹ŠQs¯v^ f‡<3µ°a ´¿”g¤†™sXÛיýž…hV…p5€hAq[NWFZW5|S2©Ÿn`b^eOcW<tq9‚LotGŠ`Iw}j¢xF—^IqR‹‹R~ŒLok<£fBr{PZFgc@‹nI¢…\L‚T‚lF“„eÃà”±Ú“ŒÇ{T§jFt6Ib*^s6Oo|I˜hlƒ_îsM™yRz\7šeEö¡x„é¡Å„]Ÿa~{]a€TKY7r^.ve6ŠHx¥RW€Ec\IWeCgwJwPj¢U‰Îyhi¼”qw“d‡yQkWC`S7nT;US3u?-šXD‰lB\vClT=|ŒNT…FdO—ŒB³¾{†²€´rm™”^‰Ãj†Ôy|©Msv<¬™sµgaAr˜T—¼‰¹êÁë¶Êÿ¾²ì©¢Åy«{¬’lê䫸ÿ´Üä·ò‹¯Ô…Óã‘ÿÿ¶Ìÿ´¯[}t=[m/;`3Il7V~DiœN‹«^\žËˆÁÿ¬Ìã—¥Œ\ ƒWˆ¢c—¤i³É“á›”òša’[SZEpkK{‡n¬ÐžÕë‘À\iuS‚xO…hAmaA„hGzqB|a<‚kO‡vP‚mO…r^†®p§Ö¢ºÿÌžý²\’QIN6L]<HL0SY2w]5¥vO€‹Xiv@tm@}ŽLdu2T]+`a;yJŠ–U{—d£·…»Öˆ—œUmQ6hT;h[CejCciBme>noEog<plFrI‹jAuU9]dFsXnrDIM0O7)K5)D6.SL5WV-MF&o]?pI_ŠCGn7ymYNhw:}y7VI"#$?F9e†qóýꦵÂYs‘H‚‹YŒ±ws®pcK\z0CY9`zl˜Ò}‰¹n†´am™ARm3fT3o|;dr@jx:Pg2HV6PQ4Gc:e†CcŒGa€Qt„T_†Xc‰bnU[ƒJJ}SX”np¦†®x‹³q{œXgLenBWMKipl“aztMtzKw~@Yn7Rf>PwBRlCNiWk‰\]ƒPJrHOlC_c?vh3TW#JU=]&Fc:j€Uq˜aoPIm<9`<iPy³X‚¨_i„I[eC]UJ[gos§‹/3&/5&E:(YF-/V/6C5M>/WJ-AF5Y;3/D+?55pB.lnEt‡\UwlWPXP^?>N6Q62^F.cc@EsR4VJ=B,NH&NT1FL6X81Z9+a9,[O6[SD][I]eG>E=`E0iY%HmDHALg>2EX5hJD‡d;x‚YqhfVwQ`l]]gIZk<hd>JoE'@@-"3"D37Q$RB3YL%cI0HcD[TGzH4½f;¡zNàb½±e‚ÒŸL®œ?trPXC]R7amAS~CevOŒ€JM‘cInS@k>@Y:GY8DV4Kb7^p%R~A@oM=mEK]2hh1€JlŽ^g„VteFidCˆ€<ª³IPߟ;uw?\>:T4AO.=`/KX.h[$npC[|KTlD_`=`x;=kG4bG2T5DN)JX'Dl<R\*Ug,@g0D`2=`&Ab77S9;C-af/tyEaQ>^?bC&Dh4Ff3^Z5Yo8hyPzŽAmªLD«Y;ŠG6o82V*FQ(LX/b_7^w>d‰BPFbg0ot8jzHqeDW‚MQlOOsFSz4Y{(V}0S€1W|,V~'Aw&<Z&O_0f_Ai‡L^žma†blžM5‰SE=+sS'wH¢Y—e¤Ï©ÚŸ½ò§Ÿ½’p–w^nKw”UQ•_R|NRv>Mg1XS3Sp<NH1]S8dŒWzZs~TokLpƒWmf€bf‰bAPA=-FB+-Q5@)!>I2]V0r8oMs RCdBKW1›U5ˆf;L^4K\5]yCn}Ckr<£W€È˜F¦c;H2FI0rm5|±\mvUšŽbcÊ—eˆnÆ›‚‡Ù¬é¶“Ä× ²ŒuäÛ–³¦x]yEPq<sfCwmHN6W[A„mFÙe_‰oª‘oyÔv¡bSg@VF3xK=ŠbKŒvN©¡qŒ£nYlHa_=TwNN]4qU/cf8ll=ia@lfE`tA¬lGlƒT {H³Åw©ÌŠ{µrI•QN:^v0fuL‹oFĆc„oOr^8afIe{Wž„aŽ€U¥\‰Ìw‚xJXY+de.X‰Mr8Um1Ta*kP.jd2klCu|U“°[ƒÓhªS·»l‘^£}Q{O„ƒSXRDX[F–\Iim?QR7“XE€zU‚…R€e\†DfE ^`Š_‚–XtŽEgA*vU6ŠM‹³m·Û¥èœOK‰o9~®kiGƒ¦[°Ç¥ÐþÓÄÿÂÕÿ»Ö‘¡m’_vŽR«bÑÿ¬úž¤ð¥Ö«¶hÏÒˆÐÒurr:]~2^‘M„²j†«Vs¯Ry´P_yC}jgÑþ»Âì—ŠmA†iSi_€¯dt¯`›º³éªÅõªœèŒ|SwdS™¨š®á¥®Ã‘¸unŸd›‘czwSxdJ‘X?djGmdI_lMs_„{YŒ‹mÅ{ Ñš¿îÈÃþʈÅuNh=EE*19#5F,PM.SV2¶QF¤ŒN^h?mu?UV0LP+IJ*XM3dT8f\DjoL‘qNnwNU^DTaEYsAcX<ZV=\m9_e<\_8t[:wa5bR8Kb=VaGwtIh\7QM2>9(</#:26-!><"$2#!K20ggE[‰A<b9\^=>N->G--K&%?#/2;>AtŽ£ÛòÑûÁx‡ŒGVz9YZ—¾†œÈgkBNx19O,[`U‹§dy©_y›Viy5M]'6T-Kc9T‰KX‘MOŠJ[•Hq“Lc”Mc}Ek~Qi}_rZj–UqˆNw‰L_„_c”s®Š•‡Œ®q¤iƒ¨aiˆSMd<IYNd}hvŒOYg8Q[0SV3We1Qm7XrGhh>bjLsXsc~i„¡PYx6HY&FN8M 9W#=e8WmBcwSm…`j–VNvER\B{Dt›Mi”BPc:7DSBwx¼‰;6-F82J@4^F;ER><Y?DF>K<6^;-KB'IA(\O4qT:‹jA‹UJykIFQJF:DS>9B:VC4TX?4YE-C>=6"9D'QN,O\/BJ7P12l9*XD2U@9hP8F_A3@CG=.eP!EP/Z=:~N1pYD™THqOGhFAmX;]}FJ”bNj_SdCWZ=.j8.I2!?(##>%1P!<B/VL-u^4bc?PlHkXFxT6nh;XD[>†Vm°{aŸ„FojUECYd3s]<‡†B‡›WR‹^HpH6WB>C/:U(A[5Kj0Zl(Z„G`tRN{RPfJro:lƒRiwZyqJTm?Mb<•i0«½QOÕ Exs8uC7>7?C"9W*JT*_\6R`1YgCRg;IeACX9MO&GI+@p9<rDIZ;8f.HQ0Fb&9U*G_(`h:Cp?FX6`k8_f<y‰D5zSAF+hT)WU1Zj8Sg>[X=]vAi‘Bx‹=ušEs±UZ·jZ£dDi?\M@K4]Z,`†=M‡GBu?bb4R€Ncb?VaDTl=S}<Vi<\+_†/R…4Uz.X€)U€(N}*V„BiˆJjQwGz±_o´yH–]<`=Ro<w‘W{Âqš½¬Á€µÜzÄŽƒ’qQ¸ƒ`Zpœ^b•d]”]N‡PT|AJsEXcA^vExŒVhŽVLV@A?+ioDmŠcruL`O4JS2<5)2.NW85XF:<.GY8MC6RY$da(a¨PO‘ZMzOM]9M_@Bb4g€9\ŽKFc2Ym1¯|FŠÑP³iHzGKd7rz>‹¯c‰ƒM¸Ÿt‘“}¹»vŸd¤aK³rU¤Œ]žl¯¹}y«si„RzlEkvP[[@T@/ŠjI›´|¥…eœ©‰èδ̪Œã¶€Þªh¢x‡h‘d”§o¾¬qsq\ƒiKnu[\QEQZ3M]6_}\akKReF_l=Zx?[U.CS5sM:‹‰erž``Ÿe_žaS–TVn0o,sw=‘Š@l†HkV›Q¢‚K®tQ}nJœzR–›kjŸVFoBfl5‰ WSzCPb/EZ0=I+M_+\t<{|E”¥U™Ïwu V}–]wœMš{?ŠƒI¯£R†¨O…¦QŸpOŠ…^l¤o’vT˜m£¨trŒ\YKn‘Uz¦]ŒŠQl£lfˆD>}87Y>l82‚•[º´|Âþµh̉NXŠ[e¶c‘¯Xê‹ûÿÌÖÿÕÐÿɯþ¬~ò¬lÔ…€Ñ€“ÚzºÙz½Çr¦·_¨±i‚µwµá”kDOP(@F)qiFŠ“Rj„Iku<pŽd[“e¨„ëê˜y„GK6,rz\z¤jˆ´eyšV†¯jÀà³»ÿ¹£åw hf‹X¤Š‡¡×”x¥lu¡Uk‰R‡R{IuZCc[O›‚м¤u”«†‰f¬v„¹t™Ð·ðÆÆû¶·d^X7XL.;?&CI.DF,OP8\b@–cFtyWcyK@D&Q@7FV;X^C^hH`fL_jEmr@ˆ}J‰’VrKdtE^[AZ]>ai<^k-UX3^b?kc;dd@jZ;hS>tc?ogTkxJ\c?GS?@D271"74$6G*$7 "<44tkMY}Be[H\qOJ‡QM}KIl78=(IEP˜¸ÿ좥„SwO^ŒTj“` N•“Cn—MSx8;>'ES>oŒM€W‡œJZu4A[:LrPTZo³lŠÄfy¥OpUoŠTsJcp?itM~ŽSpSgŒCY=U|QŠg’yޏ‰¤Ç€‹ Qv‡N|˜et¤sfªg_‰bq‘rr“PR`8IT-?='KI/Ur?S@Vv2Nh=_nMj€Tvƒ_‰žYz‘8>Y!0E3M#;`5BsJKyHXpEf…SlƒQr~G]l8Gd0c|@qFW|ELx_v°k•ÀfIB8QK;NE?PMFRO=DZB:O?.:;4'.?"!O0PO+sK2ve8RtMJ[ELJ7[C8HL>\E?Z[:B]E%C=.B5:A.<I+HU8O`@DWFL75`8-MD3KJ<IB<@<4C>1AB0YP.WR-hH8l]>F\IKCELD4ID5cB=–e6n»cJ—rUiJDX:SU/As?/O:+*!A*GW&M_:Xa=T_9rR;cV5X`KlR@`U<`V@qV6xdA›€Lf§dH€oP\LJ`CV\E|i=a”GAsO8X83J.=?-=Q3Ge?Gg=in6jsGKLI;B)PV![l8kT9a\4mpGbdCIn?f4¬£Haà—d’€B™Q4[a<A#@U.?Q,?O4MW0Km1CkE5U=?^8=\7MC(QI%Ha2BhEDg8ElBJj3Ms4ju0;ƒLEZ=Rq8FT=ƒb2^ŽN@fJRT.VP*MK-ZX)Ha2Re5]b/\z5Y…Cq‚19ÇqªÇieÂLœuEoPgg8b•E\>bIn¢Q^–QZiF\s<YŠKPHYq>b~6cŠ/W‹6Y€5S{*T{*c~*e>[yHYa8^g3…Y6t£^Z¤]a€Mv \›³v‰¾{~e–ˆU‹¤dg…g›€Hjµzo_e¡eo“Yi”_e’Ymž[t©p{šhlƒZfL<b@5=+`\<pzPQbI2V8E8#5H%5? EJ(htJHoI[G2N`DFO>Hg&…Bw³uw¥c`”iOnL\`5c~E\z=AR(Pd-Y‚;{‚Q¡_x´sS…KYy?bc4~«S„jE•_0zpA”ŒXy™js[=wh?t¢`ƒ¡l…¯m—ns}E~xG‰yQCRAk?/½šZÆ¥p…ˆyÙ±‰òÙÝ»žûÀ®ÿ§…ÆÚ°¾»ƒŸ¤vˆ“_¾sJ”œˆ~²¤ur[Y`9Na8`f?‚€NtƒZgc<bBIyB<D)?Q9ŠwaŒlGšØ”žì©’ÜŸfÅwH~6Ih"Zk"Pc)bj,~…FY–Mmq5kzCusKªŽa’Y~K¦§^¢_“¦dU—h]Š[n˜b^«hO…TZIeŽ\‡…S‹ŒXW€L—m?e£_a„8ta*Œ¢KƒË_uˆHZ;ÇqÂÃmˆJ•q@¸¾tq‘VmŒMz™[z^kŒXz¯hhšdeSšLEkCnK6“•WÒԉߎ¥i§kªesœE¡jìÿÃöÿÅæÿÆÓÿÁÅÿ«½ÿ©·é†žßzœÂn™Îx‹´U{•U²œ×|b—\Y‡QS€Ld…No{BZw8T|Ar{Y‹ºm‰§kœoZ†KBV6xU~¦dŠ´ju®T³yÄ仳薬ix_p™„ÁœÓ—¹sk“EWl=fr?xt<|€Hu^£Ç¢œ×¥—»„Ž¢]oDžŠb†Ìo„ºyÄÈ—ªÍyžWVV<]J9M>-RJ1NQ4ibBrgFd^@‰iU•[GQ/SK4~[8‚d;ir6hX7id?_tGgvJ}G’‘PiD^fAg`Ok{Jay:TmBa|L^gHmX>kR;aT>sjO{sf¬¾mz£`vs¡SGP1:D4CG7ET4*:!.60TSR`~ILXDmdGut?^e4QG-JF:XUeš•’ï³mq†NbYr†]ƒ˜Qp–Fm Yv®`k’J@]8H_A\OpIl‡?^oEG€|hÆ–“Õz”¬e¢]p•Zh›ot¶awH^|2Cb-L[+X[4gs8V„HgYw‹Z¥–f¥®€§¸m€COp@b‹c˜º€§°jnŠlvš€¨ZW}ASz:AY1CI1Mi7[{E`~?JkESvIY~TmxHnv8Vg,<R$*E!5Y(?`;R€_sªb^“SpˆVf‚ONf@@U;B\:CbBevCz‚Kz’RžPˆ…PYS?RYGFTGQD;RH4WO93[D4JA#36F''>O%EI0YA,EV5HH9LL4ER2OG;]^5WYDNG@ZL:8[3@[@FX9Sb;UlJZtUNqOWKGo?2aJ2OSBJ?=F>/DK6;G2lM0he/wYA€U?vcB~WJu]EikPudU—tQVŠ`ir[Hq;HPC[`8TrB6}P326D3"JX+Ea;PX:MU/[U1uB,‚P4wvKTfZMOKVX5XM6rN7bZ9{_IipD]yYZvWdqFOyH=vH2X8:H(GY*Od<LxHUoFKq7 PE++$FFNi/8h;RD/aH]r9]kCG_=zQ0§”4c؈}–aªW;ˆ„LW;5X/LT)F\1Zc?]tCY‰HTON~VDsA>\4SK)R_4HgBg\7YQSƒRcm5hi5Z–N_ˆNMqAdrDt„NHŽ]@WG>M%EP'2I$E=$YR!>^)Ra']f0Y‹H\–F–>€¸\¢»g’ð…wÒ_°‚s‹\NžNO_+Y`)np.bJYŸSY–UN‘RTd>Qh/[y/d†7\Œ;S~5\~,W‚(W{+X|=9vKSZ2MFrKqŒOg£Un™cšY{™b[PMh1VU!MD!?B,‰i4_›qr‚Re‹SfyEez@f’Yv™Vy”gWvWZZ=_I<xF[a>Z‚NXsI`“cFc8dM9P5@T+kq?[œ_BG=bS0VoHYVd’Q²¢P{À|Œªl„·rGžaj}CU|EAQ%W_/SƒEmzAcV¶Àq{ÑŠ[…K_ŒFfv>n´V6cHLC&xX1k=•¹du Š€[Fq©lƒp}ºqd¤khoI{WŒ_\eQ’jP‘eƈaŠœˆË¿Ž±·–ÿlUÿ¡yÀ߯ª¯‘µžy“ p…¤t€zYʇn³eO¨vR_ˆYOmFunN‰Žgo¥qiuW|†UFb8TXDlWa~ffB-´…O¶Ï“µncŽGU‰CDt2?g(=d%Qp4v‚NS„Ub„OgI“c‚ow¡f—]¢•E‡™T„¤srU_5oY2¡tUˆ¶q‹Za˜enyOq†QYk@_[1‘œezS;b8nE&†|8r†Lƒ’N÷–\ËÔŒY|RXoBŒ›^q¢_xœZ†µs‹ÀzÃ|†³pw\qimœa`™E[l;s{>ª°Z¡âƒŽ¸v޵}‰¶ya¨N”ŽbÔú·Òá—àÿ°Õÿ³·ìˆÁî…ŸØy˜Ø}y•F~Jd}An{F°Ò‹§ºl¢±nn¥UgrR|Ô€kÄjS¡Ygh?uŠX´~‹±‡t¦vlžvX¢kgN©u‚Ê{l¤Q“°z¸×‚‰¬]zˆTiŠY½›ÀÔ©ŸÙ›†¼q]sAb]8WyC`ŒHYEnˆO…žu¡¹”³}i¢nd™[y€S®o޽y|»r–¬rj‘Vi€rn²wW…PcjH`vLp|TrjSlsL|tSƒxHJV6HB3YI8p^<p`BN^>WcE\zU„|T|uC}kRusQp~Q†KgzA^uBbX–´x~œ]o…VlpNeW:wW<wYI£ƒi™ÃyŠ—d›TltM^uJmwJWX>OWGQoOcbJhg\Z}ahtSWY7DY44F*PHI…‡¥¼»¥˜]ž›s‡¶‚€½ih—Hg”d›°|¨»m™NŠyGpQwˆHc|B^wKRrˆÀ¬Ão„‡@XtGs”YuŸb‚³l›¹`–Dhz8Kp.>_.:\,@a0Dh>h„N~Œ@qOŽ”j®atŒ@MxG\ZyœiŸ^q’k²ƒTgq@q}@Ll;?d;PqE`T`•V_”L_{FVTh~Fel3@a,9[-3X/=`=>hO^ŽkÅs˜¤Qh‚[p|by‰b}‘Vw…Odt>ft<hj5\j,Q])BN1NV?4RBN2?99*9+/]9)VX3-aGDFHSK:CR4R?0NV0?TBOC7MH1LL5^S2Tk:FSFB;5\D6HW9QY@N];WcAXiH`tRcvZU^PmCDd@5JK:R7<V;+@K66C5dF&__,GT;V8.c=)sJ3—Q6vuJ{|\a€Tb_O^]:Uj4jX4Xg8~nFKŸP=eWS\>CxCDZG<P7GG1BM+RR.˜m6zuEphaYbKFOBGS>OZ4ZiAfxRx‚LkU[uWdpFU{FI|OJh@Zd2l‡;hcUNJsGFq0'mD0A4MJ!Hl9,`=FA*|Q"Z}3<iO5R@s?,ž‚5ˆÛ…„Óš€¹N¨†LkNDg=Ok2?d6>W9LI,nU/qt2l²Yj’Xj{Jsq;ca8JT4mP$V{0Qn@Qe5aZ)]‚8GoMMU0aZ8u{?L†UEkEFlB7W:1J'9B+7\);R#JV%k`)hp6dDm‘I“>°ÀS®Õ†£Ò}zèg©vG„PIe'Fc*L\(b`5|l=}¨TZ±gG•cCoD]h/]„3^@S‚<X}*Xy,Nu+eq4X”HZ›TZ‘cNcHbe7lJeˆPa~KYƒDBŽI3P./D<D?Z)|i5WŒqg‡RQW8D@&dPb_8q~Da]W\e‰Rd”Z[Si„U`Yw›UvŸfj˜b`aIxTn„F€¿{Sg\b=s‰@}\tPŠL|BroF“—N|kCp”S^€OKoATe6r„APwEXW5„}=£¸f_¡kFt>Q>+f`2v·\JkHQI.NS-^N.Ñv:¶sz¨{}”pŽ»~‚¸tfŸd‡QÉža™x^ {g´•m•xf©‘t˜¨…ĵ}‚¡xwK;ä€nõŸ†¿®ˆ¥sxUwrNF3z˜g’eœ{_rƒXev\„d¹‹t…°•y¢wiz`Z[3ŽjJŽmR\c>DoMrS5uŠLVO6MG)bS.O|:Iy<J~@b‡PeuMm{U_{Kqy:‹xF‚~L‘ l{Oe‰<o•=ˆ†PN]5cQ,^qBu|H]i@ch@szLlzJga?==*Q:+ÁpB’uJM~67d(WE*zl7D‰“L£šcjšXZ~D|”Pw”U…™Z”•T£ ^œÓˆ‚¬djrOv‹e{Ÿng‹Vg‰;UwG‰¨g—Ú|¢©p—ǾqkžK|€XÚðºŸÛƒÁÌ‚Ëÿ³˜ìœ«éšŸê“¹cSt7z~SVpL]{W³ÈyžVr˜cy¤bIu>’{Mƒ¯`‡¯k\—UmX®‘cŽª}¢}”Ï ŠËˆn«\ƒºc‡‹CgqA—µv”»bi{<cjBs›l¯Æ™¸Å¤¹€™¼q^m=o^6We+Zm4`r@lŠ^na‰¡zˆ¨sŒz~¢h_uDz’]…³v«hz—Vn‰YЍ€¥Êƒªm†›iy—h‰“f†Š_Ÿ¤x¸tw”K[k?Q[7M[>q_BtqFljD[jY‡ŒlsŒV‚Dos>jhF‚V‡—_h|EcoD„}jÙ§uºY«^…rFcc=XT=h\9ŽfNÇ•vž«„°Í|–S•ˆQ¤šp€¦wv°u•UVa9e]Hwqh‘YT\9moCNlDYnz¼¿¹ë¼|yYˆf›¦jŒ¤Yi{fz¥—³Ù—š¥Sfx<euF`uA^a@Yt[w§y–É€œÁrzš\_ŽW[’Qb’Y~„RwkK}xKfn5R]-He9Ej2Bg,=_,MrGbŽ=Vx3Jk4UzIvˆ<bv>UtB_ƒLrNv|@`nR|˜qŒ©TQh2IZ0Zn9WyDazFn†Rh…UzLbzI^…Wf‰:S]%>W#=Q+@_;WrG\ƒQrX´—W•Pd}Nncy‹_vUlˆB]v4H`28S-:V%5V/9dD5P9:@;3B3(765,)I/&]A0JW<HdNKNJXI>dY8UpGTY@KC6Q52N>*ON4Ga;HE9G@0OX7Gh=E\BLU?[_@_mDh{Vn|ZUZOdMA\P:GL@C:8H<6762.4'CC%QACM*JL2\Q5nQ5lVDvn>_FDhTQ^ICO2IJ)^H,mF&sY4mˆCl£gq·mY¯qI‹n=mIFR8ZZ-t{8z‚FssO„eSV_HHLAPX4ep<bŒRk†Ss…N_zQtxJlqC^}QK~TH{Jqd9šA„·xE•oJfAQn/3fH5:4IT=g1:[2=S*YM%ph0Pz^<V`]O«ƒ=°Úx—â†Ô°SžˆLSIOb6Pf/Cn,=P.IE#QF)kR,–zGo¡LVxLHf:>Y*?\,OU&SM)Nk=>s6^a6Z…>QŒMN„O_yRbŠNXrVZ]2Qt8@qJ?d7Bi8=a18N'JE$In5Sb5Se(Xp2€0Œ¤IŒ¨cÈÊkê\€AyLGd3Cc$K\,GW2]k9`uAxZ>p•LQ“`WJi€?cŽ<Y‚<V{.Os1Op.Qx7jb5„7[¾YUjV{MRoAUsFZg>m–J9N0D(5H3R#IDlm1a^=zR5@.9I)Ig=Tt4qFsŽPw‹Z}‹Or‡Lm“F|Mƒ’VÀgr¯jkžfhždl¦b“b‰Ç€N‹hX\5cW-]U)l_2c^.N`/`_7^ŒQbxDq{?ea?P|K\p?d]1KwCOq2^i5Ž|7d“SEˆDLZ6q‡Owµ`]jMGM.FV3GY2{]0ƒ[>²|PžÉ~¢«‡¾t©zµ§|²„Ë™fÇrkz^Ì…i]¡‰Ã“deÛš†y^´xc§yT¼‚cmtSW7feF_V:zqA…Sp‡Ii€<rc<{_LìŸmŸÙº¯¹‰†fgnO™…fhh\—xU\{cv\AjyFIh>NW6mF-X9`y6n‰EhQ|k:[tCRhAIU-b_@ŒkC¢m9xIo¤[d•ChqFQi?]\2el?Xh:dqAlnMkcNShBjcBO_Co{_`i>p]7QŠ<Vp-]}1\w6hx1xBkŒEc]/TV(WDaH RA<0I0§XG_žWWT(ka9~Sg‰STI‡™I¦ÁiÀÚu°T˜¸o¢Ý‰Ý†j¤WÍã–‰Íz¼×“Ðÿ½勞Ãw¤²in\Q‚J„Lpœ[¶h Xu—kÂŽ“Ê~U†EgyAo…_w“¿•ƒ«jk‘Qx‹`ƒžx±ÙŸ˜Öy³my»}Iy>cŽRš©a‘‡?RX-\gZt«…³¥j’ªc—›[’˜VXq>U_.BZ$Kf4_u:”R}PuŽVu‹[ƒ“{€±x_•]g˜aˆžgs‹CZV8nnH†‹Z’’`€˜€ŽÂ¡–ęбt¡¤eôñÿãv ˆB^^<]ZTjm`ikKojT}|\q‹f…}VoT‚‡ZTt@Kg8uvI©ŒW€E\n@v}[¼‚[tlI’pTpoGeTFnfLbiESR=žvh£¤j¹Ÿb”ŠTŠ™a§®n¿¬uߥe‰xGO^;T^Daxf† i^†T\ƒSi•{›·Èÿæ¸Øi‡—d™…O~R‰•{˜´–«Â»•YŠ}IgMYzUYrOb[n©z‘Ã‚Ž¹uy¨csŒcp|O‚vS„‘dzŽ\XnCa]8[b9H`>OwERr6Nd3>a9V€J`‚8I`-L^7Vt>]<Lt?S{=Wo:Sf4O\&EhCfd|“Xdn9BU)EY3Wj9Ua3Ne-R_>m{=Tt<[rNp…@Ab"6N#3M'>X/Xh3TN0SC1AR7TgD_R`Š\y”Zn‰DZo5Nl/C_26S,=J%6Q0QoDBD0DJ8GT<=K@+<6:2/M21hK4cg@qcQkYIgaH>YBG>8AI.P@4b@.U_@DaSPF=_I<ZTC[hALcEOQIWT?loCl‰WExeRDNhD8`O:QTBQE3@P49H@.C-OM+mQ%dU0\]>`X=d];XUAnT<Im3q_?;v;3BA:> 6I.@Q6|Y?…K«kްuy¼yT›uNsOLb.]a-Xc+TY3mS3gb8JVBUO3ck7d†Fb‡ZkvLdy:ut6ar?]j=S€ELxPIxM{wH¶šI`¹<olIU-Hg+"^I84+EW?c7A_55g5jW8š~3se[†cr•qŸžaªÀ‚·Ìw‚ò®I®ŸBWUDP5F[*6X.4G#9:BC$jC"`{=a{T?€A:X5P[/=h//R6FA+Ta.Yy=kžPy©\‘½b†Ô~ŽÏ€_ÇwMžpLkDQW,K_6NY-Jd1@d7<f7LY,Gg4F`3Ig+Rv;dwDt…C——M”º]}¨gc¹gI‰b=rME^2Kk<RoBhŸO^§^i¡Z}žQg£ZX‡Pfp7c{4W„;^†/UIG{BLu6Jv7fp;‚y9WƒCMd5W=>V;lU(b‡C4ƒA5L!6G-N>A \[*i…QN›[f‰I`žTP–Wbq>bc9dU3brKPmFVh7mp7Zr>vS8ƒJyÆpt¯p}·oƒ²u˜¸uÎ~Tã?c?P1FV%Im5Rn<J[6ke9hrBNxL^`7Y‡KT[3Cc1a|<Us@VxEIiJgGSKe…HršOn•]w®`VwRJ^=P@)Sq>h[4y\?ƒwRžÍ‡®Ì£ß’ŠÌ•Ü´{¶åšÇô¸‚pt{]zoR¾[@QWIÔ‚]°Ê™œÉ‰s‚a†gM‘aIdJ6zX=„uYw…^ƒ¿uk©i]c^TVYaqA·qF·À‰Œ¦€š{^mmO¬ZErU§ºwŽb^gKXw@Pj3]p4UqBU[_@_…;XQ\b4_fCGnKWYE‹qK]N-ad1PfAtfDeŠN{–FQuJ[U6gjK…Y¬µ¡ŒÈ©ŠikQo‰R–[†io‡gK^<X\2L~0[~>Y}3Mx1xˆHU¸c5:#'(#*)7"@$7i72G’L+'4/PL[i,Xn2eo9ex2€^?mO˜ÁÅü¬ÅúxÚ}ÆÑ„ªìœ»ç޵Áq‹ŸTyŒCbr:dh<Wd:RQ(YU$vR*cgI—¯ˆ½Ó™™ºif}M„¶q€„ÂÆ˜Ç›e‘ƒ:jk5btPy‘a–ºy‹·emœY| apžVz_~¨^`]0:C4w~{°Ò—m¾lk R[ŠMn¯fiµa_{<OP(Uf6Vx6wƒ7V\.eq>Sg>{€e…®vq¡h_}J|–WSy5Kc5[„MZ‚Ps€Z…š‹¨Ì¼¤Ý·¢Çƒ„RÛŒX¢„RxhJb`Mgi[‚lyjŠ›‚œozOy_:W_?sxJŠRg‡Qe„TjSk{I[pM‹Œm®‹ZvzZ€f…`st[†e…ƒ^j€]ƒ‚e³bŠV›€]¡h›œa¦—[‘’P‚…D][DUcV”ƒx‘¢„¡mpŽLˆj׳¼ÿÀžš]yJsr<b|\už†«¯y™PfiH^mL€{^t€Ÿq´n†³x޵€±{»ƒ¯z\›bRˆ_u¤p—Îy•ÁowLbmKeuJe€Haw>VrAQ~Ld‰Jkr@Ie,>[1Un<Xy,M]-NN:Na;Di1<X,AW?\|Qn~G_c7JT+:F)AZ4B\0Ja0AS+NO%IT-F`AX|=Fc(?V%8P%=['A`0@O/AM.A[1Gf8SsJj‚Vy’HZo+5A'JJ*BM*5I&5E&/>0?G>H:+MO/DP=HJBKM9-L<@=;Y>6RM?VOBLH>;I?D==P=/EJ,]K/V@`yShdUZ@;IH:ZQAZ]?9ZKX:<cG5qgDpˆTL‚cIc_Q[KmH<YO;\Q>Vh7>h=6L9RM2d^'b`<Ph?W]4E]?<Q;LL0K]1Xb>?bJ9V<R[5€a5{‘F}›npsr£w…˜_LiAO[@O/BS&GY*CO#JW#m\(L^%TW5Xh8awFm€JS•VGjCDQ'ZVSa$`e7Z{ActHW}G…L—ŸTF–}3^\DQ*Ki*)iHFQ/QZ(C_8NS5DL-[I?›i.{“X~\‚£h³v´€·¶nÒ‰OÀ¡<`X9P2:D(<D2R%@O:X-dO6i\3H~JBhK:j3EU+=W.?W6M[+\p5{€=ƒ¾\Áy »vÈt“Ê}‡Ç~e¸pH«n<V9R;DH2H\4I\4Br>Df5>^2=\0^g/b˜GW“z_yIx…Nk–L˜©Wj¼uU‹WKT`“Zp©X¨Z~˜\i…Odq>_`1R^0Ca/A[,Wi+Pn-w}1[¤_GxKQj:Qt4Ha6Uo@?n;SQ,DvB;R>MH$Vv17j52P$0B2B5AYc'}›W…£ht“Sfj<VW4Re2Os/nx@[IZ‡F\šVkždw¸s{¸‡ƒz²m…¾m{®oƒ“\‹ºq¤·w«³s}ÎvH´wOk?`V0_ŠInmEP€>en7N˜Vl‚OKŒ[Kn6]ƒ6{z@_yXfˆQ\jGr†K[’QuŒI|•KluPs´Om“\MmGSK7UlA[r2yh?ªh—Õ‹Ÿ·{§Ð‹ºˆŽˆjÿ“m™‰‘v¥«šldYbJ?mK>Þ¥}¶Åš¦q„§lpc>Z\2Z`)y_1•~AÄw¼Ìˆ™Æ‰˜ÏŒœÇ‰Æ_·‚p“l²Î˜‚sj–{VznMknVuv>„†BƒrDVcDNv>T\7McAk`8‹X]…Pcr5p…?hI„”amªw¦¦mmeBPg,hu4jQbhHdg?y–ISpCj[7Œ€W´šrÿĬ긖¡¡…•´Œ§¯x‡‹Z‹s‡V<wwPWf8[t+`}/Nu;k”Hz•M—´rRA:Y5.:/.-#&$"lSBND%K!1AFi1TILz4GW%aX1kŽFŒ»h¶ìˆÉîŠÃ剫äÄÿœ¹ô‘ˆ¡V`Y(EE#`Q/Cm>Le:Vj6@`,8T(;T9l}f˜«už£Tqm@}vc¥¨‡µ¶²’Tqe9^zHj~Z”Ÿxo›Z‹~O‚®\z²f¬\tDœ‰]˜¨d\\6VfO‘¬d°¯\Œ¹[|ŸSz´V‹¶X›ÎptÑnDŒ<HW2_d4\|/Ju0[^/C7)hpC‚ Sy¢Wm•Fx•H^™Ofªb‰Ë‡oÃra’Z‡¥°Â˜·Å˜žm€}c‚}a‰†S~kA…a<h@qO³~WÁZŠ|RamHYnJ^sF`uHoZo—op©zzÄ•„Ä”y¼‰®¯}’¨\“•l¦ h«™eg“’i¤‘h‹]ŽsSœjZ™^–\¢„eš•`”‡S„pJncKjkWs\„lÚr£‹cs—Pk’pá̮ݬi‡•W{¦[i^„›zš«e€y\dXc‹Lc}FhlS¾†„ÈÄ»rm•l¡s—º{Ž»«Ž™À‡¼v…³xÆp˜³g‚™WzŠaˆ‰[hwJ]xBnˆW~–Ok|<``3_f'@a5Ns4E_ 1</1"8:1Pd>Nk3<U;WxMYq49E#D=$H:'CJ4I]3HN*CQ'@U%:U+Ba;bv9Kc+@L ;I&?W-DU0a`0ZX+GL(J\:VsJa{OaŽOa{73W,%B&*9'3;"6<)?I4Lf?HJ-@K5=J>QA8WK;I[>:TC9EEC>?]E9wV7CnN-IL9/4P9)mR4b[CCaSCP?O0*OG/GZ>EN=AW6MQ>SC:tO8§xDˆZjƒdd~b[rLD[>IUAJ]<BY=<U0QY,Ze,Fd?JU?QQ2Mh<DdFO]Cah?b‰TP}nR_NUh<^[<‚I1žf6RzškgV:{a8FB57)76!4A(9='AP$M]&Lf#\e Vj&og1l|9B‡L4hB7T&NZgd*Va=Cc=IU<T[0~W9z„?N‰`>pSG`7Nf+@{=Gj?Qg55b:4P;:N+MP2Žb6u‚TkaD‹s6‚¤Q|¡s“£_™œpN¿„;lf2U34A$3B$<< TW"P\$H_<OT9OV%I|A8oI;J-?J#=O'SX+[j1g3‘ Q„Ê|ŒÀ}›¿p¹e}±d‚œWu«Xe»hQ«iVŽYF„SYyED€IDd6CV;Pq=qC„œFK§ˆaXGh|D€™T¸csºl€¹g}±^}¨\cQ^vCT„>Cl;9]"6M%8G>Y&Kg3Ku3Lv7s0X `BpIPj3Ou6[q>RuD;U2bh78SB@K%Ec,Nl19_02A$.D"+CB=or3‚¢]bzQAU0.D)9>!FA&ZY-JQ0YL1p`4šŠ<ž¯n¨¥d©—d´Àp‡¿ˆ‹}ItwGpŽRq›\w’WlˆR›tNŠ«V\Ã{j}Vt˜TlnWœ_h†Nq¢[‹°kdÈm[“VUwB£n:uR]Xc{HkŠOeŠKi~KlŸLp—Yyµ[išOy©Wh¬hDrMhn3ž•aàÙ–ˆt‹šW“¦kŽ‘^rŠ\mmT’sPÒŽcË—sn‚mcdOÝ‘kÚ‹ Í•Š¹zz]PU=TM%SH/QE,ƒo?žªkœnRŒpO¦qWŒgT\O„RKhQ¾£iƒ‘je“`œfG`‹VW‰Ia}DlwHKX6Hs>^nEJq5JU&W[,RR0NJ%\t4y—Z©¿wÌÜ£‚†I^l6V_.bg1pˆCauL_tXv}H_‹G|c;Ÿ©n¶µvéÀ§¢vı†êzŒ—Xsm?‰rGZT9·{WQn9Wr9S}@a}:qŽFƒƒ@—šZp‡RdW@NG25*+&,1.“™j4p7/)?G,yï”D£I:X4GcGlxGqq1¢~I¥Ñq£å‹ÓÿŸÂð–¿vFi:382E-Fc:Pk=Mi<Ir8Ff2KjCVyV}“dzJR[8Wt^„m™}[ÁtHŒ\7lK2ŽlK{{W™©x|ÀoY—Tx¥f’Òvg“J]r:¯“Vˆ‡EtjJˆLw•Cc™CkŽ1mˆ=t•NqŸI€‰RŽ“sp¨[WxIZtFbs:i†=Wp:@\9P:^‹D^‹IWƒ@YHo¢i‘Ñ‹¥åŸ—ä‡vÀzu©bŒ‰Y™w_£}eyc¦ys…wTiY@XbV_w^ZkH[N;obE†mPktNlnLjrPr‚bs¢o†®{£´¯µqŸm¦p“Ÿex‡P‚ƒL~|Isq@vm;ƒn@…eDŒvOtQdW°xjˆ™d‡”Rz‚JnIwe•m‰”g|Œ^tŽ_tˆQ˜uP’„Gk“Zì}¯–[€’VˆhƒšWwxEslY`ŒhtŸjq•NXu:^jR–™jº¦|ѯ…‰·f¢sm—–¾—˜Ã¢Ô€›Áv•ÇxºY–Nˆ”\¡¥hœ Xq‰D^x@ci=hcEggBh_,Y]$@b?QmA9R(#421;;(LX=Rh@G^CXuESf,8; )6*1+:J9Rb=Ef:I_2BY%:U(CY6Yl?Uh/4C$8F)=V.6N-<A+B=&27+<I?ZvV^–asQg‘UW“`T¡aJ–=<c/6M(9=*CO2FD+CT2-A8C31ZE,^N8O[@;[IBSFtHD˜]CGoO=IOGB:QH8NB8E>3<B029,T8-HF6GF5QL0cU9<kCHH=^L4{c3ŽwNsgVel`]yZZ„NQySKYACQ:CZ1IU+MQ+:O4Y8-qH(_o=H[KcP;{v;j–^XzqMUG?X+/O-FE)PU.OM5X?)CU06M63G2%@*/(EM!;_-@S4BT2G`/Kc)Gg&]M ]i"R€39v:@h<Xp2f<asF^c?TvGNmK_J9jf1UŽODvRHh>Uo+f‰BH€BOa9@\7H_?Rn6b{\nuMK‡PTi8mg(r‚9qŽ]{£^‰Ÿqe¡g>Œq8T=5S)4C,;AIDHS<H!2Q+UD(Yg+G…S:jD9S)7L)ST%Hv8nkD™‘DŒ`‡¼vu·zpªqY•Xdr@…h+†<wWt©]aœ\]uGI{AOh@[p=\@b~L@I½\fpŸXŒ®_ƒ°`oMovAat=Jo@Jl5Oa8Lh:=j<4X(-H(8D$Ia,QqAYu5V{5ƒ†;O©`FmEOm/Zo1[{A5f2IG ;b82Q9=J%EW/Bc-1N*<82T%/H#KJ#y‡Eb†O>^59O+FV.N]=V]<HdDH_4HvEYq;‚z9i~Ff}?ss@¦B@—hFN0XJ+d]/e†IaG[j<U`4Žm-žB’Úvˆ×€…¸laŒYsª`€²o™Âso¬b€™P[©r™sDpŠKf‘]gŠK_~Ifs:b…F|¤S{¨Wg Zq•S‹¹f¬Û{L‹kŽw?ɶv©·‡n“b˜{@vHt|UŒWt¬w—“ež}Y‘|Z¤¨t¹Ü¡ÕÁ–¬|bĵu§kt–a>€KZ\4bW=ge7ŒJ…nSzcJhcFˆR?y]DH?mKCvfN„tLs`Hlw\{wNi³axžb]¥dmv<Mh<Zu=Nj-:K&CN+GN$FH#Ji/\}:–Ÿa÷²€¦”cYzQXt9L`@YM6qBYmDpaHd™aY‰Kž|HàŸcÆÄ}¨Í·±t¹Œf•^ˆZaW_|JjbL…~bqƒhi‡XcyNe˜Di’Cg›L‹Ÿ\‚“c[]>T[3-V00<$CB&SS)”„N=f4,M'dkH×ÿ”xáxešS‚Àzs̆X¥JMc8¥®pÌõ“ÄÞ}s™Ou€T,I-6P2Vm?Ge4=Q.IS1Xj>Le<[k@j}H{‰N[vVV‹`uˆf€ƒb‘wEtN%]V+FV;~MVd@uqZ•dtNŸ¸l…¤WW…MSŠjvªup e‘³z›¡hcv@b\4BH"A="aP3Zu9L^Ex’s„¢rnan…[eoInƒ:{~@_q@d†Wf¦e]›OW}9`vD‡Ÿx®ë™¸ä¢×„¤ÜŽŒÏzf™^ym†zj‰yeˆqTŠwdm†s}³sžo€|ihoU`cFrdCqgKxgCthKymO{}PjnRg|Lc~JlyK~rX‡„]_jCrgG\bALe8Ma8PsG`ƒPm‡V}[}„V‡‡X¡†W‰‰U†|^lrVhmY•}f“bo‚d}šmˆ¨d‚•T…~Kj…U£¢]ˆŠY„ŒSŠ–Pz~HaiLi‚f‚ªnƒcq–T[‹Lg}P‰…^„–U‚ybÇ¥¢ÈÊ·¤Ù¦¤Á¤µ‚¤Çz™Î‡¥Þp„±LeDjS™d~œLgˆCNyDFzK[{Jsi4^V%?U+C[DVoDPo::X-2D!<@)I@9TWAOmK^xBL^,3=(5F0CYAGe;Qb=aqG]o:Yd*?R/?R:Na>gr;WT/>M5He6Je7>W70J4/N;BcK[€XŠ‘Z}”W_ˆ`n›}—ÉŽÆ]c•FWy7;L/DS-HP/2Q58=35B.DI1SJ8Xg>ViMEdUY[SzWN^[MfTGTHDJ<=B?69:535-U;)XT0CEA=;6BI0_L5HXA=Y7?O+uO(•v;–_RvmYn`clc[DrQ7_ALK62K2KB*EV(:O5hL3MR3=@8FC1[H(f0Y[Ejo.>46(!FAP^+)a<416R:AZ*2O<7B1H*H":^%VM4`q;LrD9qOE];5b1;U1QS(Yr+Xy@d†EmCnw?c_:r_4ix@6vLDI;bP&Sw7QPIMjr9S”CFk>A]1EW6Xo<•…IT–nm€]F’S8[@JM,fc8wˆNQm¬{x‚a<žW@[J3B$&>('/3+6B;P!FF#H\-bY7PŽPG~`DY4;[6l]/{w9n‹Pt›Ty£Mƒ¤j’Æ~xß™_ËC¤bAlATP$i\*bt6>q8KW-Mg1Tr?d”Jn²`m¼m£³i~Ät¸lz \c‰RJr8Aj/Pc/Je7?i<FX2AT'Je;8d:8U(1Q%JG*Xk8L}ARe1Xj0†z9T©cCmCKm,Oa1=Z'8X$CO%@S+9L3>H!G^+:d/2O%>C(HX-7W1d_*j“OJvEHM(@E(UK'MS3iU5L`=eoCTb6Vf1^`:_zJ]uEX‹G}‡WL‘T<_@=K,JN)^V1RHZx8Mb9Ml0zV*µ˜M’ë„ëp®jzžW™²izÀ|alE‹x9cœgvƒ[|ŠRf›^[wIPf3b^1p’Mt«^u±_i¢]„ŸQ‡Äg½Ãyi|lœrA¸…[ËŸlŠ«t ‚R¢lC˜uNzb;¯›a±Ò“µ«tÂÓ˜ú¯‹ÿ³ˆcš|] r•”^|ƒMu˜ZkuFolKuM~‡IG;iM`gRjxaanTdbO`WLqrTWjDqT0j}XX[@“‡Jw‹hbƒDJy<O^0Q~D/H,C9GM.Fb,Qh.GX+|qQÖ¥cr;vh9W^7lt-ui.lqDo‚O^FbrTŠkOnrUz„[ˆu@™‹ZÚ©rÐyC¢†WŽQyL‚•Xˆ‚Ju{F‡pK˜VŠ^‡›Ut¥VeJX;ji2kpDO`ACW4LZ9DO8>]6:H4TxPE‰ZF|Oj†X ‘U³¨iŸÃmlR‡šH–Zw•Yqºi©\“Vs_4OR0gwHBk?Qo>G_+8W0;c9Jc?XkBVs<f‡No‘Tf¤`‹ÊuÜ|‹É‚©¥odT55;0[H:iuT †Ya…EboK¹Šb³`lp2`yGp¦u’Ï™“à’¬x†–e‚s@`]6M\7@S&0BE=$Zg9[q>o‹Vq‚KfNt‰Yk~=ah9Œ…GdsL_P:u[7[Z/FB C@,|lZ®Ã‹žËˆŽÈ~®Ò‰˜Îv†µlÇ…¡´k™Ÿb‚‚_˜|n›²‚¦ÈŽ²ãŸ Þ–—Ê{t‘V]|FVxE`b<g[Dgc>dgRglQ_|P^lCjlF{hD€e;m_<ib=vc>_]5Wd8gtG~sJ{„Ml|Om|Mf{NbtGfuQ”›p¡w¢”oµ™r’gy—a{Z†ŽT…Uy‹PtŠ[žlžž_‹ˆJhnAtSDyeKw\x—fy“^x‘Zn›Zg†Rr‘_…JY]:‰{iÿŸ‘ÿÀš¤¹š¶rÇ Û“³äw»ZgžM\ŠN|^}“[k•TbOfzDjn5Ye,E]3Q`9J\>S_>Uq@bf>WT1KU4IM;JLBaqPg‰LTp:@U2DL,G>/RG,NQ4Td?fx>Ma8BY3SY?_g?]i<MY7?W7A^0FX6RbBUjETrI^wM_zG_Uk–]ubl›s‹»mŽŸWfw8Uj7PX-:E+>B*AP2M\3Bm=ImHelF]‚Lb…\Yw\NgUZOEeR=UTEKDE`@>8P<:8;P;/ZF6CB7<6;?B0AO0;P9<E2CL3=L)mR#ƒj.™P<uMJhKFQDFTH@Me>ExE0UFTB8UV*NX;W\97Z;E8.9K,UD1~c9I„V)R_"'-/"G:J],3M57I/HD(DO1,M007++=!G37V$l]:|r=V‚QDyLKpUGoA=sJMb<WyCSoBHa4@[(?Q#QO p`(Jn:8eDAP,NY+]b.[}EW‚Ljy>FŒBAe8FX-\S6ƒCz blŸhf[=ŒK=[IPY0au=euN}hA_²jp‚jRŒO2vR'2++3/?"3H$?=%=X)HT(RO)ec5fBK‘_VuDK‚Ke{Nu‰Ky™Px«^€°[¦¸|·È‹©ñ—}ÒZ«i9pF5]0>a,Ae4R{;XHb¤Zx¢Y‹bˆ«i¤_u†Ln…XWzDL^:@`2H_2Jn(Te/Kw5BLAkA?M*GN&=^,9T0:E!W\.Uz@Kv=B\,W`'‡3Pœ[Bi<Fj-9^06d'?P*7H-A@2F%;G!H^+/e(39@M#Ee5In@gq<Y‰EBa5<H#>F(?I)LEVB$^`8K‰TVk?p~IˆnS†cGdxAb‚Go‘\ZPFkKGX2AY-RX-NuOWk@V]1R_/_g,•¬P¼Ìs£á†zÛ…‚¶oŸÁ{PiUo8ya4jd6csBxˆTb‹OA`=QS,VN1zl:…©a‹Çqq½nŠ‹Hž®M´Øyo¦lq=§rJ©z]ˆ‰Oi°fŸ…Zy‡]iiC£“j㽆±½“šn¸ç°‚šn…gF‘U‹‰[zqPumF~yBja2ŠP6…ƒFpyT^hF’nM¡tP‹uYzr\™{_sl[qƒYJmPUS8lgNXlQžm7_zGR]1\r4T_1gs84a;BC%UZ/[šOLQY]M½Œilw;Ko,Ok.L]3Ll+Pm.a^3tiFg˜P™³}€Ô©d—ul“i]žkŒPŠŽInq3r\1n\7qfI€kN—pJjvPf|K—xQš¨zz‡Wr}@mEP>]†Md‚S[]CfiGdmNk`aŠlXaœ¨pŒËxu´iz¯hu¦jÄÄ|l¡Zu¤T|¡[‹¾v§Îtk‚Esš[7X,RM1iyI[ŸVNS;b=Hc;Qi<ZfFd~STu\boT€‹b‚˜e¬®y°ôƒÚÔq¶ÂbX³]csOnvP’S†L^ŠI\ƒW•Tƒ UFp0ZsC‰±q𨩾tz‚Nyl9rAn™PL{FBg8?b6Ee:cc?TEk…M„nN¡‰f|”_RJ,JF(r]@šxKif3J;(A</.@'18.\QN”‰k•ÒxÏw˜ÄvžÒy}Âo´Ãˆ†Ø€z‘ZtM‰sX–œwžÕ•¶Ú¶Ý©›Ø“{¾“lÁl m`…GZP;l[>^`Md|]nŒU_oPasQuxLjt>bW8Y[EctWhtUTsFes>Zj9\i;Ro=VzKc‚C^zJc‹f¡pµ¢iŠ‹j›hŽ©nЬhn’<[j-oi7y}Jtœbƒ§o¢¨e…QwwKjzJ_‡[ežvg’cfŒPy›a{¢^wSx Ts‡@YT:ir\~–Òž©¢ƒŠ¹Œ—щœÓ“¾×—Ìm»ec¨hc™nm¡sx¨pv‘Mbu<Ph5GP-KU2Hi?NlBLm6NpBNtAH]8LPAaW<UNB[kJqˆM_~CX_;DF.:7,KK*;D*GW:_hD\k>P]:UV5]`AY{J\yGsyF^v>K[=I]9Oa9PXDdkJYuFW|JdŒUh‰Ob•c¡]qƒGTZ1E^*>]-^T/CW.Va6ak@bLR„\pw\pƒV`‰_V…\HgSRB?\J4SX7XUHLRAIN@IN9CF7L88CH3AK;VL:AK:8H69A03C/BJ+VUC^)dA,X8.S27W/+`?,xU9\vDDvWK`ENI1G?5EA/G=0MG)AM3^S;myIA‹s<DY=<*<5(RU-?e8XK2>c8=Q8=@24E#/D'0C$G9^Y$]tD_„^W{K^rKT~HMcNGV:MR0C`7:g=<_75]25]*]V$Tc0JX;?g2J\9Qd9Wg8MqGToDby?@€FCX7FY3cZ<|x;tUY€RZ`DLy?JtQOa>`q:fŒOŠ…Gt»[c«^†U.„I&E8:7;N0<D*;@'?S,Eq7T\.UY)ms;_^gRt–Jm®ev¦r†§e„«kˆ°e™´ˆ›¾ˆ‘¹to¹tO hL…PTŽN[’Ph”SqŽPq€DnƒEkJg‚K[tF=d5][(L‡OH_EE^3AU)C`3Fi0Mi1YY-[m5FwDFlG@e>Cb6=k<Kj6Pd:Ih59d03F!RUvv3G’SCgA@d)Ha/Al/2X64?"(6(%7>IY'.f))@'NAbp3g¬RXZ@u?4N'<B8B#EC.;c4DH4f^7O†U•`8¸q?mW>[<%lc0Ÿ†Vc†\ftMPx?KH-JU(hd3SvSHo=VU/Nl4mq-xBzB¥}G”¶ZžÔydÄ{\iD\u6Nz@B\<b]0\~A^zEGA/SB$JL3egCrhCvŽMi‰Gy|J~vO’K\Inq=·‚[ˆ’sW¦Ïk˜Ž`—™l†ŒS§¿qÏ\‘ÈœjW±{`xº‚…[˜sR˜nsWhpJOuEZb9miGŒ™V™Yˆ°h‹¯jª¼w–³r‹w¡k~”_gˆQMe<VU4_ƒV{yaQvEQg5Gc9Ll(O_&Oc7IY:Q]/t”AžÑ…{ݤ‡Wx™na‰^L•SY€K`š`Q|<Uq*UvDu}QqŸ\š„O·Šb¤´v™î°}ñ³d—^`ˆPij4`h7cL{|P‘~UŠV€‡Z‘°r’碻]_pL^yJNZ.N^/qtG–edq]ubUeaR„hZeNuZLŸyJ¯‰Sƒ…H„Œ]}œj¥®h}‘I`w7v¦T¢è”Àì†yI_u7v†J:d8MX6l‚L–²c›ÍdI†?L/ K?#F:j=+tj<x]6€Uƒ–_‹_¦¯g°Ósšó†ÆoqqSdwNk…O†T`~JmyE„ƒGj{DQ{4Io4vw>y{<n`+je,fv9s˜KyªPYLM~DYŒK[ŽNOU/fT4kBqcG»ˆq…©[7L,CC6bL4‘b6ŸZ7L]7I<3HN48N-GH/VA1‹gH“±j‘ÆnšÆ}Ìw’±~°Í•‰ h}Šgv”iˆ²wµÄ”«Ó•Ü ³ç´Ç쮮ꕅ¸c`qSiua_[g‚Yo†Wjt^x‰`‚„^{“a\„cnŠkššfš’Rgs=SgI^xJT}BW{C`ƒBWj5KaFx„\|P¨„OŠ}YŒ~`}¦\ƒ–\v‹=Me5Ea>RlTv˜b}¦Z¥’K…N~‰RpŠX`‹enš`k†M^~Lu‹Q•_z¡iªh¡YN{DdmXskŽž{µœz«ª„§¶‘¤×‰µo–ªh·ƒ‡Ä‰¿ŠŽ½„©¼pœ›Hbg-F[);M)?N3PcLewEWi=ZeT\KLlEH_@PL7MJ8daHd€EXn=U_?Vb=J[>LU/<L)C[8\tC{ˆAtl<[`;JU;djKqm;kW;y_C\nBS^8DU0;J3CN;PdGSxImJV}@\zAls?Z^@XT<]T1GU*CV,EQ3_Z<soAf’TFŠh^naoqUbŠRTŒ`=hRCF>QJ3Uc<XeOQ]QYZN<UH:QEKJ?DM>CQ<FO;7J:D>4A9,7G:9J4BK&=X#2H*6/(/&%E\0sA+i70YR9Eb<jQ5CP5@=:ZE.XI.pN7€WE€›_D•~AKgV<3ZK6Rm=JY>PU4@VA6D42<*9D+0B//D+HG+|W*^k:UnFFaDJ[;CW16Y99T1?K&A[,<Z2EQ*B[%?`+ef8PpGD[=Pb4RCSrMRkGNnH\uFYC?‚QMgDReFQsRWW>Uh8PbGZYBcp=F_buKr…Da€JyS6މ:]¥uUuVJj42qAKF0:^92>4KG"Sy>CrN@b5]_.xo+\MiP˜H}§i¤gt]…‰S“¡R•¥w}žss¡fu‘`l‘TjŽYl“RY„PMl<<Y.BN)[P"Yt0Ww<C„E7cBrR"JEEN95T$;H"@[-Mt5Kt>Mw=Jh=\T0h`+ab8ie<YoBFeEEe<C`9.^-8ETV%xz0W›\CwG@e.JZ-Lj7/X2(@1-!7>HN%6d-)C*A?'ySu™CU\?jA6G(7?!>G$W\5Ud>\~Ko€OZzRVT7VY+7I0:.$PH#k^?^g=`ˆVKLAK7Dc9bR5RY8FR,DW-K]*fh/Us1Dk._^*ЇF¯ÂfuçvZÄ{]‰W_y?_~;e‹NZoFR{O>hNMA-yc?iyNuxE|©Zm´Yš²Yr¥ikSYoG„ƒGÀ{P”‘Zˆ—^–¼g•‹XxzW˜~QvŒX¢^J²°w{phš…dŸžj™ši´˜b„ƒQtfN{pNdR~…Ly›\ˆZ„›b‘X¬dugº‚p©™…z†o|sVTyVXeKWjIx}Yj`K`<\`(Hx:Gr/Hh-Oe9Jg9Zy:ŒŸQÇÌ{u«jz;—qX{€cg b†«nŠÈQšXSu1gx@eeC†iOg©fY_=kQ-ºoDä]mžcp}Ob£qz¤t†–`ƒ{I‰{DwrH©…\Çø¨åÿ´uyCkzM^yCCS3QN9vAœšf¸p_‰lyp]~i]nZNceAoƒ>x`gFzŽOƒŒCipAMmFRh<¶¹€Úÿ˜~´]dgMTkD`u9G_6U_A”ł◼QYšD0Z/3a:+O.7R4hƒRIv@t‡T~o}ª`†§`œÅs¸Ý}‹ÚpfsFpuLyŽ^†Yb‹G_z8iBWs<Tk4Ep+HY)JY*LY&TY.\d/c„@vN[ˆLT]9p}FtƒD@`9SA4YK5gFAŸ_†r;KC,`N:^U5OH%V;#‘aCHX6NB-GP.8@-EB,XL2qE~¡Y”®g¨Än‹¤e¸³ž–ß ¢ª}™¸p¤n±|ŽÁšµu§ÅÁØž»Ø§ºâ™Çoo‘Z”nVƒYe`l‡S‡lO‹€o‚¤~Œ³“uˆ–\o‚N^xN[xP€nN™jMowG[{Ff{HZ‚Ki~Qsw<jn:]mCw€SŠpP‚ƒO~_n‰MWjE~To„Jt‡Q”K„xC€„Pj]g˜oh©qc‡S]‚Sf›]{¬b{±nˆ±y’´jŸk”›_˜ds”ju’bw{CsvE~iºÈv¬^{Ywžn”¶€ž¾Šµ½j±’Tsm6EP(H[-B[,HSAesWttF\aALQ=gkPg{Y\qKR`EIR@N]AXw?MkDT`Fb]Ez^Bn_4J[0Jl3Yt<ck:PV=K_@I_J[uLbxAKS7NV>VrCK\5IU,GU0M[<NhGTƒNd’?Yr7FS/:@)1F-HT8O^9HM1GS2BH7_Z6jiBg|QGySVeQtqEdOW„bOdUUS?_\@\hGfiQ_wVdgZeeWSfSEWNRK=RM6HL68H7PC0NV.5OG4?7JF*GR#<L+9B(6*5 &1E!%;)G' M9 RA.lW+Qe5QR3FS3aK.hE/¤`>†ª\G“†MC\Z@5VU8ThBO[@IJ3<F2<G0DO1=S7<J9:O9Da<6_@FL6;G$<U/EM+NS-Gd76N3D@.=Z+5Z03L,B=[]"Ux6RpIMd@bl5bsCS|PKoHO_D^fAgb0`>`‰Xe‹aBvc?M?UM-Mm6bdHlkDg†OT{KDY80N)Q=tVI[@XKVZ.Fy.Xr<4sC;E=fm9A•YRlOTŠUMxSi_+\y/bxF{~BqƒHe…KRuCgc=z~<e‡P\xT_tDYxPMd;Z_3bƒ@C‹PCk<:n13c5=N$IM%_a*Z|>C{GVgBHp9OO/-Q$6A$ZW#^ˆE]XW†R5hA8P+>O)LO)TT)TATE ZU&Lc;6o4;Z0JV(}p/P‘SEh>Ae(I_)HZ&0`-'D!':065E#JN Al)<Y2+Q/NO#km3YQDzL4G'3C MY(fc1rHy‘^jvKFhR6:*CD;X29[>AE-FS0aH1_c7NsGcY;HyFLlH>xNAc?Bm?Pk>Nx?Ys8Rˆ:\zA„¬\”ŠV©Îd—É‚yÐrO¶s\cAn}=yNmˆY\ lXŽ`}‘Zd—dh‹TpŽSe;…r9’–R€¯m_¯ZŒM‰‰P€†L}{A ¥]”–gšˆ^ŽNjgL¢cJ´Œa¬™h‘šc—˜Z£}[¥yS¯”Uj|i{gHdtI‚~O‡§kŒ›o“˜w…¢~ w–}æ©€¹°•‚Ÿ‰~”z}‡q‘uOt[zQ3DW7R[;FY6Oi-Wt1Sˆ?^ŠDk¢RhŸMŠ¡Wš®\R…Bai.„L“ºwqŽLŸ”Q‹€<V…BYz:Zu9gk>˜ˆjl͉ML=GJ4Na@oi9bwMr^”¤YµÂ„Ûl˜Z}wA†‚P¬«yÿÿÁ¿ÿ¥Iy?VQ+T\7PZ3\y>g}>¬ŠC‚HªU‡…gwl[l[Vg]GsH”¨\m¢ip—VUpI`pR”Œes²n€L§¯wi€J[k<gc=_e<TR,qY;·ˆ_£Æ`|§K|‚OWsUegOO_T`y”d^Pu†\š·y}ã€yÔp¢ØŸø‹¡Üyp’NpgB“Z¢–^jŽEX‡Mj†PRh=DT)Qf/?g)GS0LqJYŒNMh5Ij.t–c€×V¼udˆRUv;U[6Y90WG=b^W‹cO[8QS5mI=nP6KE/B?.oD@”~TAV.@G*:? 97#OE-bY?paL€K”U‡g°¥Ë䙢[r€HsŒS{œ^ƒ–WqŽZ‹¦¿áª¾ð§¿é –Î~€©aj„Tl…Vkkd”ii˜rŸ¸€¥¸u”£[€{[r{apcK‚oSˆ\ƒoH|U;bkJbxGio=ql?`kB[b9Ra>UjNq\—mrˆXs…I~uZ`†Q\q<{`2fk3xCkˆHwR„Œ\Œ’aŠŸkk£T_—WÁwˆÒt‰Èt†Âg{ŸWqSwWxœbƒ«k±Y`„Cc€Fa†U—¨_–°Gkƒ=`}X‡ »Î‰£¯ey„HfjChc7Oi3Aa9UfPt‹[n{BN_8[W:MbA\jQh€j^‘jPƒYnˆPeˆGWnCm[JreGrlGUxQO…FUŽFSˆHWf5BM7NN:f]EwyT“„Q_e9CX8Wf?Oe-;G)7M8LpER‹Mk˜Ji{>\d?BZ7AL01C3>\F[sS`j=Q_9KG7KS8IN8YZ5Dd?N^Bs[D_z@JwMQgNNc>L[F[[IfdHZeXTYSGVICH?<E6A@1IH0@B1GA-c?(HP2<M54>7>B.?E"KO#KW%/G6[>-8k18:7>,(A1'=<.QC.Q\,W`8LO2YF4wK8¨`AlŒYMqiYKFWV>UgGGIF8O8@M*FB+H<*VL2@a<KN@Q[<BaK2\?7W7<_3.Y6<:(I<.G%+0$8> L@ 6e*)U5KM'cY)Ro:Ic;LP,NP(Qd8JrGMQ:>Q0;X;GD$aZ&gqC[sS=bF<G5PY2Zo?_wLgl:VH:[J=O.)P2>C(lUH™F:`VDR#\X(`7NIi€Nq•Un§g…¦mm©|C—r_bCcƒ0]ŽJ]RKb3Hf4OFSŠUW‡KMwJOiF`x@@tOJK1TX,_j9H|FHa;Je3<j85[/6S*JQ%MX*Sg6LvD@oC9S-3J)7J)YV(^wA^xDUxM?m8:]17Q53Q-.M$1L%;P&FE%TM"Ye,GV)G\7hl6FO<Y6A_(9V&@A 4X#.O#0N*<B/IKK!Hm.B^05W9HX.Zu=fx7KŠD?c>Gb5Bd<TW/ƒT)YS0fE(M_<)52L6[S&W€J?a@@O1PL3_TCi„bwš_ežhi][‚M\wJWe?Qk0N`/m{AYŒKzLz´uXjB͉@xø¯”[zÄ^]¿ql\}yD‹t;w‰Nްq“±uj†^bc<ds?aŒOhrNwGtuP^oB’‰?oŸOf\j}R¢•Y¹x€œ`qgEwkJtiJªw@˜NŠ[š•k’Z{yQ׈Xˆƒ}ª•‘e‘³z¢Îž¤À¡¡¬‘²ƒ‹¬—Œhª‚\щdyŸ}ŠwU™\K¡‰nLlOPK.BeBW`LCrBI^&Xc*cv8_a.rQ([x@``7…rMRjACh4‚†W|¯h_‚JgxGG^7ag:\~DVd<vpX”iI¯°…LšGlHB_*Yl8m˜nž°ƒy¦gÀ±fÎyWtc>l`<„‚UÉÍ–ÿÿ¹Ý|Ct8>Z>SjFbi;_Oj¡aazCro0x†;’ŠRŒeSyxQƒ€Vƒ§YuyKwnHdtHevL~«{·ë“’±doƒ^¹Æ’>a0A; E!c;5Sd?pU¤•sˆ™dm–E——j¯’lŽ^=gT»™„Ö‹t«u‰Ÿu¥¨q«p°d·Ï‡®Ü„‰™Iu…Ee‚Q‚xYĈ__›lk‹geuJAU1<N/9?$B=+AK6ƒŒm¥õ–S¥QPZ0†ƒ]ˉ‘ÐxV„AaFWv>RZFbh`Ž™}”œgddFgdQuggzbk]LXK;KF3±XNk~J4;(5B-9U2V`Af~PhtIn~Dg|K€{V†t[Í´”vÀkR…>Yn>eg>cuGr’h‰ÅŠÃèªÁÿ¸Ìü¿°ÿ¨‡Î”€Ï“kÈ•ƒÇž”ˆ‘¯r„“W…‡OkˆU`jO{^MocJjcW”yZŽvKe^HqzU\xKST=YK6[O:ZZJgiUu}MXhK«{d§“Xvy>fj<ƒnTpŽSY{DJr<[rFrvCgfArzS}…M}Nm‡Cn”]ŠÐ}—Êi©TvGh‚PWr8EM*YVAtvWƒI`gDaxIf€>t‰>dy1Ih@VƒJt|Y·’x¡ª„€²yn£in–Yd…DIq>]lRnˆ^Y€SMsDIj:I^AV`Knlkr‘{smi”Zb‹MUwIYkMdwSb„cy§ss³df—Kd•Q[{;ML3@X.>P7Z[B~m>a\9DQ/N];Yq77P+4U?[ŠLb‹Kfu;UX)<D;d[LonHC]QNmX[}`mƒ]apB0D39>*;E'LL06V1:N3VG.bW0\r=KzJRoMZsKQmQH[OEJI2K=:A8>B>DC2@E.5L5-I42:+71#>7#R@'CI'3A1=>)aK$BR%Z8)S[+'L:.1-<0SG)<J4B;;QE'Jk<MV;_P2f_>ŠcJXaN\LJgR9pjMOtUKIHIG8?c=AWAQN:RT8\`CfrJVqLBhG=^?Me;6n<'M:+?!+=$:-6+8I4NZ)Bt8Pi;>\:29+8:JB!MP&IZ/4Q5P/)BM'/WG9C'PL G^>7`I?L=PE2T_-Rh?VIerFN:7eY<I-1U):C3eO&OŽ74wWGQ-Ki,dd:c€:mŽMƒ•L”®h´ur«…Xi_ŒUh‡OiŠNA˜\<]<_S)j}<k™g\—dM‹XcqFNnG/V;BG&QQ&Rl;<Y4>K)JY$@_/7[.8R,6W)<T+TX%Pg1Ff<3^68O2:J(OR(Ny;WsGS„UF|L;d2?]4?Y<5U09F'3O#9S+G^+>Y*NT,KY7hp-H•O@[GA`/3\01@!9G!AP!4C&-?'4@@?Ck'BM-OZ6TeBQDTu7Ug,TI\m<Tc54M+584'P8eL1';4G4Q:!VW,CcFVB5sV>—l=wJ†yJ€ŽVXˆe[N9Sr?Og<FZ-Sk3n…G_G—“LJ‰^?P.ÞW/†ÚˆiŠcˆs3Š–B‰ÂnX¯oWa>iU*€Lr¾ŠPvaYnI“X[IVkD~hB[oFMq<`v7lo8R†´j Èp‡ÄovZ€]:¥‰\q³yyV~P•¢d¸q=ª~P˜„aà›pú¡~Á—w¶¡xÙ”`ÿxf¸w]Üm]Ò{d±•z‹¡k•—e¾•vy£s[~__Ht‚V;T?P@.JX:__AZ…XAyKWd>K‡D3U4GJ3`v?PEuU4RP,Nd,~p6lœU[ObT-LP.`n5Vn1nf,·lJWkHÇqnâ¥OTG_+~”g¨²ƒƒ„Uv—Y‡šVOkFX`=lkEŠYæ£xìÖqƒ^I[-xrMyÓ–m§uy˜_—°qb²bU‚Dc@ut6–r9 †<™z4’O[~GiZ2up@x¢XĵjŪdlŽS´¨ƒ°Á…E`2+;$/,#WH:ylZ–e½±ƒ©¸~j—M¦«eèT{i‚tÚî¥ÄÊ‚²’r¸¥‚¥ª{‘Ž\s^¶Ö¤ì‰jHpƒU‚˜c†„^™•Xž‘d”}Q_`6VO>B<&@0 N3$bJ3y]Dµ…Dp€:DI'[N-o\:vjFwmS‡boz[‚oU™sQ¢‘`¬¨e‹Xzy]’\Ã}pŽgiXJ]_Phx`¸ŠgBnNdtQpŽV|™VŒPspAfiDqŠ`uWrpW¢œŒ¤Ñ‡]†E[`7iT5d\8tpQ±ÂƒÀîãÿÒÚÿãÜÿå¿ÿËÄò¨¯Õ† ¯iЉVxŠ_pclŒf|–lksXŠlfŽ„bŠ\¤VŽtJsvQr|ZgvLidJ]ZOWO9cU@‚jL`9lS5kYE‹vMt`9sl@d^=ljSu†Wa‡P|}Nˆ|O„H‹‚M‘vFƒ‡=^~1[uM…ZtŸXZ€QRyR^‡X\S8j::K+?:+dM:W`;[l1Wj2X|C]†KL|Y`rUh~VZ{_®ž†ÀÀ…”©y‡—ZxˆKPr=ZrRu‰^q’\jE[b3RM7_fMƒq`†‘qk…ckzWeT^€MgqLZhUh‡v”ÀŒ’¿cuœTj‘Ie~;ET6SM6GL3AX1B]6IX0@I2?N5Xg;Hn?NsF^wFan;Va+8C/>"8I5maNt€Ol‡ThczŽo„“X>>*7>(9F,AF-4M)%F$?9!cT"mf9hm?i†J]ŽcMpWBK@HJ3NV8GZD;QDN>;AD-<H75A0*<*+:&35":4!=5'7;(:?%FF!F>Q;$?B)7K/GC0XJ1^_;4`BJA6K[-]SCxX?ƒb6hjEafUT[H[W=q`EuoNOpYL[O[M=zQ8[Hz_FnZF[`ISiHIY=N\9Nf?Lz:8]>1?09<!/L$*I%$EA?)GF&UW1Zv8=H4_A)F.0<(MC#>Q(6M-7?&]?"UL*4eL8D*QHJd<^nAGyP=SL?<(XE!Tv2RoHel46€SCB44b,2O5XJ'_z&;ZMS=Lf$^jGh|?sJ€žY«¤d©½rs¹šv›vhdSXlb5EŸO6dMAP+s="e†=bbMQEm?3R19L/AU0A^6@S/,M+:D!DZ%=a+?Y+:W59[.4Z.;W)FX'F])Hc/;_>5P.SQ'V}9duC[RGyP@g8?R,:G*0D$/6<BBP"H\(Af7Bc1PX5kw3`‰AGW?NV)9]-6O'5A ?K @K&,H)0A#DAGk/R_/jg5X}CQC?<T\/VG^†XGtK6bG.U8:;%K=$pU63C7F;>8#O,GH*:V=fF$b‹E`y>p~F‹˜TTfR[H0_^2Vg3Vd0nxI^O\o7}EC{YOZ2“H*•“LMŽ[Op2vi3x7{¼`I©dVj;…]7•žVd¼€’fr‘Tg€FVj9x^2Xj6Pu2ZKg‰Pk~@q^8«r?§Ó{jуeŽ^¬ŒT”“`‚uD•šQ£´x{· Ÿ€p‰s\ÍtO¨V;¿hL‘‡Q–¥{ ynŒaL[M¨kY¥uU‚xAº›cÄšx‡¸ƒ°{„pn‹hPuYC\@_H,dG*|X7Wg5bs=T—YN\8Se@dxB]x>Qn=8b5Ya1[s4l|2Im5IZ7JjERo=Ea*Qd+ƒa,SR*›N=ÊPmEX[3º›fesFRN-RS,ZJ,]L/€\7q‚Grr;•Œb°ÃŽqº=tBw€DÅÌ”÷¥‘Ù†‰²pƒ¬s}¤hxœNV€6jq4Wx+c4„MzLe’Hoƒ3ŽF„œUvU~}TІZoD>M.82.HODXuo™»°¯Ù¢æè§Ïð¤d£O™°kÖõÆéšÀÈ•Áè¢ÐŠ–k¶‹ À‹ƒše‘‹hÈÖ›µí‚„š\ˆqÊœp»¥kž†`ŒmJf‚FN\C_gF64&88*@M6VQCZ{U]¨UM‚EObBZwPQ€So€[˜”„Á¬–áw¢Zˆa‚™j—žb¢›V‹Xšc‘ŠdÄ“s—†šÆ©•È¡œÆŽ±€ƒ´“°wœ¤]ˆˆXnnTg`I‚|R~pNvf¤»’«è„`†JRO4NA*HC(EH7†…v¿ðÂåÿòÿÿáñú¶Èà ¹m~–bx™bV‚Ji’f|žj‹‘c‹¡k{“i†ž~”¹xŠFdP1iF7v\CuxUly\|zd‚‡cnmHlX=tOZn8[L0JV@yqZz›ae–^nƒLqpKt‡k{«bk°j’¸cÀ[wIkƒGdƒDZv1Nh1_~L{³n~Æum´dSzIs}`hdRŒP<d48E.NS6JjFH~`TŽaa•ok›„t§„vªr_—S]xX¬”o¥ `q‚MhjCWwAYvUquYccD[K<XL0JH7VfLvl^x‰sd‡\WeMXgJ^nNqmWuyds˜ˆ–Ò–ÇclŽM_‹EZv>V`8bP;LN:O[<Bn>Om@El<CeARo?VtFNsETj@Fl:BS/2L-2P7.Z<7W>HdAlpL‡|V|Œ^ˆ—gH@,EB*1@+0?*/?' 9=53DV:'q[-oŠDJŽ`@ePHF6QH/YP8IOA;KAB=164+;6)D;#@H01M1;5.19"/2!24!14D;I@ I<!XI)Ci5]a;gkA^yNHtRemCCl?EVH^T@‡X9W8g_EWVL’X?ŠnI…iX[cOVdSJTIWKG\N;aM<^j>MpKD^ATO6Vf9JJBb?=J*OM*IJ%;J$8I$;_*Lo9Gh>IU6_S-O„OL…J8uH7WBEJ.<P-.I,;;"Y@ \X..dC2>0IMHY;\P4J‡F5kU0@3KFPb+Lo:oj<=™^IQK7k23F4JH+ma,QœPJ^Me^)X‰Gf†d™X†¶w§ºvš¶t|œpY{V^]6@jPlT+K„,@fF2^,U6/p^*Z›]J‰L9]0D^,DX97H);F#:K$7C%;U/@a+9I%:> ;I&AY.8[18V-8X%C[&LX#9d3:T8XV+Sr4gyBTŒOGlN@j70[0+<%':)79@>; SX$Kx8:eBP\0Uo4Ks2Ag6A\1CE"8V-;C$;L&;E3J%3<NG&Rn7Kk7R]4^r8V‹MS‹M\ˆNp—`xo{¼}gº†P¤}NœoS‡kp}_HYON=,9I)33"G5>R,g\5X—Q]c4~Ip’ZD}RIK7KQ$E`-xg8mŠRZ}?_g7m~=Qs:M]4W[1Šl;L<bƒ:Ss<UW+€h+lŸQ_¥g[o<m?“¹l~ÀŠ^‡Y]CMg3Vp5]ƒ<]„Du–P^‘U]jANtNˆ{Oµj—§vvY›‘B“”UrF‹FÙ_DójMÔ›o«¾™…Á¦‰‘†ˆ†\¡’Yè‡U»•j‚“u‡‰i’aeJbwH‘…S’w^Ž˜pˆ‹_‡mK~sH}\UbMpMJ]7WW8PlLbc:e˜KW}MZyFYn7Sa6`c8I|FgOL¤RDg'@Q"cX'ixFOm>Mj/I`,Uj8J[?nbZ‹Ã†PmCea&uh76R59A#HV2Uf<SY:[]GluRq’gªÓ¡Ãúª…ÇrYžFu•N–¾c¦Âc›²c‡ª^ †P‹—Tsx3jx2[r7^~CmŒL‚®l‡Çr¬]Yx8f{9ˆ ]€»}³ŒlÎ…?R)KD7efRŒqXtSëuYÕzOð\Î…WhGš³s×ú¥ÿ÷›ãóš¼ô¢¼î®—ù£Ëâ¹Ëø¨¡¢u“´°Ð‹›Îzš¼yž²m½–R±™f–hp‚Om”Hdy;sp<ZX0m\>Œ‚jŒ™w˜›{Æt ¨c¿¨ª¯u³yžº}ï©€ÿ˜uófÈ•k¦—|‰›i˜[“{QšQ¢Š]¦m–Ÿa´¢‚É Ï–¤Ò— ÇŽ‰¨xˆ¨hˆ£hÁ¹l¨Ð€sŠbŠX†¦cªÈ„»å‰´äwÊyL}=9E6<ULL†‡È¶Æñº×ñªÌé¢Äñ¾Ÿî”˜`r…^o¥sl©lÅqŽ¿fx§Xy¯X‡’dŠ£h‡¢`ci:VI5`N;~jFy†a‰‹kŒ”t‘ž}z’f\vQqs\m‹SIuIc’]`”_†¤t޳hhšLiK“Œb¥»uׇšç}’Ù_t©Ab†7u„:Ls'=`-R{Jt®pÆd|®ZY‡YNez™vzhOj6WJ*K@9Vjkc§ˆk¢{lšwr¥v£Žz²„}®r]—XX}X’]tXRˆNVˆNX‰en•x‹hLyLVa:DS8_iD]``o‘ŠšdgkHMeCKcGRhN`wg}Ÿ€¢Ä‡—±aiH`FTj?S`HccRYqOZCQuDWP\‘T]’WQ€QPXVJDlINqIApD:gMHwdR¦gP•\LORrFJg@WqE{vOT@'JA-36)(6%3"!-#-/*1V? ml3c†QM…VAlQY]C:`BBE>;E:6<3).):+=7"L7+E>/'966&$* -& (85AB fJ%OL5a_3aq:sjD`zQXuWolEivFOyN:uTMUF|U-_[3[T@ˆY?^ZC^VIˆWB‚nOkqc\`]WZMcbASwENpL[lEbpEZ_F:l@8R8:I1/D(6<(1: M>(h[(QF4RIRCtR&a‡Ob†ST‰TSŠSDiG>K=6H*@B"QH'`d:/c=>:/H[3]BV9+^s24†W7MM?O&QT.^j9|ƒKR›TOj]:lB7K<BL%lX3LŸGDqOvw;v¢W…µ|Œ²zy˜mpƒKn‹B`\AVAmC,2u]NO1Sk#8q?9P,SL5pg9_‹T:Z>U4=X#+];-9(1:3M%JN)Fc,8h5*B)3<!AG"=N.6@)5B'=L<[$CX+Ad.8\/OX,Vh.bz<W†JArWBb90f1&E)*<*:*78=FT(\a2?‚FE`2HU+Mi(Kv@;e?<?(=R,FI+?M 7F'5B!4L%HT-Ww6Jv;Ne6b{@d™PhTbxAh]9yf4‰RzŒ[ƒpP”a—ÃwäŠZÊ‘U•~>tUA?2FJ3MZ8ssJT¤ZWM3ƒy9V…QkO4MlCEq6PV,‚W4R~DXa3^h4frBH^E`V,ee:_yEY2_ƒ7Gk4@J!VT!qm9uŒIX¯`fm>¡}H޽xvÃx•Y_ŠD`Š>mˆOmzEw“Rp¢Q„˜Z‹©jœ¨mÀj“¥nSfpgEroIo’DgwPhW<}_B›lMÏ`GÔtZ¶¤}·ÙžÙ°¨¥ŒÃ€[š†YŒ€a~|b[k?ºy]¦Î¡¾°xqŒ[]mKUY>b^GjU@lZLYvJV}PacKpkLrb:s{FS|KLP5HN2WI7``?`W5{o9_™J:i+8GFW%d`6^Z7Qf8Zl2esBd™r~›r“¡wP‡MCl3Kn?@`DImBh„GeJ__8dgL®r¥²[¸Éi¸Ëkm›RlRn§Q|žHx˜H¹rgŸY}Z:\—XBW-PY-Oa2pp1|…A¦•RšœL~†7S\+c\5‚ˆPš—[»«}¢›Y6C ^71phQo}c\ƒiWŒuX‹fƒ¡b†“]j|GŸŽY¹½p°»r¼Ò‰Å÷›Éöœ¼àƒÍºtÎÃs›wU®Â~–Í€¼o¤¸r¹Ï’Ìu¯p®Ù€w¸si¨b]gBW]5Z`7a]2¥d6Ê~B›|M†pK€sQʲi´…U°„Q³–cÒ‘xÇŒvž|moh™wr›’n‘–aˆ|Y‰|d»Œlµ‰s«šx‹‡bªqX¤‰b¨œpªµt£aƒ—b|”[³•]ÿÁv«\›…U•¼t¥½u••Vµµ‹å’pº…R·˜vرŸï ¶Äqª€K’{\±Å“Èí±¥ÎubzOZw]¯yŒÂl•´h’¶d•¾d„¶Wt•V~¢\p…UfXV€\bƒVe‰bt‘t}¤‹®•–» ‘¿Ž†©xt•h‡‹]fxJ€ˆbs¥[p˜]}›SlšDX„8`n4†yAŒŠP¥¤f™²Xwš@a:X+Jg=V+R^Bx…QwŒE_€Tqƒ|´‚n¦|Œªtv‹EWL+>8(?ILt†~y®rr¢f} €y±™Ä‰ƒžuy•aX†nm ƒŒÇ{e`c…N\Š_x•sˆ•v†Œ`VyLUkG_g?a_\”š´v…„V\qNKmJ=c@Kf_†¶–›Ýˆ‡¸`b™UdgY^Rahš}y´tn«SOy@[mOtkz©uh¡sh¡md—l]jX—s`¨hf¥k[—w½ƒÃjxœM^tKUeDRe@Q]3@7+G>(=>+/;/#8).2'33 A5XR)_e:moBYvMTqENpEJh@DS>1D1)7,83&G7"OB(9E0@C3"C0.'%)#0% @&X@'TK*:6&=;,KJ-LL+kR/bv>GiFeV:~u8ixI5gU>CAbM&US)aW7W]=wSHk[D‚fP’xXuj^_aNXcI`rAZhBewJ^…VQ~QRnFKK=:Q:7E7+G+(4$13C9ZD%eV/G@F|N~ZBaqHifEw‹IiSDŠWCjE9S7<A'PAFT/3Z:A@*MW5fDGG9ZX7O{B:iQ>L5EW+\W0wp9e’IX˜dC~N;YCFO.cl=`™On h¥cŒ±vr–{Yv]Lf=VU(`g$C€BVIE†W94€o>@5HL@w8IY3`j;cHarXGˆI8e:@P)1k1(N?9;&NV*Kh?@h4;W2)G&.97@3B)(6",47;>J J["Hr6=l;K^,Md)Zd3[†E?lMF<*6P'/X'.E& /`L['^wBW~F9o@>N$S^"L~?;c:BL(O^;;T8=R)1F$9I CQ(KN*\j6Ja9Vj/a=`z<P<Ge&FH(hZ+XsLQT)li3wY?‰lJ¥‚D®¤V•Þzjì¡f©efhfsQtiP` WDdJ‰k/G‰Pc=+V`0Gh.Me2\p?Mn<Sg5^j4ƒt9M‰RVY6[W4YW/Yk-Tp0@s65Q$LAVa6|c?s«Y]¢\pz=¥xE†½tqŸdc>ct5eb6fX/†o8m’IœY‘ž}‰¥q}–RJj›ex{ImŸ\†—Tr’euiIpY=mN5wQ6’sH }Hÿ‰Tÿ¡]Çÿã·ÿÿ¢þÑ¢Œi„zOy€]·‚oÿ’r±Šešd]a…^ux?wr7™Cjj7œhC_u]X|W_[Cd\1MNA[ACF0\<-S`JJA1SL4\y<<`,/R!INiT*i‚Gj»ge°cq£]Œ¥k‡¼‹ˆÅ‚Å…hí™lí mÇ•tÈ{e¡VpVl²zÂz‚Âgr‡Au‹9w†=fŠC‰Í}à„a‡Dko6•yGj¤Vab;w‚AIp:meE@j;ZG*ry5‹‘MqŒ>Wi7DH5RME[tG^C0£jVWU13N6]]Q‰ˆsµ‡o¡„}£…z§u‹¸mÁtc‰Np™L˜ŽQ¤¥dÎnÉÔr»Äl¦Äfºc•Âax·_¥¿xÁy¿nµi¸½u·ÅŽšÔ—£ì¡ˆÛ““ÑvŒ`ieMiQ8YNE`hOk’SbwIboM†…V³©e“W•€h¬•s¾›z㞀̨~Ф†¯¢¸ i’š\¤”_š^½˜_Ú˜dÑc¤rQwlHnkBd\=r\5qc>ojJlwXm‹l‘—j¦˜Y}h™¶t~˜KRjPŠ©”»ÿɳÿÔÁÿÃÃÙˆ›ZprDOnGMmUŽ«‘»ñ¡~^UO=f}U‘©c’¾fz«[ˆ©WŠšMtz@kŽYŒµdy“gЏ…~¼€x¬wožv}©„Ž»™˜Æ©¨Ìœ¦µ‡š°l„™S€vGon<aU8qjPc~OYc<Ub6_`1Pa,IX+HR&JK"_O*pq2]z5Ie*:X&7N&4F"=C#JZ.KkIt’d¡g‰¨c…š_‰‘VW‚HGc7LhFs…d…µw„Äns¬q¤x›”gl}kbŠg—€q—t“t’¯^c†FW|Tc‰hrŽq}ŠhuŒaX|PWrDTm^o˜’–¹„Š^iv]Sm^KnU>]Y–ƒ´Ü†“¾ff¢fp¦{¹}xµ€q‚€ªvz£be–MR{L_Y{‡a|Šg‚—t€žst¢y†³}‘³s„¤cošmŠ®}Œ¶ge‘HJf;K[Ele@K`6>:*E<)5?.+6(7=+1F+97)@<%JN(MZ0E_8O^8J]7Ia>=]><T91M46J/8H)GI(CI+DH,CK,.H(2I'.G&1G*=F,YG):M.FB,B;%4C)2F1>9'\V*7c4>D7WL&Tc'=d11K12F2PO0^W4UZ7eZ@ibPƒ_QˆpWok_\fU`pTZPciNqt@d~I`sX_~QVkLLR@>J91H7'A,'6".5>4<1 H1!`S#[t>s†LCxQ\]HouC^„JdpEQxD7xD,P7;A$Ea/1S5<;'ZG=`3E]=NP5VS1@f>AK7CZ+GS.cb-}‡?n°`O˜d@…c_Rn˜W}¢^|°o{‘keS`pRKnA>[;?b,VS&Sr-gtO—eJ.…n*98GC&In9Qd:[i@[v@OoHKi;1`9@P,E^,8qL]dPH^HKg<:k:4R/,K+,98?!.D$'*423C&1D%L=#Pa)K~<HrD=h3b`)WA2{M)73I4<k,%M; - &A/yd,EgAWk57‚<1T)SL A};@_0_P)vsE?zk=T42^99X0?g:IsLX|OL~RXz<OƒFXi=H‚:<k,@Y-_V.?c:HP.\P&aa>QH>[_;tX7§m6¸’T´ÊŒì²c¯ d\P{M<c}Y2M=IA-Ud/Ii1cj7R…DLP9PS,V^.la:fo>W€KFf?KV-Si+Z};C…M/M+E4![W0\Z<€}Ef©_eˆRc…I}>l¦jT›sRY6VX,Ye/u‰9d~C„v=”QxœYmŒLo|Eb„R|ƒR_˜K‡i=ƒ_B^eD`N?QNCoXHV†~K˜‚SÁ‘Tý‡Tÿ¤_ÿ阎¹ˆ”¶¢Žƒ³–l¢‹mß½ ~Ϧ‡Tuu=jc@ns=cj7]q6wa1zL$€b?WeH[^1cƒ@DfEJO?[S9qsXmN?NT=Ju<@\2:g.Fj+^p.‹€@™§]q?Œ‰\Ždª‚\‰»x³œ^ÌË‹Ýÿ¼¾ÿÇŸì¤nÂn|‘Gš‘GŒ£Mm—?W‘?O~5Wf%k^%µ¯fËuMˆ6cj0i=‡˜CRq?qr?_ŽG~’Jjk1KT.lhDŒƒUhzQ\oMxbHhQ7Q\EXJ>†sVCK6nqN„•mŽ n’Äšƒ¿Œ²‰³{’¿oœ²fv§ZxTtF”]ˆ“i•§_‚©YxEyxHzN—Z£b•€]ŠyUŽŒiŒ°p±Ã~¾ò³Àÿ¶¨íœ´ÙŒ Áx¾©€Šº‡•¡l‡{E¨|R{yY\ƒYr~V¥›]“—jÄŸuÓ£wÍ‚VÊtHÄtMÓ~ZÄ•nºj”šY›˜L›‡J¥Vš€V¾Žc‡~MzkDek7OX3EF/QD1iYI•…ɦ̜n¦~€°…Œ¾„j¥zhÊ›¨ö¹Úÿ¿Þö¼Ïå©“Ò‰e¢kZcf‘jl™o”¶|¸È‹}Áy,R6XVBv”dÎi‹¯W€–@t}:VqEg¦[·jp¤w™¾’”Å•†¯|§}…®”´•¦¸’˜³p’“`¡av=d`8gc8UY0\]?qyVPNFl<F[0WK'FB)>>&4G"8<!ZJ/~z;Yw2Gi-C_&=Y&1Q'9P'EZ0Tg4bY0kV9wf?skDs`?ZY>PoKki~»~ŒË{z³po©d_]X…ji–wl¡wq‘jm”`uVb“FS|L\ƒ^gnnl~‹gh•]U…ANjTx…‡–°ˆ„”le{d[pbVsZNo[cŒl˜¾n‹°`f“[w˜w~§tz©v|¦{~ªmv¤Vl†H`oBVX4RP6WSHk{cuœbu›kw•sˆ¢e}ŽQe‡_|¢g‹§dˆŸS_{INgEdlET^;6>-2</2;+6F(2C+1?',8%,7 =: >F">V/?S5G[5Lb<Hv<;iB1QB0:4/9)+6')/&--$4)-.90"A:$FC+<F/9=+3H+@H%AC%;K(,E-F:'1`59==/@%?:"JM!E`+Ld0Gc8?e;Z[?q]6biB}bT€lZ{k\a\weUm…]UŠaasTbnJckN^eG[~MBgFDL<7J/2J-(C.&0 =.<6"%3,71&JT&cf3l{?\ŠXXƒWYmRdrEL„BY]<Nt7;rDS`=?F0VI29,A:AO'BR1<\:BS5=Y.;H31N-EF,UM)ym9v§Plžak–he–`_qRztCW§V[…^Q†SZqTKi=@`7AT6Ig.eb0‚„F~rZ*fT>C6HR9Hk>=T.NQ(Xd-Ci@EU8Ba-MU2eg6†‹IO`NeIOrPCnN1`4/K./:!7A":'1)C<3G(:C&77P7Vf-NB=vKW_8a>@„P+U@NG+Hj3/b9!JD 3*O:N`&Fa4R`4Kf,<s@TD#@x8Nk6sF(©_.Aƒ_N_?Oo@WtHp{MkŒLb†NU‚E_|@HqDUa1O€6Kp+Ak?Md5JD.FS):f:Y<(MO-Gb?HJ9X@%vX1°pAÁ¤h‰è«|¼ª†‹rN©giiBX‡DYV4dw:W‘G]€LjxGHsS`Z<^d2f_7Zk?u_>T˜h@a@Sm2sw2Y™QAyVHcDQtCF`>hN.ys2i—BfŽ@m‚Q—„Vdº†N†[VhEs‚;a™DSi8„Hz„Vf{W{«jp˜YbuFv‰Jf‰EjoC]lPfnTwxU“nZe—¤d”¶r—ÃsÃy¿{ Kµ€?Ä€;ÿ˜L¯£l¿«‹øÙ½ÿÚ¶††fhlD~tD`q2aY;HS<R6)I?%M\/lr9Xn6Qe*_f8AvCOU>eZFjQ`J5SM2Uh<Ik:Xt6JxENuJflArDXo?zpQk”a~oQ}’X’^º×¡ÒýÅÆüÁ«õ½ì’qÇkÀtk¯_jÅmi«TR«V:Œ@9]#pZ,jm3P`2em8…_sš\ql:rˆHr•Z_‘_L?,H6"g*i8 RGuU@R<pa?`jAmB{©c_«\Œ¥j¥È™¤à©°í¯³ô·õ»ù¼”óÁ‹Æ”m’i^QHK2ŸRG®¥o„˜IqqIaYe¡`‚®q¹c‰p@N7ƒM>£–j”¨x©gÀ¹¿æ«Þ‘›Íu«¢d¬œ_ÆW§d9ymBƒ‹t€³Žvª€{•pq¬s„Ÿn€ d¢•_•¥m‘Ž^Ÿx[³‰Zš–U¦‡PœŠ_‹£h˜]€“YxIsfEXmL_d?dh>^V9QU7_cXŒ¡Š¨Êœ¸Ê¥ŸÓŸ£ì¥žî ¢â›µêœ¿Ý¢¿ÓŸµß¯²å¿²ä©Ñ“{Ä‚~³~½ƒŒ¸pxeQ¸ zZ¤fQoN}]©²Zs‘:W^&V\4^ZxÄzxºv‰³~£Ä¡È‹ˆ¥my‡cŒ›{Œ±}µ‡y˜WmpH…}Iew;cfAZ`6QM-ZS;geF{…UX‘GV`6JQ.J>0LK/BW6Eo=Dr3\w4ln+H]*DT/A[5@R//A/7836."E6&YD/NI2OD6FX=KhEh„`º„–Ñ|x´n}±eh‹]cˆ[c€WpYmŠ]z§\cOkŠKR†WXŽd]Œkn•rz˜lz‰Wg€EKjEd||’£}j•obbLi_VfZThQi{_’¬fªS_ˆTf^t”fr¤c{£j‰›Xw„QXq5GZ*=> /5 CC/Q]Djƒ[p›am˜`sPcESvGiRv~FhbC`J…xE€KYr< \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/lagrcv/test/pathdef.m b/SD-VBS/common/toolbox/lagrcv/test/pathdef.m new file mode 100755 index 0000000..7a33e83 --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/test/pathdef.m | |||
@@ -0,0 +1,284 @@ | |||
1 | function p = pathdef | ||
2 | %PATHDEF Search path defaults. | ||
3 | % PATHDEF returns a string that can be used as input to MATLABPATH | ||
4 | % in order to set the path. | ||
5 | |||
6 | |||
7 | % Copyright 1984-2002 The MathWorks, Inc. | ||
8 | % $Revision: 1.4.2.1 $ $Date: 2003/01/16 12:51:34 $ | ||
9 | |||
10 | |||
11 | % DO NOT MODIFY THIS FILE. IT IS AN AUTOGENERATED FILE. | ||
12 | % EDITING MAY CAUSE THE FILE TO BECOME UNREADABLE TO | ||
13 | % THE PATHTOOL AND THE INSTALLER. | ||
14 | |||
15 | p = [... | ||
16 | %%% BEGIN ENTRIES %%% | ||
17 | '/u/ikkjin/Benchmark:', ... | ||
18 | '/u/ikkjin/Benchmark/viola_jones/src/test:', ... | ||
19 | '/u/ikkjin/Benchmark/viola_jones/src/test/distrib:', ... | ||
20 | '/u/ikkjin/Benchmark/viola_jones/src/test/src:', ... | ||
21 | '/u/ikkjin/Benchmark/Toolbox:', ... | ||
22 | '/u/ikkjin/Benchmark/Toolbox/Gang:', ... | ||
23 | '/u/ikkjin/Benchmark/Toolbox/MultiNcut:', ... | ||
24 | '/u/ikkjin/Benchmark/Toolbox/MultiNcut3D:', ... | ||
25 | '/u/ikkjin/Benchmark/Toolbox/QihuiTool:', ... | ||
26 | '/u/ikkjin/Benchmark/Toolbox/QihuiTool/NNMF:', ... | ||
27 | '/u/ikkjin/Benchmark/Toolbox/QihuiTool/RGB2Lab:', ... | ||
28 | '/u/ikkjin/Benchmark/Toolbox/QihuiTool/SIFT_toolbox:', ... | ||
29 | '/u/ikkjin/Benchmark/Toolbox/QihuiTool/SIFT_toolbox/images:', ... | ||
30 | '/u/ikkjin/Benchmark/Toolbox/ShapeContext:', ... | ||
31 | '/u/ikkjin/Benchmark/Toolbox/ShapeContext/lap:', ... | ||
32 | '/u/ikkjin/Benchmark/Toolbox/ShapeContext/lap/CVS:', ... | ||
33 | '/u/ikkjin/Benchmark/Toolbox/ikkjin:', ... | ||
34 | '/u/ikkjin/Benchmark/Toolbox/interContourCutsAffine:', ... | ||
35 | '/u/ikkjin/Benchmark/Toolbox/interContourCutsAffine/source:', ... | ||
36 | '/u/ikkjin/Benchmark/Toolbox/lagrcv:', ... | ||
37 | '/u/ikkjin/Benchmark/Toolbox/lagrcv/test:', ... | ||
38 | '/u/ikkjin/Benchmark/Toolbox/lagrcv/test/result:', ... | ||
39 | '/u/ikkjin/Benchmark/Toolbox/textons:', ... | ||
40 | '/u/ikkjin/Benchmark/Toolbox/toolbox_basic:', ... | ||
41 | '/u/ikkjin/Benchmark/Toolbox/toolbox_basic/TOOLBOX_calib:', ... | ||
42 | '/u/ikkjin/Benchmark/Toolbox/toolbox_basic/affine:', ... | ||
43 | '/u/ikkjin/Benchmark/Toolbox/toolbox_basic/calib:', ... | ||
44 | '/u/ikkjin/Benchmark/Toolbox/toolbox_basic/calib/TOOLBOX_calib:', ... | ||
45 | '/u/ikkjin/Benchmark/Toolbox/toolbox_basic/calib_bouguetj:', ... | ||
46 | '/u/ikkjin/Benchmark/Toolbox/toolbox_basic/calib_bouguetj2:', ... | ||
47 | '/u/ikkjin/Benchmark/Toolbox/toolbox_basic/common:', ... | ||
48 | '/u/ikkjin/Benchmark/Toolbox/toolbox_basic/disp:', ... | ||
49 | '/u/ikkjin/Benchmark/Toolbox/toolbox_basic/fact:', ... | ||
50 | '/u/ikkjin/Benchmark/Toolbox/toolbox_basic/filter:', ... | ||
51 | '/u/ikkjin/Benchmark/Toolbox/toolbox_basic/filter_hist:', ... | ||
52 | '/u/ikkjin/Benchmark/Toolbox/toolbox_basic/filtersQuad:', ... | ||
53 | '/u/ikkjin/Benchmark/Toolbox/toolbox_basic/io:', ... | ||
54 | '/u/ikkjin/Benchmark/Toolbox/toolbox_basic/matching:', ... | ||
55 | '/u/ikkjin/Benchmark/Toolbox/toolbox_basic/matching/pub:', ... | ||
56 | '/u/ikkjin/Benchmark/Toolbox/toolbox_basic/matching/pub/contrib:', ... | ||
57 | '/u/ikkjin/Benchmark/Toolbox/toolbox_basic/matching/pub/contrib/v5:', ... | ||
58 | '/u/ikkjin/Benchmark/Toolbox/toolbox_basic/matching/pub/contrib/v5/optim:', ... | ||
59 | '/u/ikkjin/Benchmark/Toolbox/toolbox_basic/matching/pub/contrib/v5/optim/assignprob:', ... | ||
60 | '/u/ikkjin/Benchmark/Toolbox/toolbox_basic/ncut:', ... | ||
61 | '/u/ikkjin/Benchmark/Toolbox/toolbox_basic/pyramid:', ... | ||
62 | '/u/ikkjin/Benchmark/Toolbox/toolbox_basic/stella:', ... | ||
63 | '/u/ikkjin/Benchmark/Toolbox/toolbox_basic/tars:', ... | ||
64 | '/u/ikkjin/Benchmark/Toolbox/toolbox_basic/textons:', ... | ||
65 | '/u/ikkjin/Benchmark/color2gray:', ... | ||
66 | '/u/ikkjin/Benchmark/color2gray/src:', ... | ||
67 | '/u/ikkjin/Benchmark/color2gray/src/TestImages:', ... | ||
68 | '/u/ikkjin/Benchmark/color2gray/src/colorspaces:', ... | ||
69 | '/u/ikkjin/Benchmark/color2gray/src/helper:', ... | ||
70 | '/u/ikkjin/Benchmark/disparity:', ... | ||
71 | '/u/ikkjin/Benchmark/disparity/result:', ... | ||
72 | '/u/ikkjin/Benchmark/disparity/src:', ... | ||
73 | '/u/ikkjin/Benchmark/localization:', ... | ||
74 | '/u/ikkjin/Benchmark/localization/result:', ... | ||
75 | '/u/ikkjin/Benchmark/localization/src:', ... | ||
76 | '/u/ikkjin/Benchmark/registration:', ... | ||
77 | '/u/ikkjin/Benchmark/registration/result:', ... | ||
78 | '/u/ikkjin/Benchmark/registration/src:', ... | ||
79 | '/u/ikkjin/Benchmark/stitch:', ... | ||
80 | '/u/ikkjin/Benchmark/stitch/result:', ... | ||
81 | '/u/ikkjin/Benchmark/stitch/src:', ... | ||
82 | '/u/ikkjin/Benchmark/texture_synthesis:', ... | ||
83 | '/u/ikkjin/Benchmark/texture_synthesis/MEX:', ... | ||
84 | '/u/ikkjin/Benchmark/tracking:', ... | ||
85 | '/u/ikkjin/Benchmark/tracking/result:', ... | ||
86 | '/u/ikkjin/Benchmark/tracking/src:', ... | ||
87 | '/u/ikkjin/Benchmark/viola_jones:', ... | ||
88 | '/u/ikkjin/Benchmark/viola_jones/result:', ... | ||
89 | '/u/ikkjin/Benchmark/viola_jones/src:', ... | ||
90 | '/u/ikkjin/Benchmark/viola_jones/src/Additional Functions:', ... | ||
91 | '/u/ikkjin/Benchmark/viola_jones/src/Code:', ... | ||
92 | '/u/ikkjin/Benchmark/viola_jones/src/MatlabFaceDetect Files:', ... | ||
93 | matlabroot,'/toolbox/matlab/general:', ... | ||
94 | matlabroot,'/toolbox/matlab/ops:', ... | ||
95 | matlabroot,'/toolbox/matlab/lang:', ... | ||
96 | matlabroot,'/toolbox/matlab/elmat:', ... | ||
97 | matlabroot,'/toolbox/matlab/elfun:', ... | ||
98 | matlabroot,'/toolbox/matlab/specfun:', ... | ||
99 | matlabroot,'/toolbox/matlab/matfun:', ... | ||
100 | matlabroot,'/toolbox/matlab/datafun:', ... | ||
101 | matlabroot,'/toolbox/matlab/polyfun:', ... | ||
102 | matlabroot,'/toolbox/matlab/funfun:', ... | ||
103 | matlabroot,'/toolbox/matlab/sparfun:', ... | ||
104 | matlabroot,'/toolbox/matlab/scribe:', ... | ||
105 | matlabroot,'/toolbox/matlab/graph2d:', ... | ||
106 | matlabroot,'/toolbox/matlab/graph3d:', ... | ||
107 | matlabroot,'/toolbox/matlab/specgraph:', ... | ||
108 | matlabroot,'/toolbox/matlab/graphics:', ... | ||
109 | matlabroot,'/toolbox/matlab/uitools:', ... | ||
110 | matlabroot,'/toolbox/matlab/strfun:', ... | ||
111 | matlabroot,'/toolbox/matlab/imagesci:', ... | ||
112 | matlabroot,'/toolbox/matlab/iofun:', ... | ||
113 | matlabroot,'/toolbox/matlab/audiovideo:', ... | ||
114 | matlabroot,'/toolbox/matlab/timefun:', ... | ||
115 | matlabroot,'/toolbox/matlab/datatypes:', ... | ||
116 | matlabroot,'/toolbox/matlab/verctrl:', ... | ||
117 | matlabroot,'/toolbox/matlab/codetools:', ... | ||
118 | matlabroot,'/toolbox/matlab/helptools:', ... | ||
119 | matlabroot,'/toolbox/matlab/demos:', ... | ||
120 | matlabroot,'/toolbox/matlab/timeseries:', ... | ||
121 | matlabroot,'/toolbox/matlab/hds:', ... | ||
122 | matlabroot,'/toolbox/matlab/guide:', ... | ||
123 | matlabroot,'/toolbox/matlab/plottools:', ... | ||
124 | matlabroot,'/toolbox/local:', ... | ||
125 | matlabroot,'/toolbox/shared/controllib:', ... | ||
126 | matlabroot,'/toolbox/simulink/simulink:', ... | ||
127 | matlabroot,'/toolbox/simulink/blocks:', ... | ||
128 | matlabroot,'/toolbox/simulink/components:', ... | ||
129 | matlabroot,'/toolbox/simulink/fixedandfloat:', ... | ||
130 | matlabroot,'/toolbox/simulink/fixedandfloat/fxpdemos:', ... | ||
131 | matlabroot,'/toolbox/simulink/fixedandfloat/obsolete:', ... | ||
132 | matlabroot,'/toolbox/simulink/simdemos:', ... | ||
133 | matlabroot,'/toolbox/simulink/simdemos/aerospace:', ... | ||
134 | matlabroot,'/toolbox/simulink/simdemos/automotive:', ... | ||
135 | matlabroot,'/toolbox/simulink/simdemos/simfeatures:', ... | ||
136 | matlabroot,'/toolbox/simulink/simdemos/simgeneral:', ... | ||
137 | matlabroot,'/toolbox/simulink/dee:', ... | ||
138 | matlabroot,'/toolbox/shared/dastudio:', ... | ||
139 | matlabroot,'/toolbox/shared/glue:', ... | ||
140 | matlabroot,'/toolbox/stateflow/stateflow:', ... | ||
141 | matlabroot,'/toolbox/rtw/rtw:', ... | ||
142 | matlabroot,'/toolbox/simulink/simulink/modeladvisor:', ... | ||
143 | matlabroot,'/toolbox/simulink/simulink/modeladvisor/fixpt:', ... | ||
144 | matlabroot,'/toolbox/simulink/simulink/MPlayIO:', ... | ||
145 | matlabroot,'/toolbox/simulink/simulink/dataobjectwizard:', ... | ||
146 | matlabroot,'/toolbox/shared/fixedpointlib:', ... | ||
147 | matlabroot,'/toolbox/simulink/dataimportexport:', ... | ||
148 | matlabroot,'/toolbox/shared/hdlshared:', ... | ||
149 | matlabroot,'/toolbox/rtw/rtwdemos:', ... | ||
150 | matlabroot,'/toolbox/rtw/rtwdemos/rsimdemos:', ... | ||
151 | matlabroot,'/toolbox/rtw/targets/asap2/asap2:', ... | ||
152 | matlabroot,'/toolbox/rtw/targets/asap2/asap2/user:', ... | ||
153 | matlabroot,'/toolbox/rtw/targets/common/can/blocks:', ... | ||
154 | matlabroot,'/toolbox/rtw/targets/common/configuration/resource:', ... | ||
155 | matlabroot,'/toolbox/rtw/targets/common/tgtcommon:', ... | ||
156 | matlabroot,'/toolbox/stateflow/sfdemos:', ... | ||
157 | matlabroot,'/toolbox/stateflow/coder:', ... | ||
158 | matlabroot,'/toolbox/bioinfo/bioinfo:', ... | ||
159 | matlabroot,'/toolbox/bioinfo/biolearning:', ... | ||
160 | matlabroot,'/toolbox/bioinfo/microarray:', ... | ||
161 | matlabroot,'/toolbox/bioinfo/mass_spec:', ... | ||
162 | matlabroot,'/toolbox/bioinfo/proteins:', ... | ||
163 | matlabroot,'/toolbox/bioinfo/biomatrices:', ... | ||
164 | matlabroot,'/toolbox/bioinfo/biodemos:', ... | ||
165 | matlabroot,'/toolbox/bioinfo/graphtheory:', ... | ||
166 | matlabroot,'/toolbox/commblks/commblks:', ... | ||
167 | matlabroot,'/toolbox/commblks/commmasks:', ... | ||
168 | matlabroot,'/toolbox/commblks/commmex:', ... | ||
169 | matlabroot,'/toolbox/commblks/commblksdemos:', ... | ||
170 | matlabroot,'/toolbox/commblks/commblksobsolete/v3:', ... | ||
171 | matlabroot,'/toolbox/commblks/commblksobsolete/v2p5:', ... | ||
172 | matlabroot,'/toolbox/commblks/commblksobsolete/v2:', ... | ||
173 | matlabroot,'/toolbox/comm/comm:', ... | ||
174 | matlabroot,'/toolbox/comm/commdemos:', ... | ||
175 | matlabroot,'/toolbox/comm/commdemos/commdocdemos:', ... | ||
176 | matlabroot,'/toolbox/comm/commobsolete:', ... | ||
177 | matlabroot,'/toolbox/compiler:', ... | ||
178 | matlabroot,'/toolbox/control/control:', ... | ||
179 | matlabroot,'/toolbox/control/ctrlguis:', ... | ||
180 | matlabroot,'/toolbox/control/ctrlobsolete:', ... | ||
181 | matlabroot,'/toolbox/control/ctrlutil:', ... | ||
182 | matlabroot,'/toolbox/control/ctrldemos:', ... | ||
183 | matlabroot,'/toolbox/shared/slcontrollib:', ... | ||
184 | matlabroot,'/toolbox/curvefit/curvefit:', ... | ||
185 | matlabroot,'/toolbox/curvefit/cftoolgui:', ... | ||
186 | matlabroot,'/toolbox/shared/optimlib:', ... | ||
187 | matlabroot,'/toolbox/dspblks/dspblks:', ... | ||
188 | matlabroot,'/toolbox/dspblks/dspmasks:', ... | ||
189 | matlabroot,'/toolbox/dspblks/dspmex:', ... | ||
190 | matlabroot,'/toolbox/dspblks/dspdemos:', ... | ||
191 | matlabroot,'/toolbox/shared/filterdesignlib:', ... | ||
192 | matlabroot,'/toolbox/rtw/targets/ecoder:', ... | ||
193 | matlabroot,'/toolbox/rtw/targets/ecoder/ecoderdemos:', ... | ||
194 | matlabroot,'/toolbox/rtw/targets/mpt:', ... | ||
195 | matlabroot,'/toolbox/rtw/targets/mpt/mpt:', ... | ||
196 | matlabroot,'/toolbox/rtw/targets/mpt/user_specific:', ... | ||
197 | matlabroot,'/toolbox/fixedpoint/fixedpoint:', ... | ||
198 | matlabroot,'/toolbox/fixedpoint/fidemos:', ... | ||
199 | matlabroot,'/toolbox/fixedpoint/fimex:', ... | ||
200 | matlabroot,'/toolbox/fixpoint:', ... | ||
201 | matlabroot,'/toolbox/gads:', ... | ||
202 | matlabroot,'/toolbox/gads/gads:', ... | ||
203 | matlabroot,'/toolbox/gads/gadsdemos:', ... | ||
204 | matlabroot,'/toolbox/ident/ident:', ... | ||
205 | matlabroot,'/toolbox/ident/idobsolete:', ... | ||
206 | matlabroot,'/toolbox/ident/idguis:', ... | ||
207 | matlabroot,'/toolbox/ident/idutils:', ... | ||
208 | matlabroot,'/toolbox/ident/iddemos:', ... | ||
209 | matlabroot,'/toolbox/ident/idhelp:', ... | ||
210 | matlabroot,'/toolbox/images/images:', ... | ||
211 | matlabroot,'/toolbox/images/imuitools:', ... | ||
212 | matlabroot,'/toolbox/images/imdemos:', ... | ||
213 | matlabroot,'/toolbox/images/iptutils:', ... | ||
214 | matlabroot,'/toolbox/shared/imageslib:', ... | ||
215 | matlabroot,'/toolbox/images/medformats:', ... | ||
216 | matlabroot,'/toolbox/instrument/instrument:', ... | ||
217 | matlabroot,'/toolbox/instrument/instrumentdemos:', ... | ||
218 | matlabroot,'/toolbox/map/map:', ... | ||
219 | matlabroot,'/toolbox/map/mapdemos:', ... | ||
220 | matlabroot,'/toolbox/map/mapdisp:', ... | ||
221 | matlabroot,'/toolbox/map/mapformats:', ... | ||
222 | matlabroot,'/toolbox/map/mapproj:', ... | ||
223 | matlabroot,'/toolbox/shared/mapgeodesy:', ... | ||
224 | matlabroot,'/toolbox/slvnv/simcoverage:', ... | ||
225 | matlabroot,'/toolbox/nnet:', ... | ||
226 | matlabroot,'/toolbox/nnet/nncontrol:', ... | ||
227 | matlabroot,'/toolbox/nnet/nndemos:', ... | ||
228 | matlabroot,'/toolbox/nnet/nnet:', ... | ||
229 | matlabroot,'/toolbox/nnet/nnet/nnanalyze:', ... | ||
230 | matlabroot,'/toolbox/nnet/nnet/nncustom:', ... | ||
231 | matlabroot,'/toolbox/nnet/nnet/nndistance:', ... | ||
232 | matlabroot,'/toolbox/nnet/nnet/nnformat:', ... | ||
233 | matlabroot,'/toolbox/nnet/nnet/nninit:', ... | ||
234 | matlabroot,'/toolbox/nnet/nnet/nnlearn:', ... | ||
235 | matlabroot,'/toolbox/nnet/nnet/nnnetinput:', ... | ||
236 | matlabroot,'/toolbox/nnet/nnet/nnnetwork:', ... | ||
237 | matlabroot,'/toolbox/nnet/nnet/nnperformance:', ... | ||
238 | matlabroot,'/toolbox/nnet/nnet/nnplot:', ... | ||
239 | matlabroot,'/toolbox/nnet/nnet/nnprocess:', ... | ||
240 | matlabroot,'/toolbox/nnet/nnet/nnsearch:', ... | ||
241 | matlabroot,'/toolbox/nnet/nnet/nntopology:', ... | ||
242 | matlabroot,'/toolbox/nnet/nnet/nntrain:', ... | ||
243 | matlabroot,'/toolbox/nnet/nnet/nntransfer:', ... | ||
244 | matlabroot,'/toolbox/nnet/nnet/nnweight:', ... | ||
245 | matlabroot,'/toolbox/nnet/nnguis:', ... | ||
246 | matlabroot,'/toolbox/nnet/nnguis/nftool:', ... | ||
247 | matlabroot,'/toolbox/nnet/nnguis/nntool:', ... | ||
248 | matlabroot,'/toolbox/nnet/nnobsolete:', ... | ||
249 | matlabroot,'/toolbox/nnet/nnresource:', ... | ||
250 | matlabroot,'/toolbox/nnet/nnutils:', ... | ||
251 | matlabroot,'/toolbox/optim:', ... | ||
252 | matlabroot,'/toolbox/pde:', ... | ||
253 | matlabroot,'/toolbox/robust/robust:', ... | ||
254 | matlabroot,'/toolbox/robust/rctlmi:', ... | ||
255 | matlabroot,'/toolbox/robust/rctutil:', ... | ||
256 | matlabroot,'/toolbox/robust/rctdemos:', ... | ||
257 | matlabroot,'/toolbox/robust/rctobsolete/robust:', ... | ||
258 | matlabroot,'/toolbox/robust/rctobsolete/lmi:', ... | ||
259 | matlabroot,'/toolbox/robust/rctobsolete/mutools/commands:', ... | ||
260 | matlabroot,'/toolbox/robust/rctobsolete/mutools/subs:', ... | ||
261 | matlabroot,'/toolbox/signal/signal:', ... | ||
262 | matlabroot,'/toolbox/signal/sigtools:', ... | ||
263 | matlabroot,'/toolbox/signal/sptoolgui:', ... | ||
264 | matlabroot,'/toolbox/signal/sigdemos:', ... | ||
265 | matlabroot,'/toolbox/shared/spcuilib:', ... | ||
266 | matlabroot,'/toolbox/slcontrol/slcontrol:', ... | ||
267 | matlabroot,'/toolbox/slcontrol/slctrlguis:', ... | ||
268 | matlabroot,'/toolbox/slcontrol/slctrlutil:', ... | ||
269 | matlabroot,'/toolbox/slcontrol/slctrldemos:', ... | ||
270 | matlabroot,'/toolbox/splines:', ... | ||
271 | matlabroot,'/toolbox/stats:', ... | ||
272 | matlabroot,'/toolbox/vipblks/vipblks:', ... | ||
273 | matlabroot,'/toolbox/vipblks/vipmasks:', ... | ||
274 | matlabroot,'/toolbox/vipblks/vipmex:', ... | ||
275 | matlabroot,'/toolbox/vipblks/vipdemos:', ... | ||
276 | matlabroot,'/toolbox/wavelet/wavelet:', ... | ||
277 | matlabroot,'/toolbox/wavelet/wmultisig1d:', ... | ||
278 | matlabroot,'/toolbox/wavelet/wavedemo:', ... | ||
279 | matlabroot,'/work:', ... | ||
280 | %%% END ENTRIES %%% | ||
281 | ... | ||
282 | ]; | ||
283 | |||
284 | p = [userpath,p]; | ||
diff --git a/SD-VBS/common/toolbox/lagrcv/test/test_lk.m b/SD-VBS/common/toolbox/lagrcv/test/test_lk.m new file mode 100755 index 0000000..c6ca701 --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/test/test_lk.m | |||
@@ -0,0 +1,74 @@ | |||
1 | addpath ~/Matlab/Toolbox/lagrcv/ | ||
2 | addpath ~/Matlab/Toolbox/toolbox_basic/filter | ||
3 | addpath ~/Matlab/Toolbox/ikkjin/ | ||
4 | |||
5 | N_FEA=1600; | ||
6 | WINSZ=8; %size of sum-up window | ||
7 | NO_PYR=2; | ||
8 | SUPPRESION_RADIUS=10; | ||
9 | LK_ITER=20; | ||
10 | IMAGE_DIR='~/backup/Research/ant/Transport/' | ||
11 | filelist=dir(fullfile(IMAGE_DIR, '*.jpg')); | ||
12 | flen=length(filelist); | ||
13 | |||
14 | img_idx_cur=[1:flen]; | ||
15 | |||
16 | %subplot(1,2,1);imshow(Iprev) | ||
17 | %/hold on | ||
18 | %//scatter(features(2,:),features(1,:),'r') | ||
19 | %% | ||
20 | imgName=fullfile(IMAGE_DIR,filelist(img_idx_cur(1)).name); | ||
21 | Icur=imread(imgName); | ||
22 | Icur=rgb2gray(Icur); | ||
23 | Icur=calcImgBlurMex(double(Icur)); | ||
24 | %% | ||
25 | |||
26 | Jpyr=getPyramid(Icur, 2); | ||
27 | |||
28 | [lambda tr det c_xx c_xy c_yy] =calcTextureMex(double(Icur), WINSZ); | ||
29 | imgsz=size(lambda); | ||
30 | lambda([1:8 end-8:end],:)=0; | ||
31 | lambda(:,[1:8 end-8:end])=0; | ||
32 | [temp idx]=sort(lambda(:), 'descend'); | ||
33 | |||
34 | %% | ||
35 | featureIdx=idx(1:N_FEA); | ||
36 | features=zeros(3, N_FEA); | ||
37 | features(1,:)=ceil(featureIdx/imgsz(1)); | ||
38 | features(2,:)=featureIdx'-(features(1,:)-1)*imgsz(1); | ||
39 | features(3,:)=lambda(featureIdx); | ||
40 | |||
41 | imagesc(lambda); hold on | ||
42 | scatter(features(1,:), features(2,:), 'r+');hold off | ||
43 | %% | ||
44 | interestPnt=getANMS(features(1,:)', features(2,:)', features(3,:)', SUPPRESION_RADIUS); | ||
45 | interestPnt=interestPnt'; | ||
46 | scatter(interestPnt(1,:), interestPnt(2,:), 'g+') | ||
47 | %% | ||
48 | features=interestPnt(1:2,:); | ||
49 | %% | ||
50 | |||
51 | for iter=img_idx_cur | ||
52 | Iprev=Icur; | ||
53 | Icur=imread(fullfile(IMAGE_DIR,filelist(img_idx_cur(iter)).name)); | ||
54 | Icur=rgb2gray(Icur); | ||
55 | Icur=calcImgBlurMex(double(Icur)); | ||
56 | |||
57 | Ipyr=Jpyr; | ||
58 | Jpyr=getPyramid(Icur, 2); | ||
59 | |||
60 | [dxPyr dyPyr]=calcSobelPyrMex(Ipyr,2); | ||
61 | |||
62 | [lambda tr det c_xx c_xy c_yy] = calcTexturePyrMex(dxPyr, dyPyr, WINSZ, NO_PYR); | ||
63 | |||
64 | [newpoints status]=calcOptFlowLKPyrMex(Ipyr, dxPyr, dyPyr, Jpyr, double(features), 4, 0.03, LK_ITER, c_xx, c_xy, c_yy); | ||
65 | |||
66 | newpoints=newpoints(:,find(status)); | ||
67 | figure(1); | ||
68 | imagesc(Icur);colormap gray | ||
69 | hold on;scatter(newpoints(1,:), newpoints(2,:), 'r+'); hold off; | ||
70 | drawnow | ||
71 | %print('-djpeg', sprintf('result/result_%03d', iter)) | ||
72 | %pause | ||
73 | features=newpoints; | ||
74 | end | ||
diff --git a/SD-VBS/common/toolbox/lagrcv/test/test_lk_disp.m b/SD-VBS/common/toolbox/lagrcv/test/test_lk_disp.m new file mode 100755 index 0000000..2d55fe3 --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/test/test_lk_disp.m | |||
@@ -0,0 +1,49 @@ | |||
1 | addpath /u/ikkjin/Matlab/Toolbox/lagrcv | ||
2 | |||
3 | %Iprev=imread('/Projects/LAGR/logs/Test5/left_APIrun530-1/l24Aug05-abacination-1124876208.403311.ppm'); | ||
4 | %Icur=imread('/Projects/LAGR/logs/Test5/left_APIrun530-1/l24Aug05-abacination-1124876208.670013.ppm'); | ||
5 | Iprev=imread('img0.ppm'); | ||
6 | Icur=imread('img1.ppm'); | ||
7 | |||
8 | Iprev=rgb2gray(Iprev); | ||
9 | Icur=rgb2gray(Icur); | ||
10 | |||
11 | tic | ||
12 | [ features numvalid ] = goodFeaturesToTrack(Iprev, 0.3, 10); | ||
13 | toc | ||
14 | subplot(1,2,1);imshow(Iprev) | ||
15 | hold on | ||
16 | scatter(features(2,:),features(1,:),'r') | ||
17 | |||
18 | Ipyr=getPyramid(Iprev, 3); | ||
19 | Jpyr=getPyramid(Icur, 3); | ||
20 | tic | ||
21 | [dxPyr2 dyPyr2]=calcGradientPyrMex(Ipyr,3); | ||
22 | toc | ||
23 | tic | ||
24 | [dxPyr dyPyr]=calcSobelPyrMex(Ipyr,3); | ||
25 | toc | ||
26 | |||
27 | features=features(:,1:211); | ||
28 | for i=20 | ||
29 | features2=[features(2,:); features(1,:)]; | ||
30 | tic | ||
31 | [ newpoints status pyr1 ] = calcOpticalFlowPyrLK(Iprev,Icur,features, i); | ||
32 | toc | ||
33 | tic | ||
34 | [newpoints2 status]=calcOptFlowLKPyrMex(Ipyr, dxPyr, dyPyr, Jpyr, double(features2), 4, 0.03, i); | ||
35 | toc | ||
36 | newpoints2=[newpoints2(2,:); newpoints2(1,:)]; | ||
37 | features_out=features(:,find(status)); | ||
38 | newpoints=newpoints(:,find(status)); | ||
39 | newpoints2=newpoints2(:,find(status)); | ||
40 | subplot(1,2,1);imshow(Iprev);hold on | ||
41 | quiver(features_out(2,:),features_out(1,:), newpoints(2,:)-features_out(2,:), newpoints(1,:)-features_out(1,:),0,'r');hold off | ||
42 | subplot(1,2,2);imshow(Iprev);hold on | ||
43 | quiver(features_out(2,:),features_out(1,:), newpoints2(2,:)-features_out(2,:), newpoints2(1,:)-features_out(1,:),0,'r');hold off | ||
44 | %subplot(1,2,2);imshow(Icur);hold on | ||
45 | %scatter(newpoints2(2,:),newpoints2(1,:),'r');hold off | ||
46 | %sum(sum((newpoints-newpoints2).^2)) | ||
47 | |||
48 | pause | ||
49 | end | ||
diff --git a/SD-VBS/common/toolbox/lagrcv/test/test_lk_opencv.m b/SD-VBS/common/toolbox/lagrcv/test/test_lk_opencv.m new file mode 100755 index 0000000..9cfd1ae --- /dev/null +++ b/SD-VBS/common/toolbox/lagrcv/test/test_lk_opencv.m | |||
@@ -0,0 +1,47 @@ | |||
1 | addpath ~/Matlab/Toolbox/lagrcv/ | ||
2 | addpath ~/Matlab/Toolbox/toolbox_basic/filter | ||
3 | addpath ~/Matlab/Toolbox/ikkjin/ | ||
4 | |||
5 | IMAGE_DIR='/data/insecure/images/ants/Transport/' | ||
6 | filelist=dir(fullfile(IMAGE_DIR, '*.jpg')); | ||
7 | flen=length(filelist); | ||
8 | |||
9 | img_idx_cur=[1:flen]; | ||
10 | |||
11 | %subplot(1,2,1);imshow(Iprev) | ||
12 | %/hold on | ||
13 | %//scatter(features(2,:),features(1,:),'r') | ||
14 | %Iprev=imread(fullfile(IMAGE_DIR,filelist(img_idx_prev(1)).name)); | ||
15 | %% | ||
16 | imgName=fullfile(IMAGE_DIR,filelist(img_idx_cur(1)).name); | ||
17 | Icur=imread(imgName); | ||
18 | %% | ||
19 | Icur=smooth(double(rgb2gray(Icur)), 4); | ||
20 | %% | ||
21 | Icur=Icur(1:2:end,1:2:end); | ||
22 | |||
23 | [ features numvalid ] = goodFeaturesToTrack(Icur, 0.3, 10); | ||
24 | features=features(:,1:numvalid); | ||
25 | |||
26 | figure(1); | ||
27 | imagesc(Icur);colormap gray | ||
28 | hold on;scatter(features(2,:), features(1,:), 'r+'); hold off; | ||
29 | |||
30 | %% | ||
31 | for iter=img_idx_cur | ||
32 | Iprev=Icur; | ||
33 | Icur=imread(fullfile(IMAGE_DIR,filelist(img_idx_cur(iter)).name)); | ||
34 | Icur=calcImgBlurMex(rgb2gray(Icur)); | ||
35 | |||
36 | tic | ||
37 | [ newpoints status pyr1 ] = calcOpticalFlowPyrLK(Iprev,Icur,features); | ||
38 | toc | ||
39 | newpoints=newpoints(:,find(status)); | ||
40 | figure(1); | ||
41 | imagesc(Icur);colormap gray | ||
42 | hold on;scatter(newpoints(2,:), newpoints(1,:), 'r+'); hold off; | ||
43 | drawnow | ||
44 | print('-djpeg', sprintf('result/result_%03d', iter)) | ||
45 | %pause | ||
46 | features=newpoints; | ||
47 | end | ||
diff --git a/SD-VBS/common/toolbox/mex_template.c b/SD-VBS/common/toolbox/mex_template.c new file mode 100755 index 0000000..b85683f --- /dev/null +++ b/SD-VBS/common/toolbox/mex_template.c | |||
@@ -0,0 +1,58 @@ | |||
1 | //function W = mex_template(X,Y); | ||
2 | |||
3 | #include <math.h> | ||
4 | #include <mex.h> | ||
5 | //#include <matrix.h> | ||
6 | //#include "mex_util.cpp" | ||
7 | |||
8 | //#define PI 3.1415927 | ||
9 | |||
10 | void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray | ||
11 | *in[]) { | ||
12 | //reading in | ||
13 | const mxArray *X = in[0]; | ||
14 | double *pr = mxGetPr(X); | ||
15 | int *ir = mxGetIr(X); | ||
16 | int *jc = mxGetJc(X); | ||
17 | int m = mxGetM(X); | ||
18 | int n = mxGetN(X); | ||
19 | |||
20 | mxArray *cell_1 = mxGetCell(cell_input,0); | ||
21 | mxGetData() | ||
22 | mxGetNumberOfDimensions() | ||
23 | mxGetDimensions() | ||
24 | mxGetNumberOfElements() | ||
25 | |||
26 | //sparse array reading | ||
27 | int i,j,k; | ||
28 | double x; | ||
29 | for (j=0;j<n;j++) | ||
30 | for (k=jc[j]; k!=jc[j+1]; k++) { | ||
31 | i = ir[k]; | ||
32 | x = pr[k]; | ||
33 | //x = X(i,j); | ||
34 | } | ||
35 | |||
36 | //printing variables & debugging | ||
37 | int nnz = jc[n]; | ||
38 | mexPrintf("nnz = %d\n",nnz); | ||
39 | double z = 0.15; | ||
40 | mexPrintf("z = %1.3g \n",z); | ||
41 | mexErrMsgTxt("Stopped\n"); | ||
42 | |||
43 | //common functions | ||
44 | fabs(x) // absolute value of float x | ||
45 | |||
46 | //writing out | ||
47 | mxArray *W = mxCreateSparse(m, n, nnz, mxREAL); | ||
48 | |||
49 | |||
50 | mxArray *args[2]; | ||
51 | args[0] = (mxArray*) prhs[0]; | ||
52 | args[1] = mxCreateDoubleScalar(2.0); | ||
53 | mexCallMATLAB(1, plhs, 2, args, "sum"); | ||
54 | |||
55 | //allocating, desallocating | ||
56 | int *ind = (int*)mxCalloc(n,sizeof(int)); | ||
57 | mxFree(ind); | ||
58 | } \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/Distor2Calib.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/Distor2Calib.m new file mode 100755 index 0000000..a82f583 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/Distor2Calib.m | |||
@@ -0,0 +1,391 @@ | |||
1 | function [fc_2,Rc_2,Tc_2,H_2,distance,V_vert,V_hori,x_all_c,V_hori_pix,V_vert_pix,V_diag1_pix,V_diag2_pix]=Distor2Calib(k_dist,grid_pts_centered,n_sq_x,n_sq_y,Np,W,L,Xgrid_2,f_ini,N_iter,two_focal); | ||
2 | |||
3 | % Computes the calibration parameters knowing the | ||
4 | % distortion factor k_dist | ||
5 | |||
6 | % grid_pts_centered are the grid point coordinates after substraction of | ||
7 | % the optical center. | ||
8 | |||
9 | % can give an optional guess for the focal length f_ini (can set to []) | ||
10 | % can provide the number of iterations for the Iterative Vanishing Point Algorithm | ||
11 | |||
12 | % if the focal length is known perfectly, then, there is no need to iterate, | ||
13 | % and therefore, one can fix: N_iter = 0; | ||
14 | |||
15 | % California Institute of Technology | ||
16 | % (c) Jean-Yves Bouguet - October 7th, 1997 | ||
17 | |||
18 | |||
19 | |||
20 | %keyboard; | ||
21 | |||
22 | if exist('two_focal'), | ||
23 | if isempty(two_focal), | ||
24 | two_focal=0; | ||
25 | end; | ||
26 | else | ||
27 | two_focal = 0; | ||
28 | end; | ||
29 | |||
30 | |||
31 | if exist('N_iter'), | ||
32 | if ~isempty(N_iter), | ||
33 | disp('Use number of iterations provided'); | ||
34 | else | ||
35 | N_iter = 10; | ||
36 | end; | ||
37 | else | ||
38 | N_iter = 10; | ||
39 | end; | ||
40 | |||
41 | if exist('f_ini'), | ||
42 | if ~isempty(f_ini), | ||
43 | disp('Use focal provided'); | ||
44 | if length(f_ini)<2, f_ini=[f_ini;f_ini]; end; | ||
45 | fc_2 = f_ini; | ||
46 | x_all_c = [grid_pts_centered(1,:)/fc_2(1);grid_pts_centered(2,:)/fc_2(2)]; | ||
47 | x_all_c = comp_distortion(x_all_c,k_dist); % we can this time!!! | ||
48 | else | ||
49 | fc_2 = [1;1]; | ||
50 | x_all_c = grid_pts_centered; | ||
51 | end; | ||
52 | else | ||
53 | fc_2 = [1;1]; | ||
54 | x_all_c = grid_pts_centered; | ||
55 | end; | ||
56 | |||
57 | |||
58 | dX = W/n_sq_x; | ||
59 | dY = L/n_sq_y; | ||
60 | |||
61 | |||
62 | N_x = n_sq_x+1; | ||
63 | N_y = n_sq_y+1; | ||
64 | |||
65 | |||
66 | x_grid = zeros(N_x,N_y); | ||
67 | y_grid = zeros(N_x,N_y); | ||
68 | |||
69 | |||
70 | |||
71 | |||
72 | |||
73 | %%% Computation of the four vanishing points in pixels | ||
74 | |||
75 | |||
76 | x_grid(:) = grid_pts_centered(1,:); | ||
77 | y_grid(:) = grid_pts_centered(2,:); | ||
78 | |||
79 | for k=1:n_sq_x+1, | ||
80 | [U,S,V] = svd([x_grid(k,:);y_grid(k,:);ones(1,n_sq_y+1)]); | ||
81 | vert(:,k) = U(:,3); | ||
82 | end; | ||
83 | |||
84 | for k=1:n_sq_y+1, | ||
85 | [U,S,V] = svd([x_grid(:,k)';y_grid(:,k)';ones(1,n_sq_x+1)]); | ||
86 | hori(:,k) = U(:,3); | ||
87 | end; | ||
88 | |||
89 | % 2 principle Vanishing points: | ||
90 | [U,S,V] = svd(vert); | ||
91 | V_vert = U(:,3); | ||
92 | [U,S,V] = svd(hori); | ||
93 | V_hori = U(:,3); | ||
94 | |||
95 | |||
96 | |||
97 | % Square warping: | ||
98 | |||
99 | |||
100 | vert_first = vert(:,1) - dot(V_vert,vert(:,1))/dot(V_vert,V_vert) * V_vert; | ||
101 | vert_last = vert(:,n_sq_x+1) - dot(V_vert,vert(:,n_sq_x+1))/dot(V_vert,V_vert) * V_vert; | ||
102 | |||
103 | hori_first = hori(:,1) - dot(V_hori,hori(:,1))/dot(V_hori,V_hori) * V_hori; | ||
104 | hori_last = hori(:,n_sq_y+1) - dot(V_hori,hori(:,n_sq_y+1))/dot(V_hori,V_hori) * V_hori; | ||
105 | |||
106 | |||
107 | x1 = cross(hori_first,vert_first); | ||
108 | x2 = cross(hori_first,vert_last); | ||
109 | x3 = cross(hori_last,vert_last); | ||
110 | x4 = cross(hori_last,vert_first); | ||
111 | |||
112 | x1 = x1/x1(3); | ||
113 | x2 = x2/x2(3); | ||
114 | x3 = x3/x3(3); | ||
115 | x4 = x4/x4(3); | ||
116 | |||
117 | |||
118 | |||
119 | [square] = Rectangle2Square([x1 x2 x3 x4],W,L); | ||
120 | |||
121 | y1 = square(:,1); | ||
122 | y2 = square(:,2); | ||
123 | y3 = square(:,3); | ||
124 | y4 = square(:,4); | ||
125 | |||
126 | H2 = cross(V_vert,V_hori); | ||
127 | |||
128 | V_diag1 = cross(cross(y1,y3),H2); | ||
129 | V_diag2 = cross(cross(y2,y4),H2); | ||
130 | |||
131 | V_diag1 = V_diag1 / norm(V_diag1); | ||
132 | V_diag2 = V_diag2 / norm(V_diag2); | ||
133 | |||
134 | V_hori_pix = V_hori; | ||
135 | V_vert_pix = V_vert; | ||
136 | V_diag1_pix = V_diag1; | ||
137 | V_diag2_pix = V_diag2; | ||
138 | |||
139 | |||
140 | % end of computation of the vanishing points in pixels. | ||
141 | |||
142 | |||
143 | |||
144 | |||
145 | |||
146 | |||
147 | |||
148 | |||
149 | if two_focal, % only if we attempt to estimate two focals... | ||
150 | % Use diagonal lines also to add two extra vanishing points (?) | ||
151 | N_min = min(N_x,N_y); | ||
152 | |||
153 | if N_min < 2, | ||
154 | use_diag = 0; | ||
155 | two_focal = 0; | ||
156 | disp('Cannot estimate two focals (no existing diagonals)'); | ||
157 | else | ||
158 | use_diag = 1; | ||
159 | Delta_N = abs(N_x-N_y); | ||
160 | N_extra = round((N_min - Delta_N - 1)/2); | ||
161 | diag_list = -N_extra:Delta_N+N_extra; | ||
162 | N_diag = length(diag_list); | ||
163 | diag_1 = zeros(3,N_diag); | ||
164 | diag_2 = zeros(3,N_diag); | ||
165 | end; | ||
166 | else | ||
167 | % Give up the use of the diagonals (so far) | ||
168 | % it seems that the error is increased | ||
169 | use_diag = 0; | ||
170 | end; | ||
171 | |||
172 | |||
173 | |||
174 | % The vertical lines: vert, Horizontal lines: hori | ||
175 | vert = zeros(3,n_sq_x+1); | ||
176 | hori = zeros(3,n_sq_y+1); | ||
177 | |||
178 | for counter_k = 1:N_iter, % the Iterative Vanishing Points Algorithm to | ||
179 | % estimate the focal length accurately | ||
180 | |||
181 | x_grid(:) = x_all_c(1,:); | ||
182 | y_grid(:) = x_all_c(2,:); | ||
183 | |||
184 | for k=1:n_sq_x+1, | ||
185 | [U,S,V] = svd([x_grid(k,:);y_grid(k,:);ones(1,n_sq_y+1)]); | ||
186 | vert(:,k) = U(:,3); | ||
187 | end; | ||
188 | |||
189 | for k=1:n_sq_y+1, | ||
190 | [U,S,V] = svd([x_grid(:,k)';y_grid(:,k)';ones(1,n_sq_x+1)]); | ||
191 | hori(:,k) = U(:,3); | ||
192 | end; | ||
193 | |||
194 | % 2 principle Vanishing points: | ||
195 | [U,S,V] = svd(vert); | ||
196 | V_vert = U(:,3); | ||
197 | [U,S,V] = svd(hori); | ||
198 | V_hori = U(:,3); | ||
199 | |||
200 | |||
201 | |||
202 | % Square warping: | ||
203 | |||
204 | |||
205 | vert_first = vert(:,1) - dot(V_vert,vert(:,1))/dot(V_vert,V_vert) * V_vert; | ||
206 | vert_last = vert(:,n_sq_x+1) - dot(V_vert,vert(:,n_sq_x+1))/dot(V_vert,V_vert) * V_vert; | ||
207 | |||
208 | hori_first = hori(:,1) - dot(V_hori,hori(:,1))/dot(V_hori,V_hori) * V_hori; | ||
209 | hori_last = hori(:,n_sq_y+1) - dot(V_hori,hori(:,n_sq_y+1))/dot(V_hori,V_hori) * V_hori; | ||
210 | |||
211 | |||
212 | x1 = cross(hori_first,vert_first); | ||
213 | x2 = cross(hori_first,vert_last); | ||
214 | x3 = cross(hori_last,vert_last); | ||
215 | x4 = cross(hori_last,vert_first); | ||
216 | |||
217 | x1 = x1/x1(3); | ||
218 | x2 = x2/x2(3); | ||
219 | x3 = x3/x3(3); | ||
220 | x4 = x4/x4(3); | ||
221 | |||
222 | |||
223 | |||
224 | [square] = Rectangle2Square([x1 x2 x3 x4],W,L); | ||
225 | |||
226 | y1 = square(:,1); | ||
227 | y2 = square(:,2); | ||
228 | y3 = square(:,3); | ||
229 | y4 = square(:,4); | ||
230 | |||
231 | H2 = cross(V_vert,V_hori); | ||
232 | |||
233 | V_diag1 = cross(cross(y1,y3),H2); | ||
234 | V_diag2 = cross(cross(y2,y4),H2); | ||
235 | |||
236 | V_diag1 = V_diag1 / norm(V_diag1); | ||
237 | V_diag2 = V_diag2 / norm(V_diag2); | ||
238 | |||
239 | |||
240 | |||
241 | |||
242 | % Estimation of the focal length, and normalization: | ||
243 | |||
244 | % Compute the ellipsis of (1/f^2) positions: | ||
245 | % a * (1/fx)^2 + b * (1/fx)^2 = -c | ||
246 | |||
247 | |||
248 | a1 = V_hori(1); | ||
249 | b1 = V_hori(2); | ||
250 | c1 = V_hori(3); | ||
251 | |||
252 | a2 = V_vert(1); | ||
253 | b2 = V_vert(2); | ||
254 | c2 = V_vert(3); | ||
255 | |||
256 | a3 = V_diag1(1); | ||
257 | b3 = V_diag1(2); | ||
258 | c3 = V_diag1(3); | ||
259 | |||
260 | a4 = V_diag2(1); | ||
261 | b4 = V_diag2(2); | ||
262 | c4 = V_diag2(3); | ||
263 | |||
264 | |||
265 | if two_focal, | ||
266 | |||
267 | |||
268 | A = [a1*a2 b1*b2;a3*a4 b3*b4]; | ||
269 | b = -[c1*c2;c3*c4]; | ||
270 | |||
271 | f = sqrt(abs(1./(inv(A)*b))); | ||
272 | |||
273 | else | ||
274 | |||
275 | f = sqrt(abs(-(c1*c2*(a1*a2 + b1*b2) + c3*c4*(a3*a4 + b3*b4))/(c1^2*c2^2 + c3^2*c4^2))); | ||
276 | |||
277 | f = [f;f]; | ||
278 | |||
279 | end; | ||
280 | |||
281 | |||
282 | |||
283 | % REMARK: | ||
284 | % if both a and b are small, the calibration is impossible. | ||
285 | % if one of them is small, only the other focal length is observable | ||
286 | % if none is small, both focals are observable | ||
287 | |||
288 | |||
289 | fc_2 = fc_2 .* f; | ||
290 | |||
291 | |||
292 | % DEBUG PART: fix focal to 500... | ||
293 | %fc_2= [500;500]; disp('Line 293 to be earased in Distor2Calib.m'); | ||
294 | |||
295 | |||
296 | % end of focal compensation | ||
297 | |||
298 | % normalize by the current focal: | ||
299 | |||
300 | x_all = [grid_pts_centered(1,:)/fc_2(1);grid_pts_centered(2,:)/fc_2(2)]; | ||
301 | |||
302 | % Compensate by the distortion factor: | ||
303 | |||
304 | x_all_c = comp_distortion(x_all,k_dist); | ||
305 | |||
306 | end; | ||
307 | |||
308 | % At that point, we hope that the distortion is gone... | ||
309 | |||
310 | x_grid(:) = x_all_c(1,:); | ||
311 | y_grid(:) = x_all_c(2,:); | ||
312 | |||
313 | for k=1:n_sq_x+1, | ||
314 | [U,S,V] = svd([x_grid(k,:);y_grid(k,:);ones(1,n_sq_y+1)]); | ||
315 | vert(:,k) = U(:,3); | ||
316 | end; | ||
317 | |||
318 | for k=1:n_sq_y+1, | ||
319 | [U,S,V] = svd([x_grid(:,k)';y_grid(:,k)';ones(1,n_sq_x+1)]); | ||
320 | hori(:,k) = U(:,3); | ||
321 | end; | ||
322 | |||
323 | % Vanishing points: | ||
324 | [U,S,V] = svd(vert); | ||
325 | V_vert = U(:,3); | ||
326 | [U,S,V] = svd(hori); | ||
327 | V_hori = U(:,3); | ||
328 | |||
329 | % Horizon: | ||
330 | |||
331 | H_2 = cross(V_vert,V_hori); | ||
332 | |||
333 | % H_2 = cross(V_vert,V_hori); | ||
334 | |||
335 | % pick a plane in front of the camera (positive depth) | ||
336 | if H_2(3) < 0, H_2 = -H_2; end; | ||
337 | |||
338 | |||
339 | % Rotation matrix: | ||
340 | |||
341 | if V_hori(1) < 0, V_hori = -V_hori; end; | ||
342 | |||
343 | V_hori = V_hori/norm(V_hori); | ||
344 | H_2 = H_2/norm(H_2); | ||
345 | |||
346 | V_hori = V_hori - dot(V_hori,H_2)*H_2; | ||
347 | |||
348 | Rc_2 = [V_hori cross(H_2,V_hori) H_2]; | ||
349 | |||
350 | Rc_2 = Rc_2 / det(Rc_2); | ||
351 | |||
352 | %omc_2 = rodrigues(Rc_2); | ||
353 | |||
354 | %Rc_2 = rodrigues(omc_2); | ||
355 | |||
356 | % Find the distance of the plane for translation vector: | ||
357 | |||
358 | xc_2 = [x_all_c;ones(1,Np)]; | ||
359 | |||
360 | Zc_2 = 1./sum(xc_2 .* (Rc_2(:,3)*ones(1,Np))); | ||
361 | |||
362 | Xo_2 = [sum(xc_2 .* (Rc_2(:,1)*ones(1,Np))).*Zc_2 ; sum(xc_2 .* (Rc_2(:,2)*ones(1,Np))).*Zc_2]; | ||
363 | |||
364 | XXo_2 = Xo_2 - mean(Xo_2')'*ones(1,Np); | ||
365 | |||
366 | distance_x = norm(Xgrid_2(1,:))/norm(XXo_2(1,:)); | ||
367 | distance_y = norm(Xgrid_2(2,:))/norm(XXo_2(2,:)); | ||
368 | |||
369 | |||
370 | distance = sum(sum(XXo_2(1:2,:).*Xgrid_2(1:2,:)))/sum(sum(XXo_2(1:2,:).^2)); | ||
371 | |||
372 | alpha = abs(distance_x - distance_y)/distance; | ||
373 | |||
374 | if (alpha>0.1)&~two_focal, | ||
375 | disp('Should use two focals in x and y...'); | ||
376 | end; | ||
377 | |||
378 | % Deduce the translation vector: | ||
379 | |||
380 | Tc_2 = distance * H_2; | ||
381 | |||
382 | |||
383 | |||
384 | |||
385 | |||
386 | return; | ||
387 | |||
388 | V_hori_pix/V_hori_pix(3) | ||
389 | V_vert_pix/V_vert_pix(3) | ||
390 | V_diag1_pix/V_diag1_pix(3) | ||
391 | V_diag2_pix/V_diag2_pix(3) | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/Rectangle2Square.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/Rectangle2Square.m new file mode 100755 index 0000000..a6bbbe5 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/Rectangle2Square.m | |||
@@ -0,0 +1,19 @@ | |||
1 | function [square] = Rectangle2Square(rectangle,L,W); | ||
2 | |||
3 | % Generate the square from a rectangle of known segment lengths | ||
4 | % from pt1 to pt2 : L | ||
5 | % from pt2 to pt3 : W | ||
6 | |||
7 | [u_hori,u_vert] = UnWarpPlane(rectangle); | ||
8 | |||
9 | coeff_x = sqrt(W/L); | ||
10 | coeff_y = 1/coeff_x; | ||
11 | |||
12 | x_coord = [ 0 coeff_x coeff_x 0]; | ||
13 | y_coord = [ 0 0 coeff_y coeff_y]; | ||
14 | |||
15 | |||
16 | square = rectangle(:,1) * ones(1,4) + u_hori*x_coord + u_vert*y_coord; | ||
17 | square = square ./ (ones(3,1)*square(3,:)); | ||
18 | |||
19 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/UnWarpPlane.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/UnWarpPlane.m new file mode 100755 index 0000000..8addf52 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/UnWarpPlane.m | |||
@@ -0,0 +1,54 @@ | |||
1 | function [u_hori,u_vert] = UnWarpPlane(x1,x2,x3,x4); | ||
2 | |||
3 | % Recovers the two 3D directions of the rectangular patch x1x2x3x4 | ||
4 | % x1 is the origin point, ie any point of planar coordinate (x,y) on the | ||
5 | % rectangular patch will be projected on the image plane at: | ||
6 | % x1 + x * u_hori + y * u_vert | ||
7 | % | ||
8 | % Note: u_hori and u_vert are also the two vanishing points. | ||
9 | |||
10 | |||
11 | if nargin < 4, | ||
12 | |||
13 | x4 = x1(:,4); | ||
14 | x3 = x1(:,3); | ||
15 | x2 = x1(:,2); | ||
16 | x1 = x1(:,1); | ||
17 | |||
18 | end; | ||
19 | |||
20 | |||
21 | % Image Projection: | ||
22 | L1 = cross(x1,x2); | ||
23 | L2 = cross(x4,x3); | ||
24 | L3 = cross(x2,x3); | ||
25 | L4 = cross(x1,x4); | ||
26 | |||
27 | % Vanishing point: | ||
28 | V1 = cross(L1,L2); | ||
29 | V2 = cross(L3,L4); | ||
30 | |||
31 | % Horizon line: | ||
32 | H = cross(V1,V2); | ||
33 | |||
34 | if H(3) < 0, H = -H; end; | ||
35 | |||
36 | |||
37 | H = H / norm(H); | ||
38 | |||
39 | |||
40 | X1 = x1 / dot(H,x1); | ||
41 | X2 = x2 / dot(H,x2); | ||
42 | X3 = x3 / dot(H,x3); | ||
43 | X4 = x4 / dot(H,x4); | ||
44 | |||
45 | scale = X1(3); | ||
46 | |||
47 | X1 = X1/scale; | ||
48 | X2 = X2/scale; | ||
49 | X3 = X3/scale; | ||
50 | X4 = X4/scale; | ||
51 | |||
52 | |||
53 | u_hori = X2 - X1; | ||
54 | u_vert = X4 - X1; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/add_suppress.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/add_suppress.m new file mode 100755 index 0000000..a8a32c0 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/add_suppress.m | |||
@@ -0,0 +1,98 @@ | |||
1 | |||
2 | if ~exist('n_ima'), | ||
3 | fprintf(1,'No data to process.\n'); | ||
4 | return; | ||
5 | end; | ||
6 | |||
7 | |||
8 | check_active_images; | ||
9 | |||
10 | |||
11 | fprintf(1,'\nThis function is useful to select a subset of images to calibrate\n'); | ||
12 | |||
13 | fprintf(1,'\nThere are currently %d active images selected for calibration (out of %d):\n',length(ind_active),n_ima); | ||
14 | |||
15 | if ~isempty(ind_active), | ||
16 | |||
17 | for ii = 1:length(ind_active)-2, | ||
18 | |||
19 | fprintf(1,'%d, ',ind_active(ii)); | ||
20 | |||
21 | end; | ||
22 | |||
23 | fprintf(1,'%d and %d.',ind_active(end-1),ind_active(end)); | ||
24 | |||
25 | end; | ||
26 | |||
27 | fprintf(1,'\n'); | ||
28 | |||
29 | |||
30 | fprintf(1,'\nDo you want to suppress or add images from that list?\n'); | ||
31 | |||
32 | choice = 2; | ||
33 | |||
34 | while (choice~=0)&(choice~=1), | ||
35 | choice = input('For suppressing images enter 0, for adding images enter 1 ([]=no change): '); | ||
36 | if isempty(choice), | ||
37 | fprintf(1,'No change applied to the list of active images.\n'); | ||
38 | return; | ||
39 | end; | ||
40 | if (choice~=0)&(choice~=1), | ||
41 | disp('Bad entry. Try again.'); | ||
42 | end; | ||
43 | end; | ||
44 | |||
45 | |||
46 | if choice, | ||
47 | |||
48 | ima_numbers = input('Number(s) of image(s) to add ([] = all images) = '); | ||
49 | |||
50 | if isempty(ima_numbers), | ||
51 | fprintf(1,'All %d images are now active\n',n_ima); | ||
52 | ima_proc = 1:n_ima; | ||
53 | else | ||
54 | ima_proc = ima_numbers; | ||
55 | end; | ||
56 | |||
57 | else | ||
58 | |||
59 | |||
60 | ima_numbers = input('Number(s) of image(s) to suppress ([] = no image) = '); | ||
61 | |||
62 | if isempty(ima_numbers), | ||
63 | fprintf(1,'No image has been suppressed. No modication of the list of active images.\n',n_ima); | ||
64 | ima_proc = []; | ||
65 | else | ||
66 | ima_proc = ima_numbers; | ||
67 | end; | ||
68 | |||
69 | end; | ||
70 | |||
71 | if ~isempty(ima_proc), | ||
72 | |||
73 | active_images(ima_proc) = choice * ones(1,length(ima_proc)); | ||
74 | |||
75 | end; | ||
76 | |||
77 | |||
78 | check_active_images; | ||
79 | |||
80 | |||
81 | fprintf(1,'\nThere is now a total of %d active images for calibration:\n',length(ind_active)); | ||
82 | |||
83 | if ~isempty(ind_active), | ||
84 | |||
85 | for ii = 1:length(ind_active)-2, | ||
86 | |||
87 | fprintf(1,'%d, ',ind_active(ii)); | ||
88 | |||
89 | end; | ||
90 | |||
91 | fprintf(1,'%d and %d.',ind_active(end-1),ind_active(end)); | ||
92 | |||
93 | end; | ||
94 | |||
95 | fprintf(1,'\n\nYou may now run ''Calibration'' to recalibrate based on this new set of images.\n'); | ||
96 | |||
97 | |||
98 | \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/analyse_error.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/analyse_error.m new file mode 100755 index 0000000..7a9cf0f --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/analyse_error.m | |||
@@ -0,0 +1,141 @@ | |||
1 | % Color code for each image: | ||
2 | |||
3 | if ~exist('n_ima')|~exist('fc'), | ||
4 | fprintf(1,'No calibration data available.\n'); | ||
5 | return; | ||
6 | end; | ||
7 | |||
8 | check_active_images; | ||
9 | |||
10 | if ~exist(['ex_' num2str(ind_active(1)) ]), | ||
11 | fprintf(1,'Need to calibrate before analysing reprojection error. Maybe need to load Calib_Results.mat file.\n'); | ||
12 | return; | ||
13 | end; | ||
14 | |||
15 | |||
16 | %if ~exist('no_grid'), | ||
17 | no_grid = 0; | ||
18 | %end; | ||
19 | |||
20 | colors = 'brgkcm'; | ||
21 | |||
22 | |||
23 | figure(5); | ||
24 | |||
25 | for kk = 1:n_ima, | ||
26 | if exist(['y_' num2str(kk)]), | ||
27 | if active_images(kk) & eval(['~isnan(y_' num2str(kk) '(1,1))']), | ||
28 | |||
29 | if ~no_grid, | ||
30 | eval(['XX_kk = X_' num2str(kk) ';']); | ||
31 | N_kk = size(XX_kk,2); | ||
32 | |||
33 | if ~exist(['n_sq_x_' num2str(kk)]), | ||
34 | no_grid = 1; | ||
35 | end; | ||
36 | |||
37 | if ~no_grid, | ||
38 | eval(['n_sq_x = n_sq_x_' num2str(kk) ';']); | ||
39 | eval(['n_sq_y = n_sq_y_' num2str(kk) ';']); | ||
40 | if (N_kk ~= ((n_sq_x+1)*(n_sq_y+1))), | ||
41 | no_grid = 1; | ||
42 | end; | ||
43 | end; | ||
44 | end; | ||
45 | |||
46 | eval(['plot(ex_' num2str(kk) '(1,:),ex_' num2str(kk) '(2,:),''' colors(rem(kk-1,6)+1) '+'');']); | ||
47 | |||
48 | hold on; | ||
49 | end; | ||
50 | end; | ||
51 | end; | ||
52 | |||
53 | hold off; | ||
54 | axis('equal'); | ||
55 | if 1, %~no_grid, | ||
56 | title('Reprojection error (in pixel) - To exit: right button'); | ||
57 | else | ||
58 | title('Reprojection error (in pixel)'); | ||
59 | end; | ||
60 | xlabel('x'); | ||
61 | ylabel('y'); | ||
62 | |||
63 | set(5,'Name','error','NumberTitle','off'); | ||
64 | |||
65 | |||
66 | |||
67 | err_std = std(ex')'; | ||
68 | |||
69 | fprintf(1,'Pixel error: err = [ %3.5f %3.5f] (all active images)\n\n',err_std); | ||
70 | |||
71 | |||
72 | b = 1; | ||
73 | |||
74 | while b==1, | ||
75 | |||
76 | [xp,yp,b] = ginput3(1); | ||
77 | |||
78 | if b==1, | ||
79 | ddd = (ex(1,:)-xp).^2 + (ex(2,:)-yp).^2; | ||
80 | |||
81 | [mind,indmin] = min(ddd); | ||
82 | |||
83 | |||
84 | done = 0; | ||
85 | kk_ima = 1; | ||
86 | while (~done)&(kk_ima<=n_ima), | ||
87 | %fprintf(1,'%d...',kk_ima); | ||
88 | eval(['ex_kk = ex_' num2str(kk_ima) ';']); | ||
89 | sol_kk = find((ex_kk(1,:) == ex(1,indmin))&(ex_kk(2,:) == ex(2,indmin))); | ||
90 | if isempty(sol_kk), | ||
91 | kk_ima = kk_ima + 1; | ||
92 | else | ||
93 | done = 1; | ||
94 | end; | ||
95 | end; | ||
96 | |||
97 | if ~no_grid, | ||
98 | |||
99 | eval(['n_sq_x = n_sq_x_' num2str(kk_ima) ';']); | ||
100 | eval(['n_sq_y = n_sq_y_' num2str(kk_ima) ';']); | ||
101 | |||
102 | Nx = n_sq_x+1; | ||
103 | Ny = n_sq_y+1; | ||
104 | |||
105 | y1 = floor((sol_kk-1)./Nx); | ||
106 | x1 = sol_kk - 1 - Nx*y1; %rem(sol_kk-1,Nx); | ||
107 | |||
108 | y1 = (n_sq_y+1) - y1; | ||
109 | x1 = x1 + 1; | ||
110 | |||
111 | fprintf(1,'\nSelected image: %d\nSelected point: (col,row)=(%d,%d)\nNcol=%d, Nrow=%d\n',[kk_ima x1 y1 Nx Ny]); | ||
112 | fprintf(1,'Pixel error = (%3.5f,%3.5f)\n',[ex(1,indmin) ex(2,indmin)]); | ||
113 | |||
114 | else | ||
115 | |||
116 | eval(['x_kk = x_' num2str(kk_ima) ';']); | ||
117 | |||
118 | xpt = x_kk(:,sol_kk); | ||
119 | |||
120 | fprintf(1,'\nSelected image: %d\nImage coordinates (in pixel): (%3.2f,%3.2f)\n',[kk_ima xpt']); | ||
121 | fprintf(1,'Pixel error = (%3.5f,%3.5f)\n',[ex(1,indmin) ex(2,indmin)]); | ||
122 | |||
123 | |||
124 | end; | ||
125 | |||
126 | |||
127 | if exist(['wintx_' num2str(kk_ima)]), | ||
128 | |||
129 | eval(['wintx = wintx_' num2str(kk_ima) ';']); | ||
130 | eval(['winty = winty_' num2str(kk_ima) ';']); | ||
131 | |||
132 | fprintf(1,'Window size: wintx = %d, winty = %d\n',[wintx winty]); | ||
133 | end; | ||
134 | |||
135 | |||
136 | end; | ||
137 | |||
138 | end; | ||
139 | |||
140 | disp('done'); | ||
141 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/apply_distortion.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/apply_distortion.m new file mode 100755 index 0000000..f5c5b48 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/apply_distortion.m | |||
@@ -0,0 +1,137 @@ | |||
1 | function [xd,dxddk] = apply_distortion(x,k) | ||
2 | |||
3 | |||
4 | [m,n] = size(x); | ||
5 | |||
6 | % Add distortion: | ||
7 | |||
8 | r2 = x(1,:).^2 + x(2,:).^2; | ||
9 | |||
10 | r4 = r2.^2; | ||
11 | |||
12 | % Radial distortion: | ||
13 | |||
14 | cdist = 1 + k(1) * r2 + k(2) * r4; | ||
15 | |||
16 | if nargout > 1, | ||
17 | dcdistdk = [ r2' r4' zeros(n,2)]; | ||
18 | end; | ||
19 | |||
20 | |||
21 | xd1 = x .* (ones(2,1)*cdist); | ||
22 | |||
23 | coeff = (reshape([cdist;cdist],2*n,1)*ones(1,3)); | ||
24 | |||
25 | if nargout > 1, | ||
26 | dxd1dk = zeros(2*n,4); | ||
27 | dxd1dk(1:2:end,:) = (x(1,:)'*ones(1,4)) .* dcdistdk; | ||
28 | dxd1dk(2:2:end,:) = (x(2,:)'*ones(1,4)) .* dcdistdk; | ||
29 | end; | ||
30 | |||
31 | |||
32 | % tangential distortion: | ||
33 | |||
34 | a1 = 2.*x(1,:).*x(2,:); | ||
35 | a2 = r2 + 2*x(1,:).^2; | ||
36 | a3 = r2 + 2*x(2,:).^2; | ||
37 | |||
38 | delta_x = [k(3)*a1 + k(4)*a2 ; | ||
39 | k(3) * a3 + k(4)*a1]; | ||
40 | |||
41 | aa = (2*k(3)*x(2,:)+6*k(4)*x(1,:))'*ones(1,3); | ||
42 | bb = (2*k(3)*x(1,:)+2*k(4)*x(2,:))'*ones(1,3); | ||
43 | cc = (6*k(3)*x(2,:)+2*k(4)*x(1,:))'*ones(1,3); | ||
44 | |||
45 | if nargout > 1, | ||
46 | ddelta_xdk = zeros(2*n,4); | ||
47 | ddelta_xdk(1:2:end,3) = a1'; | ||
48 | ddelta_xdk(1:2:end,4) = a2'; | ||
49 | ddelta_xdk(2:2:end,3) = a3'; | ||
50 | ddelta_xdk(2:2:end,4) = a1'; | ||
51 | end; | ||
52 | |||
53 | xd = xd1 + delta_x; | ||
54 | |||
55 | if nargout > 1, | ||
56 | dxddk = dxd1dk + ddelta_xdk ; | ||
57 | end; | ||
58 | |||
59 | |||
60 | return; | ||
61 | |||
62 | % Test of the Jacobians: | ||
63 | |||
64 | n = 10; | ||
65 | |||
66 | X = 10*randn(3,n); | ||
67 | om = randn(3,1); | ||
68 | T = [10*randn(2,1);40]; | ||
69 | f = 1000*rand(2,1); | ||
70 | c = 1000*randn(2,1); | ||
71 | k = 0.5*randn(4,1); | ||
72 | |||
73 | |||
74 | [x,dxdom,dxdT,dxdf,dxdc,dxdk] = project_points(X,om,T,f,c,k); | ||
75 | |||
76 | |||
77 | % Test on om: NOT OK | ||
78 | |||
79 | dom = 0.000000001 * norm(om)*randn(3,1); | ||
80 | om2 = om + dom; | ||
81 | |||
82 | [x2] = project_points(X,om2,T,f,c,k); | ||
83 | |||
84 | x_pred = x + reshape(dxdom * dom,2,n); | ||
85 | |||
86 | |||
87 | norm(x2-x)/norm(x2 - x_pred) | ||
88 | |||
89 | |||
90 | % Test on T: OK!! | ||
91 | |||
92 | dT = 0.0001 * norm(T)*randn(3,1); | ||
93 | T2 = T + dT; | ||
94 | |||
95 | [x2] = project_points(X,om,T2,f,c,k); | ||
96 | |||
97 | x_pred = x + reshape(dxdT * dT,2,n); | ||
98 | |||
99 | |||
100 | norm(x2-x)/norm(x2 - x_pred) | ||
101 | |||
102 | |||
103 | |||
104 | % Test on f: OK!! | ||
105 | |||
106 | df = 0.001 * norm(f)*randn(2,1); | ||
107 | f2 = f + df; | ||
108 | |||
109 | [x2] = project_points(X,om,T,f2,c,k); | ||
110 | |||
111 | x_pred = x + reshape(dxdf * df,2,n); | ||
112 | |||
113 | |||
114 | norm(x2-x)/norm(x2 - x_pred) | ||
115 | |||
116 | |||
117 | % Test on c: OK!! | ||
118 | |||
119 | dc = 0.01 * norm(c)*randn(2,1); | ||
120 | c2 = c + dc; | ||
121 | |||
122 | [x2] = project_points(X,om,T,f,c2,k); | ||
123 | |||
124 | x_pred = x + reshape(dxdc * dc,2,n); | ||
125 | |||
126 | norm(x2-x)/norm(x2 - x_pred) | ||
127 | |||
128 | % Test on k: OK!! | ||
129 | |||
130 | dk = 0.001 * norm(4)*randn(4,1); | ||
131 | k2 = k + dk; | ||
132 | |||
133 | [x2] = project_points(X,om,T,f,c,k2); | ||
134 | |||
135 | x_pred = x + reshape(dxdk * dk,2,n); | ||
136 | |||
137 | norm(x2-x)/norm(x2 - x_pred) | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/calib_gui.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/calib_gui.m new file mode 100755 index 0000000..d591d03 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/calib_gui.m | |||
@@ -0,0 +1,117 @@ | |||
1 | fig_number = 1; | ||
2 | |||
3 | n_row = 4; | ||
4 | n_col = 4; | ||
5 | |||
6 | string_list = cell(n_row,n_col); | ||
7 | callback_list = cell(n_row,n_col); | ||
8 | |||
9 | x_size = 85; | ||
10 | y_size = 14; | ||
11 | gap_x = 0; | ||
12 | font_name = 'clean'; | ||
13 | font_size = 8; | ||
14 | |||
15 | title_figure = 'Camera Calibration Toolbox'; | ||
16 | |||
17 | string_list{1,1} = 'Image names'; | ||
18 | string_list{1,2} = 'Read images'; | ||
19 | string_list{1,3} = 'Extract grid corners'; | ||
20 | string_list{1,4} = 'Calibration'; | ||
21 | string_list{2,1} = 'Show Extrinsic'; | ||
22 | string_list{2,2} = 'Reproject on images'; | ||
23 | string_list{2,3} = 'Analyse error'; | ||
24 | string_list{2,4} = 'Recomp. corners'; | ||
25 | string_list{3,1} = 'Add/Suppress images'; | ||
26 | string_list{3,2} = 'Save'; | ||
27 | string_list{3,3} = 'Load'; | ||
28 | string_list{3,4} = 'Exit'; | ||
29 | |||
30 | string_list{4,1} = 'Comp. Extrinsic'; | ||
31 | string_list{4,2} = 'Undistort image'; | ||
32 | string_list{4,3} = 'Export calib data'; | ||
33 | |||
34 | |||
35 | callback_list{1,1} = 'data_calib;'; | ||
36 | callback_list{1,2} = 'ima_read_calib;'; | ||
37 | callback_list{1,3} = 'click_calib;'; | ||
38 | callback_list{1,4} = 'go_calib_optim;'; | ||
39 | callback_list{2,1} = 'ext_calib;'; | ||
40 | callback_list{2,2} = 'reproject_calib;'; | ||
41 | callback_list{2,3} = 'analyse_error;'; | ||
42 | callback_list{2,4} = 'recomp_corner_calib;'; | ||
43 | callback_list{3,1} = 'add_suppress;'; | ||
44 | callback_list{3,2} = 'saving_calib;'; | ||
45 | callback_list{3,3} = 'loading_calib;'; | ||
46 | callback_list{3,4} = ['disp(''Bye. To run again, type calib_gui.''); close(' num2str(fig_number) ');']; | ||
47 | |||
48 | callback_list{4,1} = 'extrinsic_computation;'; | ||
49 | callback_list{4,2} = 'undistort_image;'; | ||
50 | callback_list{4,3} = 'export_calib_data;'; | ||
51 | |||
52 | |||
53 | %------- BEGIN PROECTED REGION -----------% | ||
54 | %------- DO NOT EDIT IN THIS REGION -----------% | ||
55 | |||
56 | figure(fig_number); clf; | ||
57 | pos = get(fig_number,'Position'); | ||
58 | |||
59 | fig_size_x = x_size*n_col+(n_col+1)*gap_x; | ||
60 | fig_size_y = y_size*n_row+(n_row+1)*gap_x; | ||
61 | |||
62 | set(fig_number,'Units','points', ... | ||
63 | 'BackingStore','off', ... | ||
64 | 'Color',[0.8 0.8 0.8], ... | ||
65 | 'MenuBar','none', ... | ||
66 | 'Resize','off', ... | ||
67 | 'Name',title_figure, ... | ||
68 | 'Position',[pos(1) pos(2) fig_size_x fig_size_y], ... | ||
69 | 'NumberTitle','off'); %,'WindowButtonMotionFcn',['figure(' num2str(fig_number) ');']); | ||
70 | |||
71 | h_mat = zeros(n_row,n_col); | ||
72 | |||
73 | posx = zeros(n_row,n_col); | ||
74 | posy = zeros(n_row,n_col); | ||
75 | |||
76 | for i=n_row:-1:1, | ||
77 | for j = n_col:-1:1, | ||
78 | posx(i,j) = gap_x+(j-1)*(x_size+gap_x); | ||
79 | posy(i,j) = fig_size_y - i*(gap_x+y_size); | ||
80 | end; | ||
81 | end; | ||
82 | |||
83 | for i=n_row:-1:1, | ||
84 | for j = n_col:-1:1, | ||
85 | if ~isempty(string_list{i,j}) & ~isempty(callback_list{i,j}), | ||
86 | h_mat(i,j) = uicontrol('Parent',fig_number, ... | ||
87 | 'Units','points', ... | ||
88 | 'Callback',callback_list{i,j}, ... | ||
89 | 'ListboxTop',0, ... | ||
90 | 'Position',[posx(i,j) posy(i,j) x_size y_size], ... | ||
91 | 'String',string_list{i,j}, ... | ||
92 | 'fontsize',font_size,... | ||
93 | 'fontname',font_name,... | ||
94 | 'Tag','Pushbutton1'); | ||
95 | end; | ||
96 | end; | ||
97 | end; | ||
98 | |||
99 | %------ END PROTECTED REGION ----------------% | ||
100 | |||
101 | if 0, | ||
102 | %-- VERSION: | ||
103 | |||
104 | uicontrol('Parent',fig_number, ... | ||
105 | 'Units','points', ... | ||
106 | 'ListboxTop',0, ... | ||
107 | 'Position',[(fig_size_x-x_size/2)-2 -5 x_size/2 y_size], ... | ||
108 | 'String','ver. 1.0', ... | ||
109 | 'fontsize',8,... | ||
110 | 'BackgroundColor',[0.8 0.8 0.8], ... | ||
111 | 'fontname','clean',... | ||
112 | 'HorizontalAlignment','right', ... | ||
113 | 'Style','text'); | ||
114 | end; | ||
115 | |||
116 | |||
117 | %clear callback_list string_list fig_number fig_size_x fig_size_y i j n_col n_row pos string_list title_figure x_size y_size font_name font_size gap_x h_mat posx posy | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/check_active_images.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/check_active_images.m new file mode 100755 index 0000000..fc365a5 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/check_active_images.m | |||
@@ -0,0 +1,19 @@ | |||
1 | |||
2 | if ~exist('active_images'), | ||
3 | active_images = ones(1,n_ima); | ||
4 | end; | ||
5 | n_act = length(active_images); | ||
6 | if n_act < n_ima, | ||
7 | active_images = [active_images ones(1,n_ima-n_act)]; | ||
8 | else | ||
9 | if n_act > n_ima, | ||
10 | active_images = active_images(1:n_ima); | ||
11 | end; | ||
12 | end; | ||
13 | |||
14 | ind_active = find(active_images); | ||
15 | |||
16 | if prod(active_images == 0), | ||
17 | disp('Error: There is no active image'); | ||
18 | break | ||
19 | end; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/check_convergence.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/check_convergence.m new file mode 100755 index 0000000..c4b13fd --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/check_convergence.m | |||
@@ -0,0 +1,48 @@ | |||
1 | %%% Replay the set of solution vectors: | ||
2 | |||
3 | |||
4 | if ~exist('param_list'), | ||
5 | if ~exist('solution'); | ||
6 | fprintf(1,'Error: Need to calibrate first\n'); | ||
7 | return; | ||
8 | else | ||
9 | param_list = solution; | ||
10 | end; | ||
11 | end; | ||
12 | |||
13 | N_iter = size(param_list,2); | ||
14 | |||
15 | if N_iter == 1, | ||
16 | fprintf(1,'Warning: There is a unique state in the list of parameters.\n'); | ||
17 | end; | ||
18 | |||
19 | |||
20 | |||
21 | %M = moviein(N_iter); | ||
22 | |||
23 | for nn = 1:N_iter, | ||
24 | |||
25 | solution = param_list(:,nn); | ||
26 | |||
27 | extract_parameters; | ||
28 | comp_error_calib; | ||
29 | |||
30 | ext_calib; | ||
31 | |||
32 | drawnow; | ||
33 | |||
34 | % Mnn = getframe(gcf); | ||
35 | |||
36 | % M(:,nn) = Mnn; | ||
37 | |||
38 | end; | ||
39 | |||
40 | %fig = gcf; | ||
41 | |||
42 | |||
43 | %figure(fig+1); | ||
44 | %close; | ||
45 | %figure(fig+1); | ||
46 | |||
47 | %clf; | ||
48 | %movie(M,20); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/check_directory.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/check_directory.m new file mode 100755 index 0000000..dc23149 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/check_directory.m | |||
@@ -0,0 +1,97 @@ | |||
1 | % This small script looks in the direcory and checks if the images are there. | ||
2 | % | ||
3 | % This works only on Matlab 5.x (otherwise, the dir commands works differently) | ||
4 | |||
5 | % (c) Jean-Yves Bouguet - Dec. 27th, 1999 | ||
6 | |||
7 | l = dir([calib_name '*']); | ||
8 | |||
9 | Nl = size(l,1); | ||
10 | Nima_valid = 0; | ||
11 | ind_valid = []; | ||
12 | loc_extension = []; | ||
13 | length_name = size(calib_name,2); | ||
14 | |||
15 | if Nl > 0, | ||
16 | |||
17 | for pp = 1:Nl, | ||
18 | filenamepp = l(pp).name; | ||
19 | iii = findstr(filenamepp,calib_name); | ||
20 | |||
21 | loc_ext = findstr(filenamepp,format_image); | ||
22 | string_num = filenamepp(length_name+1:loc_ext - 2); | ||
23 | |||
24 | if isempty(str2num(string_num)), | ||
25 | iii = []; | ||
26 | end; | ||
27 | |||
28 | |||
29 | if ~isempty(iii), | ||
30 | if (iii(1) ~= 1), | ||
31 | iii = []; | ||
32 | end; | ||
33 | end; | ||
34 | |||
35 | |||
36 | |||
37 | if ~isempty(iii) & ~isempty(loc_ext), | ||
38 | |||
39 | Nima_valid = Nima_valid + 1; | ||
40 | ind_valid = [ind_valid pp]; | ||
41 | loc_extension = [loc_extension loc_ext(1)]; | ||
42 | |||
43 | end; | ||
44 | |||
45 | end; | ||
46 | |||
47 | if (Nima_valid==0), | ||
48 | |||
49 | fprintf(1,'No image found. File format may be wrong.\n'); | ||
50 | |||
51 | else | ||
52 | |||
53 | % Get all the string numbers: | ||
54 | |||
55 | string_length = zeros(1,Nima_valid); | ||
56 | indices = zeros(1,Nima_valid); | ||
57 | |||
58 | |||
59 | for ppp = 1:Nima_valid, | ||
60 | |||
61 | name = l(ind_valid(ppp)).name; | ||
62 | string_num = name(length_name+1:loc_extension(ppp) - 2); | ||
63 | string_length(ppp) = size(string_num,2); | ||
64 | indices(ppp) = str2num(string_num); | ||
65 | |||
66 | end; | ||
67 | |||
68 | % Number of images... | ||
69 | first_num = min(indices); | ||
70 | n_ima = max(indices) - first_num + 1; | ||
71 | |||
72 | if min(string_length) == max(string_length), | ||
73 | |||
74 | N_slots = min(string_length); | ||
75 | type_numbering = 1; | ||
76 | |||
77 | else | ||
78 | |||
79 | N_slots = 1; | ||
80 | type_numbering = 0; | ||
81 | |||
82 | end; | ||
83 | |||
84 | image_numbers = first_num:n_ima-1+first_num; | ||
85 | |||
86 | %%% By default, all the images are active for calibration: | ||
87 | |||
88 | active_images = ones(1,n_ima); | ||
89 | |||
90 | end; | ||
91 | |||
92 | else | ||
93 | |||
94 | fprintf(1,'No image found. Basename may be wrong.\n'); | ||
95 | |||
96 | end; | ||
97 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/check_extracted_images.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/check_extracted_images.m new file mode 100755 index 0000000..fa7df87 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/check_extracted_images.m | |||
@@ -0,0 +1,37 @@ | |||
1 | check_active_images; | ||
2 | |||
3 | for kk = ind_active, | ||
4 | |||
5 | if ~exist(['x_' num2str(kk)]), | ||
6 | |||
7 | fprintf(1,'WARNING: Need to extract grid corners on image %d\n',kk); | ||
8 | |||
9 | active_images(kk) = 0; | ||
10 | |||
11 | eval(['dX_' num2str(kk) ' = NaN;']); | ||
12 | eval(['dY_' num2str(kk) ' = NaN;']); | ||
13 | |||
14 | eval(['wintx_' num2str(kk) ' = NaN;']); | ||
15 | eval(['winty_' num2str(kk) ' = NaN;']); | ||
16 | |||
17 | eval(['x_' num2str(kk) ' = NaN*ones(2,1);']); | ||
18 | eval(['X_' num2str(kk) ' = NaN*ones(3,1);']); | ||
19 | |||
20 | eval(['n_sq_x_' num2str(kk) ' = NaN;']); | ||
21 | eval(['n_sq_y_' num2str(kk) ' = NaN;']); | ||
22 | |||
23 | else | ||
24 | |||
25 | eval(['xkk = x_' num2str(kk) ';']); | ||
26 | |||
27 | if isnan(xkk(1)), | ||
28 | |||
29 | fprintf(1,'WARNING: Need to extract grid corners on image %d - This image is now set inactive\n',kk); | ||
30 | |||
31 | active_images(kk) = 0; | ||
32 | |||
33 | end; | ||
34 | |||
35 | end; | ||
36 | |||
37 | end; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/clear_windows.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/clear_windows.m new file mode 100755 index 0000000..1eccbd3 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/clear_windows.m | |||
@@ -0,0 +1,4 @@ | |||
1 | for kk = 1:n_ima, | ||
2 | eval(['clear wintx_' num2str(kk)]); | ||
3 | eval(['clear winty_' num2str(kk)]); | ||
4 | end; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/clearwin.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/clearwin.m new file mode 100755 index 0000000..a04be67 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/clearwin.m | |||
@@ -0,0 +1,10 @@ | |||
1 | % Function that clears all the wintx_i and winty_i | ||
2 | % In normal operation of the toolbox, this function should not be | ||
3 | % useful. | ||
4 | % only in cases where you want to re-extract corners using the Extract grid corners another time... not common. You might as well use the Recomp. corners. | ||
5 | |||
6 | for kk = 1:n_ima, | ||
7 | |||
8 | eval(['clear wintx_' num2str(kk) ' winty_' num2str(kk)]); | ||
9 | |||
10 | end; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/click_calib.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/click_calib.m new file mode 100755 index 0000000..1a6d2d7 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/click_calib.m | |||
@@ -0,0 +1,193 @@ | |||
1 | %if exist('images_read'); | ||
2 | % active_images = active_images & images_read; | ||
3 | %end; | ||
4 | |||
5 | var2fix = 'dX_default'; | ||
6 | |||
7 | fixvariable; | ||
8 | |||
9 | var2fix = 'dY_default'; | ||
10 | |||
11 | fixvariable; | ||
12 | |||
13 | var2fix = 'map'; | ||
14 | |||
15 | fixvariable; | ||
16 | |||
17 | |||
18 | if ~exist('n_ima'), | ||
19 | data_calib; | ||
20 | end; | ||
21 | |||
22 | check_active_images; | ||
23 | |||
24 | if ~exist(['I_' num2str(ind_active(1))]), | ||
25 | ima_read_calib; | ||
26 | if isempty(ind_read), | ||
27 | disp('Cannot extract corners without images'); | ||
28 | return; | ||
29 | end; | ||
30 | end; | ||
31 | |||
32 | |||
33 | %wintx = 10; % neigborhood of integration for | ||
34 | %winty = 10; % the corner finder | ||
35 | |||
36 | fprintf(1,'\nExtraction of the grid corners on the images\n'); | ||
37 | |||
38 | |||
39 | if ~exist('map'), map = gray(256); end; | ||
40 | |||
41 | |||
42 | disp('WARNING!!! Do not forget to change dX_default and dY_default in click_calib.m!!!') | ||
43 | |||
44 | if ~exist('dX_default'); | ||
45 | |||
46 | % Default size of the pattern squares; | ||
47 | |||
48 | % Setup of JY (old at Caltech) | ||
49 | %dX_default = 21.9250/11; | ||
50 | %dY_default = 18.1250/9; | ||
51 | |||
52 | % Setup of JY (new at Intel) | ||
53 | %dX_default = 1.9750; | ||
54 | %dY_default = 1.9865; | ||
55 | |||
56 | |||
57 | % Setup of Luis and Enrico | ||
58 | %dX_default = 67.7/16; | ||
59 | %dY_default = 50.65/12; | ||
60 | |||
61 | |||
62 | % Setup of German | ||
63 | %dX_default = 10.16; | ||
64 | %dY_default = 10.16; | ||
65 | |||
66 | % Setup of JY (new at Intel) | ||
67 | %dX_default = 1.9750*2.54; | ||
68 | %dY_default = 1.9865*2.54; | ||
69 | |||
70 | % Setup of JY - 3D calibration rig at Intel (new at Intel) | ||
71 | %dX_default = 3; | ||
72 | %dY_default = 3; | ||
73 | |||
74 | % Setup of JY - 3D calibration rig at Intel (new at Intel) - use units in mm to match Zhang | ||
75 | dX_default = 30; | ||
76 | dY_default = 30; | ||
77 | |||
78 | end; | ||
79 | |||
80 | |||
81 | if ~exist('dont_ask'), | ||
82 | dont_ask = 0; | ||
83 | end; | ||
84 | |||
85 | |||
86 | if ~dont_ask, | ||
87 | ima_numbers = input('Number(s) of image(s) to process ([] = all images) = '); | ||
88 | else | ||
89 | ima_numbers = []; | ||
90 | end; | ||
91 | |||
92 | if isempty(ima_numbers), | ||
93 | ima_proc = 1:n_ima; | ||
94 | else | ||
95 | ima_proc = ima_numbers; | ||
96 | end; | ||
97 | |||
98 | |||
99 | % Useful option to add images: | ||
100 | kk_first = ima_proc(1); %input('Start image number ([]=1=first): '); | ||
101 | |||
102 | %if isempty(kk_first), kk_first = 1; end; | ||
103 | |||
104 | |||
105 | if exist(['wintx_' num2str(kk_first)]), | ||
106 | |||
107 | eval(['wintxkk = wintx_' num2str(kk_first) ';']); | ||
108 | |||
109 | if isempty(wintxkk) | isnan(wintxkk), | ||
110 | |||
111 | disp('Window size for corner finder (wintx and winty):'); | ||
112 | wintx = input('wintx ([] = 5) = '); | ||
113 | if isempty(wintx), wintx = 5; end; | ||
114 | wintx = round(wintx); | ||
115 | winty = input('winty ([] = 5) = '); | ||
116 | if isempty(winty), winty = 5; end; | ||
117 | winty = round(winty); | ||
118 | |||
119 | fprintf(1,'Window size = %dx%d\n',2*wintx+1,2*winty+1); | ||
120 | |||
121 | end; | ||
122 | |||
123 | else | ||
124 | |||
125 | disp('Window size for corner finder (wintx and winty):'); | ||
126 | wintx = input('wintx ([] = 5) = '); | ||
127 | if isempty(wintx), wintx = 5; end; | ||
128 | wintx = round(wintx); | ||
129 | winty = input('winty ([] = 5) = '); | ||
130 | if isempty(winty), winty = 5; end; | ||
131 | winty = round(winty); | ||
132 | |||
133 | fprintf(1,'Window size = %dx%d\n',2*wintx+1,2*winty+1); | ||
134 | |||
135 | end; | ||
136 | |||
137 | |||
138 | for kk = ima_proc, | ||
139 | if exist(['I_' num2str(kk)]), | ||
140 | click_ima_calib; | ||
141 | active_images(kk) = 1; | ||
142 | else | ||
143 | eval(['dX_' num2str(kk) ' = NaN;']); | ||
144 | eval(['dY_' num2str(kk) ' = NaN;']); | ||
145 | |||
146 | eval(['wintx_' num2str(kk) ' = NaN;']); | ||
147 | eval(['winty_' num2str(kk) ' = NaN;']); | ||
148 | |||
149 | eval(['x_' num2str(kk) ' = NaN*ones(2,1);']); | ||
150 | eval(['X_' num2str(kk) ' = NaN*ones(3,1);']); | ||
151 | |||
152 | eval(['n_sq_x_' num2str(kk) ' = NaN;']); | ||
153 | eval(['n_sq_y_' num2str(kk) ' = NaN;']); | ||
154 | end; | ||
155 | end; | ||
156 | |||
157 | |||
158 | check_active_images; | ||
159 | |||
160 | |||
161 | % Fix potential non-existing variables: | ||
162 | |||
163 | for kk = 1:n_ima, | ||
164 | if ~exist(['x_' num2str(kk)]), | ||
165 | eval(['dX_' num2str(kk) ' = NaN;']); | ||
166 | eval(['dY_' num2str(kk) ' = NaN;']); | ||
167 | |||
168 | eval(['wintx_' num2str(kk) ' = NaN;']); | ||
169 | eval(['winty_' num2str(kk) ' = NaN;']); | ||
170 | |||
171 | eval(['x_' num2str(kk) ' = NaN*ones(2,1);']); | ||
172 | eval(['X_' num2str(kk) ' = NaN*ones(3,1);']); | ||
173 | |||
174 | eval(['n_sq_x_' num2str(kk) ' = NaN;']); | ||
175 | eval(['n_sq_y_' num2str(kk) ' = NaN;']); | ||
176 | end; | ||
177 | end; | ||
178 | |||
179 | |||
180 | string_save = 'save calib_data active_images ind_active wintx winty n_ima type_numbering N_slots first_num image_numbers format_image calib_name Hcal Wcal nx ny map dX_default dY_default dX dY'; | ||
181 | |||
182 | for kk = 1:n_ima, | ||
183 | string_save = [string_save ' X_' num2str(kk) ' x_' num2str(kk) ' n_sq_x_' num2str(kk) ' n_sq_y_' num2str(kk) ' wintx_' num2str(kk) ' winty_' num2str(kk) ' dX_' num2str(kk) ' dY_' num2str(kk)]; | ||
184 | end; | ||
185 | |||
186 | eval(string_save); | ||
187 | |||
188 | disp('done'); | ||
189 | |||
190 | return; | ||
191 | |||
192 | go_calib_optim; | ||
193 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/click_ima_calib.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/click_ima_calib.m new file mode 100755 index 0000000..f0fd4ca --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/click_ima_calib.m | |||
@@ -0,0 +1,230 @@ | |||
1 | % Cleaned-up version of init_calib.m | ||
2 | |||
3 | fprintf(1,'\nProcessing image %d...\n',kk); | ||
4 | |||
5 | eval(['I = I_' num2str(kk) ';']); | ||
6 | |||
7 | if exist(['wintx_' num2str(kk)]), | ||
8 | |||
9 | eval(['wintxkk = wintx_' num2str(kk) ';']); | ||
10 | |||
11 | if ~isempty(wintxkk) & ~isnan(wintxkk), | ||
12 | |||
13 | eval(['wintx = wintx_' num2str(kk) ';']); | ||
14 | eval(['winty = winty_' num2str(kk) ';']); | ||
15 | |||
16 | end; | ||
17 | end; | ||
18 | |||
19 | |||
20 | fprintf(1,'Using (wintx,winty)=(%d,%d) - Window size = %dx%d\n',wintx,winty,2*wintx+1,2*winty+1); | ||
21 | |||
22 | |||
23 | figure(2); | ||
24 | image(I); | ||
25 | colormap(map); | ||
26 | |||
27 | title(['Click on the four extreme corners of the rectangular pattern... Image ' num2str(kk)]); | ||
28 | |||
29 | disp('Click on the four extreme corners of the rectangular complete pattern...'); | ||
30 | |||
31 | [x,y] = ginput3(4); | ||
32 | |||
33 | [Xc,good,bad,type] = cornerfinder([x';y'],I,winty,wintx); % the four corners | ||
34 | |||
35 | x = Xc(1,:)'; | ||
36 | y = Xc(2,:)'; | ||
37 | |||
38 | [y,indy] = sort(y); | ||
39 | x = x(indy); | ||
40 | |||
41 | if (x(2) > x(1)), | ||
42 | x4 = x(1);y4 = y(1); x3 = x(2); y3 = y(2); | ||
43 | else | ||
44 | x4 = x(2);y4 = y(2); x3 = x(1); y3 = y(1); | ||
45 | end; | ||
46 | if (x(3) > x(4)), | ||
47 | x2 = x(3);y2 = y(3); x1 = x(4); y1 = y(4); | ||
48 | else | ||
49 | x2 = x(4);y2 = y(4); x1 = x(3); y1 = y(3); | ||
50 | end; | ||
51 | |||
52 | x = [x1;x2;x3;x4]; | ||
53 | y = [y1;y2;y3;y4]; | ||
54 | |||
55 | |||
56 | figure(2); hold on; | ||
57 | plot([x;x(1)],[y;y(1)],'g-'); | ||
58 | plot(x,y,'og'); | ||
59 | hx=text((x(4)+x(3))/2,(y(4)+y(3))/2 - 20,'X'); | ||
60 | set(hx,'color','g','Fontsize',14); | ||
61 | hy=text((x(4)+x(1))/2-20,(y(4)+y(1))/2,'Y'); | ||
62 | set(hy,'color','g','Fontsize',14); | ||
63 | hold off; | ||
64 | |||
65 | |||
66 | % Try to automatically count the number of squares in the grid | ||
67 | |||
68 | n_sq_x1 = count_squares(I,x1,y1,x2,y2,wintx); | ||
69 | n_sq_x2 = count_squares(I,x3,y3,x4,y4,wintx); | ||
70 | n_sq_y1 = count_squares(I,x2,y2,x3,y3,wintx); | ||
71 | n_sq_y2 = count_squares(I,x4,y4,x1,y1,wintx); | ||
72 | |||
73 | |||
74 | |||
75 | % If could not count the number of squares, enter manually | ||
76 | |||
77 | if (n_sq_x1~=n_sq_x2)|(n_sq_y1~=n_sq_y2), | ||
78 | |||
79 | |||
80 | disp('Could not count the number of squares in the grid. Enter manually.'); | ||
81 | n_sq_x = input('Number of squares along the X direction ([]=10) = '); %6 | ||
82 | if isempty(n_sq_x), n_sq_x = 10; end; | ||
83 | n_sq_y = input('Number of squares along the Y direction ([]=10) = '); %6 | ||
84 | if isempty(n_sq_y), n_sq_y = 10; end; | ||
85 | |||
86 | else | ||
87 | |||
88 | n_sq_x = n_sq_x1; | ||
89 | n_sq_y = n_sq_y1; | ||
90 | |||
91 | end; | ||
92 | |||
93 | |||
94 | % Enter the size of each square | ||
95 | |||
96 | dX = input(['Size dX of each square along the X direction ([]=' num2str(dX_default) 'mm) = ']); | ||
97 | dY = input(['Size dY of each square along the Y direction ([]=' num2str(dY_default) 'mm) = ']); | ||
98 | if isempty(dX), dX = dX_default; else dX_default = dX; end; | ||
99 | if isempty(dY), dY = dY_default; else dY_default = dY; end; | ||
100 | |||
101 | % Compute the inside points through computation of the planar homography (collineation) | ||
102 | |||
103 | a00 = [x(1);y(1);1]; | ||
104 | a10 = [x(2);y(2);1]; | ||
105 | a11 = [x(3);y(3);1]; | ||
106 | a01 = [x(4);y(4);1]; | ||
107 | |||
108 | |||
109 | % Compute the planar collineation: (return the normalization matrix as well) | ||
110 | |||
111 | [Homo,Hnorm,inv_Hnorm] = compute_homography ([a00 a10 a11 a01],[0 1 1 0;0 0 1 1;1 1 1 1]); | ||
112 | |||
113 | |||
114 | % Build the grid using the planar collineation: | ||
115 | |||
116 | x_l = ((0:n_sq_x)'*ones(1,n_sq_y+1))/n_sq_x; | ||
117 | y_l = (ones(n_sq_x+1,1)*(0:n_sq_y))/n_sq_y; | ||
118 | pts = [x_l(:) y_l(:) ones((n_sq_x+1)*(n_sq_y+1),1)]'; | ||
119 | |||
120 | XX = Homo*pts; | ||
121 | XX = XX(1:2,:) ./ (ones(2,1)*XX(3,:)); | ||
122 | |||
123 | |||
124 | % Complete size of the rectangle | ||
125 | |||
126 | W = n_sq_x*dX; | ||
127 | L = n_sq_y*dY; | ||
128 | |||
129 | |||
130 | |||
131 | |||
132 | %%%%%%%%%%%%%%%%%%%%%%%% ADDITIONAL STUFF IN THE CASE OF HIGHLY DISTORTED IMAGES %%%%%%%%%%%%% | ||
133 | figure(2); | ||
134 | hold on; | ||
135 | plot(XX(1,:),XX(2,:),'r+'); | ||
136 | title('The red crosses should be close to the image corners'); | ||
137 | hold off; | ||
138 | |||
139 | disp('If the guessed grid corners (red crosses on the image) are not close to the actual corners,'); | ||
140 | disp('it is necessary to enter an initial guess for the radial distortion factor kc (useful for subpixel detection)'); | ||
141 | quest_distort = input('Need of an initial guess for distortion? ([]=no, other=yes) '); | ||
142 | |||
143 | quest_distort = ~isempty(quest_distort); | ||
144 | |||
145 | if quest_distort, | ||
146 | % Estimation of focal length: | ||
147 | c_g = [size(I,2);size(I,1)]/2 + .5; | ||
148 | f_g = Distor2Calib(0,[[x(1) x(2) x(4) x(3)] - c_g(1);[y(1) y(2) y(4) y(3)] - c_g(2)],1,1,4,W,L,[-W/2 W/2 W/2 -W/2;L/2 L/2 -L/2 -L/2; 0 0 0 0],100,1,1); | ||
149 | f_g = mean(f_g); | ||
150 | script_fit_distortion; | ||
151 | end; | ||
152 | %%%%%%%%%%%%%%%%%%%%% END ADDITIONAL STUFF IN THE CASE OF HIGHLY DISTORTED IMAGES %%%%%%%%%%%%% | ||
153 | |||
154 | |||
155 | |||
156 | |||
157 | |||
158 | Np = (n_sq_x+1)*(n_sq_y+1); | ||
159 | |||
160 | disp('Corner extraction...'); | ||
161 | |||
162 | grid_pts = cornerfinder(XX,I,winty,wintx); %%% Finds the exact corners at every points! | ||
163 | |||
164 | |||
165 | |||
166 | %save all_corners x y grid_pts | ||
167 | |||
168 | grid_pts = grid_pts - 1; % subtract 1 to bring the origin to (0,0) instead of (1,1) in matlab (not necessary in C) | ||
169 | |||
170 | |||
171 | |||
172 | ind_corners = [1 n_sq_x+1 (n_sq_x+1)*n_sq_y+1 (n_sq_x+1)*(n_sq_y+1)]; % index of the 4 corners | ||
173 | ind_orig = (n_sq_x+1)*n_sq_y + 1; | ||
174 | xorig = grid_pts(1,ind_orig); | ||
175 | yorig = grid_pts(2,ind_orig); | ||
176 | dxpos = mean([grid_pts(:,ind_orig) grid_pts(:,ind_orig+1)]'); | ||
177 | dypos = mean([grid_pts(:,ind_orig) grid_pts(:,ind_orig-n_sq_x-1)]'); | ||
178 | |||
179 | |||
180 | x_box_kk = [grid_pts(1,:)-(wintx+.5);grid_pts(1,:)+(wintx+.5);grid_pts(1,:)+(wintx+.5);grid_pts(1,:)-(wintx+.5);grid_pts(1,:)-(wintx+.5)]; | ||
181 | y_box_kk = [grid_pts(2,:)-(winty+.5);grid_pts(2,:)-(winty+.5);grid_pts(2,:)+(winty+.5);grid_pts(2,:)+(winty+.5);grid_pts(2,:)-(winty+.5)]; | ||
182 | |||
183 | |||
184 | figure(3); | ||
185 | image(I); colormap(map); hold on; | ||
186 | plot(grid_pts(1,:)+1,grid_pts(2,:)+1,'r+'); | ||
187 | plot(x_box_kk+1,y_box_kk+1,'-b'); | ||
188 | plot(grid_pts(1,ind_corners)+1,grid_pts(2,ind_corners)+1,'mo'); | ||
189 | plot(xorig+1,yorig+1,'*m'); | ||
190 | h = text(xorig-15,yorig-15,'O'); | ||
191 | set(h,'Color','m','FontSize',14); | ||
192 | h2 = text(dxpos(1)-10,dxpos(2)-10,'dX'); | ||
193 | set(h2,'Color','g','FontSize',14); | ||
194 | h3 = text(dypos(1)-25,dypos(2)-3,'dY'); | ||
195 | set(h3,'Color','g','FontSize',14); | ||
196 | xlabel('Xc (in camera frame)'); | ||
197 | ylabel('Yc (in camera frame)'); | ||
198 | title('Extracted corners'); | ||
199 | zoom on; | ||
200 | drawnow; | ||
201 | hold off; | ||
202 | |||
203 | |||
204 | Xi = reshape(([0:n_sq_x]*dX)'*ones(1,n_sq_y+1),Np,1)'; | ||
205 | Yi = reshape(ones(n_sq_x+1,1)*[n_sq_y:-1:0]*dY,Np,1)'; | ||
206 | Zi = zeros(1,Np); | ||
207 | |||
208 | Xgrid = [Xi;Yi;Zi]; | ||
209 | |||
210 | |||
211 | % All the point coordinates (on the image, and in 3D) - for global optimization: | ||
212 | |||
213 | x = grid_pts; | ||
214 | X = Xgrid; | ||
215 | |||
216 | |||
217 | % Saves all the data into variables: | ||
218 | |||
219 | eval(['dX_' num2str(kk) ' = dX;']); | ||
220 | eval(['dY_' num2str(kk) ' = dY;']); | ||
221 | |||
222 | eval(['wintx_' num2str(kk) ' = wintx;']); | ||
223 | eval(['winty_' num2str(kk) ' = winty;']); | ||
224 | |||
225 | eval(['x_' num2str(kk) ' = x;']); | ||
226 | eval(['X_' num2str(kk) ' = X;']); | ||
227 | |||
228 | eval(['n_sq_x_' num2str(kk) ' = n_sq_x;']); | ||
229 | eval(['n_sq_y_' num2str(kk) ' = n_sq_y;']); | ||
230 | \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/click_ima_calib3D.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/click_ima_calib3D.m new file mode 100755 index 0000000..7718268 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/click_ima_calib3D.m | |||
@@ -0,0 +1,482 @@ | |||
1 | % Cleaned-up version of init_calib.m | ||
2 | |||
3 | eval(['I = I_' num2str(kk) ';']); | ||
4 | |||
5 | figure(2); | ||
6 | image(I); | ||
7 | colormap(map); | ||
8 | |||
9 | |||
10 | |||
11 | |||
12 | |||
13 | %%%%%%%%%%%%%%%%%%%%%%%%% LEFT PATTERN ACQUISITION %%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||
14 | |||
15 | |||
16 | |||
17 | title(['Click on the four extreme corners of the left rectangular pattern... Image ' num2str(kk)]); | ||
18 | |||
19 | disp('Click on the four extreme corners of the left rectangular pattern...'); | ||
20 | |||
21 | [x,y] = ginput3(4); | ||
22 | |||
23 | [Xc,good,bad,type] = cornerfinder([x';y'],I,winty,wintx); % the four corners | ||
24 | |||
25 | x = Xc(1,:)'; | ||
26 | y = Xc(2,:)'; | ||
27 | |||
28 | [y,indy] = sort(y); | ||
29 | x = x(indy); | ||
30 | |||
31 | if (x(2) > x(1)), | ||
32 | x4 = x(1);y4 = y(1); x3 = x(2); y3 = y(2); | ||
33 | else | ||
34 | x4 = x(2);y4 = y(2); x3 = x(1); y3 = y(1); | ||
35 | end; | ||
36 | if (x(3) > x(4)), | ||
37 | x2 = x(3);y2 = y(3); x1 = x(4); y1 = y(4); | ||
38 | else | ||
39 | x2 = x(4);y2 = y(4); x1 = x(3); y1 = y(3); | ||
40 | end; | ||
41 | |||
42 | x = [x1;x2;x3;x4]; | ||
43 | y = [y1;y2;y3;y4]; | ||
44 | |||
45 | |||
46 | figure(2); hold on; | ||
47 | plot([x;x(1)],[y;y(1)],'g-'); | ||
48 | plot(x,y,'og'); | ||
49 | hx=text((x(4)+x(3))/2,(y(4)+y(3))/2 - 20,'X'); | ||
50 | set(hx,'color','g','Fontsize',14); | ||
51 | hy=text((x(4)+x(1))/2-20,(y(4)+y(1))/2,'Y'); | ||
52 | set(hy,'color','g','Fontsize',14); | ||
53 | hold off; | ||
54 | |||
55 | drawnow; | ||
56 | |||
57 | |||
58 | % Try to automatically count the number of squares in the grid | ||
59 | |||
60 | n_sq_x1 = count_squares(I,x1,y1,x2,y2,wintx); | ||
61 | n_sq_x2 = count_squares(I,x3,y3,x4,y4,wintx); | ||
62 | n_sq_y1 = count_squares(I,x2,y2,x3,y3,wintx); | ||
63 | n_sq_y2 = count_squares(I,x4,y4,x1,y1,wintx); | ||
64 | |||
65 | |||
66 | |||
67 | % If could not count the number of squares, enter manually | ||
68 | |||
69 | if (n_sq_x1~=n_sq_x2)|(n_sq_y1~=n_sq_y2), | ||
70 | |||
71 | |||
72 | disp('Could not count the number of squares in the grid. Enter manually.'); | ||
73 | n_sq_x = input('Number of squares along the X direction ([]=10) = '); %6 | ||
74 | if isempty(n_sq_x), n_sq_x = 10; end; | ||
75 | n_sq_y = input('Number of squares along the Y direction ([]=10) = '); %6 | ||
76 | if isempty(n_sq_y), n_sq_y = 10; end; | ||
77 | |||
78 | else | ||
79 | |||
80 | n_sq_x = n_sq_x1; | ||
81 | n_sq_y = n_sq_y1; | ||
82 | |||
83 | end; | ||
84 | |||
85 | |||
86 | if 1, | ||
87 | % Enter the size of each square | ||
88 | |||
89 | dX = input(['Size dX of each square along the X direction ([]=' num2str(dX_default) 'cm) = ']); | ||
90 | dY = input(['Size dY of each square along the Y direction ([]=' num2str(dY_default) 'cm) = ']); | ||
91 | if isempty(dX), dX = dX_default; else dX_default = dX; end; | ||
92 | if isempty(dY), dY = dY_default; else dY_default = dY; end; | ||
93 | |||
94 | else | ||
95 | |||
96 | dX = 3; | ||
97 | dY = 3; | ||
98 | |||
99 | end; | ||
100 | |||
101 | |||
102 | % Compute the inside points through computation of the planar homography (collineation) | ||
103 | |||
104 | a00 = [x(1);y(1);1]; | ||
105 | a10 = [x(2);y(2);1]; | ||
106 | a11 = [x(3);y(3);1]; | ||
107 | a01 = [x(4);y(4);1]; | ||
108 | |||
109 | |||
110 | % Compute the planart collineation: (return the normalization matrice as well) | ||
111 | |||
112 | [Homo,Hnorm,inv_Hnorm] = compute_collineation (a00, a10, a11, a01); | ||
113 | |||
114 | |||
115 | % Build the grid using the planar collineation: | ||
116 | |||
117 | x_l = ((0:n_sq_x)'*ones(1,n_sq_y+1))/n_sq_x; | ||
118 | y_l = (ones(n_sq_x+1,1)*(0:n_sq_y))/n_sq_y; | ||
119 | pts = [x_l(:) y_l(:) ones((n_sq_x+1)*(n_sq_y+1),1)]'; | ||
120 | |||
121 | XX = Homo*pts; | ||
122 | XX = XX(1:2,:) ./ (ones(2,1)*XX(3,:)); | ||
123 | |||
124 | |||
125 | % Complete size of the rectangle | ||
126 | |||
127 | W = n_sq_x*dX; | ||
128 | L = n_sq_y*dY; | ||
129 | |||
130 | |||
131 | |||
132 | if 1, | ||
133 | %%%%%%%%%%%%%%%%%%%%%%%% ADDITIONAL STUFF IN THE CASE OF HIGHLY DISTORTED IMAGES %%%%%%%%%%%%% | ||
134 | figure(2); | ||
135 | hold on; | ||
136 | plot(XX(1,:),XX(2,:),'r+'); | ||
137 | title('The red crosses should be close to the image corners'); | ||
138 | hold off; | ||
139 | |||
140 | disp('If the guessed grid corners (red crosses on the image) are not close to the actual corners,'); | ||
141 | disp('it is necessary to enter an initial guess for the radial distortion factor kc (useful for subpixel detection)'); | ||
142 | quest_distort = input('Need of an initial guess for distortion? ([]=no, other=yes) '); | ||
143 | |||
144 | quest_distort = ~isempty(quest_distort); | ||
145 | |||
146 | if quest_distort, | ||
147 | % Estimation of focal length: | ||
148 | c_g = [size(I,2);size(I,1)]/2 + .5; | ||
149 | f_g = Distor2Calib(0,[[x(1) x(2) x(4) x(3)] - c_g(1);[y(1) y(2) y(4) y(3)] - c_g(2)],1,1,4,W,L,[-W/2 W/2 W/2 -W/2;L/2 L/2 -L/2 -L/2; 0 0 0 0],100,1,1); | ||
150 | f_g = mean(f_g); | ||
151 | script_fit_distortion; | ||
152 | end; | ||
153 | %%%%%%%%%%%%%%%%%%%%% END ADDITIONAL STUFF IN THE CASE OF HIGHLY DISTORTED IMAGES %%%%%%%%%%%%% | ||
154 | end; | ||
155 | |||
156 | |||
157 | Np = (n_sq_x+1)*(n_sq_y+1); | ||
158 | |||
159 | disp('Corner extraction...'); | ||
160 | |||
161 | grid_pts = cornerfinder(XX,I,winty,wintx); %%% Finds the exact corners at every points! | ||
162 | |||
163 | %save all_corners x y grid_pts | ||
164 | |||
165 | grid_pts = grid_pts - 1; % subtract 1 to bring the origin to (0,0) instead of (1,1) in matlab (not necessary in C) | ||
166 | |||
167 | |||
168 | % Global Homography from plane to pixel coordinates: | ||
169 | |||
170 | H_total = [1 0 -1 ; 0 1 -1 ; 0 0 1]*Homo*[1 0 0;0 -1 1;0 0 1]*[1/W 0 0 ; 0 1/L 0; 0 0 1]; | ||
171 | % WARNING!!! the first matrix (on the left side) takes care of the transformation of the pixel cooredinates by -1 (previous line) | ||
172 | % If it is not done, then this matrix should not appear (in C) | ||
173 | H_total = H_total / H_total(3,3); | ||
174 | |||
175 | |||
176 | ind_corners = [1 n_sq_x+1 (n_sq_x+1)*n_sq_y+1 (n_sq_x+1)*(n_sq_y+1)]; % index of the 4 corners | ||
177 | ind_orig = (n_sq_x+1)*n_sq_y + 1; | ||
178 | xorig = grid_pts(1,ind_orig); | ||
179 | yorig = grid_pts(2,ind_orig); | ||
180 | dxpos = mean([grid_pts(:,ind_orig) grid_pts(:,ind_orig+1)]'); | ||
181 | dypos = mean([grid_pts(:,ind_orig) grid_pts(:,ind_orig-n_sq_x-1)]'); | ||
182 | |||
183 | |||
184 | x_box_kk = [grid_pts(1,:)-(wintx+.5);grid_pts(1,:)+(wintx+.5);grid_pts(1,:)+(wintx+.5);grid_pts(1,:)-(wintx+.5);grid_pts(1,:)-(wintx+.5)]; | ||
185 | y_box_kk = [grid_pts(2,:)-(winty+.5);grid_pts(2,:)-(winty+.5);grid_pts(2,:)+(winty+.5);grid_pts(2,:)+(winty+.5);grid_pts(2,:)-(winty+.5)]; | ||
186 | |||
187 | |||
188 | figure(3); | ||
189 | image(I); colormap(map); hold on; | ||
190 | plot(grid_pts(1,:)+1,grid_pts(2,:)+1,'r+'); | ||
191 | plot(x_box_kk+1,y_box_kk+1,'-b'); | ||
192 | plot(grid_pts(1,ind_corners)+1,grid_pts(2,ind_corners)+1,'mo'); | ||
193 | plot(xorig+1,yorig+1,'*m'); | ||
194 | h = text(xorig-15,yorig-15,'O'); | ||
195 | set(h,'Color','m','FontSize',14); | ||
196 | h2 = text(dxpos(1)-10,dxpos(2)-10,'dX'); | ||
197 | set(h2,'Color','g','FontSize',14); | ||
198 | h3 = text(dypos(1)-25,dypos(2)-3,'dY'); | ||
199 | set(h3,'Color','g','FontSize',14); | ||
200 | xlabel('Xc (in camera frame)'); | ||
201 | ylabel('Yc (in camera frame)'); | ||
202 | title('Extracted corners'); | ||
203 | zoom on; | ||
204 | drawnow; | ||
205 | hold off; | ||
206 | |||
207 | |||
208 | Xi = reshape(([0:n_sq_x]*dX)'*ones(1,n_sq_y+1),Np,1)'; | ||
209 | Yi = reshape(ones(n_sq_x+1,1)*[n_sq_y:-1:0]*dY,Np,1)'; | ||
210 | Zi = zeros(1,Np); | ||
211 | |||
212 | Xgrid = [Xi;Yi;Zi]; | ||
213 | |||
214 | |||
215 | % All the point coordinates (on the image, and in 3D) - for global optimization: | ||
216 | |||
217 | x = grid_pts; | ||
218 | X = Xgrid; | ||
219 | |||
220 | |||
221 | % The left pannel info: | ||
222 | |||
223 | xl = x; | ||
224 | Xl = X; | ||
225 | nl_sq_x = n_sq_x; | ||
226 | nl_sq_y = n_sq_y; | ||
227 | Hl = H_total; | ||
228 | |||
229 | |||
230 | |||
231 | |||
232 | |||
233 | |||
234 | %%%%%%%%%%%%%%%%%%%%%%%%% RIGHT PATTERN ACQUISITION %%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||
235 | |||
236 | |||
237 | x1 = a10(1)/a10(3); | ||
238 | x4 = a11(1)/a11(3); | ||
239 | |||
240 | y1 = a10(2)/a10(3); | ||
241 | y4 = a11(2)/a11(3); | ||
242 | |||
243 | |||
244 | figure(2); | ||
245 | hold on; | ||
246 | plot([x1 x4],[y1 y4],'c-'); | ||
247 | plot([x1 x4],[y1 y4],'co'); | ||
248 | hold off; | ||
249 | |||
250 | title(['Click on the two remaining extreme corners of the right rectangular pattern... Image ' num2str(kk)]); | ||
251 | |||
252 | disp('Click on the two remaining extreme corners of the right rectangular pattern...'); | ||
253 | |||
254 | [x,y] = ginput3(2); | ||
255 | |||
256 | [Xc,good,bad,type] = cornerfinder([x';y'],I,winty,wintx); % the four corners | ||
257 | |||
258 | x = Xc(1,:)'; | ||
259 | y = Xc(2,:)'; | ||
260 | |||
261 | [y,indy] = sort(y); | ||
262 | x = x(indy); | ||
263 | |||
264 | x2 = x(2); | ||
265 | x3 = x(1); | ||
266 | |||
267 | y2 = y(2); | ||
268 | y3 = y(1); | ||
269 | |||
270 | |||
271 | x = [x1;x2;x3;x4]; | ||
272 | y = [y1;y2;y3;y4]; | ||
273 | |||
274 | figure(2); hold on; | ||
275 | plot([x;x(1)],[y;y(1)],'c-'); | ||
276 | plot(x,y,'oc'); | ||
277 | hx=text((x(4)+x(3))/2,(y(4)+y(3))/2 - 20,'X'); | ||
278 | set(hx,'color','c','Fontsize',14); | ||
279 | hy=text((x(4)+x(1))/2-20,(y(4)+y(1))/2,'Y'); | ||
280 | set(hy,'color','c','Fontsize',14); | ||
281 | hold off; | ||
282 | drawnow; | ||
283 | |||
284 | |||
285 | % Try to automatically count the number of squares in the grid | ||
286 | |||
287 | n_sq_x1 = count_squares(I,x1,y1,x2,y2,wintx); | ||
288 | n_sq_x2 = count_squares(I,x3,y3,x4,y4,wintx); | ||
289 | n_sq_y1 = count_squares(I,x2,y2,x3,y3,wintx); | ||
290 | n_sq_y2 = count_squares(I,x4,y4,x1,y1,wintx); | ||
291 | |||
292 | |||
293 | |||
294 | % If could not count the number of squares, enter manually | ||
295 | |||
296 | if (n_sq_x1~=n_sq_x2)|(n_sq_y1~=n_sq_y2), | ||
297 | |||
298 | |||
299 | disp('Could not count the number of squares in the grid. Enter manually.'); | ||
300 | n_sq_x = input('Number of squares along the X direction ([]=10) = '); %6 | ||
301 | if isempty(n_sq_x), n_sq_x = 10; end; | ||
302 | n_sq_y = input('Number of squares along the Y direction ([]=10) = '); %6 | ||
303 | if isempty(n_sq_y), n_sq_y = 10; end; | ||
304 | |||
305 | else | ||
306 | |||
307 | n_sq_x = n_sq_x1; | ||
308 | n_sq_y = n_sq_y1; | ||
309 | |||
310 | end; | ||
311 | |||
312 | |||
313 | if 1, | ||
314 | % Enter the size of each square | ||
315 | |||
316 | dX = input(['Size dX of each square along the X direction ([]=' num2str(dX_default) 'cm) = ']); | ||
317 | dY = input(['Size dY of each square along the Y direction ([]=' num2str(dY_default) 'cm) = ']); | ||
318 | if isempty(dX), dX = dX_default; else dX_default = dX; end; | ||
319 | if isempty(dY), dY = dY_default; else dY_default = dY; end; | ||
320 | |||
321 | else | ||
322 | |||
323 | dX = 3; | ||
324 | dY = 3; | ||
325 | |||
326 | end; | ||
327 | |||
328 | |||
329 | % Compute the inside points through computation of the planar homography (collineation) | ||
330 | |||
331 | a00 = [x(1);y(1);1]; | ||
332 | a10 = [x(2);y(2);1]; | ||
333 | a11 = [x(3);y(3);1]; | ||
334 | a01 = [x(4);y(4);1]; | ||
335 | |||
336 | |||
337 | % Compute the planart collineation: (return the normalization matrice as well) | ||
338 | |||
339 | [Homo,Hnorm,inv_Hnorm] = compute_collineation (a00, a10, a11, a01); | ||
340 | |||
341 | |||
342 | % Build the grid using the planar collineation: | ||
343 | |||
344 | x_l = ((0:n_sq_x)'*ones(1,n_sq_y+1))/n_sq_x; | ||
345 | y_l = (ones(n_sq_x+1,1)*(0:n_sq_y))/n_sq_y; | ||
346 | pts = [x_l(:) y_l(:) ones((n_sq_x+1)*(n_sq_y+1),1)]'; | ||
347 | |||
348 | XX = Homo*pts; | ||
349 | XX = XX(1:2,:) ./ (ones(2,1)*XX(3,:)); | ||
350 | |||
351 | |||
352 | % Complete size of the rectangle | ||
353 | |||
354 | W = n_sq_x*dX; | ||
355 | L = n_sq_y*dY; | ||
356 | |||
357 | |||
358 | |||
359 | if 1, | ||
360 | %%%%%%%%%%%%%%%%%%%%%%%% ADDITIONAL STUFF IN THE CASE OF HIGHLY DISTORTED IMAGES %%%%%%%%%%%%% | ||
361 | figure(2); | ||
362 | hold on; | ||
363 | plot(XX(1,:),XX(2,:),'r+'); | ||
364 | title('The red crosses should be close to the image corners'); | ||
365 | hold off; | ||
366 | |||
367 | disp('If the guessed grid corners (red crosses on the image) are not close to the actual corners,'); | ||
368 | disp('it is necessary to enter an initial guess for the radial distortion factor kc (useful for subpixel detection)'); | ||
369 | quest_distort = input('Need of an initial guess for distortion? ([]=no, other=yes) '); | ||
370 | |||
371 | quest_distort = ~isempty(quest_distort); | ||
372 | |||
373 | if quest_distort, | ||
374 | % Estimation of focal length: | ||
375 | c_g = [size(I,2);size(I,1)]/2 + .5; | ||
376 | f_g = Distor2Calib(0,[[x(1) x(2) x(4) x(3)] - c_g(1);[y(1) y(2) y(4) y(3)] - c_g(2)],1,1,4,W,L,[-W/2 W/2 W/2 -W/2;L/2 L/2 -L/2 -L/2; 0 0 0 0],100,1,1); | ||
377 | f_g = mean(f_g); | ||
378 | script_fit_distortion; | ||
379 | end; | ||
380 | %%%%%%%%%%%%%%%%%%%%% END ADDITIONAL STUFF IN THE CASE OF HIGHLY DISTORTED IMAGES %%%%%%%%%%%%% | ||
381 | end; | ||
382 | |||
383 | |||
384 | Np = (n_sq_x+1)*(n_sq_y+1); | ||
385 | |||
386 | disp('Corner extraction...'); | ||
387 | |||
388 | grid_pts = cornerfinder(XX,I,winty,wintx); %%% Finds the exact corners at every points! | ||
389 | |||
390 | %save all_corners x y grid_pts | ||
391 | |||
392 | grid_pts = grid_pts - 1; % subtract 1 to bring the origin to (0,0) instead of (1,1) in matlab (not necessary in C) | ||
393 | |||
394 | |||
395 | % Global Homography from plane to pixel coordinates: | ||
396 | |||
397 | H_total = [1 0 -1 ; 0 1 -1 ; 0 0 1]*Homo*[1 0 0;0 -1 1;0 0 1]*[1/W 0 0 ; 0 1/L 0; 0 0 1]; | ||
398 | % WARNING!!! the first matrix (on the left side) takes care of the transformation of the pixel cooredinates by -1 (previous line) | ||
399 | % If it is not done, then this matrix should not appear (in C) | ||
400 | H_total = H_total / H_total(3,3); | ||
401 | |||
402 | |||
403 | ind_corners = [1 n_sq_x+1 (n_sq_x+1)*n_sq_y+1 (n_sq_x+1)*(n_sq_y+1)]; % index of the 4 corners | ||
404 | ind_orig = (n_sq_x+1)*n_sq_y + 1; | ||
405 | xorig = grid_pts(1,ind_orig); | ||
406 | yorig = grid_pts(2,ind_orig); | ||
407 | dxpos = mean([grid_pts(:,ind_orig) grid_pts(:,ind_orig+1)]'); | ||
408 | dypos = mean([grid_pts(:,ind_orig) grid_pts(:,ind_orig-n_sq_x-1)]'); | ||
409 | |||
410 | |||
411 | x_box_kk = [grid_pts(1,:)-(wintx+.5);grid_pts(1,:)+(wintx+.5);grid_pts(1,:)+(wintx+.5);grid_pts(1,:)-(wintx+.5);grid_pts(1,:)-(wintx+.5)]; | ||
412 | y_box_kk = [grid_pts(2,:)-(winty+.5);grid_pts(2,:)-(winty+.5);grid_pts(2,:)+(winty+.5);grid_pts(2,:)+(winty+.5);grid_pts(2,:)-(winty+.5)]; | ||
413 | |||
414 | |||
415 | figure(3); | ||
416 | hold on; | ||
417 | plot(grid_pts(1,:)+1,grid_pts(2,:)+1,'r+'); | ||
418 | plot(x_box_kk+1,y_box_kk+1,'-b'); | ||
419 | plot(grid_pts(1,ind_corners)+1,grid_pts(2,ind_corners)+1,'mo'); | ||
420 | plot(xorig+1,yorig+1,'*m'); | ||
421 | h = text(xorig-15,yorig-15,'O'); | ||
422 | set(h,'Color','m','FontSize',14); | ||
423 | h2 = text(dxpos(1)-10,dxpos(2)-10,'dX'); | ||
424 | set(h2,'Color','g','FontSize',14); | ||
425 | h3 = text(dypos(1)-25,dypos(2)-3,'dY'); | ||
426 | set(h3,'Color','g','FontSize',14); | ||
427 | xlabel('Xc (in camera frame)'); | ||
428 | ylabel('Yc (in camera frame)'); | ||
429 | title('Extracted corners'); | ||
430 | zoom on; | ||
431 | drawnow; | ||
432 | hold off; | ||
433 | |||
434 | |||
435 | Xi = reshape(([0:n_sq_x]*dX)'*ones(1,n_sq_y+1),Np,1)'; | ||
436 | Yi = reshape(ones(n_sq_x+1,1)*[n_sq_y:-1:0]*dY,Np,1)'; | ||
437 | Zi = zeros(1,Np); | ||
438 | |||
439 | Xgrid = [Xi;Yi;Zi]; | ||
440 | |||
441 | |||
442 | % All the point coordinates (on the image, and in 3D) - for global optimization: | ||
443 | |||
444 | x = grid_pts; | ||
445 | X = Xgrid; | ||
446 | |||
447 | |||
448 | % The right pannel info: | ||
449 | |||
450 | xr = x; | ||
451 | Xr = X; | ||
452 | nr_sq_x = n_sq_x; | ||
453 | nr_sq_y = n_sq_y; | ||
454 | Hr = H_total; | ||
455 | |||
456 | |||
457 | |||
458 | %%%%%%%% REGROUP THE LEFT AND RIHT PATTERNS %%%%%%%%%%%%% | ||
459 | |||
460 | |||
461 | Xr2 = [0 0 1;0 1 0;-1 0 0]*Xr + [dX*nl_sq_x;0;0]*ones(1,length(Xr)); | ||
462 | |||
463 | |||
464 | x = [xl xr]; | ||
465 | |||
466 | X = [Xl Xr2]; | ||
467 | |||
468 | |||
469 | |||
470 | eval(['x_' num2str(kk) ' = x;']); | ||
471 | eval(['X_' num2str(kk) ' = X;']); | ||
472 | |||
473 | eval(['nl_sq_x_' num2str(kk) ' = nl_sq_x;']); | ||
474 | eval(['nl_sq_y_' num2str(kk) ' = nl_sq_y;']); | ||
475 | |||
476 | eval(['nr_sq_x_' num2str(kk) ' = nr_sq_x;']); | ||
477 | eval(['nr_sq_y_' num2str(kk) ' = nr_sq_y;']); | ||
478 | |||
479 | % Save the global planar homography: | ||
480 | |||
481 | eval(['Hl_' num2str(kk) ' = Hl;']); | ||
482 | eval(['Hr_' num2str(kk) ' = Hr;']); \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/comp_distortion.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/comp_distortion.m new file mode 100755 index 0000000..a0f03de --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/comp_distortion.m | |||
@@ -0,0 +1,38 @@ | |||
1 | function [x_comp] = comp_distortion(x_dist,k2); | ||
2 | |||
3 | % [x_comp] = comp_distortion(x_dist,k2); | ||
4 | % | ||
5 | % compensates the radial distortion of the camera | ||
6 | % on the image plane. | ||
7 | % | ||
8 | % x_dist : the image points got without considering the | ||
9 | % radial distortion. | ||
10 | % x : The image plane points after correction for the distortion | ||
11 | % | ||
12 | % x and x_dist are 2xN arrays | ||
13 | % | ||
14 | % NOTE : This compensation has to be done after the substraction | ||
15 | % of the center of projection, and division by the focal | ||
16 | % length. | ||
17 | % | ||
18 | % (do it up to a second order approximation) | ||
19 | |||
20 | [two,N] = size(x_dist); | ||
21 | |||
22 | if (two ~= 2 ), | ||
23 | error('ERROR : The dimension of the points should be 2xN'); | ||
24 | end; | ||
25 | |||
26 | if length(k2) > 2, | ||
27 | [x_comp] = comp_distortion_oulu(x_dist,k2); | ||
28 | else | ||
29 | |||
30 | radius_2= x_dist(1,:).^2 + x_dist(2,:).^2; | ||
31 | radial_distortion = 1 + ones(2,1)*(k2 * radius_2); | ||
32 | radius_2_comp = (x_dist(1,:).^2 + x_dist(2,:).^2) ./ radial_distortion(1,:); | ||
33 | radial_distortion = 1 + ones(2,1)*(k2 * radius_2_comp); | ||
34 | x_comp = x_dist ./ radial_distortion; | ||
35 | |||
36 | end; | ||
37 | |||
38 | %% Function completely checked : It works fine !!! \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/comp_distortion2.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/comp_distortion2.m new file mode 100755 index 0000000..532ee9a --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/comp_distortion2.m | |||
@@ -0,0 +1,71 @@ | |||
1 | function [x_comp] = comp_distortion(x_dist,k2); | ||
2 | |||
3 | % [x_comp] = comp_distortion(x_dist,k2); | ||
4 | % | ||
5 | % compensates the radial distortion of the camera | ||
6 | % on the image plane. | ||
7 | % | ||
8 | % x_dist : the image points got without considering the | ||
9 | % radial distortion. | ||
10 | % k2: Radial distortion factor | ||
11 | % | ||
12 | % x : The image plane points after correction for the distortion | ||
13 | % | ||
14 | % x and x_dist are 2xN arrays | ||
15 | % | ||
16 | % NOTE : This compensation has to be done after the substraction | ||
17 | % of the center of projection, and division by the focal | ||
18 | % length. | ||
19 | % | ||
20 | % Solve for cubic roots using method from Numerical Recipes in C 2nd Ed. | ||
21 | % pages 184-185. | ||
22 | |||
23 | |||
24 | % California Institute of Technology | ||
25 | % (c) Jean-Yves Bouguet - April 27th, 1998 | ||
26 | |||
27 | % fully checked! JYB, april 27th, 1998 - 2am | ||
28 | |||
29 | if k2 ~= 0, | ||
30 | |||
31 | [two,N] = size(x_dist); | ||
32 | |||
33 | if (two ~= 2 ), | ||
34 | error('ERROR : The dimension of the points should be 2xN'); | ||
35 | end; | ||
36 | |||
37 | |||
38 | ph = atan2(x_dist(2,:),x_dist(1,:)); | ||
39 | |||
40 | Q = -1/(3*k2); | ||
41 | R = -x_dist(1,:)./(2*k2*cos(ph)); | ||
42 | |||
43 | R2 = R.^2; | ||
44 | Q3 = Q^3; | ||
45 | |||
46 | |||
47 | if k2 < 0, | ||
48 | |||
49 | % this works in all practical situations (it starts failing for very large | ||
50 | % values of k2) | ||
51 | |||
52 | th = acos(R./sqrt(Q3)); | ||
53 | r = -2*sqrt(Q)*cos((th-2*pi)/3); | ||
54 | |||
55 | else | ||
56 | |||
57 | % note: this always works, even for ridiculous values of k2 | ||
58 | |||
59 | A = (sqrt(R2-Q3)-R).^(1/3); | ||
60 | B = Q*(1./A); | ||
61 | r = (A+B); | ||
62 | |||
63 | end; | ||
64 | |||
65 | x_comp = [r.*cos(ph); r.*sin(ph)]; | ||
66 | |||
67 | else | ||
68 | |||
69 | x_comp = x_dist; | ||
70 | |||
71 | end; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/comp_distortion_oulu.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/comp_distortion_oulu.m new file mode 100755 index 0000000..67d02d5 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/comp_distortion_oulu.m | |||
@@ -0,0 +1,47 @@ | |||
1 | function [x] = comp_distortion_oulu(xd,k); | ||
2 | |||
3 | %comp_distortion_oulu.m | ||
4 | % | ||
5 | %[x] = comp_distortion_oulu(xd,k) | ||
6 | % | ||
7 | %Compensates for radial and tangential distortion. Model From Oulu university. | ||
8 | %For more informatino about the distortion model, check the forward projection mapping function: | ||
9 | %project_points.m | ||
10 | % | ||
11 | %INPUT: xd: distorted (normalized) point coordinates in the image plane (2xN matrix) | ||
12 | % k: Distortion coefficients (radial and tangential) (4x1 vector) | ||
13 | % | ||
14 | %OUTPUT: x: undistorted (normalized) point coordinates in the image plane (2xN matrix) | ||
15 | % | ||
16 | %Method: Iterative method for compensation. | ||
17 | % | ||
18 | %NOTE: This compensation has to be done after the subtraction | ||
19 | % of the principal point, and division by the focal length. | ||
20 | |||
21 | |||
22 | if length(k) < 4, | ||
23 | |||
24 | [x] = comp_distortion(xd,k); | ||
25 | |||
26 | else | ||
27 | |||
28 | |||
29 | k1 = k(1); | ||
30 | k2 = k(2); | ||
31 | p1 = k(3); | ||
32 | p2 = k(4); | ||
33 | |||
34 | x = xd; % initial guess | ||
35 | |||
36 | for kk=1:5; | ||
37 | |||
38 | r_2 = sum(x.^2); | ||
39 | k_radial = 1 + k1 * r_2 + k2 * r_2.^2; | ||
40 | delta_x = [2*p1*x(1,:).*x(2,:) + p2*(r_2 + 2*x(1,:).^2) ; | ||
41 | p1 * (r_2 + 2*x(2,:).^2)+2*p2*x(1,:).*x(2,:)]; | ||
42 | x = (xd - delta_x)./(ones(2,1)*k_radial); | ||
43 | |||
44 | end; | ||
45 | |||
46 | end; | ||
47 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/comp_error_calib.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/comp_error_calib.m new file mode 100755 index 0000000..c7bf662 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/comp_error_calib.m | |||
@@ -0,0 +1,46 @@ | |||
1 | %%%%%%%%%%%%%%%%%%%% RECOMPUTES THE REPROJECTION ERROR %%%%%%%%%%%%%%%%%%%%%%%% | ||
2 | |||
3 | check_active_images; | ||
4 | |||
5 | % Reproject the patterns on the images, and compute the pixel errors: | ||
6 | |||
7 | ex = []; % Global error vector | ||
8 | x = []; % Detected corners on the image plane | ||
9 | y = []; % Reprojected points | ||
10 | |||
11 | if ~exist('alpha_c'), | ||
12 | alpha_c = 0; | ||
13 | end; | ||
14 | |||
15 | for kk = 1:n_ima, | ||
16 | |||
17 | eval(['omckk = omc_' num2str(kk) ';']); | ||
18 | eval(['Tckk = Tc_' num2str(kk) ';']); | ||
19 | |||
20 | if active_images(kk) & (~isnan(omckk(1,1))), | ||
21 | |||
22 | %Rkk = rodrigues(omckk); | ||
23 | |||
24 | eval(['y_' num2str(kk) ' = project_points2(X_' num2str(kk) ',omckk,Tckk,fc,cc,kc,alpha_c);']); | ||
25 | |||
26 | eval(['ex_' num2str(kk) ' = x_' num2str(kk) ' -y_' num2str(kk) ';']); | ||
27 | |||
28 | eval(['x_kk = x_' num2str(kk) ';']); | ||
29 | |||
30 | eval(['ex = [ex ex_' num2str(kk) '];']); | ||
31 | eval(['x = [x x_' num2str(kk) '];']); | ||
32 | eval(['y = [y y_' num2str(kk) '];']); | ||
33 | |||
34 | else | ||
35 | |||
36 | % eval(['y_' num2str(kk) ' = NaN*ones(2,1);']); | ||
37 | |||
38 | |||
39 | % If inactivated image, the error does not make sense: | ||
40 | eval(['ex_' num2str(kk) ' = NaN*ones(2,1);']); | ||
41 | |||
42 | end; | ||
43 | |||
44 | end; | ||
45 | |||
46 | err_std = std(ex')'; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/compute_collineation.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/compute_collineation.m new file mode 100755 index 0000000..809c309 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/compute_collineation.m | |||
@@ -0,0 +1,66 @@ | |||
1 | function [H,Hnorm,inv_Hnorm] = compute_collineation (a00, a10, a11, a01); | ||
2 | |||
3 | % new formalism using homographies | ||
4 | |||
5 | a00 = a00 / a00(3); | ||
6 | a10 = a10 / a10(3); | ||
7 | a11 = a11 / a11(3); | ||
8 | a01 = a01 / a01(3); | ||
9 | |||
10 | |||
11 | % Prenormalization of point coordinates (very important): | ||
12 | % (Affine normalization) | ||
13 | |||
14 | ax = [a00(1);a10(1);a11(1);a01(1)]; | ||
15 | ay = [a00(2);a10(2);a11(2);a01(2)]; | ||
16 | |||
17 | mxx = mean(ax); | ||
18 | myy = mean(ay); | ||
19 | ax = ax - mxx; | ||
20 | ay = ay - myy; | ||
21 | |||
22 | scxx = mean(abs(ax)); | ||
23 | scyy = mean(abs(ay)); | ||
24 | |||
25 | |||
26 | Hnorm = [1/scxx 0 -mxx/scxx;0 1/scyy -myy/scyy;0 0 1]; | ||
27 | inv_Hnorm = [scxx 0 mxx ; 0 scyy myy; 0 0 1]; | ||
28 | |||
29 | |||
30 | a00n = Hnorm*a00; | ||
31 | a10n = Hnorm*a10; | ||
32 | a11n = Hnorm*a11; | ||
33 | a01n = Hnorm*a01; | ||
34 | |||
35 | |||
36 | % Computation of the vanishing points: | ||
37 | |||
38 | V1n = cross(cross(a00n,a10n),cross(a01n,a11n)); | ||
39 | V2n = cross(cross(a00n,a01n),cross(a10n,a11n)); | ||
40 | |||
41 | V1 = inv_Hnorm*V1n; | ||
42 | V2 = inv_Hnorm*V2n; | ||
43 | |||
44 | |||
45 | % Normalizaion of the vanishing points: | ||
46 | |||
47 | V1n = V1n/norm(V1n); | ||
48 | V2n = V2n/norm(V2n); | ||
49 | |||
50 | |||
51 | % Closed-form solution of the coefficients: | ||
52 | |||
53 | alpha_x = (a10n(2)*a00n(1) - a10n(1)*a00n(2))/(V1n(2)*a10n(1)-V1n(1)*a10n(2)); | ||
54 | |||
55 | alpha_y = (a01n(2)*a00n(1) - a01n(1)*a00n(2))/(V2n(2)*a01n(1)-V2n(1)*a01n(2)); | ||
56 | |||
57 | |||
58 | % Remaining Homography | ||
59 | |||
60 | Hrem = [alpha_x*V1n alpha_y*V2n a00n]; | ||
61 | |||
62 | |||
63 | % Final homography: | ||
64 | |||
65 | H = inv_Hnorm*Hrem; | ||
66 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/compute_extrinsic.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/compute_extrinsic.m new file mode 100755 index 0000000..5217351 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/compute_extrinsic.m | |||
@@ -0,0 +1,123 @@ | |||
1 | function [omckk,Tckk,Rckk,H,x,ex,JJ] = compute_extrinsic(x_kk,X_kk,fc,cc,kc,alpha_c,MaxIter,thresh_cond), | ||
2 | |||
3 | %compute_extrinsic | ||
4 | % | ||
5 | %[omckk,Tckk,Rckk,H,x,ex] = compute_extrinsic(x_kk,X_kk,fc,cc,kc,alpha_c) | ||
6 | % | ||
7 | %Computes the extrinsic parameters attached to a 3D structure X_kk given its projection | ||
8 | %on the image plane x_kk and the intrinsic camera parameters fc, cc and kc. | ||
9 | %Works with planar and non-planar structures. | ||
10 | % | ||
11 | %INPUT: x_kk: Feature locations on the images | ||
12 | % X_kk: Corresponding grid coordinates | ||
13 | % fc: Camera focal length | ||
14 | % cc: Principal point coordinates | ||
15 | % kc: Distortion coefficients | ||
16 | % alpha_c: Skew coefficient | ||
17 | % | ||
18 | %OUTPUT: omckk: 3D rotation vector attached to the grid positions in space | ||
19 | % Tckk: 3D translation vector attached to the grid positions in space | ||
20 | % Rckk: 3D rotation matrices corresponding to the omc vectors | ||
21 | % H: Homography between points on the grid and points on the image plane (in pixel) | ||
22 | % This makes sense only if the planar that is used in planar. | ||
23 | % x: Reprojections of the points on the image plane | ||
24 | % ex: Reprojection error: ex = x_kk - x; | ||
25 | % | ||
26 | %Method: Computes the normalized point coordinates, then computes the 3D pose | ||
27 | % | ||
28 | %Important functions called within that program: | ||
29 | % | ||
30 | %normalize: Computes the normalize image point coordinates. | ||
31 | % | ||
32 | %pose3D: Computes the 3D pose of the structure given the normalized image projection. | ||
33 | % | ||
34 | %project_points.m: Computes the 2D image projections of a set of 3D points | ||
35 | |||
36 | |||
37 | |||
38 | if nargin < 8, | ||
39 | thresh_cond = inf; | ||
40 | end; | ||
41 | |||
42 | |||
43 | if nargin < 7, | ||
44 | MaxIter = 20; | ||
45 | end; | ||
46 | |||
47 | |||
48 | if nargin < 6, | ||
49 | alpha_c = 0; | ||
50 | if nargin < 5, | ||
51 | kc = zeros(4,1); | ||
52 | if nargin < 4, | ||
53 | cc = zeros(2,1); | ||
54 | if nargin < 3, | ||
55 | fc = ones(2,1); | ||
56 | if nargin < 2, | ||
57 | error('Need 2D projections and 3D points (in compute_extrinsic.m)'); | ||
58 | return; | ||
59 | end; | ||
60 | end; | ||
61 | end; | ||
62 | end; | ||
63 | end; | ||
64 | |||
65 | % Initialization: | ||
66 | |||
67 | [omckk,Tckk,Rckk] = compute_extrinsic_init(x_kk,X_kk,fc,cc,kc,alpha_c); | ||
68 | |||
69 | % Refinement: | ||
70 | |||
71 | [omckk,Tckk,Rckk,JJ] = compute_extrinsic_refine(omckk,Tckk,x_kk,X_kk,fc,cc,kc,alpha_c,MaxIter,thresh_cond); | ||
72 | |||
73 | |||
74 | % computation of the homography (not useful in the end) | ||
75 | |||
76 | H = [Rckk(:,1:2) Tckk]; | ||
77 | |||
78 | % Computes the reprojection error in pixels: | ||
79 | |||
80 | x = project_points2(X_kk,omckk,Tckk,fc,cc,kc,alpha_c); | ||
81 | |||
82 | ex = x_kk - x; | ||
83 | |||
84 | |||
85 | % Converts the homography in pixel units: | ||
86 | |||
87 | KK = [fc(1) alpha_c*fc(1) cc(1);0 fc(2) cc(2); 0 0 1]; | ||
88 | |||
89 | H = KK*H; | ||
90 | |||
91 | |||
92 | |||
93 | |||
94 | return; | ||
95 | |||
96 | |||
97 | % Test of compte extrinsic: | ||
98 | |||
99 | Np = 4; | ||
100 | sx = 10; | ||
101 | sy = 10; | ||
102 | sz = 5; | ||
103 | |||
104 | om = randn(3,1); | ||
105 | T = [0;0;100]; | ||
106 | |||
107 | noise = 2/1000; | ||
108 | |||
109 | XX = [sx*randn(1,Np);sy*randn(1,Np);sz*randn(1,Np)]; | ||
110 | xx = project_points(XX,om,T); | ||
111 | |||
112 | xxn = xx + noise * randn(2,Np); | ||
113 | |||
114 | [omckk,Tckk] = compute_extrinsic(xxn,XX); | ||
115 | |||
116 | [om omckk om-omckk] | ||
117 | [T Tckk T-Tckk] | ||
118 | |||
119 | figure(3); | ||
120 | plot(xx(1,:),xx(2,:),'r+'); | ||
121 | hold on; | ||
122 | plot(xxn(1,:),xxn(2,:),'g+'); | ||
123 | hold off; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/compute_extrinsic_init.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/compute_extrinsic_init.m new file mode 100755 index 0000000..2e6d821 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/compute_extrinsic_init.m | |||
@@ -0,0 +1,151 @@ | |||
1 | function [omckk,Tckk,Rckk] = compute_extrinsic_init(x_kk,X_kk,fc,cc,kc,alpha_c), | ||
2 | |||
3 | %compute_extrinsic | ||
4 | % | ||
5 | %[omckk,Tckk,Rckk] = compute_extrinsic_init(x_kk,X_kk,fc,cc,kc,alpha_c) | ||
6 | % | ||
7 | %Computes the extrinsic parameters attached to a 3D structure X_kk given its projection | ||
8 | %on the image plane x_kk and the intrinsic camera parameters fc, cc and kc. | ||
9 | %Works with planar and non-planar structures. | ||
10 | % | ||
11 | %INPUT: x_kk: Feature locations on the images | ||
12 | % X_kk: Corresponding grid coordinates | ||
13 | % fc: Camera focal length | ||
14 | % cc: Principal point coordinates | ||
15 | % kc: Distortion coefficients | ||
16 | % alpha_c: Skew coefficient | ||
17 | % | ||
18 | %OUTPUT: omckk: 3D rotation vector attached to the grid positions in space | ||
19 | % Tckk: 3D translation vector attached to the grid positions in space | ||
20 | % Rckk: 3D rotation matrices corresponding to the omc vectors | ||
21 | % | ||
22 | %Method: Computes the normalized point coordinates, then computes the 3D pose | ||
23 | % | ||
24 | %Important functions called within that program: | ||
25 | % | ||
26 | %normalize: Computes the normalize image point coordinates. | ||
27 | % | ||
28 | %pose3D: Computes the 3D pose of the structure given the normalized image projection. | ||
29 | % | ||
30 | %project_points.m: Computes the 2D image projections of a set of 3D points | ||
31 | |||
32 | |||
33 | |||
34 | if nargin < 6, | ||
35 | alpha_c = 0; | ||
36 | if nargin < 5, | ||
37 | kc = zeros(4,1); | ||
38 | if nargin < 4, | ||
39 | cc = zeros(2,1); | ||
40 | if nargin < 3, | ||
41 | fc = ones(2,1); | ||
42 | if nargin < 2, | ||
43 | error('Need 2D projections and 3D points (in compute_extrinsic.m)'); | ||
44 | return; | ||
45 | end; | ||
46 | end; | ||
47 | end; | ||
48 | end; | ||
49 | end; | ||
50 | |||
51 | |||
52 | % Compute the normalized coordinates: | ||
53 | |||
54 | xn = normalize(x_kk,fc,cc,kc,alpha_c); | ||
55 | |||
56 | |||
57 | |||
58 | Np = size(xn,2); | ||
59 | |||
60 | %% Check for planarity of the structure: | ||
61 | |||
62 | X_mean = mean(X_kk')'; | ||
63 | |||
64 | Y = X_kk - (X_mean*ones(1,Np)); | ||
65 | |||
66 | YY = Y*Y'; | ||
67 | |||
68 | [U,S,V] = svd(YY); | ||
69 | |||
70 | r = S(3,3)/S(2,2); | ||
71 | |||
72 | if (r < 1e-3)|(Np < 6), %1e-3, %1e-4, %norm(X_kk(3,:)) < eps, % Test of planarity | ||
73 | |||
74 | %fprintf(1,'Planar structure detected: r=%f\n',r); | ||
75 | |||
76 | % Transform the plane to bring it in the Z=0 plane: | ||
77 | |||
78 | R_transform = V'; | ||
79 | |||
80 | if det(R_transform) < 0, R_transform = -R_transform; end; | ||
81 | |||
82 | T_transform = -(R_transform)*X_mean; | ||
83 | |||
84 | X_new = R_transform*X_kk + T_transform*ones(1,Np); | ||
85 | |||
86 | |||
87 | % Compute the planar homography: | ||
88 | |||
89 | H = compute_homography (xn,X_new(1:2,:)); | ||
90 | |||
91 | % De-embed the motion parameters from the homography: | ||
92 | |||
93 | sc = mean([norm(H(:,1));norm(H(:,2))]); | ||
94 | |||
95 | H = H/sc; | ||
96 | |||
97 | omckk = rodrigues([H(:,1:2) cross(H(:,1),H(:,2))]); | ||
98 | Rckk = rodrigues(omckk); | ||
99 | Tckk = H(:,3); | ||
100 | |||
101 | %If Xc = Rckk * X_new + Tckk, then Xc = Rckk * R_transform * X_kk + Tckk + T_transform | ||
102 | |||
103 | Tckk = Tckk + Rckk* T_transform; | ||
104 | Rckk = Rckk * R_transform; | ||
105 | |||
106 | omckk = rodrigues(Rckk); | ||
107 | Rckk = rodrigues(omckk); | ||
108 | |||
109 | |||
110 | else | ||
111 | |||
112 | %fprintf(1,'Non planar structure detected: r=%f\n',r); | ||
113 | |||
114 | % Computes an initial guess for extrinsic parameters (works for general 3d structure, not planar!!!): | ||
115 | % The DLT method is applied here!! | ||
116 | |||
117 | J = zeros(2*Np,12); | ||
118 | |||
119 | xX = (ones(3,1)*xn(1,:)).*X_kk; | ||
120 | yX = (ones(3,1)*xn(2,:)).*X_kk; | ||
121 | |||
122 | J(1:2:end,[1 4 7]) = -X_kk'; | ||
123 | J(2:2:end,[2 5 8]) = X_kk'; | ||
124 | J(1:2:end,[3 6 9]) = xX'; | ||
125 | J(2:2:end,[3 6 9]) = -yX'; | ||
126 | J(1:2:end,12) = xn(1,:)'; | ||
127 | J(2:2:end,12) = -xn(2,:)'; | ||
128 | J(1:2:end,10) = -ones(Np,1); | ||
129 | J(2:2:end,11) = ones(Np,1); | ||
130 | |||
131 | JJ = J'*J; | ||
132 | [U,S,V] = svd(JJ); | ||
133 | |||
134 | RR = reshape(V(1:9,12),3,3); | ||
135 | |||
136 | if det(RR) < 0, | ||
137 | V(:,12) = -V(:,12); | ||
138 | RR = -RR; | ||
139 | end; | ||
140 | |||
141 | [Ur,Sr,Vr] = svd(RR); | ||
142 | |||
143 | Rckk = Ur*Vr'; | ||
144 | |||
145 | sc = norm(V(1:9,12)) / norm(Rckk(:)); | ||
146 | Tckk = V(10:12,12)/sc; | ||
147 | |||
148 | omckk = rodrigues(Rckk); | ||
149 | Rckk = rodrigues(omckk); | ||
150 | |||
151 | end; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/compute_extrinsic_refine.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/compute_extrinsic_refine.m new file mode 100755 index 0000000..a4d066c --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/compute_extrinsic_refine.m | |||
@@ -0,0 +1,113 @@ | |||
1 | function [omckk,Tckk,Rckk,JJ] = compute_extrinsic_refine(omc_init,Tc_init,x_kk,X_kk,fc,cc,kc,alpha_c,MaxIter,thresh_cond), | ||
2 | |||
3 | %compute_extrinsic | ||
4 | % | ||
5 | %[omckk,Tckk,Rckk] = compute_extrinsic_refine(x_kk,X_kk,fc,cc,kc,alpha_c,MaxIter) | ||
6 | % | ||
7 | %Computes the extrinsic parameters attached to a 3D structure X_kk given its projection | ||
8 | %on the image plane x_kk and the intrinsic camera parameters fc, cc and kc. | ||
9 | %Works with planar and non-planar structures. | ||
10 | % | ||
11 | %INPUT: x_kk: Feature locations on the images | ||
12 | % X_kk: Corresponding grid coordinates | ||
13 | % fc: Camera focal length | ||
14 | % cc: Principal point coordinates | ||
15 | % kc: Distortion coefficients | ||
16 | % alpha_c: Skew coefficient | ||
17 | % MaxIter: Maximum number of iterations | ||
18 | % | ||
19 | %OUTPUT: omckk: 3D rotation vector attached to the grid positions in space | ||
20 | % Tckk: 3D translation vector attached to the grid positions in space | ||
21 | % Rckk: 3D rotation matrices corresponding to the omc vectors | ||
22 | |||
23 | % | ||
24 | %Method: Computes the normalized point coordinates, then computes the 3D pose | ||
25 | % | ||
26 | %Important functions called within that program: | ||
27 | % | ||
28 | %normalize: Computes the normalize image point coordinates. | ||
29 | % | ||
30 | %pose3D: Computes the 3D pose of the structure given the normalized image projection. | ||
31 | % | ||
32 | %project_points.m: Computes the 2D image projections of a set of 3D points | ||
33 | |||
34 | |||
35 | if nargin < 10, | ||
36 | thresh_cond = inf; | ||
37 | end; | ||
38 | |||
39 | |||
40 | if nargin < 9, | ||
41 | MaxIter = 20; | ||
42 | end; | ||
43 | |||
44 | if nargin < 8, | ||
45 | alpha_c = 0; | ||
46 | if nargin < 7, | ||
47 | kc = zeros(4,1); | ||
48 | if nargin < 6, | ||
49 | cc = zeros(2,1); | ||
50 | if nargin < 5, | ||
51 | fc = ones(2,1); | ||
52 | if nargin < 4, | ||
53 | error('Need 2D projections and 3D points (in compute_extrinsic_refine.m)'); | ||
54 | return; | ||
55 | end; | ||
56 | end; | ||
57 | end; | ||
58 | end; | ||
59 | end; | ||
60 | |||
61 | |||
62 | % Initialization: | ||
63 | |||
64 | omckk = omc_init; | ||
65 | Tckk = Tc_init; | ||
66 | |||
67 | |||
68 | % Final optimization (minimize the reprojection error in pixel): | ||
69 | % through Gradient Descent: | ||
70 | |||
71 | param = [omckk;Tckk]; | ||
72 | |||
73 | change = 1; | ||
74 | |||
75 | iter = 0; | ||
76 | |||
77 | %keyboard; | ||
78 | |||
79 | %fprintf(1,'Gradient descent iterations: '); | ||
80 | |||
81 | while (change > 1e-10)&(iter < MaxIter), | ||
82 | |||
83 | %fprintf(1,'%d...',iter+1); | ||
84 | |||
85 | [x,dxdom,dxdT] = project_points2(X_kk,omckk,Tckk,fc,cc,kc,alpha_c); | ||
86 | |||
87 | ex = x_kk - x; | ||
88 | |||
89 | %keyboard; | ||
90 | |||
91 | JJ = [dxdom dxdT]; | ||
92 | |||
93 | if cond(JJ) > thresh_cond, | ||
94 | change = 0; | ||
95 | else | ||
96 | |||
97 | JJ2 = JJ'*JJ; | ||
98 | |||
99 | param_innov = inv(JJ2)*(JJ')*ex(:); | ||
100 | param_up = param + param_innov; | ||
101 | change = norm(param_innov)/norm(param_up); | ||
102 | param = param_up; | ||
103 | iter = iter + 1; | ||
104 | |||
105 | omckk = param(1:3); | ||
106 | Tckk = param(4:6); | ||
107 | end; | ||
108 | |||
109 | end; | ||
110 | |||
111 | %fprintf(1,'\n'); | ||
112 | |||
113 | Rckk = rodrigues(omckk); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/compute_homography.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/compute_homography.m new file mode 100755 index 0000000..fcc9003 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/compute_homography.m | |||
@@ -0,0 +1,163 @@ | |||
1 | function [H,Hnorm,inv_Hnorm] = compute_homography (m,M); | ||
2 | |||
3 | %compute_homography | ||
4 | % | ||
5 | %[H,Hnorm,inv_Hnorm] = compute_homography (m,M) | ||
6 | % | ||
7 | %Computes the planar homography between the point coordinates on the plane (M) and the image | ||
8 | %point coordinates (m). | ||
9 | % | ||
10 | %INPUT: m: homogeneous coordinates in the image plane (3xN matrix) | ||
11 | % M: homogeneous coordinates in the plane in 3D (3xN matrix) | ||
12 | % | ||
13 | %OUTPUT: H: Homography matrix (3x3 homogeneous matrix) | ||
14 | % Hnorm: Normlization matrix used on the points before homography computation | ||
15 | % (useful for numerical stability is points in pixel coordinates) | ||
16 | % inv_Hnorm: The inverse of Hnorm | ||
17 | % | ||
18 | %Definition: m ~ H*M where "~" means equal up to a non zero scalar factor. | ||
19 | % | ||
20 | %Method: First computes an initial guess for the homography through quasi-linear method. | ||
21 | % Then, if the total number of points is larger than 4, optimize the solution by minimizing | ||
22 | % the reprojection error (in the least squares sense). | ||
23 | % | ||
24 | % | ||
25 | %Important functions called within that program: | ||
26 | % | ||
27 | %comp_distortion_oulu: Undistorts pixel coordinates. | ||
28 | % | ||
29 | %compute_homography.m: Computes the planar homography between points on the grid in 3D, and the image plane. | ||
30 | % | ||
31 | %project_points.m: Computes the 2D image projections of a set of 3D points, and also returns te Jacobian | ||
32 | % matrix (derivative with respect to the intrinsic and extrinsic parameters). | ||
33 | % This function is called within the minimization loop. | ||
34 | |||
35 | |||
36 | |||
37 | |||
38 | Np = size(m,2); | ||
39 | |||
40 | if size(m,1)<3, | ||
41 | m = [m;ones(1,Np)]; | ||
42 | end; | ||
43 | |||
44 | if size(M,1)<3, | ||
45 | M = [M;ones(1,Np)]; | ||
46 | end; | ||
47 | |||
48 | |||
49 | m = m ./ (ones(3,1)*m(3,:)); | ||
50 | M = M ./ (ones(3,1)*M(3,:)); | ||
51 | |||
52 | % Prenormalization of point coordinates (very important): | ||
53 | % (Affine normalization) | ||
54 | |||
55 | ax = m(1,:); | ||
56 | ay = m(2,:); | ||
57 | |||
58 | mxx = mean(ax); | ||
59 | myy = mean(ay); | ||
60 | ax = ax - mxx; | ||
61 | ay = ay - myy; | ||
62 | |||
63 | scxx = mean(abs(ax)); | ||
64 | scyy = mean(abs(ay)); | ||
65 | |||
66 | |||
67 | Hnorm = [1/scxx 0 -mxx/scxx;0 1/scyy -myy/scyy;0 0 1]; | ||
68 | inv_Hnorm = [scxx 0 mxx ; 0 scyy myy; 0 0 1]; | ||
69 | |||
70 | mn = Hnorm*m; | ||
71 | |||
72 | % Compute the homography between m and mn: | ||
73 | |||
74 | % Build the matrix: | ||
75 | |||
76 | L = zeros(2*Np,9); | ||
77 | |||
78 | L(1:2:2*Np,1:3) = M'; | ||
79 | L(2:2:2*Np,4:6) = M'; | ||
80 | L(1:2:2*Np,7:9) = -((ones(3,1)*mn(1,:)).* M)'; | ||
81 | L(2:2:2*Np,7:9) = -((ones(3,1)*mn(2,:)).* M)'; | ||
82 | |||
83 | if Np > 4, | ||
84 | L = L'*L; | ||
85 | end; | ||
86 | |||
87 | [U,S,V] = svd(L); | ||
88 | |||
89 | hh = V(:,9); | ||
90 | hh = hh/hh(9); | ||
91 | |||
92 | Hrem = reshape(hh,3,3)'; | ||
93 | %Hrem = Hrem / Hrem(3,3); | ||
94 | |||
95 | % Final homography: | ||
96 | |||
97 | H = inv_Hnorm*Hrem; | ||
98 | |||
99 | |||
100 | %%% Homography refinement if there are more than 4 points: | ||
101 | |||
102 | if Np > 4, | ||
103 | |||
104 | % Final refinement: | ||
105 | |||
106 | hhv = reshape(H',9,1); | ||
107 | hhv = hhv(1:8); | ||
108 | |||
109 | for iter=1:10, | ||
110 | |||
111 | mrep = H * M; | ||
112 | |||
113 | J = zeros(2*Np,8); | ||
114 | |||
115 | MMM = (M ./ (ones(3,1)*mrep(3,:))); | ||
116 | |||
117 | J(1:2:2*Np,1:3) = -MMM'; | ||
118 | J(2:2:2*Np,4:6) = -MMM'; | ||
119 | |||
120 | mrep = mrep ./ (ones(3,1)*mrep(3,:)); | ||
121 | |||
122 | m_err = m(1:2,:) - mrep(1:2,:); | ||
123 | m_err = m_err(:); | ||
124 | |||
125 | MMM2 = (ones(3,1)*mrep(1,:)) .* MMM; | ||
126 | MMM3 = (ones(3,1)*mrep(2,:)) .* MMM; | ||
127 | |||
128 | J(1:2:2*Np,7:8) = MMM2(1:2,:)'; | ||
129 | J(2:2:2*Np,7:8) = MMM3(1:2,:)'; | ||
130 | |||
131 | MMM = (M ./ (ones(3,1)*mrep(3,:)))'; | ||
132 | |||
133 | hh_innov = inv(J'*J)*J'*m_err; | ||
134 | |||
135 | hhv_up = hhv - hh_innov; | ||
136 | |||
137 | H_up = reshape([hhv_up;1],3,3)'; | ||
138 | |||
139 | %norm(m_err) | ||
140 | %norm(hh_innov) | ||
141 | |||
142 | hhv = hhv_up; | ||
143 | H = H_up; | ||
144 | |||
145 | end; | ||
146 | |||
147 | end; | ||
148 | |||
149 | |||
150 | |||
151 | |||
152 | |||
153 | return; | ||
154 | |||
155 | %test of Jacobian | ||
156 | |||
157 | mrep = H*M; | ||
158 | mrep = mrep ./ (ones(3,1)*mrep(3,:)); | ||
159 | |||
160 | m_err = mrep(1:2,:) - m(1:2,:); | ||
161 | figure(8); | ||
162 | plot(m_err(1,:),m_err(2,:),'r+'); | ||
163 | std(m_err') | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/cornerfinder.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/cornerfinder.m new file mode 100755 index 0000000..9bfa51f --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/cornerfinder.m | |||
@@ -0,0 +1,215 @@ | |||
1 | function [xc,good,bad,type] = cornerfinder(xt,I,wintx,winty,wx2,wy2); | ||
2 | |||
3 | %[xc] = cornerfinder(xt,I); | ||
4 | % | ||
5 | %Finds the sub-pixel corners on the image I with initial guess xt | ||
6 | %xt and xc are 2xN matrices. The first component is the x coordinate | ||
7 | %(horizontal) and the second component is the y coordinate (vertical) | ||
8 | % | ||
9 | %Based on Harris corner finder method | ||
10 | % | ||
11 | %Finds corners to a precision below .1 pixel! | ||
12 | %Oct. 14th, 1997 - UPDATED to work with vertical and horizontal edges as well!!! | ||
13 | %Sept 1998 - UPDATED to handle diverged points: we keep the original points | ||
14 | %good is a binary vector indicating wether a feature point has been properly | ||
15 | %found. | ||
16 | % | ||
17 | %Add a zero zone of size wx2,wy2 | ||
18 | %July 15th, 1999 - Bug on the mask building... fixed + change to Gaussian mask with higher | ||
19 | %resolution and larger number of iterations. | ||
20 | |||
21 | |||
22 | % California Institute of Technology | ||
23 | % (c) Jean-Yves Bouguet -- Oct. 14th, 1997 | ||
24 | |||
25 | |||
26 | |||
27 | line_feat = 1; % set to 1 to allow for extraction of line features. | ||
28 | |||
29 | xt = xt'; | ||
30 | xt = fliplr(xt); | ||
31 | |||
32 | |||
33 | if nargin < 4, | ||
34 | winty = 5; | ||
35 | if nargin < 3, | ||
36 | wintx = 5; | ||
37 | end; | ||
38 | end; | ||
39 | |||
40 | |||
41 | if nargin < 6, | ||
42 | wx2 = -1; | ||
43 | wy2 = -1; | ||
44 | end; | ||
45 | |||
46 | |||
47 | %mask = ones(2*wintx+1,2*winty+1); | ||
48 | mask = exp(-((-wintx:wintx)'/(wintx)).^2) * exp(-((-winty:winty)/(winty)).^2); | ||
49 | |||
50 | |||
51 | if (wx2>0) & (wy2>0), | ||
52 | if ((wintx - wx2)>=2)&((winty - wy2)>=2), | ||
53 | mask(wintx+1-wx2:wintx+1+wx2,winty+1-wy2:winty+1+wy2)= zeros(2*wx2+1,2*wy2+1); | ||
54 | end; | ||
55 | end; | ||
56 | |||
57 | offx = [-wintx:wintx]'*ones(1,2*winty+1); | ||
58 | offy = ones(2*wintx+1,1)*[-winty:winty]; | ||
59 | |||
60 | resolution = 0.005; | ||
61 | |||
62 | MaxIter = 10; | ||
63 | |||
64 | [nx,ny] = size(I); | ||
65 | N = size(xt,1); | ||
66 | |||
67 | xc = xt; % first guess... they don't move !!! | ||
68 | |||
69 | type = zeros(1,N); | ||
70 | |||
71 | |||
72 | for i=1:N, | ||
73 | |||
74 | v_extra = resolution + 1; % just larger than resolution | ||
75 | |||
76 | compt = 0; % no iteration yet | ||
77 | |||
78 | while (norm(v_extra) > resolution) & (compt<MaxIter), | ||
79 | |||
80 | cIx = xc(i,1); % | ||
81 | cIy = xc(i,2); % Coords. of the point | ||
82 | crIx = round(cIx); % on the initial image | ||
83 | crIy = round(cIy); % | ||
84 | itIx = cIx - crIx; % Coefficients | ||
85 | itIy = cIy - crIy; % to compute | ||
86 | if itIx > 0, % the sub pixel | ||
87 | vIx = [itIx 1-itIx 0]'; % accuracy. | ||
88 | else | ||
89 | vIx = [0 1+itIx -itIx]'; | ||
90 | end; | ||
91 | if itIy > 0, | ||
92 | vIy = [itIy 1-itIy 0]; | ||
93 | else | ||
94 | vIy = [0 1+itIy -itIy]; | ||
95 | end; | ||
96 | |||
97 | |||
98 | % What if the sub image is not in? | ||
99 | |||
100 | if (crIx-wintx-2 < 1), xmin=1; xmax = 2*wintx+5; | ||
101 | elseif (crIx+wintx+2 > nx), xmax = nx; xmin = nx-2*wintx-4; | ||
102 | else | ||
103 | xmin = crIx-wintx-2; xmax = crIx+wintx+2; | ||
104 | end; | ||
105 | |||
106 | if (crIy-winty-2 < 1), ymin=1; ymax = 2*winty+5; | ||
107 | elseif (crIy+winty+2 > ny), ymax = ny; ymin = ny-2*winty-4; | ||
108 | else | ||
109 | ymin = crIy-winty-2; ymax = crIy+winty+2; | ||
110 | end; | ||
111 | |||
112 | |||
113 | SI = I(xmin:xmax,ymin:ymax); % The necessary neighborhood | ||
114 | SI = conv2(conv2(SI,vIx,'same'),vIy,'same'); | ||
115 | SI = SI(2:2*wintx+4,2:2*winty+4); % The subpixel interpolated neighborhood | ||
116 | [gy,gx] = gradient(SI); % The gradient image | ||
117 | gx = gx(2:2*wintx+2,2:2*winty+2); % extraction of the useful parts only | ||
118 | gy = gy(2:2*wintx+2,2:2*winty+2); % of the gradients | ||
119 | |||
120 | px = cIx + offx; | ||
121 | py = cIy + offy; | ||
122 | |||
123 | gxx = gx .* gx .* mask; | ||
124 | gyy = gy .* gy .* mask; | ||
125 | gxy = gx .* gy .* mask; | ||
126 | |||
127 | |||
128 | bb = [sum(sum(gxx .* px + gxy .* py)); sum(sum(gxy .* px + gyy .* py))]; | ||
129 | |||
130 | a = sum(sum(gxx)); | ||
131 | b = sum(sum(gxy)); | ||
132 | c = sum(sum(gyy)); | ||
133 | |||
134 | dt = a*c - b^2; | ||
135 | |||
136 | xc2 = [c*bb(1)-b*bb(2) a*bb(2)-b*bb(1)]/dt; | ||
137 | |||
138 | |||
139 | %keyboard; | ||
140 | |||
141 | if line_feat, | ||
142 | |||
143 | G = [a b;b c]; | ||
144 | [U,S,V] = svd(G); | ||
145 | |||
146 | %keyboard; | ||
147 | |||
148 | % If non-invertible, then project the point onto the edge orthogonal: | ||
149 | |||
150 | if (S(1,1)/S(2,2) > 50), | ||
151 | % projection operation: | ||
152 | xc2 = xc2 + sum((xc(i,:)-xc2).*(V(:,2)'))*V(:,2)'; | ||
153 | type(i) = 1; | ||
154 | end; | ||
155 | |||
156 | end; | ||
157 | |||
158 | |||
159 | %keyboard; | ||
160 | |||
161 | % G = [a b;b c]; | ||
162 | % [U,S,V] = svd(G); | ||
163 | |||
164 | |||
165 | % if S(1,1)/S(2,2) > 150, | ||
166 | % bb2 = U'*bb; | ||
167 | % xc2 = (V*[bb2(1)/S(1,1) ;0])'; | ||
168 | % else | ||
169 | % xc2 = [c*bb(1)-b*bb(2) a*bb(2)-b*bb(1)]/dt; | ||
170 | % end; | ||
171 | |||
172 | |||
173 | %if (abs(a)> 50*abs(c)), | ||
174 | % xc2 = [(c*bb(1)-b*bb(2))/dt xc(i,2)]; | ||
175 | % elseif (abs(c)> 50*abs(a)) | ||
176 | % xc2 = [xc(i,1) (a*bb(2)-b*bb(1))/dt]; | ||
177 | % else | ||
178 | % xc2 = [c*bb(1)-b*bb(2) a*bb(2)-b*bb(1)]/dt; | ||
179 | % end; | ||
180 | |||
181 | %keyboard; | ||
182 | |||
183 | v_extra = xc(i,:) - xc2; | ||
184 | |||
185 | xc(i,:) = xc2; | ||
186 | |||
187 | % keyboard; | ||
188 | |||
189 | compt = compt + 1; | ||
190 | |||
191 | end | ||
192 | end; | ||
193 | |||
194 | |||
195 | % check for points that diverge: | ||
196 | |||
197 | delta_x = xc(:,1) - xt(:,1); | ||
198 | delta_y = xc(:,2) - xt(:,2); | ||
199 | |||
200 | %keyboard; | ||
201 | |||
202 | |||
203 | bad = (abs(delta_x) > wintx) | (abs(delta_y) > winty); | ||
204 | good = ~bad; | ||
205 | in_bad = find(bad); | ||
206 | |||
207 | % For the diverged points, keep the original guesses: | ||
208 | |||
209 | xc(in_bad,:) = xt(in_bad,:); | ||
210 | |||
211 | xc = fliplr(xc); | ||
212 | xc = xc'; | ||
213 | |||
214 | bad = bad'; | ||
215 | good = good'; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/count_squares.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/count_squares.m new file mode 100755 index 0000000..0e226c0 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/count_squares.m | |||
@@ -0,0 +1,74 @@ | |||
1 | function ns = count_squares(I,x1,y1,x2,y2,win); | ||
2 | |||
3 | %keyboard; | ||
4 | |||
5 | [ny,nx] = size(I); | ||
6 | |||
7 | lambda = [y1 - y2;x2 - x1;x1*y2 - x2*y1]; | ||
8 | |||
9 | lambda = 1/sqrt(lambda(1)^2 + lambda(2)^2) * lambda; | ||
10 | |||
11 | l1 = lambda + [0;0;win]; | ||
12 | l2 = lambda - [0;0;win]; | ||
13 | |||
14 | |||
15 | dx = x2-x1; | ||
16 | dy = y2 - y1; | ||
17 | |||
18 | |||
19 | if abs(dx) > abs(dy), | ||
20 | |||
21 | if x2 > x1, | ||
22 | xs = x1:x2; | ||
23 | else | ||
24 | xs = x1:-1:x2; | ||
25 | end; | ||
26 | |||
27 | ys = -(lambda(3) + lambda(1)*xs)/lambda(2); | ||
28 | |||
29 | else | ||
30 | |||
31 | if y2 > y1, | ||
32 | ys = y1:y2; | ||
33 | else | ||
34 | ys = y1:-1:y2; | ||
35 | end; | ||
36 | xs = -(lambda(3) + lambda(2)*ys)/lambda(1); | ||
37 | |||
38 | end; | ||
39 | |||
40 | |||
41 | |||
42 | Np = length(xs); | ||
43 | |||
44 | xs_mat = ones(2*win + 1,1)*xs; | ||
45 | ys_mat = ones(2*win + 1,1)*ys; | ||
46 | |||
47 | win_mat = (-win:win)'*ones(1,Np); | ||
48 | |||
49 | |||
50 | xs_mat2 = round(xs_mat - win_mat * lambda(1)); | ||
51 | ys_mat2 = round(ys_mat - win_mat * lambda(2)); | ||
52 | |||
53 | ind_mat = (xs_mat2 - 1) * ny + ys_mat2; | ||
54 | |||
55 | ima_patch = zeros(2*win + 1,Np); | ||
56 | |||
57 | ima_patch(:) = I(ind_mat(:)); | ||
58 | |||
59 | %ima2 = ima_patch(:,win+1:end-win); | ||
60 | |||
61 | filtk = [ones(win,Np);zeros(1,Np);-ones(win,Np)]; | ||
62 | |||
63 | out_f = sum(filtk.*ima_patch); | ||
64 | |||
65 | out_f_f = conv2(out_f,[1/4 1/2 1/4],'same'); | ||
66 | |||
67 | out_f_f = out_f_f(win+1:end-win); | ||
68 | |||
69 | ns = length(find(((out_f_f(2:end)>=0)&(out_f_f(1:end-1)<0)) | ((out_f_f(2:end)<=0)&(out_f_f(1:end-1)>0))))+1; | ||
70 | |||
71 | |||
72 | |||
73 | |||
74 | return; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/data_calib.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/data_calib.m new file mode 100755 index 0000000..422769b --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/data_calib.m | |||
@@ -0,0 +1,92 @@ | |||
1 | %%% This script alets the user enter the name of the images (base name, numbering scheme,... | ||
2 | |||
3 | |||
4 | % Checks that there are some images in the directory: | ||
5 | |||
6 | l_ras = dir('*ras'); | ||
7 | s_ras = size(l_ras,1); | ||
8 | l_bmp = dir('*bmp'); | ||
9 | s_bmp = size(l_bmp,1); | ||
10 | l_tif = dir('*tif'); | ||
11 | s_tif = size(l_tif,1); | ||
12 | l_pgm = dir('*pgm'); | ||
13 | s_pgm = size(l_pgm,1); | ||
14 | l_jpg = dir('*jpg'); | ||
15 | s_jpg = size(l_jpg,1); | ||
16 | |||
17 | s_tot = s_ras + s_bmp + s_tif + s_pgm + s_jpg; | ||
18 | |||
19 | if s_tot < 1, | ||
20 | fprintf(1,'No image in this directory in either ras, bmp, tif, pgm or jpg format. Change directory and try again.\n'); | ||
21 | break; | ||
22 | end; | ||
23 | |||
24 | |||
25 | % IF yes, display the directory content: | ||
26 | |||
27 | dir; | ||
28 | |||
29 | Nima_valid = 0; | ||
30 | |||
31 | while (Nima_valid==0), | ||
32 | |||
33 | fprintf(1,'\n'); | ||
34 | calib_name = input('Basename camera calibration images (without number nor suffix): ','s'); | ||
35 | |||
36 | format_image = '0'; | ||
37 | |||
38 | while format_image == '0', | ||
39 | |||
40 | format_image = input('Image format: ([]=''r''=''ras'', ''b''=''bmp'', ''t''=''tif'', ''p''=''pgm'', ''j''=''jpg'', ''m''=''ppm'') ','s'); | ||
41 | |||
42 | if isempty(format_image), | ||
43 | format_image = 'ras'; | ||
44 | end; | ||
45 | |||
46 | if lower(format_image(1)) == 'm', | ||
47 | format_image = 'ppm'; | ||
48 | else | ||
49 | if lower(format_image(1)) == 'b', | ||
50 | format_image = 'bmp'; | ||
51 | else | ||
52 | if lower(format_image(1)) == 't', | ||
53 | format_image = 'tif'; | ||
54 | else | ||
55 | if lower(format_image(1)) == 'p', | ||
56 | format_image = 'pgm'; | ||
57 | else | ||
58 | if lower(format_image(1)) == 'j', | ||
59 | format_image = 'jpg'; | ||
60 | else | ||
61 | if lower(format_image(1)) == 'r', | ||
62 | format_image = 'ras'; | ||
63 | else | ||
64 | disp('Invalid image format'); | ||
65 | format_image = '0'; % Ask for format once again | ||
66 | end; | ||
67 | end; | ||
68 | end; | ||
69 | end; | ||
70 | end; | ||
71 | end; | ||
72 | end; | ||
73 | |||
74 | |||
75 | check_directory; | ||
76 | |||
77 | end; | ||
78 | |||
79 | |||
80 | |||
81 | %string_save = 'save calib_data n_ima type_numbering N_slots image_numbers format_image calib_name first_num'; | ||
82 | |||
83 | %eval(string_save); | ||
84 | |||
85 | |||
86 | |||
87 | if (Nima_valid~=0), | ||
88 | % Reading images: | ||
89 | |||
90 | ima_read_calib; % may be launched from the toolbox itself | ||
91 | end; | ||
92 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/error_analysis.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/error_analysis.m new file mode 100755 index 0000000..85feac5 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/error_analysis.m | |||
@@ -0,0 +1,182 @@ | |||
1 | %%% ERROR_ANALYSIS | ||
2 | %%% This simulation helps coputing the acturacies of calibration | ||
3 | %%% Run it after the main calibration | ||
4 | |||
5 | |||
6 | |||
7 | N_runs = 200; | ||
8 | |||
9 | %N_ima_active = 4; | ||
10 | |||
11 | saving = 1; | ||
12 | |||
13 | if 1, %~exist('fc_list'), % initialization | ||
14 | |||
15 | % Initialization: | ||
16 | |||
17 | load Calib_Results; | ||
18 | check_active_images; | ||
19 | |||
20 | fc_list = []; | ||
21 | cc_list = []; | ||
22 | kc_list = []; | ||
23 | active_images_list = []; | ||
24 | |||
25 | |||
26 | for kk=1:n_ima, | ||
27 | |||
28 | eval(['omc_list_' num2str(kk) ' = [];']); | ||
29 | eval(['Tc_list_' num2str(kk) ' = [];']); | ||
30 | |||
31 | end; | ||
32 | |||
33 | %sx = median(abs(ex(1,:)))*1.4836; | ||
34 | %sy = median(abs(ex(2,:)))*1.4836; | ||
35 | |||
36 | sx = std(ex(1,:)); | ||
37 | sy = std(ex(2,:)); | ||
38 | |||
39 | % Saving the feature locations: | ||
40 | |||
41 | for kk = 1:n_ima, | ||
42 | |||
43 | eval(['x_save_' num2str(kk) ' = x_' num2str(kk) ';']); | ||
44 | eval(['y_save_' num2str(kk) ' = y_' num2str(kk) ';']); | ||
45 | |||
46 | end; | ||
47 | |||
48 | active_images_save = active_images; | ||
49 | ind_active_save = ind_active; | ||
50 | |||
51 | fc_save = fc; | ||
52 | cc_save = cc; | ||
53 | kc_save = kc; | ||
54 | KK_save = KK; | ||
55 | |||
56 | |||
57 | end; | ||
58 | |||
59 | |||
60 | |||
61 | |||
62 | %%% The main loop: | ||
63 | |||
64 | |||
65 | for ntrial = 1:N_runs, | ||
66 | |||
67 | fprintf(1,'\nRun number: %d\n',ntrial); | ||
68 | fprintf(1, '----------\n'); | ||
69 | |||
70 | for kk = 1:n_ima, | ||
71 | |||
72 | eval(['y_kk = y_save_' num2str(kk) ';']) | ||
73 | |||
74 | if active_images(kk) & ~isnan(y_kk(1,1)), | ||
75 | |||
76 | Nkk = size(y_kk,2); | ||
77 | |||
78 | x_kk_new = y_kk + [sx * randn(1,Nkk);sy*randn(1,Nkk)]; | ||
79 | |||
80 | eval(['x_' num2str(kk) ' = x_kk_new;']); | ||
81 | |||
82 | end; | ||
83 | |||
84 | end; | ||
85 | |||
86 | N_active = length(ind_active_save); | ||
87 | junk = randn(1,N_active); | ||
88 | [junk,junk2] = sort(junk); | ||
89 | |||
90 | active_images = zeros(1,n_ima); | ||
91 | active_images(ind_active_save(junk2(1:N_ima_active))) = ones(1,N_ima_active); | ||
92 | |||
93 | fc = fc_save; | ||
94 | cc = cc_save; | ||
95 | kc = kc_save; | ||
96 | KK = KK_save; | ||
97 | |||
98 | go_calib_optim; | ||
99 | |||
100 | fc_list = [fc_list fc]; | ||
101 | cc_list = [cc_list cc]; | ||
102 | kc_list = [kc_list kc]; | ||
103 | active_images_list = [active_images_list active_images']; | ||
104 | |||
105 | for kk=1:n_ima, | ||
106 | |||
107 | eval(['omc_list_' num2str(kk) ' = [ omc_list_' num2str(kk) ' omc_' num2str(kk) ' ];']); | ||
108 | eval(['Tc_list_' num2str(kk) ' = [ Tc_list_' num2str(kk) ' Tc_' num2str(kk) ' ];']); | ||
109 | |||
110 | end; | ||
111 | |||
112 | end; | ||
113 | |||
114 | |||
115 | |||
116 | |||
117 | if 0, | ||
118 | |||
119 | % Restoring the feature locations: | ||
120 | |||
121 | for kk = 1:n_ima, | ||
122 | |||
123 | eval(['x_' num2str(kk) ' = x_save_' num2str(kk) ';']); | ||
124 | |||
125 | end; | ||
126 | |||
127 | fprintf(1,'\nFinal run (with the real data)\n'); | ||
128 | fprintf(1, '------------------------------\n'); | ||
129 | |||
130 | active_images = active_images_save; | ||
131 | ind_active = ind_active_save; | ||
132 | |||
133 | go_calib_optim; | ||
134 | |||
135 | fc_list = [fc_list fc]; | ||
136 | cc_list = [cc_list cc]; | ||
137 | kc_list = [kc_list kc]; | ||
138 | active_images_list = [active_images_list active_images']; | ||
139 | |||
140 | for kk=1:n_ima, | ||
141 | |||
142 | eval(['omc_list_' num2str(kk) ' = [ omc_list_' num2str(kk) ' omc_' num2str(kk) ' ];']); | ||
143 | eval(['Tc_list_' num2str(kk) ' = [ Tc_list_' num2str(kk) ' Tc_' num2str(kk) ' ];']); | ||
144 | |||
145 | end; | ||
146 | |||
147 | end; | ||
148 | |||
149 | |||
150 | |||
151 | |||
152 | |||
153 | if saving, | ||
154 | |||
155 | disp(['Save Calibration accuracy results under Calib_Accuracies_' num2str(N_ima_active) '.mat']); | ||
156 | |||
157 | string_save = ['save Calib_Accuracies_' num2str(N_ima_active) ' active_images n_ima N_ima_active N_runs active_images_list fc cc kc fc_list cc_list kc_list']; | ||
158 | |||
159 | for kk = 1:n_ima, | ||
160 | string_save = [string_save ' Tc_list_' num2str(kk) ' omc_list_' num2str(kk) ' Tc_' num2str(kk) ' omc_' num2str(kk) ]; | ||
161 | end; | ||
162 | |||
163 | eval(string_save); | ||
164 | |||
165 | end; | ||
166 | |||
167 | |||
168 | return; | ||
169 | |||
170 | std(fc_list') | ||
171 | |||
172 | std(cc_list') | ||
173 | |||
174 | std(kc_list') | ||
175 | |||
176 | for kk = 1:n_ima, | ||
177 | |||
178 | eval(['std(Tc_list_' num2str(kk) ''')']) | ||
179 | |||
180 | end; | ||
181 | |||
182 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/export_calib_data.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/export_calib_data.m new file mode 100755 index 0000000..39506a8 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/export_calib_data.m | |||
@@ -0,0 +1,99 @@ | |||
1 | %% Export calibration data (corners + 3D coordinates) to | ||
2 | %% text files (in Willson-Heikkila's format or Zhang's format) | ||
3 | |||
4 | %% Thanks to Michael Goesele (from the Max-Planck-Institut) for the original suggestion | ||
5 | %% of adding thsi export function to the toolbox. | ||
6 | |||
7 | |||
8 | if ~exist('n_ima'), | ||
9 | fprintf(1,'ERROR: No calibration data to export\n'); | ||
10 | |||
11 | else | ||
12 | |||
13 | check_active_images; | ||
14 | |||
15 | check_extracted_images; | ||
16 | |||
17 | check_active_images; | ||
18 | |||
19 | fprintf(1,'Tool that exports calibration data to Willson-Heikkila or Zhang formats\n'); | ||
20 | |||
21 | qformat = -1; | ||
22 | |||
23 | while (qformat ~=0)&(qformat ~=1), | ||
24 | |||
25 | fprintf(1,'Two possible formats of export: 0=Willson and Heikkila, 1=Zhang\n') | ||
26 | qformat = input('Format of export (enter 0 or 1): '); | ||
27 | |||
28 | if isempty(qformat) | ||
29 | qformat = -1; | ||
30 | end; | ||
31 | |||
32 | if (qformat ~=0)&(qformat ~=1), | ||
33 | |||
34 | fprintf(1,'Invalid entry. Try again.\n') | ||
35 | |||
36 | end; | ||
37 | |||
38 | end; | ||
39 | |||
40 | if qformat == 0, | ||
41 | |||
42 | fprintf(1,'\nExport of calibration data to text files (Willson and Heikkila''s format)\n'); | ||
43 | outputfile = input('File basename: ','s'); | ||
44 | |||
45 | for kk = ind_active, | ||
46 | |||
47 | eval(['X_kk = X_' num2str(kk) ';']); | ||
48 | eval(['x_kk = x_' num2str(kk) ';']); | ||
49 | |||
50 | Xx = [X_kk ; x_kk]'; | ||
51 | |||
52 | file_name = [outputfile num2str(kk)]; | ||
53 | |||
54 | disp(['Exporting calibration data (3D world + 2D image coordinates) of image ' num2str(kk) ' to file ' file_name '...']); | ||
55 | |||
56 | eval(['save ' file_name ' Xx -ASCII']); | ||
57 | |||
58 | end; | ||
59 | |||
60 | else | ||
61 | |||
62 | fprintf(1,'\nExport of calibration data to text files (Zhang''s format)\n'); | ||
63 | modelfile = input('File basename for the 3D world coordinates: ','s'); | ||
64 | datafile = input('File basename for the 2D image coordinates: ','s'); | ||
65 | |||
66 | for kk = ind_active, | ||
67 | |||
68 | eval(['X_kk = X_' num2str(kk) ';']); | ||
69 | eval(['x_kk = x_' num2str(kk) ';']); | ||
70 | |||
71 | if ~exist(['n_sq_x_' num2str(kk)]), | ||
72 | n_sq_x = 1; | ||
73 | n_sq_y = size(X_kk,2); | ||
74 | else | ||
75 | eval(['n_sq_x = n_sq_x_' num2str(kk) ';']); | ||
76 | eval(['n_sq_y = n_sq_y_' num2str(kk) ';']); | ||
77 | end; | ||
78 | |||
79 | X = reshape(X_kk(1,:)',n_sq_x+1,n_sq_y+1)'; | ||
80 | Y = reshape(X_kk(2,:)',n_sq_x+1,n_sq_y+1)'; | ||
81 | XY = reshape([X;Y],n_sq_y+1,2*(n_sq_x+1)); | ||
82 | |||
83 | x = reshape(x_kk(1,:)',n_sq_x+1,n_sq_y+1)'; | ||
84 | y = reshape(x_kk(2,:)',n_sq_x+1,n_sq_y+1)'; | ||
85 | xy = reshape([x;y],n_sq_y+1,2*(n_sq_x+1)); | ||
86 | |||
87 | disp(['Exporting calibration data of image ' num2str(kk) ' to files ' modelfile num2str(kk) '.txt and ' datafile num2str(kk) '.txt...']); | ||
88 | |||
89 | eval(['save ' modelfile num2str(kk) '.txt XY -ASCII']); | ||
90 | eval(['save ' datafile num2str(kk) '.txt xy -ASCII']); | ||
91 | |||
92 | end; | ||
93 | |||
94 | |||
95 | end; | ||
96 | |||
97 | fprintf(1,'done\n'); | ||
98 | |||
99 | end; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/ext_calib.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/ext_calib.m new file mode 100755 index 0000000..04d6319 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/ext_calib.m | |||
@@ -0,0 +1,152 @@ | |||
1 | |||
2 | %%%%%%%%%%%%%%%%%%%% SHOW EXTRINSIC RESULTS %%%%%%%%%%%%%%%%%%%%%%%% | ||
3 | |||
4 | if ~exist('n_ima')|~exist('fc'), | ||
5 | fprintf(1,'No calibration data available.\n'); | ||
6 | return; | ||
7 | end; | ||
8 | |||
9 | check_active_images; | ||
10 | |||
11 | if ~exist(['omc_' num2str(ind_active(1))]), | ||
12 | fprintf(1,'No calibration data available.\n'); | ||
13 | return; | ||
14 | end; | ||
15 | |||
16 | %if ~exist('no_grid'), | ||
17 | no_grid = 0; | ||
18 | %end; | ||
19 | |||
20 | if ~exist(['n_sq_x_' num2str(ind_active(1))]), | ||
21 | no_grid = 1; | ||
22 | end; | ||
23 | |||
24 | |||
25 | if 0, | ||
26 | |||
27 | err_std = std(ex'); | ||
28 | |||
29 | fprintf(1,'\n\nCalibration results without principal point estimation:\n\n'); | ||
30 | fprintf(1,'Focal Length: fc = [ %3.5f %3.5f]\n',fc); | ||
31 | fprintf(1,'Principal point: cc = [ %3.5f %3.5f]\n',cc); | ||
32 | fprintf(1,'Distortion: kc = [ %3.5f %3.5f %3.5f %3.5f]\n',kc); | ||
33 | fprintf(1,'Pixel error: err = [ %3.5f %3.5f]\n\n',err_std); | ||
34 | |||
35 | end; | ||
36 | |||
37 | |||
38 | % Color code for each image: | ||
39 | |||
40 | colors = 'brgkcm'; | ||
41 | |||
42 | |||
43 | %%% Show the extrinsic parameters | ||
44 | |||
45 | if ~exist('dX'), | ||
46 | eval(['dX = norm(Tc_' num2str(ind_active(1)) ')/10;']); | ||
47 | dY = dX; | ||
48 | end; | ||
49 | |||
50 | IP = 5*dX*([0 nx-1 nx-1 0 0 ; 0 0 ny-1 ny-1 0;1 1 1 1 1] - [cc;0]*ones(1,5)) ./ ([fc;1]*ones(1,5)); | ||
51 | BASE = 5*dX*([0 1 0 0 0 0;0 0 0 1 0 0;0 0 0 0 0 1]); | ||
52 | IP = reshape([IP;BASE(:,1)*ones(1,5);IP],3,15); | ||
53 | |||
54 | figure(4); | ||
55 | [a,b] = view; | ||
56 | |||
57 | figure(4); | ||
58 | plot3(BASE(1,:),BASE(3,:),-BASE(2,:),'b-','linewidth',2'); | ||
59 | hold on; | ||
60 | plot3(IP(1,:),IP(3,:),-IP(2,:),'r-','linewidth',2); | ||
61 | text(6*dX,0,0,'X_c'); | ||
62 | text(-dX,5*dX,0,'Z_c'); | ||
63 | text(0,0,-6*dX,'Y_c'); | ||
64 | text(-dX,-dX,dX,'O_c'); | ||
65 | |||
66 | |||
67 | for kk = 1:n_ima, | ||
68 | |||
69 | if active_images(kk); | ||
70 | |||
71 | if exist(['X_' num2str(kk)]) & exist(['omc_' num2str(kk)]), | ||
72 | |||
73 | eval(['XX_kk = X_' num2str(kk) ';']); | ||
74 | |||
75 | if ~isnan(XX_kk(1,1)) | ||
76 | |||
77 | eval(['omc_kk = omc_' num2str(kk) ';']); | ||
78 | eval(['Tc_kk = Tc_' num2str(kk) ';']); | ||
79 | N_kk = size(XX_kk,2); | ||
80 | |||
81 | if ~exist(['n_sq_x_' num2str(kk)]), | ||
82 | no_grid = 1; | ||
83 | else | ||
84 | eval(['n_sq_x = n_sq_x_' num2str(kk) ';']); | ||
85 | if isnan(n_sq_x(1)), | ||
86 | no_grid = 1; | ||
87 | end; | ||
88 | end; | ||
89 | |||
90 | |||
91 | if ~no_grid, | ||
92 | eval(['n_sq_x = n_sq_x_' num2str(kk) ';']); | ||
93 | eval(['n_sq_y = n_sq_y_' num2str(kk) ';']); | ||
94 | if (N_kk ~= ((n_sq_x+1)*(n_sq_y+1))), | ||
95 | no_grid = 1; | ||
96 | end; | ||
97 | end; | ||
98 | |||
99 | if ~isnan(omc_kk(1,1)), | ||
100 | |||
101 | R_kk = rodrigues(omc_kk); | ||
102 | |||
103 | YY_kk = R_kk * XX_kk + Tc_kk * ones(1,length(XX_kk)); | ||
104 | |||
105 | uu = [-dX;-dY;0]/2; | ||
106 | uu = R_kk * uu + Tc_kk; | ||
107 | |||
108 | if ~no_grid, | ||
109 | YYx = zeros(n_sq_x+1,n_sq_y+1); | ||
110 | YYy = zeros(n_sq_x+1,n_sq_y+1); | ||
111 | YYz = zeros(n_sq_x+1,n_sq_y+1); | ||
112 | |||
113 | YYx(:) = YY_kk(1,:); | ||
114 | YYy(:) = YY_kk(2,:); | ||
115 | YYz(:) = YY_kk(3,:); | ||
116 | |||
117 | %keyboard; | ||
118 | |||
119 | figure(4); | ||
120 | hhh= mesh(YYx,YYz,-YYy); | ||
121 | set(hhh,'edgecolor',colors(rem(kk-1,6)+1),'linewidth',1); %,'facecolor','none'); | ||
122 | %plot3(YY_kk(1,:),YY_kk(3,:),-YY_kk(2,:),['o' colors(rem(kk-1,6)+1)]); | ||
123 | text(uu(1),uu(3),-uu(2),num2str(kk),'fontsize',14,'color',colors(rem(kk-1,6)+1)); | ||
124 | else | ||
125 | |||
126 | figure(4); | ||
127 | plot3(YY_kk(1,:),YY_kk(3,:),-YY_kk(2,:),['.' colors(rem(kk-1,6)+1)]); | ||
128 | text(uu(1),uu(3),-uu(2),num2str(kk),'fontsize',14,'color',colors(rem(kk-1,6)+1)); | ||
129 | |||
130 | end; | ||
131 | |||
132 | end; | ||
133 | |||
134 | end; | ||
135 | |||
136 | end; | ||
137 | |||
138 | end; | ||
139 | |||
140 | end; | ||
141 | |||
142 | figure(4);rotate3d on; | ||
143 | axis('equal'); | ||
144 | title('Extrinsic parameters'); | ||
145 | %view(60,30); | ||
146 | view(a,b); | ||
147 | hold off; | ||
148 | |||
149 | set(4,'Name','3D','NumberTitle','off'); | ||
150 | |||
151 | %fprintf(1,'To generate the complete movie associated to the optimization loop, try: check_convergence;\n'); | ||
152 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/extract_grid.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/extract_grid.m new file mode 100755 index 0000000..0cf9abe --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/extract_grid.m | |||
@@ -0,0 +1,234 @@ | |||
1 | function [x,X,n_sq_x,n_sq_y,ind_orig,ind_x,ind_y] = extract_grid(I,wintx,winty,fc,cc,kc,dX,dY); | ||
2 | |||
3 | map = gray(256); | ||
4 | |||
5 | minI = min(I(:)); | ||
6 | maxI = max(I(:)); | ||
7 | |||
8 | Id = 255*(I - minI)/(maxI - minI); | ||
9 | |||
10 | figure(2); | ||
11 | image(Id); | ||
12 | colormap(map); | ||
13 | |||
14 | |||
15 | if nargin < 2, | ||
16 | |||
17 | disp('Window size for corner finder (wintx and winty):'); | ||
18 | wintx = input('wintx ([] = 5) = '); | ||
19 | if isempty(wintx), wintx = 5; end; | ||
20 | wintx = round(wintx); | ||
21 | winty = input('winty ([] = 5) = '); | ||
22 | if isempty(winty), winty = 5; end; | ||
23 | winty = round(winty); | ||
24 | |||
25 | fprintf(1,'Window size = %dx%d\n',2*wintx+1,2*winty+1); | ||
26 | |||
27 | end; | ||
28 | |||
29 | |||
30 | |||
31 | title('Click on the four extreme corners of the rectangular pattern...'); | ||
32 | |||
33 | disp('Click on the four extreme corners of the rectangular complete pattern...'); | ||
34 | |||
35 | [x,y] = ginput3(4); | ||
36 | |||
37 | [Xc,good,bad,type] = cornerfinder([x';y'],I,winty,wintx); % the four corners | ||
38 | |||
39 | x = Xc(1,:)'; | ||
40 | y = Xc(2,:)'; | ||
41 | |||
42 | [y,indy] = sort(y); | ||
43 | x = x(indy); | ||
44 | |||
45 | if (x(2) > x(1)), | ||
46 | x4 = x(1);y4 = y(1); x3 = x(2); y3 = y(2); | ||
47 | else | ||
48 | x4 = x(2);y4 = y(2); x3 = x(1); y3 = y(1); | ||
49 | end; | ||
50 | if (x(3) > x(4)), | ||
51 | x2 = x(3);y2 = y(3); x1 = x(4); y1 = y(4); | ||
52 | else | ||
53 | x2 = x(4);y2 = y(4); x1 = x(3); y1 = y(3); | ||
54 | end; | ||
55 | |||
56 | x = [x1;x2;x3;x4]; | ||
57 | y = [y1;y2;y3;y4]; | ||
58 | |||
59 | |||
60 | figure(2); hold on; | ||
61 | plot([x;x(1)],[y;y(1)],'g-'); | ||
62 | plot(x,y,'og'); | ||
63 | hx=text((x(4)+x(3))/2,(y(4)+y(3))/2 - 20,'X'); | ||
64 | set(hx,'color','g','Fontsize',14); | ||
65 | hy=text((x(4)+x(1))/2-20,(y(4)+y(1))/2,'Y'); | ||
66 | set(hy,'color','g','Fontsize',14); | ||
67 | hold off; | ||
68 | |||
69 | |||
70 | % Try to automatically count the number of squares in the grid | ||
71 | |||
72 | n_sq_x1 = count_squares(I,x1,y1,x2,y2,wintx); | ||
73 | n_sq_x2 = count_squares(I,x3,y3,x4,y4,wintx); | ||
74 | n_sq_y1 = count_squares(I,x2,y2,x3,y3,wintx); | ||
75 | n_sq_y2 = count_squares(I,x4,y4,x1,y1,wintx); | ||
76 | |||
77 | |||
78 | |||
79 | % If could not count the number of squares, enter manually | ||
80 | |||
81 | if (n_sq_x1~=n_sq_x2)|(n_sq_y1~=n_sq_y2), | ||
82 | |||
83 | |||
84 | disp('Could not count the number of squares in the grid. Enter manually.'); | ||
85 | n_sq_x = input('Number of squares along the X direction ([]=10) = '); %6 | ||
86 | if isempty(n_sq_x), n_sq_x = 10; end; | ||
87 | n_sq_y = input('Number of squares along the Y direction ([]=10) = '); %6 | ||
88 | if isempty(n_sq_y), n_sq_y = 10; end; | ||
89 | |||
90 | else | ||
91 | |||
92 | n_sq_x = n_sq_x1; | ||
93 | n_sq_y = n_sq_y1; | ||
94 | |||
95 | end; | ||
96 | |||
97 | if ~exist('dX')|~exist('dY'), | ||
98 | |||
99 | % Enter the size of each square | ||
100 | |||
101 | dX = input(['Size dX of each square along the X direction ([]=30mm) = ']); | ||
102 | dY = input(['Size dY of each square along the Y direction ([]=30mm) = ']); | ||
103 | if isempty(dX), dX = 30; end; | ||
104 | if isempty(dY), dY = 30; end; | ||
105 | |||
106 | end; | ||
107 | |||
108 | |||
109 | % Compute the inside points through computation of the planar homography (collineation) | ||
110 | |||
111 | a00 = [x(1);y(1);1]; | ||
112 | a10 = [x(2);y(2);1]; | ||
113 | a11 = [x(3);y(3);1]; | ||
114 | a01 = [x(4);y(4);1]; | ||
115 | |||
116 | |||
117 | % Compute the planart collineation: (return the normalization matrice as well) | ||
118 | |||
119 | [Homo,Hnorm,inv_Hnorm] = compute_homography ([a00 a10 a11 a01],[0 1 1 0;0 0 1 1;1 1 1 1]); | ||
120 | |||
121 | |||
122 | % Build the grid using the planar collineation: | ||
123 | |||
124 | x_l = ((0:n_sq_x)'*ones(1,n_sq_y+1))/n_sq_x; | ||
125 | y_l = (ones(n_sq_x+1,1)*(0:n_sq_y))/n_sq_y; | ||
126 | pts = [x_l(:) y_l(:) ones((n_sq_x+1)*(n_sq_y+1),1)]'; | ||
127 | |||
128 | XX = Homo*pts; | ||
129 | XX = XX(1:2,:) ./ (ones(2,1)*XX(3,:)); | ||
130 | |||
131 | |||
132 | % Complete size of the rectangle | ||
133 | |||
134 | W = n_sq_x*dX; | ||
135 | L = n_sq_y*dY; | ||
136 | |||
137 | |||
138 | |||
139 | if nargin < 6, | ||
140 | |||
141 | %%%%%%%%%%%%%%%%%%%%%%%% ADDITIONAL STUFF IN THE CASE OF HIGHLY DISTORTED IMAGES %%%%%%%%%%%%% | ||
142 | figure(2); | ||
143 | hold on; | ||
144 | plot(XX(1,:),XX(2,:),'r+'); | ||
145 | title('The red crosses should be close to the image corners'); | ||
146 | hold off; | ||
147 | |||
148 | disp('If the guessed grid corners (red crosses on the image) are not close to the actual corners,'); | ||
149 | disp('it is necessary to enter an initial guess for the radial distortion factor kc (useful for subpixel detection)'); | ||
150 | quest_distort = input('Need of an initial guess for distortion? ([]=no, other=yes) '); | ||
151 | |||
152 | quest_distort = ~isempty(quest_distort); | ||
153 | |||
154 | if quest_distort, | ||
155 | % Estimation of focal length: | ||
156 | c_g = [size(I,2);size(I,1)]/2 + .5; | ||
157 | f_g = Distor2Calib(0,[[x(1) x(2) x(4) x(3)] - c_g(1);[y(1) y(2) y(4) y(3)] - c_g(2)],1,1,4,W,L,[-W/2 W/2 W/2 -W/2;L/2 L/2 -L/2 -L/2; 0 0 0 0],100,1,1); | ||
158 | f_g = mean(f_g); | ||
159 | script_fit_distortion; | ||
160 | end; | ||
161 | %%%%%%%%%%%%%%%%%%%%% END ADDITIONAL STUFF IN THE CASE OF HIGHLY DISTORTED IMAGES %%%%%%%%%%%%% | ||
162 | |||
163 | else | ||
164 | |||
165 | xy_corners_undist = comp_distortion_oulu([(x' - cc(1))/fc(1);(y'-cc(2))/fc(1)],kc); | ||
166 | |||
167 | xu = xy_corners_undist(1,:)'; | ||
168 | yu = xy_corners_undist(2,:)'; | ||
169 | |||
170 | [XXu] = projectedGrid ( [xu(1);yu(1)], [xu(2);yu(2)],[xu(3);yu(3)], [xu(4);yu(4)],n_sq_x+1,n_sq_y+1); % The full grid | ||
171 | |||
172 | r2 = sum(XXu.^2); | ||
173 | XX = (ones(2,1)*(1 + kc(1) * r2 + kc(2) * (r2.^2))) .* XXu; | ||
174 | XX(1,:) = fc(1)*XX(1,:)+cc(1); | ||
175 | XX(2,:) = fc(2)*XX(2,:)+cc(2); | ||
176 | |||
177 | end; | ||
178 | |||
179 | |||
180 | Np = (n_sq_x+1)*(n_sq_y+1); | ||
181 | |||
182 | disp('Corner extraction...'); | ||
183 | |||
184 | grid_pts = cornerfinder(XX,I,winty,wintx); %%% Finds the exact corners at every points! | ||
185 | |||
186 | grid_pts = grid_pts - 1; % subtract 1 to bring the origin to (0,0) instead of (1,1) in matlab (not necessary in C) | ||
187 | |||
188 | ind_corners = [1 n_sq_x+1 (n_sq_x+1)*n_sq_y+1 (n_sq_x+1)*(n_sq_y+1)]; % index of the 4 corners | ||
189 | ind_orig = (n_sq_x+1)*n_sq_y + 1; | ||
190 | xorig = grid_pts(1,ind_orig); | ||
191 | yorig = grid_pts(2,ind_orig); | ||
192 | dxpos = mean([grid_pts(:,ind_orig) grid_pts(:,ind_orig+1)]'); | ||
193 | dypos = mean([grid_pts(:,ind_orig) grid_pts(:,ind_orig-n_sq_x-1)]'); | ||
194 | |||
195 | |||
196 | ind_x = (n_sq_x+1)*(n_sq_y + 1); | ||
197 | ind_y = 1; | ||
198 | |||
199 | x_box_kk = [grid_pts(1,:)-(wintx+.5);grid_pts(1,:)+(wintx+.5);grid_pts(1,:)+(wintx+.5);grid_pts(1,:)-(wintx+.5);grid_pts(1,:)-(wintx+.5)]; | ||
200 | y_box_kk = [grid_pts(2,:)-(winty+.5);grid_pts(2,:)-(winty+.5);grid_pts(2,:)+(winty+.5);grid_pts(2,:)+(winty+.5);grid_pts(2,:)-(winty+.5)]; | ||
201 | |||
202 | |||
203 | figure(3); | ||
204 | image(Id); colormap(map); hold on; | ||
205 | plot(grid_pts(1,:)+1,grid_pts(2,:)+1,'r+'); | ||
206 | plot(x_box_kk+1,y_box_kk+1,'-b'); | ||
207 | plot(grid_pts(1,ind_corners)+1,grid_pts(2,ind_corners)+1,'mo'); | ||
208 | plot(xorig+1,yorig+1,'*m'); | ||
209 | h = text(xorig-15,yorig-15,'O'); | ||
210 | set(h,'Color','m','FontSize',14); | ||
211 | h2 = text(dxpos(1)-10,dxpos(2)-10,'dX'); | ||
212 | set(h2,'Color','g','FontSize',14); | ||
213 | h3 = text(dypos(1)-25,dypos(2)-3,'dY'); | ||
214 | set(h3,'Color','g','FontSize',14); | ||
215 | xlabel('Xc (in camera frame)'); | ||
216 | ylabel('Yc (in camera frame)'); | ||
217 | title('Extracted corners'); | ||
218 | zoom on; | ||
219 | drawnow; | ||
220 | hold off; | ||
221 | |||
222 | |||
223 | Xi = reshape(([0:n_sq_x]*dX)'*ones(1,n_sq_y+1),Np,1)'; | ||
224 | Yi = reshape(ones(n_sq_x+1,1)*[n_sq_y:-1:0]*dY,Np,1)'; | ||
225 | Zi = zeros(1,Np); | ||
226 | |||
227 | Xgrid = [Xi;Yi;Zi]; | ||
228 | |||
229 | |||
230 | % All the point coordinates (on the image, and in 3D) - for global optimization: | ||
231 | |||
232 | x = grid_pts; | ||
233 | X = Xgrid; | ||
234 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/extract_parameters.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/extract_parameters.m new file mode 100755 index 0000000..035b97d --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/extract_parameters.m | |||
@@ -0,0 +1,46 @@ | |||
1 | |||
2 | %%% Extraction of the final intrinsic and extrinsic paramaters: | ||
3 | |||
4 | check_active_images; | ||
5 | |||
6 | fc = solution(1:2);%*** | ||
7 | cc = solution(3:4);%*** | ||
8 | alpha_c = solution(5);%*** | ||
9 | kc = solution(6:9);%*** | ||
10 | |||
11 | |||
12 | % Calibration matrix: | ||
13 | |||
14 | KK = [fc(1) fc(1)*alpha_c cc(1);0 fc(2) cc(2); 0 0 1]; | ||
15 | inv_KK = inv(KK); | ||
16 | |||
17 | % Extract the extrinsic paramters, and recomputer the collineations | ||
18 | |||
19 | for kk = 1:n_ima, | ||
20 | |||
21 | if active_images(kk), | ||
22 | |||
23 | omckk = solution(15+6*(kk-1) + 1:15+6*(kk-1) + 3);%*** | ||
24 | Tckk = solution(15+6*(kk-1) + 4:15+6*(kk-1) + 6);%*** | ||
25 | |||
26 | Rckk = rodrigues(omckk); | ||
27 | |||
28 | Hkk = KK * [Rckk(:,1) Rckk(:,2) Tckk]; | ||
29 | |||
30 | Hkk = Hkk / Hkk(3,3); | ||
31 | |||
32 | else | ||
33 | |||
34 | omckk = NaN*ones(3,1); | ||
35 | Tckk = NaN*ones(3,1); | ||
36 | Rckk = NaN*ones(3,3); | ||
37 | Hkk = NaN*ones(3,3); | ||
38 | |||
39 | end; | ||
40 | |||
41 | eval(['omc_' num2str(kk) ' = omckk;']); | ||
42 | eval(['Rc_' num2str(kk) ' = Rckk;']); | ||
43 | eval(['Tc_' num2str(kk) ' = Tckk;']); | ||
44 | eval(['H_' num2str(kk) '= Hkk;']); | ||
45 | |||
46 | end; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/extract_parameters3D.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/extract_parameters3D.m new file mode 100755 index 0000000..841c6ab --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/extract_parameters3D.m | |||
@@ -0,0 +1,36 @@ | |||
1 | |||
2 | %%% Extraction of the final intrinsic and extrinsic paramaters: | ||
3 | |||
4 | |||
5 | fc = solution(1:2); | ||
6 | kc = solution(3:6); | ||
7 | cc = solution(6*n_ima + 4 +3:6*n_ima + 5 +3); | ||
8 | |||
9 | % Calibration matrix: | ||
10 | |||
11 | KK = [fc(1) 0 cc(1);0 fc(2) cc(2); 0 0 1]; | ||
12 | inv_KK = inv(KK); | ||
13 | |||
14 | % Extract the extrinsic paramters, and recomputer the collineations | ||
15 | |||
16 | for kk = 1:n_ima, | ||
17 | |||
18 | omckk = solution(4+6*(kk-1) + 3:6*kk + 3); | ||
19 | |||
20 | Tckk = solution(6*kk+1 + 3:6*kk+3 + 3); | ||
21 | |||
22 | Rckk = rodrigues(omckk); | ||
23 | |||
24 | Hlkk = KK * [Rckk(:,1) Rckk(:,2) Tckk]; | ||
25 | |||
26 | Hlkk = Hlkk / Hlkk(3,3); | ||
27 | |||
28 | eval(['omc_' num2str(kk) ' = omckk;']); | ||
29 | eval(['Rc_' num2str(kk) ' = Rckk;']); | ||
30 | eval(['Tc_' num2str(kk) ' = Tckk;']); | ||
31 | |||
32 | eval(['Hl_' num2str(kk) '=Hlkk;']); | ||
33 | |||
34 | end; | ||
35 | |||
36 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/extrinsic_computation.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/extrinsic_computation.m new file mode 100755 index 0000000..fbba78e --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/extrinsic_computation.m | |||
@@ -0,0 +1,185 @@ | |||
1 | %%% INPUT THE IMAGE FILE NAME: | ||
2 | |||
3 | if ~exist('fc')|~exist('cc')|~exist('kc')|~exist('alpha_c'), | ||
4 | fprintf(1,'No intrinsic camera parameters available.\n'); | ||
5 | return; | ||
6 | end; | ||
7 | |||
8 | dir; | ||
9 | |||
10 | fprintf(1,'\n'); | ||
11 | disp('Computation of the extrinsic parameters from an image of a pattern'); | ||
12 | disp('The intrinsic camera parameters are assumed to be known (previously computed)'); | ||
13 | |||
14 | fprintf(1,'\n'); | ||
15 | image_name = input('Image name (full name without extension): ','s'); | ||
16 | |||
17 | format_image2 = '0'; | ||
18 | |||
19 | while format_image2 == '0', | ||
20 | |||
21 | format_image2 = input('Image format: ([]=''r''=''ras'', ''b''=''bmp'', ''t''=''tif'', ''p''=''pgm'', ''j''=''jpg'', ''m''=''ppm'') ','s'); | ||
22 | |||
23 | if isempty(format_image2), | ||
24 | format_image2 = 'ras'; | ||
25 | end; | ||
26 | |||
27 | if lower(format_image2(1)) == 'm', | ||
28 | format_image2 = 'ppm'; | ||
29 | else | ||
30 | if lower(format_image2(1)) == 'b', | ||
31 | format_image2 = 'bmp'; | ||
32 | else | ||
33 | if lower(format_image2(1)) == 't', | ||
34 | format_image2 = 'tif'; | ||
35 | else | ||
36 | if lower(format_image2(1)) == 'p', | ||
37 | format_image2 = 'pgm'; | ||
38 | else | ||
39 | if lower(format_image2(1)) == 'j', | ||
40 | format_image2 = 'jpg'; | ||
41 | else | ||
42 | if lower(format_image2(1)) == 'r', | ||
43 | format_image2 = 'ras'; | ||
44 | else | ||
45 | disp('Invalid image format'); | ||
46 | format_image2 = '0'; % Ask for format once again | ||
47 | end; | ||
48 | end; | ||
49 | end; | ||
50 | end; | ||
51 | end; | ||
52 | end; | ||
53 | end; | ||
54 | |||
55 | ima_name = [image_name '.' format_image2]; | ||
56 | |||
57 | |||
58 | %%% READ IN IMAGE: | ||
59 | |||
60 | if format_image2(1) == 'p', | ||
61 | if format_image2(2) == 'p', | ||
62 | I = double(loadppm(ima_name)); | ||
63 | else | ||
64 | I = double(loadpgm(ima_name)); | ||
65 | end; | ||
66 | else | ||
67 | if format_image2(1) == 'r', | ||
68 | I = readras(ima_name); | ||
69 | else | ||
70 | I = double(imread(ima_name)); | ||
71 | end; | ||
72 | end; | ||
73 | |||
74 | if size(I,3)>1, | ||
75 | I = I(:,:,2); | ||
76 | end; | ||
77 | |||
78 | |||
79 | %%% EXTRACT GRID CORNERS: | ||
80 | |||
81 | fprintf(1,'\nExtraction of the grid corners on the image\n'); | ||
82 | |||
83 | disp('Window size for corner finder (wintx and winty):'); | ||
84 | wintx = input('wintx ([] = 5) = '); | ||
85 | if isempty(wintx), wintx = 5; end; | ||
86 | wintx = round(wintx); | ||
87 | winty = input('winty ([] = 5) = '); | ||
88 | if isempty(winty), winty = 5; end; | ||
89 | winty = round(winty); | ||
90 | |||
91 | fprintf(1,'Window size = %dx%d\n',2*wintx+1,2*winty+1); | ||
92 | |||
93 | [x_ext,X_ext,n_sq_x,n_sq_y,ind_orig,ind_x,ind_y] = extract_grid(I,wintx,winty,fc,cc,kc); | ||
94 | |||
95 | |||
96 | |||
97 | %%% Computation of the Extrinsic Parameters attached to the grid: | ||
98 | |||
99 | [omc_ext,Tc_ext,Rc_ext,H_ext] = compute_extrinsic(x_ext,X_ext,fc,cc,kc,alpha_c); | ||
100 | |||
101 | |||
102 | %%% Reproject the points on the image: | ||
103 | |||
104 | [x_reproj] = project_points2(X_ext,omc_ext,Tc_ext,fc,cc,kc,alpha_c); | ||
105 | |||
106 | err_reproj = x_ext - x_reproj; | ||
107 | |||
108 | err_std2 = std(err_reproj')'; | ||
109 | |||
110 | |||
111 | Basis = [X_ext(:,[ind_orig ind_x ind_orig ind_y ind_orig ])]; | ||
112 | |||
113 | VX = Basis(:,2) - Basis(:,1); | ||
114 | VY = Basis(:,4) - Basis(:,1); | ||
115 | |||
116 | nX = norm(VX); | ||
117 | nY = norm(VY); | ||
118 | |||
119 | VZ = min(nX,nY) * cross(VX/nX,VY/nY); | ||
120 | |||
121 | Basis = [Basis VZ]; | ||
122 | |||
123 | [x_basis] = project_points2(Basis,omc_ext,Tc_ext,fc,cc,kc,alpha_c); | ||
124 | |||
125 | dxpos = (x_basis(:,2) + x_basis(:,1))/2; | ||
126 | dypos = (x_basis(:,4) + x_basis(:,3))/2; | ||
127 | dzpos = (x_basis(:,6) + x_basis(:,5))/2; | ||
128 | |||
129 | |||
130 | |||
131 | figure(2); | ||
132 | image(I); | ||
133 | colormap(gray(256)); | ||
134 | hold on; | ||
135 | plot(x_ext(1,:)+1,x_ext(2,:)+1,'r+'); | ||
136 | plot(x_reproj(1,:)+1,x_reproj(2,:)+1,'yo'); | ||
137 | h = text(x_ext(1,ind_orig)-25,x_ext(2,ind_orig)-25,'O'); | ||
138 | set(h,'Color','g','FontSize',14); | ||
139 | h2 = text(dxpos(1)+1,dxpos(2)-30,'X'); | ||
140 | set(h2,'Color','g','FontSize',14); | ||
141 | h3 = text(dypos(1)-30,dypos(2)+1,'Y'); | ||
142 | set(h3,'Color','g','FontSize',14); | ||
143 | h4 = text(dzpos(1)-10,dzpos(2)-20,'Z'); | ||
144 | set(h4,'Color','g','FontSize',14); | ||
145 | plot(x_basis(1,:)+1,x_basis(2,:)+1,'g-','linewidth',2); | ||
146 | title('Image points (+) and reprojected grid points (o)'); | ||
147 | hold off; | ||
148 | |||
149 | |||
150 | fprintf(1,'\n\nExtrinsic parameters:\n\n'); | ||
151 | fprintf(1,'Translation vector: Tc_ext = [ %3.6f \t %3.6f \t %3.6f ]\n',Tc_ext); | ||
152 | fprintf(1,'Rotation vector: omc_ext = [ %3.6f \t %3.6f \t %3.6f ]\n',omc_ext); | ||
153 | fprintf(1,'Rotation matrix: Rc_ext = [ %3.6f \t %3.6f \t %3.6f\n',Rc_ext(1,:)'); | ||
154 | fprintf(1,' %3.6f \t %3.6f \t %3.6f\n',Rc_ext(2,:)'); | ||
155 | fprintf(1,' %3.6f \t %3.6f \t %3.6f ]\n',Rc_ext(3,:)'); | ||
156 | fprintf(1,'Pixel error: err = [ %3.5f \t %3.5f ]\n\n',err_std2); | ||
157 | |||
158 | |||
159 | |||
160 | |||
161 | |||
162 | return; | ||
163 | |||
164 | |||
165 | % Stores the results: | ||
166 | |||
167 | kk = 1; | ||
168 | |||
169 | % Stores location of grid wrt camera: | ||
170 | |||
171 | eval(['omc_' num2str(kk) ' = omc_ext;']); | ||
172 | eval(['Tc_' num2str(kk) ' = Tc_ext;']); | ||
173 | |||
174 | % Stores the projected points: | ||
175 | |||
176 | eval(['y_' num2str(kk) ' = x_reproj;']); | ||
177 | eval(['X_' num2str(kk) ' = X_ext;']); | ||
178 | eval(['x_' num2str(kk) ' = x_ext;']); | ||
179 | |||
180 | |||
181 | % Organize the points in a grid: | ||
182 | |||
183 | eval(['n_sq_x_' num2str(kk) ' = n_sq_x;']); | ||
184 | eval(['n_sq_y_' num2str(kk) ' = n_sq_y;']); | ||
185 | \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/fixallvariables.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/fixallvariables.m new file mode 100755 index 0000000..b5808f3 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/fixallvariables.m | |||
@@ -0,0 +1,19 @@ | |||
1 | % Code that clears all empty or NaN variables | ||
2 | |||
3 | varlist = whos; | ||
4 | |||
5 | if ~isempty(varlist), | ||
6 | |||
7 | Nvar = size(varlist,1); | ||
8 | |||
9 | for c_var = 1:Nvar, | ||
10 | |||
11 | var2fix = varlist(c_var).name; | ||
12 | |||
13 | fixvariable; | ||
14 | |||
15 | end; | ||
16 | |||
17 | end; | ||
18 | |||
19 | clear varlist var2fix Nvar c_var \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/fixvariable.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/fixvariable.m new file mode 100755 index 0000000..2213431 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/fixvariable.m | |||
@@ -0,0 +1,18 @@ | |||
1 | % Code that clears an empty variable, or a NaN vsriable. | ||
2 | % Does not clear structures, or cells. | ||
3 | |||
4 | if exist('var2fix'), | ||
5 | if eval(['exist(''' var2fix ''') == 1']), | ||
6 | if eval(['isempty(' var2fix ')']), | ||
7 | eval(['clear ' var2fix ]); | ||
8 | else | ||
9 | if eval(['~isstruct(' var2fix ')']), | ||
10 | if eval(['~iscell(' var2fix ')']), | ||
11 | if eval(['isnan(' var2fix '(1))']), | ||
12 | eval(['clear ' var2fix ]); | ||
13 | end; | ||
14 | end; | ||
15 | end; | ||
16 | end; | ||
17 | end; | ||
18 | end; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/ginput3.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/ginput3.m new file mode 100755 index 0000000..56fe496 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/ginput3.m | |||
@@ -0,0 +1,216 @@ | |||
1 | function [out1,out2,out3] = ginput2(arg1) | ||
2 | %GINPUT Graphical input from mouse. | ||
3 | % [X,Y] = GINPUT(N) gets N points from the current axes and returns | ||
4 | % the X- and Y-coordinates in length N vectors X and Y. The cursor | ||
5 | % can be positioned using a mouse (or by using the Arrow Keys on some | ||
6 | % systems). Data points are entered by pressing a mouse button | ||
7 | % or any key on the keyboard except carriage return, which terminates | ||
8 | % the input before N points are entered. | ||
9 | % | ||
10 | % [X,Y] = GINPUT gathers an unlimited number of points until the | ||
11 | % return key is pressed. | ||
12 | % | ||
13 | % [X,Y,BUTTON] = GINPUT(N) returns a third result, BUTTON, that | ||
14 | % contains a vector of integers specifying which mouse button was | ||
15 | % used (1,2,3 from left) or ASCII numbers if a key on the keyboard | ||
16 | % was used. | ||
17 | |||
18 | % Copyright (c) 1984-96 by The MathWorks, Inc. | ||
19 | % $Revision: 5.18 $ $Date: 1996/11/10 17:48:08 $ | ||
20 | |||
21 | % Fixed version by Jean-Yves Bouguet to have a cross instead of 2 lines | ||
22 | % More visible for images | ||
23 | |||
24 | P = NaN*ones(16,16); | ||
25 | P(1:15,1:15) = 2*ones(15,15); | ||
26 | P(2:14,2:14) = ones(13,13); | ||
27 | P(3:13,3:13) = NaN*ones(11,11); | ||
28 | P(6:10,6:10) = 2*ones(5,5); | ||
29 | P(7:9,7:9) = 1*ones(3,3); | ||
30 | |||
31 | out1 = []; out2 = []; out3 = []; y = []; | ||
32 | c = computer; | ||
33 | if ~strcmp(c(1:2),'PC') & ~strcmp(c(1:2),'MA') | ||
34 | tp = get(0,'TerminalProtocol'); | ||
35 | else | ||
36 | tp = 'micro'; | ||
37 | end | ||
38 | |||
39 | if ~strcmp(tp,'none') & ~strcmp(tp,'x') & ~strcmp(tp,'micro'), | ||
40 | if nargout == 1, | ||
41 | if nargin == 1, | ||
42 | eval('out1 = trmginput(arg1);'); | ||
43 | else | ||
44 | eval('out1 = trmginput;'); | ||
45 | end | ||
46 | elseif nargout == 2 | nargout == 0, | ||
47 | if nargin == 1, | ||
48 | eval('[out1,out2] = trmginput(arg1);'); | ||
49 | else | ||
50 | eval('[out1,out2] = trmginput;'); | ||
51 | end | ||
52 | if nargout == 0 | ||
53 | out1 = [ out1 out2 ]; | ||
54 | end | ||
55 | elseif nargout == 3, | ||
56 | if nargin == 1, | ||
57 | eval('[out1,out2,out3] = trmginput(arg1);'); | ||
58 | else | ||
59 | eval('[out1,out2,out3] = trmginput;'); | ||
60 | end | ||
61 | end | ||
62 | else | ||
63 | |||
64 | fig = gcf; | ||
65 | figure(gcf); | ||
66 | |||
67 | if nargin == 0 | ||
68 | how_many = -1; | ||
69 | b = []; | ||
70 | else | ||
71 | how_many = arg1; | ||
72 | b = []; | ||
73 | if isstr(how_many) ... | ||
74 | | size(how_many,1) ~= 1 | size(how_many,2) ~= 1 ... | ||
75 | | ~(fix(how_many) == how_many) ... | ||
76 | | how_many < 0 | ||
77 | error('Requires a positive integer.') | ||
78 | end | ||
79 | if how_many == 0 | ||
80 | ptr_fig = 0; | ||
81 | while(ptr_fig ~= fig) | ||
82 | ptr_fig = get(0,'PointerWindow'); | ||
83 | end | ||
84 | scrn_pt = get(0,'PointerLocation'); | ||
85 | loc = get(fig,'Position'); | ||
86 | pt = [scrn_pt(1) - loc(1), scrn_pt(2) - loc(2)]; | ||
87 | out1 = pt(1); y = pt(2); | ||
88 | elseif how_many < 0 | ||
89 | error('Argument must be a positive integer.') | ||
90 | end | ||
91 | end | ||
92 | |||
93 | pointer = get(gcf,'pointer'); | ||
94 | |||
95 | set(gcf,'Pointer','custom','PointerShapeCData',P,'PointerShapeHotSpot',[8,8]); | ||
96 | %set(gcf,'pointer','crosshair'); | ||
97 | fig_units = get(fig,'units'); | ||
98 | char = 0; | ||
99 | |||
100 | while how_many ~= 0 | ||
101 | % Use no-side effect WAITFORBUTTONPRESS | ||
102 | waserr = 0; | ||
103 | eval('keydown = wfbp;', 'waserr = 1;'); | ||
104 | if(waserr == 1) | ||
105 | if(ishandle(fig)) | ||
106 | set(fig,'pointer',pointer,'units',fig_units); | ||
107 | error('Interrupted'); | ||
108 | else | ||
109 | error('Interrupted by figure deletion'); | ||
110 | end | ||
111 | end | ||
112 | |||
113 | ptr_fig = get(0,'CurrentFigure'); | ||
114 | if(ptr_fig == fig) | ||
115 | if keydown | ||
116 | char = get(fig, 'CurrentCharacter'); | ||
117 | button = abs(get(fig, 'CurrentCharacter')); | ||
118 | scrn_pt = get(0, 'PointerLocation'); | ||
119 | set(fig,'units','pixels') | ||
120 | loc = get(fig, 'Position'); | ||
121 | pt = [scrn_pt(1) - loc(1), scrn_pt(2) - loc(2)]; | ||
122 | set(fig,'CurrentPoint',pt); | ||
123 | else | ||
124 | button = get(fig, 'SelectionType'); | ||
125 | if strcmp(button,'open') | ||
126 | button = b(length(b)); | ||
127 | elseif strcmp(button,'normal') | ||
128 | button = 1; | ||
129 | elseif strcmp(button,'extend') | ||
130 | button = 2; | ||
131 | elseif strcmp(button,'alt') | ||
132 | button = 3; | ||
133 | else | ||
134 | error('Invalid mouse selection.') | ||
135 | end | ||
136 | end | ||
137 | pt = get(gca, 'CurrentPoint'); | ||
138 | |||
139 | how_many = how_many - 1; | ||
140 | |||
141 | if(char == 13) % & how_many ~= 0) | ||
142 | % if the return key was pressed, char will == 13, | ||
143 | % and that's our signal to break out of here whether | ||
144 | % or not we have collected all the requested data | ||
145 | % points. | ||
146 | % If this was an early breakout, don't include | ||
147 | % the <Return> key info in the return arrays. | ||
148 | % We will no longer count it if it's the last input. | ||
149 | break; | ||
150 | end | ||
151 | |||
152 | out1 = [out1;pt(1,1)]; | ||
153 | y = [y;pt(1,2)]; | ||
154 | b = [b;button]; | ||
155 | end | ||
156 | end | ||
157 | |||
158 | set(fig,'pointer',pointer,'units',fig_units); | ||
159 | |||
160 | if nargout > 1 | ||
161 | out2 = y; | ||
162 | if nargout > 2 | ||
163 | out3 = b; | ||
164 | end | ||
165 | else | ||
166 | out1 = [out1 y]; | ||
167 | end | ||
168 | |||
169 | end | ||
170 | |||
171 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||
172 | function key = wfbp | ||
173 | %WFBP Replacement for WAITFORBUTTONPRESS that has no side effects. | ||
174 | |||
175 | % Remove figure button functions | ||
176 | fprops = {'windowbuttonupfcn','buttondownfcn', ... | ||
177 | 'windowbuttondownfcn','windowbuttonmotionfcn'}; | ||
178 | fig = gcf; | ||
179 | fvals = get(fig,fprops); | ||
180 | set(fig,fprops,{'','','',''}) | ||
181 | |||
182 | % Remove all other buttondown functions | ||
183 | ax = findobj(fig,'type','axes'); | ||
184 | if isempty(ax) | ||
185 | ch = {}; | ||
186 | else | ||
187 | ch = get(ax,{'Children'}); | ||
188 | end | ||
189 | for i=1:length(ch), | ||
190 | ch{i} = ch{i}(:)'; | ||
191 | end | ||
192 | h = [ax(:)',ch{:}]; | ||
193 | vals = get(h,{'buttondownfcn'}); | ||
194 | mt = repmat({''},size(vals)); | ||
195 | set(h,{'buttondownfcn'},mt); | ||
196 | |||
197 | % Now wait for that buttonpress, and check for error conditions | ||
198 | waserr = 0; | ||
199 | eval(['if nargout==0,', ... | ||
200 | ' waitforbuttonpress,', ... | ||
201 | 'else,', ... | ||
202 | ' keydown = waitforbuttonpress;',... | ||
203 | 'end' ], 'waserr = 1;'); | ||
204 | |||
205 | % Put everything back | ||
206 | if(ishandle(fig)) | ||
207 | set(fig,fprops,fvals) | ||
208 | set(h,{'buttondownfcn'},vals) | ||
209 | end | ||
210 | |||
211 | if(waserr == 1) | ||
212 | error('Interrupted'); | ||
213 | end | ||
214 | |||
215 | if nargout>0, key = keydown; end | ||
216 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/go_calib_optim.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/go_calib_optim.m new file mode 100755 index 0000000..ad19f64 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/go_calib_optim.m | |||
@@ -0,0 +1,139 @@ | |||
1 | %go_calib_optim | ||
2 | % | ||
3 | %Main calibration function. Computes the intrinsic andextrinsic parameters. | ||
4 | %Runs as a script. | ||
5 | % | ||
6 | %INPUT: x_1,x_2,x_3,...: Feature locations on the images | ||
7 | % X_1,X_2,X_3,...: Corresponding grid coordinates | ||
8 | % | ||
9 | %OUTPUT: fc: Camera focal length | ||
10 | % cc: Principal point coordinates | ||
11 | % kc: Distortion coefficients | ||
12 | % KK: The camera matrix (containing fc and cc) | ||
13 | % omc_1,omc_2,omc_3,...: 3D rotation vectors attached to the grid positions in space | ||
14 | % Tc_1,Tc_2,Tc_3,...: 3D translation vectors attached to the grid positions in space | ||
15 | % Rc_1,Rc_2,Rc_3,...: 3D rotation matrices corresponding to the omc vectors | ||
16 | % | ||
17 | %Method: Minimizes the pixel reprojection error in the least squares sense over the intrinsic | ||
18 | % camera parameters, and the extrinsic parameters (3D locations of the grids in space) | ||
19 | % | ||
20 | %Note: If the intrinsic camera parameters (fc, cc, kc) do not exist before, they are initialized through | ||
21 | % the function init_intrinsic_param.m. Otherwise, the variables in memory are used as initial guesses. | ||
22 | % | ||
23 | %Note: The row vector active_images consists of zeros and ones. To deactivate an image, set the | ||
24 | % corresponding entry in the active_images vector to zero. | ||
25 | % | ||
26 | %VERY IMPORTANT: This function works for 2D and 3D calibration rigs, except for init_intrinsic_param.m | ||
27 | %that is so far implemented to work only with 2D rigs. | ||
28 | %In the future, a more general function will be there. | ||
29 | %For now, if using a 3D calibration rig, set quick_init to 1 for an easy initialization of the focal length | ||
30 | |||
31 | |||
32 | if ~exist('n_ima'), | ||
33 | data_calib; % Load the images | ||
34 | click_calib; % Extract the corners | ||
35 | end; | ||
36 | |||
37 | |||
38 | check_active_images; | ||
39 | |||
40 | check_extracted_images; | ||
41 | |||
42 | check_active_images; | ||
43 | |||
44 | |||
45 | desactivated_images = []; | ||
46 | |||
47 | |||
48 | if ~exist('center_optim'), | ||
49 | center_optim = 1; %%% Set this variable to 0 if your do not want to estimate the principal point | ||
50 | %%% Required when using one image, and VERY RECOMMENDED WHEN USING LESS THAN 4 images | ||
51 | end; | ||
52 | |||
53 | % Check 3D-ness of the calibration rig: | ||
54 | rig3D = 0; | ||
55 | for kk = ind_active, | ||
56 | eval(['X_kk = X_' num2str(kk) ';']); | ||
57 | if is3D(X_kk), | ||
58 | rig3D = 1; | ||
59 | end; | ||
60 | end; | ||
61 | |||
62 | |||
63 | if center_optim & (length(ind_active) < 2) & ~rig3D, | ||
64 | fprintf(1,'\nPrincipal point rejected from the optimization when using one image and planar rig (center_optim = 1).\n'); | ||
65 | center_optim = 0; %%% when using a single image, please, no principal point estimation!!! | ||
66 | est_alpha = 0; | ||
67 | end; | ||
68 | |||
69 | if ~exist('dont_ask'), | ||
70 | dont_ask = 0; | ||
71 | end; | ||
72 | |||
73 | if center_optim & (length(ind_active) < 5), | ||
74 | fprintf(1,'\nThe principal point estimation may be unreliable (using less than 5 images for calibration).\n'); | ||
75 | if ~dont_ask, | ||
76 | quest = input('Are you sure you want to keep the principal point in the optimization process? ([]=yes, other=no) '); | ||
77 | center_optim = isempty(quest); | ||
78 | end; | ||
79 | end; | ||
80 | |||
81 | if center_optim, | ||
82 | fprintf(1,'\nINFO: To reject the principal point from the optimization, set center_optim = 0 in go_calib_optim.m\n'); | ||
83 | end; | ||
84 | |||
85 | if ~exist('est_alpha'), | ||
86 | est_alpha = 0; % by default, do not estimate skew | ||
87 | end; | ||
88 | |||
89 | if ~center_optim & (est_alpha), | ||
90 | fprintf(1,'WARNING: Since there is no principal point estimation, no skew estimation (est_alpha = 0)\n'); | ||
91 | est_alpha = 0; | ||
92 | else | ||
93 | if ~est_alpha, | ||
94 | fprintf(1,'WARNING: Skew not optimized. Check variable est_alpha.\n'); | ||
95 | alpha_c = 0; | ||
96 | else | ||
97 | fprintf(1,'WARNING: Skew is optimized. To disable skew estimation, set est_alpha=0.\n'); | ||
98 | end; | ||
99 | end; | ||
100 | |||
101 | |||
102 | if ~exist('est_dist'); | ||
103 | est_dist = [1;1;1;1]; | ||
104 | end; | ||
105 | if ~prod(est_dist), | ||
106 | fprintf(1,'\nWARNING: Distortion not fully estimated. Check variable est_dist.\n'); | ||
107 | end; | ||
108 | |||
109 | |||
110 | |||
111 | |||
112 | %%% MAIN OPTIMIZATION CALL!!!!! (look into this function for the details of implementation) | ||
113 | go_calib_optim_iter; | ||
114 | |||
115 | |||
116 | |||
117 | if ~isempty(desactivated_images), | ||
118 | |||
119 | param_list_save = param_list; | ||
120 | |||
121 | fprintf(1,'\nNew optimization including the images that have been deactivated during the previous optimization.\n'); | ||
122 | active_images(desactivated_images) = ones(1,length(desactivated_images)); | ||
123 | desactivated_images = []; | ||
124 | |||
125 | go_calib_optim_iter; | ||
126 | |||
127 | if ~isempty(desactivated_images), | ||
128 | fprintf(1,['List of images left desactivated: ' num2str(desactivated_images) '\n' ] ); | ||
129 | end; | ||
130 | |||
131 | param_list = [param_list_save(:,1:end-1) param_list]; | ||
132 | |||
133 | end; | ||
134 | |||
135 | |||
136 | %%%%%%%%%%%%%%%%%%%% GRAPHICAL OUTPUT %%%%%%%%%%%%%%%%%%%%%%%% | ||
137 | |||
138 | %graphout_calib; | ||
139 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/go_calib_optim_iter.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/go_calib_optim_iter.m new file mode 100755 index 0000000..e3d22f6 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/go_calib_optim_iter.m | |||
@@ -0,0 +1,394 @@ | |||
1 | %go_calib_optim_iter | ||
2 | % | ||
3 | %Main calibration function. Computes the intrinsic andextrinsic parameters. | ||
4 | %Runs as a script. | ||
5 | % | ||
6 | %INPUT: x_1,x_2,x_3,...: Feature locations on the images | ||
7 | % X_1,X_2,X_3,...: Corresponding grid coordinates | ||
8 | % | ||
9 | %OUTPUT: fc: Camera focal length | ||
10 | % cc: Principal point coordinates | ||
11 | % kc: Distortion coefficients | ||
12 | % KK: The camera matrix (containing fc and cc) | ||
13 | % omc_1,omc_2,omc_3,...: 3D rotation vectors attached to the grid positions in space | ||
14 | % Tc_1,Tc_2,Tc_3,...: 3D translation vectors attached to the grid positions in space | ||
15 | % Rc_1,Rc_2,Rc_3,...: 3D rotation matrices corresponding to the omc vectors | ||
16 | % | ||
17 | %Method: Minimizes the pixel reprojection error in the least squares sense over the intrinsic | ||
18 | % camera parameters, and the extrinsic parameters (3D locations of the grids in space) | ||
19 | % | ||
20 | %Note: If the intrinsic camera parameters (fc, cc, kc) do not exist before, they are initialized through | ||
21 | % the function init_intrinsic_param.m. Otherwise, the variables in memory are used as initial guesses. | ||
22 | % | ||
23 | %Note: The row vector active_images consists of zeros and ones. To deactivate an image, set the | ||
24 | % corresponding entry in the active_images vector to zero. | ||
25 | % | ||
26 | %VERY IMPORTANT: This function works for 2D and 3D calibration rigs, except for init_intrinsic_param.m | ||
27 | %that is so far implemented to work only with 2D rigs. | ||
28 | %In the future, a more general function will be there. | ||
29 | %For now, if using a 3D calibration rig, quick_init is set to 1 for an easy initialization of the focal length | ||
30 | |||
31 | |||
32 | if ~exist('center_optim'), | ||
33 | center_optim = 1; %%% Set this variable to 0 if your do not want to estimate the principal point | ||
34 | end; | ||
35 | |||
36 | if ~exist('est_dist'), | ||
37 | est_dist = [1;1;1;1]; | ||
38 | end; | ||
39 | |||
40 | if ~exist('est_alpha'), | ||
41 | est_alpha = 0; % by default, do not estimate skew | ||
42 | end; | ||
43 | |||
44 | |||
45 | % Little fix in case of stupid values in the binary variables: | ||
46 | center_optim = ~~center_optim; | ||
47 | est_alpha = ~~est_alpha; | ||
48 | est_dist = ~~est_dist; | ||
49 | |||
50 | |||
51 | if ~exist('nx')&~exist('ny'), | ||
52 | fprintf(1,'WARNING: No image size (nx,ny) available. Setting nx=640 and ny=480\n'); | ||
53 | nx = 640; | ||
54 | ny = 480; | ||
55 | end; | ||
56 | |||
57 | |||
58 | check_active_images; | ||
59 | |||
60 | |||
61 | quick_init = 0; % Set to 1 for using a quick init (necessary when using 3D rigs) | ||
62 | |||
63 | |||
64 | if ~center_optim, % In the case where the principal point is not estimated, keep it at the center of the image | ||
65 | fprintf(1,'Principal point not optimized (center_optim=0). It is kept at the center of the image.\n'); | ||
66 | cc = [(nx-1)/2;(ny-1)/2]; | ||
67 | end; | ||
68 | |||
69 | |||
70 | if ~prod(est_dist), | ||
71 | fprintf(1,'\nDistortion not fully estimated. Check variable est_dist.\n'); | ||
72 | end; | ||
73 | |||
74 | if ~est_alpha, | ||
75 | fprintf(1,'Skew not optimized (est_alpha=0).\n'); | ||
76 | alpha_c = 0; | ||
77 | end; | ||
78 | |||
79 | |||
80 | % Check 3D-ness of the calibration rig: | ||
81 | rig3D = 0; | ||
82 | for kk = ind_active, | ||
83 | eval(['X_kk = X_' num2str(kk) ';']); | ||
84 | if is3D(X_kk), | ||
85 | rig3D = 1; | ||
86 | end; | ||
87 | end; | ||
88 | |||
89 | % If the rig is 3D, then no choice: the only valid initialization is manual! | ||
90 | if rig3D, | ||
91 | quick_init = 1; | ||
92 | end; | ||
93 | |||
94 | |||
95 | |||
96 | alpha_smooth = 1; % set alpha_smooth = 1; for steepest gradient descent | ||
97 | |||
98 | |||
99 | % Conditioning threshold for view rejection | ||
100 | thresh_cond = 1e6; | ||
101 | |||
102 | |||
103 | |||
104 | %% Initialization of the intrinsic parameters (if necessary) | ||
105 | |||
106 | if ~exist('cc'), | ||
107 | fprintf(1,'Initialization of the principal point at the center of the image.\n'); | ||
108 | cc = [(nx-1)/2;(ny-1)/2]; | ||
109 | alpha_smooth = 0.4; % slow convergence | ||
110 | end; | ||
111 | |||
112 | |||
113 | if ~exist('kc'), | ||
114 | fprintf(1,'Initialization of the image distortion to zero.\n'); | ||
115 | kc = zeros(4,1); | ||
116 | alpha_smooth = 0.4; % slow convergence | ||
117 | end; | ||
118 | |||
119 | if ~exist('alpha_c'), | ||
120 | fprintf(1,'Initialization of the image skew to zero.\n'); | ||
121 | alpha_c = 0; | ||
122 | alpha_smooth = 0.4; % slow convergence | ||
123 | end; | ||
124 | |||
125 | if ~exist('fc')& quick_init, | ||
126 | FOV_angle = 35; % Initial camera field of view in degrees | ||
127 | fprintf(1,['Initialization of the focal length to a FOV of ' num2str(FOV_angle) ' degrees.\n']); | ||
128 | fc = (nx/2)/tan(pi*FOV_angle/360) * ones(2,1); | ||
129 | alpha_smooth = 0.4; % slow | ||
130 | end; | ||
131 | |||
132 | |||
133 | if ~exist('fc'), | ||
134 | % Initialization of the intrinsic parameters: | ||
135 | fprintf(1,'Initialization of the intrinsic parameters using the vanishing points of planar patterns.\n') | ||
136 | init_intrinsic_param; % The right way to go (if quick_init is not active)! | ||
137 | alpha_smooth = 0.4; % slow convergence | ||
138 | end; | ||
139 | |||
140 | |||
141 | if ~prod(est_dist), | ||
142 | % If no distortion estimated, set to zero the variables that are not estimated | ||
143 | kc = kc .* est_dist; | ||
144 | end; | ||
145 | |||
146 | |||
147 | |||
148 | |||
149 | |||
150 | %% Initialization of the extrinsic parameters for global minimization: | ||
151 | |||
152 | |||
153 | init_param = [fc;cc;alpha_c;kc;zeros(6,1)]; | ||
154 | |||
155 | |||
156 | |||
157 | for kk = 1:n_ima, | ||
158 | |||
159 | if exist(['x_' num2str(kk)]), | ||
160 | |||
161 | eval(['x_kk = x_' num2str(kk) ';']); | ||
162 | eval(['X_kk = X_' num2str(kk) ';']); | ||
163 | |||
164 | if (isnan(x_kk(1,1))), | ||
165 | if active_images(kk), | ||
166 | fprintf(1,'Warning: Cannot calibrate with image %d. Need to extract grid corners first.\n',kk) | ||
167 | fprintf(1,' Set active_images(%d)=1; and run Extract grid corners.\n',kk) | ||
168 | end; | ||
169 | active_images(kk) = 0; | ||
170 | end; | ||
171 | if active_images(kk), | ||
172 | [omckk,Tckk] = compute_extrinsic_init(x_kk,X_kk,fc,cc,kc,alpha_c); | ||
173 | [omckk,Tckk,Rckk,JJ_kk] = compute_extrinsic_refine(omckk,Tckk,x_kk,X_kk,fc,cc,kc,alpha_c,20,thresh_cond); | ||
174 | if cond(JJ_kk)> thresh_cond, | ||
175 | active_images(kk) = 0; | ||
176 | omckk = NaN*ones(3,1); | ||
177 | Tckk = NaN*ones(3,1); | ||
178 | fprintf(1,'\nWarning: View #%d ill-conditioned. This image is now set inactive.\n',kk) | ||
179 | desactivated_images = [desactivated_images kk]; | ||
180 | end; | ||
181 | if isnan(omckk(1,1)), | ||
182 | %fprintf(1,'\nWarning: Desactivating image %d. Re-activate it later by typing:\nactive_images(%d)=1;\nand re-run optimization\n',[kk kk]) | ||
183 | active_images(kk) = 0; | ||
184 | end; | ||
185 | else | ||
186 | omckk = NaN*ones(3,1); | ||
187 | Tckk = NaN*ones(3,1); | ||
188 | end; | ||
189 | |||
190 | else | ||
191 | |||
192 | omckk = NaN*ones(3,1); | ||
193 | Tckk = NaN*ones(3,1); | ||
194 | |||
195 | if active_images(kk), | ||
196 | fprintf(1,'Warning: Cannot calibrate with image %d. Need to extract grid corners first.\n',kk) | ||
197 | fprintf(1,' Set active_images(%d)=1; and run Extract grid corners.\n',kk) | ||
198 | end; | ||
199 | |||
200 | active_images(kk) = 0; | ||
201 | |||
202 | end; | ||
203 | |||
204 | eval(['omc_' num2str(kk) ' = omckk;']); | ||
205 | eval(['Tc_' num2str(kk) ' = Tckk;']); | ||
206 | |||
207 | init_param = [init_param; omckk ; Tckk]; | ||
208 | |||
209 | end; | ||
210 | |||
211 | |||
212 | check_active_images; | ||
213 | |||
214 | |||
215 | |||
216 | %-------------------- Main Optimization: | ||
217 | |||
218 | fprintf(1,'\nMain calibration optimization procedure - Number of images: %d\n',length(ind_active)); | ||
219 | |||
220 | |||
221 | param = init_param; | ||
222 | change = 1; | ||
223 | |||
224 | iter = 0; | ||
225 | |||
226 | fprintf(1,'Gradient descent iterations: '); | ||
227 | |||
228 | param_list = param; | ||
229 | |||
230 | MaxIter = 30; | ||
231 | |||
232 | |||
233 | while (change > 1e-6)&(iter < MaxIter), | ||
234 | |||
235 | fprintf(1,'%d...',iter+1); | ||
236 | |||
237 | |||
238 | %% The first step consists of updating the whole vector of knowns (intrinsic + extrinsic of active | ||
239 | %% images) through a one step steepest gradient descent. | ||
240 | |||
241 | JJ = []; | ||
242 | ex = []; | ||
243 | |||
244 | f = param(1:2); | ||
245 | c = param(3:4); | ||
246 | alpha = param(5); | ||
247 | k = param(6:9); | ||
248 | |||
249 | |||
250 | for kk = 1:n_ima, | ||
251 | |||
252 | if active_images(kk), | ||
253 | |||
254 | %omckk = param(4+6*(kk-1) + 3:6*kk + 3); | ||
255 | |||
256 | %Tckk = param(6*kk+1 + 3:6*kk+3 + 3); | ||
257 | |||
258 | omckk = param(15+6*(kk-1) + 1:15+6*(kk-1) + 3); | ||
259 | |||
260 | Tckk = param(15+6*(kk-1) + 4:15+6*(kk-1) + 6); | ||
261 | |||
262 | if isnan(omckk(1)), | ||
263 | fprintf(1,'Intrinsic parameters at frame %d do not exist\n',kk); | ||
264 | return; | ||
265 | end; | ||
266 | |||
267 | eval(['X_kk = X_' num2str(kk) ';']); | ||
268 | eval(['x_kk = x_' num2str(kk) ';']); | ||
269 | |||
270 | Np = size(X_kk,2); | ||
271 | |||
272 | JJkk = zeros(2*Np,n_ima * 6 + 15); | ||
273 | |||
274 | [x,dxdom,dxdT,dxdf,dxdc,dxdk,dxdalpha] = project_points2(X_kk,omckk,Tckk,f,c,k,alpha); | ||
275 | |||
276 | exkk = x_kk - x; | ||
277 | |||
278 | ex = [ex;exkk(:)]; | ||
279 | |||
280 | JJkk(:,1:2) = dxdf; | ||
281 | JJkk(:,3:4) = dxdc; | ||
282 | JJkk(:,5) = dxdalpha; | ||
283 | JJkk(:,6:9) = dxdk; | ||
284 | JJkk(:,15+6*(kk-1) + 1:15+6*(kk-1) + 3) = dxdom; | ||
285 | JJkk(:,15+6*(kk-1) + 4:15+6*(kk-1) + 6) = dxdT; | ||
286 | |||
287 | |||
288 | |||
289 | JJ = [JJ;JJkk]; | ||
290 | |||
291 | |||
292 | % Check if this view is ill-conditioned: | ||
293 | JJ_kk = [dxdom dxdT]; | ||
294 | if cond(JJ_kk)> thresh_cond, | ||
295 | active_images(kk) = 0; | ||
296 | fprintf(1,'\nWarning: View #%d ill-conditioned. This image is now set inactive.\n',kk) | ||
297 | desactivated_images = [desactivated_images kk]; | ||
298 | param(15+6*(kk-1) + 1:15+6*(kk-1) + 6) = NaN*ones(6,1); | ||
299 | end; | ||
300 | |||
301 | |||
302 | end; | ||
303 | |||
304 | end; | ||
305 | |||
306 | |||
307 | % List of active images (necessary if changed): | ||
308 | check_active_images; | ||
309 | |||
310 | |||
311 | % The following vector helps to select the variables to update (for only active images): | ||
312 | |||
313 | ind_Jac = find([ones(2,1);center_optim*ones(2,1);est_alpha;est_dist;zeros(6,1);reshape(ones(6,1)*active_images,6*n_ima,1)])'; | ||
314 | |||
315 | |||
316 | JJ = JJ(:,ind_Jac); | ||
317 | |||
318 | JJ2 = JJ'*JJ; | ||
319 | |||
320 | |||
321 | % Smoothing coefficient: | ||
322 | |||
323 | alpha_smooth2 = 1-(1-alpha_smooth)^(iter+1); %set to 1 to undo any smoothing! | ||
324 | |||
325 | |||
326 | param_innov = alpha_smooth2*inv(JJ2)*(JJ')*ex; | ||
327 | param_up = param(ind_Jac) + param_innov; | ||
328 | param(ind_Jac) = param_up; | ||
329 | |||
330 | |||
331 | % New intrinsic parameters: | ||
332 | |||
333 | fc_current = param(1:2); | ||
334 | cc_current = param(3:4); | ||
335 | alpha_current = param(5); | ||
336 | kc_current = param(6:9); | ||
337 | |||
338 | |||
339 | % Change on the intrinsic parameters: | ||
340 | change = norm([fc_current;cc_current] - [f;c])/norm([fc_current;cc_current]); | ||
341 | |||
342 | |||
343 | %% Second step: (optional) - It makes convergence faster, and the region of convergence LARGER!!! | ||
344 | %% Recompute the extrinsic parameters only using compute_extrinsic.m (this may be useful sometimes) | ||
345 | %% The complete gradient descent method is useful to precisely update the intrinsic parameters. | ||
346 | |||
347 | MaxIter2 = 20; | ||
348 | |||
349 | |||
350 | for kk = 1:n_ima, | ||
351 | if active_images(kk), | ||
352 | omc_current = param(15+6*(kk-1) + 1:15+6*(kk-1) + 3); | ||
353 | Tc_current = param(15+6*(kk-1) + 4:15+6*(kk-1) + 6); | ||
354 | eval(['X_kk = X_' num2str(kk) ';']); | ||
355 | eval(['x_kk = x_' num2str(kk) ';']); | ||
356 | [omc_current,Tc_current] = compute_extrinsic_init(x_kk,X_kk,fc_current,cc_current,kc_current,alpha_current); | ||
357 | [omckk,Tckk,Rckk,JJ_kk] = compute_extrinsic_refine(omc_current,Tc_current,x_kk,X_kk,fc_current,cc_current,kc_current,alpha_current,MaxIter2,thresh_cond); | ||
358 | if cond(JJ_kk)> thresh_cond, | ||
359 | active_images(kk) = 0; | ||
360 | fprintf(1,'\nWarning: View #%d ill-conditioned. This image is now set inactive.\n',kk) | ||
361 | desactivated_images = [desactivated_images kk]; | ||
362 | omckk = NaN*ones(3,1); | ||
363 | Tckk = NaN*ones(3,1); | ||
364 | end; | ||
365 | param(15+6*(kk-1) + 1:15+6*(kk-1) + 3) = omckk; | ||
366 | param(15+6*(kk-1) + 4:15+6*(kk-1) + 6) = Tckk; | ||
367 | end; | ||
368 | end; | ||
369 | |||
370 | param_list = [param_list param]; | ||
371 | |||
372 | iter = iter + 1; | ||
373 | |||
374 | end; | ||
375 | |||
376 | fprintf(1,'\n'); | ||
377 | |||
378 | |||
379 | solution = param; | ||
380 | |||
381 | |||
382 | %%% Extraction of the final intrinsic and extrinsic paramaters: | ||
383 | |||
384 | extract_parameters; | ||
385 | |||
386 | comp_error_calib; | ||
387 | |||
388 | fprintf(1,'\n\nCalibration results after optimization:\n\n'); | ||
389 | fprintf(1,'Focal Length: fc = [ %3.5f %3.5f ]\n',fc); | ||
390 | fprintf(1,'Principal point: cc = [ %3.5f %3.5f ]\n',cc); | ||
391 | fprintf(1,'Skew: alpha_c = [ %3.5f ] => angle of pixel = %3.5f degrees\n',alpha_c,90 - atan(alpha_c)*180/pi); | ||
392 | fprintf(1,'Distortion: kc = [ %3.5f %3.5f %3.5f %3.5f ]\n',kc); | ||
393 | fprintf(1,'Pixel error: err = [ %3.5f %3.5f ]\n\n',err_std); | ||
394 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/ima_read_calib.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/ima_read_calib.m new file mode 100755 index 0000000..dbbc4e0 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/ima_read_calib.m | |||
@@ -0,0 +1,158 @@ | |||
1 | |||
2 | if ~exist('calib_name')|~exist('format_image'), | ||
3 | data_calib; | ||
4 | return; | ||
5 | end; | ||
6 | |||
7 | check_directory; | ||
8 | |||
9 | if ~exist('n_ima'), | ||
10 | data_calib; | ||
11 | return; | ||
12 | end; | ||
13 | |||
14 | check_active_images; | ||
15 | |||
16 | |||
17 | images_read = active_images; | ||
18 | |||
19 | |||
20 | if exist('image_numbers'), | ||
21 | first_num = image_numbers(1); | ||
22 | end; | ||
23 | |||
24 | |||
25 | % Just to fix a minor bug: | ||
26 | if ~exist('first_num'), | ||
27 | first_num = image_numbers(1); | ||
28 | end; | ||
29 | |||
30 | |||
31 | image_numbers = first_num:n_ima-1+first_num; | ||
32 | |||
33 | no_image_file = 0; | ||
34 | |||
35 | i = 1; | ||
36 | |||
37 | while (i <= n_ima), % & (~no_image_file), | ||
38 | |||
39 | if active_images(i), | ||
40 | |||
41 | %fprintf(1,'Loading image %d...\n',i); | ||
42 | |||
43 | if ~type_numbering, | ||
44 | number_ext = num2str(image_numbers(i)); | ||
45 | else | ||
46 | number_ext = sprintf(['%.' num2str(N_slots) 'd'],image_numbers(i)); | ||
47 | end; | ||
48 | |||
49 | ima_name = [calib_name number_ext '.' format_image]; | ||
50 | |||
51 | if i == ind_active(1), | ||
52 | fprintf(1,'Loading image '); | ||
53 | end; | ||
54 | |||
55 | if exist(ima_name), | ||
56 | |||
57 | fprintf(1,'%d...',i); | ||
58 | |||
59 | if format_image(1) == 'p', | ||
60 | if format_image(2) == 'p', | ||
61 | Ii = double(loadppm(ima_name)); | ||
62 | else | ||
63 | Ii = double(loadpgm(ima_name)); | ||
64 | end; | ||
65 | else | ||
66 | if format_image(1) == 'r', | ||
67 | Ii = readras(ima_name); | ||
68 | else | ||
69 | Ii = double(imread(ima_name)); | ||
70 | end; | ||
71 | end; | ||
72 | |||
73 | |||
74 | if size(Ii,3)>1, | ||
75 | Ii = Ii(:,:,2); | ||
76 | end; | ||
77 | |||
78 | eval(['I_' num2str(i) ' = Ii;']); | ||
79 | |||
80 | else | ||
81 | |||
82 | fprintf(1,'%d...no image...',i); | ||
83 | |||
84 | images_read(i) = 0; | ||
85 | |||
86 | %no_image_file = 1; | ||
87 | |||
88 | end; | ||
89 | |||
90 | end; | ||
91 | |||
92 | i = i+1; | ||
93 | |||
94 | end; | ||
95 | |||
96 | |||
97 | ind_read = find(images_read); | ||
98 | |||
99 | |||
100 | |||
101 | |||
102 | if isempty(ind_read), | ||
103 | |||
104 | fprintf(1,'\nWARNING! No image were read\n'); | ||
105 | |||
106 | no_image_file = 1; | ||
107 | |||
108 | |||
109 | else | ||
110 | |||
111 | |||
112 | %fprintf(1,'\nWARNING! Every exsisting image in the directory is set active.\n'); | ||
113 | |||
114 | |||
115 | if no_image_file, | ||
116 | |||
117 | %fprintf(1,'WARNING! Some images were not read properly\n'); | ||
118 | |||
119 | end; | ||
120 | |||
121 | |||
122 | fprintf(1,'\n'); | ||
123 | |||
124 | if size(I_1,1)~=480, | ||
125 | small_calib_image = 1; | ||
126 | else | ||
127 | small_calib_image = 0; | ||
128 | end; | ||
129 | |||
130 | [Hcal,Wcal] = size(I_1); % size of the calibration image | ||
131 | |||
132 | [ny,nx] = size(I_1); | ||
133 | |||
134 | clickname = []; | ||
135 | |||
136 | map = gray(256); | ||
137 | |||
138 | %string_save = 'save calib_data n_ima type_numbering N_slots image_numbers format_image calib_name Hcal Wcal nx ny map small_calib_image'; | ||
139 | |||
140 | %eval(string_save); | ||
141 | |||
142 | disp('done'); | ||
143 | %click_calib; | ||
144 | |||
145 | end; | ||
146 | |||
147 | if ~exist('map'), map = gray(256); end; | ||
148 | |||
149 | active_images = images_read; | ||
150 | |||
151 | % Show all the calibration images: | ||
152 | |||
153 | |||
154 | if ~isempty(ind_read), | ||
155 | |||
156 | mosaic; | ||
157 | |||
158 | end; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/init_intrinsic_param.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/init_intrinsic_param.m new file mode 100755 index 0000000..94a5240 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/init_intrinsic_param.m | |||
@@ -0,0 +1,158 @@ | |||
1 | %init_intrinsic_param | ||
2 | % | ||
3 | %Initialization of the intrinsic parameters. | ||
4 | %Runs as a script. | ||
5 | % | ||
6 | %INPUT: x_1,x_2,x_3,...: Feature locations on the images | ||
7 | % X_1,X_2,X_3,...: Corresponding grid coordinates | ||
8 | % | ||
9 | %OUTPUT: fc: Camera focal length | ||
10 | % cc: Principal point coordinates | ||
11 | % kc: Distortion coefficients | ||
12 | % alpha_c: skew coefficient | ||
13 | % KK: The camera matrix (containing fc, cc and alpha_c) | ||
14 | % | ||
15 | %Method: Computes the planar homographies H_1, H_2, H_3, ... and computes | ||
16 | % the focal length fc from orthogonal vanishing points constraint. | ||
17 | % The principal point cc is assumed at the center of the image. | ||
18 | % Assumes no image distortion (kc = [0;0;0;0]) | ||
19 | % | ||
20 | %Note: The row vector active_images consists of zeros and ones. To deactivate an image, set the | ||
21 | % corresponding entry in the active_images vector to zero. | ||
22 | % | ||
23 | % | ||
24 | %Important function called within that program: | ||
25 | % | ||
26 | %compute_homography.m: Computes the planar homography between points on the grid in 3D, and the image plane. | ||
27 | % | ||
28 | % | ||
29 | %VERY IMPORTANT: This function works only with 2D rigs. | ||
30 | %In the future, a more general function will be there (working with 3D rigs as well). | ||
31 | |||
32 | |||
33 | |||
34 | check_active_images; | ||
35 | |||
36 | if ~exist(['x_' num2str(ind_active(1)) ]), | ||
37 | click_calib; | ||
38 | end; | ||
39 | |||
40 | |||
41 | fprintf(1,'\nInitialization of the intrinsic parameters - Number of images: %d\n',length(ind_active)); | ||
42 | |||
43 | |||
44 | % Initialize the homographies: | ||
45 | |||
46 | for kk = 1:n_ima, | ||
47 | eval(['x_kk = x_' num2str(kk) ';']); | ||
48 | eval(['X_kk = X_' num2str(kk) ';']); | ||
49 | if (isnan(x_kk(1,1))), | ||
50 | if active_images(kk), | ||
51 | fprintf(1,'WARNING: Cannot calibrate with image %d. Need to extract grid corners first.\n',kk) | ||
52 | fprintf(1,' Set active_images(%d)=1; and run Extract grid corners.\n',kk) | ||
53 | end; | ||
54 | active_images(kk) = 0; | ||
55 | end; | ||
56 | if active_images(kk), | ||
57 | eval(['H_' num2str(kk) ' = compute_homography(x_kk,X_kk(1:2,:));']); | ||
58 | else | ||
59 | eval(['H_' num2str(kk) ' = NaN*ones(3,3);']); | ||
60 | end; | ||
61 | end; | ||
62 | |||
63 | check_active_images; | ||
64 | |||
65 | % initial guess for principal point and distortion: | ||
66 | |||
67 | if ~exist('nx'), [ny,nx] = size(I); end; | ||
68 | |||
69 | c_init = [nx;ny]/2 - 0.5; % initialize at the center of the image | ||
70 | k_init = [0;0;0;0]; % initialize to zero (no distortion) | ||
71 | |||
72 | |||
73 | |||
74 | % Compute explicitely the focal length using all the (mutually orthogonal) vanishing points | ||
75 | % note: The vanihing points are hidden in the planar collineations H_kk | ||
76 | |||
77 | A = []; | ||
78 | b = []; | ||
79 | |||
80 | % matrix that subtract the principal point: | ||
81 | Sub_cc = [1 0 -c_init(1);0 1 -c_init(2);0 0 1]; | ||
82 | |||
83 | for kk=1:n_ima, | ||
84 | |||
85 | if active_images(kk), | ||
86 | |||
87 | eval(['Hkk = H_' num2str(kk) ';']); | ||
88 | |||
89 | Hkk = Sub_cc * Hkk; | ||
90 | |||
91 | % Extract vanishing points (direct and diagonals): | ||
92 | |||
93 | V_hori_pix = Hkk(:,1); | ||
94 | V_vert_pix = Hkk(:,2); | ||
95 | V_diag1_pix = (Hkk(:,1)+Hkk(:,2))/2; | ||
96 | V_diag2_pix = (Hkk(:,1)-Hkk(:,2))/2; | ||
97 | |||
98 | V_hori_pix = V_hori_pix/norm(V_hori_pix); | ||
99 | V_vert_pix = V_vert_pix/norm(V_vert_pix); | ||
100 | V_diag1_pix = V_diag1_pix/norm(V_diag1_pix); | ||
101 | V_diag2_pix = V_diag2_pix/norm(V_diag2_pix); | ||
102 | |||
103 | a1 = V_hori_pix(1); | ||
104 | b1 = V_hori_pix(2); | ||
105 | c1 = V_hori_pix(3); | ||
106 | |||
107 | a2 = V_vert_pix(1); | ||
108 | b2 = V_vert_pix(2); | ||
109 | c2 = V_vert_pix(3); | ||
110 | |||
111 | a3 = V_diag1_pix(1); | ||
112 | b3 = V_diag1_pix(2); | ||
113 | c3 = V_diag1_pix(3); | ||
114 | |||
115 | a4 = V_diag2_pix(1); | ||
116 | b4 = V_diag2_pix(2); | ||
117 | c4 = V_diag2_pix(3); | ||
118 | |||
119 | A_kk = [a1*a2 b1*b2; | ||
120 | a3*a4 b3*b4]; | ||
121 | |||
122 | b_kk = -[c1*c2;c3*c4]; | ||
123 | |||
124 | |||
125 | A = [A;A_kk]; | ||
126 | b = [b;b_kk]; | ||
127 | |||
128 | end; | ||
129 | |||
130 | end; | ||
131 | |||
132 | |||
133 | % use all the vanishing points to estimate focal length: | ||
134 | |||
135 | f_init = sqrt(abs(1./(inv(A'*A)*A'*b))); % if using a two-focal model for initial guess | ||
136 | |||
137 | alpha_init = 0; | ||
138 | |||
139 | %f_init = sqrt(b'*(sum(A')') / (b'*b)) * ones(2,1); % if single focal length model is used | ||
140 | |||
141 | |||
142 | % Global calibration matrix (initial guess): | ||
143 | |||
144 | KK = [f_init(1) alpha_init*f_init(1) c_init(1);0 f_init(2) c_init(2); 0 0 1]; | ||
145 | inv_KK = inv(KK); | ||
146 | |||
147 | |||
148 | cc = c_init; | ||
149 | fc = f_init; | ||
150 | kc = k_init; | ||
151 | alpha_c = alpha_init; | ||
152 | |||
153 | |||
154 | fprintf(1,'\n\nCalibration parameters after initialization:\n\n'); | ||
155 | fprintf(1,'Focal Length: fc = [ %3.5f %3.5f ]\n',fc); | ||
156 | fprintf(1,'Principal point: cc = [ %3.5f %3.5f ]\n',cc); | ||
157 | fprintf(1,'Skew: alpha_c = [ %3.5f ] => angle of pixel = %3.5f degrees\n',alpha_c,90 - atan(alpha_c)*180/pi); | ||
158 | fprintf(1,'Distortion: kc = [ %3.5f %3.5f %3.5f %3.5f ]\n',kc); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/is3D.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/is3D.m new file mode 100755 index 0000000..ab00b3d --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/is3D.m | |||
@@ -0,0 +1,19 @@ | |||
1 | function test = is3D(X), | ||
2 | |||
3 | |||
4 | Np = size(X,2); | ||
5 | |||
6 | %% Check for planarity of the structure: | ||
7 | |||
8 | X_mean = mean(X')'; | ||
9 | |||
10 | Y = X - (X_mean*ones(1,Np)); | ||
11 | |||
12 | YY = Y*Y'; | ||
13 | |||
14 | [U,S,V] = svd(YY); | ||
15 | |||
16 | r = S(3,3)/S(2,2); | ||
17 | |||
18 | test = (r > 1e-3); | ||
19 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/loading_calib.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/loading_calib.m new file mode 100755 index 0000000..a0f50d2 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/loading_calib.m | |||
@@ -0,0 +1,10 @@ | |||
1 | if ~exist('Calib_Results.mat'), | ||
2 | fprintf(1,'\nCalibration file Calib_Results.mat not found!\n'); | ||
3 | return; | ||
4 | end; | ||
5 | |||
6 | fprintf(1,'\nLoading calibration results from Calib_Results.mat\n'); | ||
7 | |||
8 | load Calib_Results | ||
9 | |||
10 | fprintf(1,'done\n'); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/loadinr.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/loadinr.m new file mode 100755 index 0000000..91b6f89 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/loadinr.m | |||
@@ -0,0 +1,52 @@ | |||
1 | %LOADINR Load an INRIMAGE format file | ||
2 | % | ||
3 | % LOADINR(filename, im) | ||
4 | % | ||
5 | % Load an INRIA image format file and return it as a matrix | ||
6 | % | ||
7 | % SEE ALSO: saveinr | ||
8 | % | ||
9 | % Copyright (c) Peter Corke, 1999 Machine Vision Toolbox for Matlab | ||
10 | |||
11 | |||
12 | % Peter Corke 1996 | ||
13 | |||
14 | function im = loadinr(fname, im) | ||
15 | |||
16 | fid = fopen(fname, 'r'); | ||
17 | |||
18 | s = fgets(fid); | ||
19 | if strcmp(s(1:12), '#INRIMAGE-4#') == 0, | ||
20 | error('not INRIMAGE format'); | ||
21 | end | ||
22 | |||
23 | % not very complete, only looks for the X/YDIM keys | ||
24 | while 1, | ||
25 | s = fgets(fid); | ||
26 | n = length(s) - 1; | ||
27 | if s(1) == '#', | ||
28 | break | ||
29 | end | ||
30 | if strcmp(s(1:5), 'XDIM='), | ||
31 | cols = str2num(s(6:n)); | ||
32 | end | ||
33 | if strcmp(s(1:5), 'YDIM='), | ||
34 | rows = str2num(s(6:n)); | ||
35 | end | ||
36 | if strcmp(s(1:4), 'CPU='), | ||
37 | if strcmp(s(5:n), 'sun') == 0, | ||
38 | error('not sun data ordering'); | ||
39 | end | ||
40 | end | ||
41 | |||
42 | end | ||
43 | disp(['INRIMAGE format file ' num2str(rows) ' x ' num2str(cols)]) | ||
44 | |||
45 | % now the binary data | ||
46 | fseek(fid, 256, 'bof'); | ||
47 | [im count] = fread(fid, [cols rows], 'float32'); | ||
48 | im = im'; | ||
49 | if count ~= (rows*cols), | ||
50 | error('file too short'); | ||
51 | end | ||
52 | fclose(fid); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/loadpgm.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/loadpgm.m new file mode 100755 index 0000000..dfa8b61 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/loadpgm.m | |||
@@ -0,0 +1,89 @@ | |||
1 | %LOADPGM Load a PGM image | ||
2 | % | ||
3 | % I = loadpgm(filename) | ||
4 | % | ||
5 | % Returns a matrix containing the image loaded from the PGM format | ||
6 | % file filename. Handles ASCII (P2) and binary (P5) PGM file formats. | ||
7 | % | ||
8 | % If the filename has no extension, and open fails, a '.pgm' will | ||
9 | % be appended. | ||
10 | % | ||
11 | % | ||
12 | % Copyright (c) Peter Corke, 1999 Machine Vision Toolbox for Matlab | ||
13 | |||
14 | |||
15 | % Peter Corke 1994 | ||
16 | |||
17 | function I = loadpgm(file) | ||
18 | white = [' ' 9 10 13]; % space, tab, lf, cr | ||
19 | white = setstr(white); | ||
20 | |||
21 | fid = fopen(file, 'r'); | ||
22 | if fid < 0, | ||
23 | fid = fopen([file '.pgm'], 'r'); | ||
24 | end | ||
25 | if fid < 0, | ||
26 | error('Couldn''t open file'); | ||
27 | end | ||
28 | |||
29 | magic = fread(fid, 2, 'char'); | ||
30 | while 1 | ||
31 | c = fread(fid,1,'char'); | ||
32 | if c == '#', | ||
33 | fgetl(fid); | ||
34 | elseif ~any(c == white) | ||
35 | fseek(fid, -1, 'cof'); % unputc() | ||
36 | break; | ||
37 | end | ||
38 | end | ||
39 | cols = fscanf(fid, '%d', 1); | ||
40 | while 1 | ||
41 | c = fread(fid,1,'char'); | ||
42 | if c == '#', | ||
43 | fgetl(fid); | ||
44 | elseif ~any(c == white) | ||
45 | fseek(fid, -1, 'cof'); % unputc() | ||
46 | break; | ||
47 | end | ||
48 | end | ||
49 | rows = fscanf(fid, '%d', 1); | ||
50 | while 1 | ||
51 | c = fread(fid,1,'char'); | ||
52 | if c == '#', | ||
53 | fgetl(fid); | ||
54 | elseif ~any(c == white) | ||
55 | fseek(fid, -1, 'cof'); % unputc() | ||
56 | break; | ||
57 | end | ||
58 | end | ||
59 | maxval = fscanf(fid, '%d', 1); | ||
60 | while 1 | ||
61 | c = fread(fid,1,'char'); | ||
62 | if c == '#', | ||
63 | fgetl(fid); | ||
64 | elseif ~any(c == white) | ||
65 | fseek(fid, -1, 'cof'); % unputc() | ||
66 | break; | ||
67 | end | ||
68 | end | ||
69 | if magic(1) == 'P', | ||
70 | if magic(2) == '2', | ||
71 | %disp(['ASCII PGM file ' num2str(rows) ' x ' num2str(cols)]) | ||
72 | I = fscanf(fid, '%d', [cols rows])'; | ||
73 | elseif magic(2) == '5', | ||
74 | %disp(['Binary PGM file ' num2str(rows) ' x ' num2str(cols)]) | ||
75 | if maxval == 1, | ||
76 | fmt = 'unint1'; | ||
77 | elseif maxval == 15, | ||
78 | fmt = 'uint4'; | ||
79 | elseif maxval == 255, | ||
80 | fmt = 'uint8'; | ||
81 | elseif maxval == 2^32-1, | ||
82 | fmt = 'uint32'; | ||
83 | end | ||
84 | I = fread(fid, [cols rows], fmt)'; | ||
85 | else | ||
86 | disp('Not a PGM file'); | ||
87 | end | ||
88 | end | ||
89 | fclose(fid); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/loadppm.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/loadppm.m new file mode 100755 index 0000000..0c004fc --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/loadppm.m | |||
@@ -0,0 +1,109 @@ | |||
1 | %LOADPPM Load a PPM image | ||
2 | % | ||
3 | % I = loadppm(filename) | ||
4 | % | ||
5 | % Returns a matrix containing the image loaded from the PPM format | ||
6 | % file filename. Handles ASCII (P3) and binary (P6) PPM file formats. | ||
7 | % | ||
8 | % If the filename has no extension, and open fails, a '.ppm' and | ||
9 | % '.pnm' extension will be tried. | ||
10 | % | ||
11 | % SEE ALSO: saveppm loadpgm | ||
12 | % | ||
13 | % Copyright (c) Peter Corke, 1999 Machine Vision Toolbox for Matlab | ||
14 | |||
15 | |||
16 | % Peter Corke 1994 | ||
17 | |||
18 | function I = loadppm(file) | ||
19 | white = [' ' 9 10 13]; % space, tab, lf, cr | ||
20 | white = setstr(white); | ||
21 | |||
22 | fid = fopen(file, 'r'); | ||
23 | if fid < 0, | ||
24 | fid = fopen([file '.ppm'], 'r'); | ||
25 | end | ||
26 | if fid < 0, | ||
27 | fid = fopen([file '.pnm'], 'r'); | ||
28 | end | ||
29 | if fid < 0, | ||
30 | error('Couldn''t open file'); | ||
31 | end | ||
32 | |||
33 | magic = fread(fid, 2, 'char'); | ||
34 | while 1 | ||
35 | c = fread(fid,1,'char'); | ||
36 | if c == '#', | ||
37 | fgetl(fid); | ||
38 | elseif ~any(c == white) | ||
39 | fseek(fid, -1, 'cof'); % unputc() | ||
40 | break; | ||
41 | end | ||
42 | end | ||
43 | cols = fscanf(fid, '%d', 1); | ||
44 | while 1 | ||
45 | c = fread(fid,1,'char'); | ||
46 | if c == '#', | ||
47 | fgetl(fid); | ||
48 | elseif ~any(c == white) | ||
49 | fseek(fid, -1, 'cof'); % unputc() | ||
50 | break; | ||
51 | end | ||
52 | end | ||
53 | rows = fscanf(fid, '%d', 1); | ||
54 | while 1 | ||
55 | c = fread(fid,1,'char'); | ||
56 | if c == '#', | ||
57 | fgetl(fid); | ||
58 | elseif ~any(c == white) | ||
59 | fseek(fid, -1, 'cof'); % unputc() | ||
60 | break; | ||
61 | end | ||
62 | end | ||
63 | maxval = fscanf(fid, '%d', 1); | ||
64 | while 1 | ||
65 | c = fread(fid,1,'char'); | ||
66 | if c == '#', | ||
67 | fgetl(fid); | ||
68 | elseif ~any(c == white) | ||
69 | fseek(fid, -1, 'cof'); % unputc() | ||
70 | break; | ||
71 | end | ||
72 | end | ||
73 | if magic(1) == 'P', | ||
74 | if magic(2) == '3', | ||
75 | %disp(['ASCII PPM file ' num2str(rows) ' x ' num2str(cols)]) | ||
76 | I = fscanf(fid, '%d', [cols*3 rows]); | ||
77 | elseif magic(2) == '6', | ||
78 | %disp(['Binary PPM file ' num2str(rows) ' x ' num2str(cols)]) | ||
79 | if maxval == 1, | ||
80 | fmt = 'unint1'; | ||
81 | elseif maxval == 15, | ||
82 | fmt = 'uint4'; | ||
83 | elseif maxval == 255, | ||
84 | fmt = 'uint8'; | ||
85 | elseif maxval == 2^32-1, | ||
86 | fmt = 'uint32'; | ||
87 | end | ||
88 | I = fread(fid, [cols*3 rows], fmt); | ||
89 | else | ||
90 | disp('Not a PPM file'); | ||
91 | end | ||
92 | end | ||
93 | % | ||
94 | % now the matrix has interleaved columns of R, G, B | ||
95 | % | ||
96 | I = I'; | ||
97 | size(I); | ||
98 | R = I(:,1:3:(cols*3)); | ||
99 | G = I(:,2:3:(cols*3)); | ||
100 | B = I(:,3:3:(cols*3)); | ||
101 | fclose(fid); | ||
102 | |||
103 | |||
104 | I = zeros(rows,cols,3); | ||
105 | I(:,:,1) = R; | ||
106 | I(:,:,2) = G; | ||
107 | I(:,:,3) = B; | ||
108 | I = uint8(I); | ||
109 | \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/mean_std_robust.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/mean_std_robust.m new file mode 100755 index 0000000..0d18a62 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/mean_std_robust.m | |||
@@ -0,0 +1,7 @@ | |||
1 | function [m,s] = mean_std_robust(x); | ||
2 | |||
3 | x = x(:); | ||
4 | |||
5 | m = median(x); | ||
6 | |||
7 | s = median(abs(x - m))*1.4836; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/mosaic.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/mosaic.m new file mode 100755 index 0000000..b056661 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/mosaic.m | |||
@@ -0,0 +1,92 @@ | |||
1 | |||
2 | if ~exist('I_1'), | ||
3 | active_images_save = active_images; | ||
4 | ima_read_calib; | ||
5 | active_images = active_images_save; | ||
6 | check_active_images; | ||
7 | end; | ||
8 | |||
9 | check_active_images; | ||
10 | |||
11 | if isempty(ind_read), | ||
12 | return; | ||
13 | end; | ||
14 | |||
15 | |||
16 | n_col = floor(sqrt(n_ima*nx/ny)); | ||
17 | |||
18 | n_row = ceil(n_ima / n_col); | ||
19 | |||
20 | |||
21 | ker2 = 1; | ||
22 | for ii = 1:n_col, | ||
23 | ker2 = conv(ker2,[1/4 1/2 1/4]); | ||
24 | end; | ||
25 | |||
26 | |||
27 | II = I_1(1:n_col:end,1:n_col:end); | ||
28 | |||
29 | [ny2,nx2] = size(II); | ||
30 | |||
31 | |||
32 | |||
33 | kk_c = 1; | ||
34 | |||
35 | II_mosaic = []; | ||
36 | |||
37 | for jj = 1:n_row, | ||
38 | |||
39 | |||
40 | II_row = []; | ||
41 | |||
42 | for ii = 1:n_col, | ||
43 | |||
44 | if (exist(['I_' num2str(kk_c)])) & (kk_c <= n_ima), | ||
45 | |||
46 | if active_images(kk_c), | ||
47 | eval(['I = I_' num2str(kk_c) ';']); | ||
48 | %I = conv2(conv2(I,ker2,'same'),ker2','same'); % anti-aliasing | ||
49 | I = I(1:n_col:end,1:n_col:end); | ||
50 | else | ||
51 | I = zeros(ny2,nx2); | ||
52 | end; | ||
53 | |||
54 | else | ||
55 | |||
56 | I = zeros(ny2,nx2); | ||
57 | |||
58 | end; | ||
59 | |||
60 | |||
61 | |||
62 | II_row = [II_row I]; | ||
63 | |||
64 | if ii ~= n_col, | ||
65 | |||
66 | II_row = [II_row zeros(ny2,3)]; | ||
67 | |||
68 | end; | ||
69 | |||
70 | |||
71 | kk_c = kk_c + 1; | ||
72 | |||
73 | end; | ||
74 | |||
75 | nn2 = size(II_row,2); | ||
76 | |||
77 | if jj ~= n_row, | ||
78 | II_row = [II_row; zeros(3,nn2)]; | ||
79 | end; | ||
80 | |||
81 | II_mosaic = [II_mosaic ; II_row]; | ||
82 | |||
83 | end; | ||
84 | |||
85 | figure(2); | ||
86 | image(II_mosaic); | ||
87 | colormap(gray(256)); | ||
88 | title('Calibration images'); | ||
89 | set(gca,'Xtick',[]) | ||
90 | set(gca,'Ytick',[]) | ||
91 | axis('image'); | ||
92 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/normalize.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/normalize.m new file mode 100755 index 0000000..6dc7149 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/normalize.m | |||
@@ -0,0 +1,43 @@ | |||
1 | function [xn] = normalize(x_kk,fc,cc,kc,alpha_c), | ||
2 | |||
3 | %normalize | ||
4 | % | ||
5 | %[xn] = normalize(x_kk,fc,cc,kc,alpha_c) | ||
6 | % | ||
7 | %Computes the normalized coordinates xn given the pixel coordinates x_kk | ||
8 | %and the intrinsic camera parameters fc, cc and kc. | ||
9 | % | ||
10 | %INPUT: x_kk: Feature locations on the images | ||
11 | % fc: Camera focal length | ||
12 | % cc: Principal point coordinates | ||
13 | % kc: Distortion coefficients | ||
14 | % alpha_c: Skew coefficient | ||
15 | % | ||
16 | %OUTPUT: xn: Normalized feature locations on the image plane (a 2XN matrix) | ||
17 | % | ||
18 | %Important functions called within that program: | ||
19 | % | ||
20 | %comp_distortion_oulu: undistort pixel coordinates. | ||
21 | |||
22 | if nargin < 5, | ||
23 | alpha_c = 0; | ||
24 | if nargin < 4; | ||
25 | kc = [0;0;0;0]; | ||
26 | if nargin < 3; | ||
27 | cc = [0;0]; | ||
28 | if nargin < 2, | ||
29 | fc = [1;1]; | ||
30 | end; | ||
31 | end; | ||
32 | end; | ||
33 | end; | ||
34 | |||
35 | |||
36 | % First subtract principal point, and divide by the focal length: | ||
37 | temp = (x_kk(2,:) - cc(2))/fc(2); | ||
38 | x_distort = [(x_kk(1,:) - cc(1))/fc(1) - alpha_c*temp;temp]; | ||
39 | |||
40 | |||
41 | %Compensate for lens distortion: | ||
42 | |||
43 | xn = comp_distortion_oulu(x_distort,kc); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/pgmread.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/pgmread.m new file mode 100755 index 0000000..c96ccb7 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/pgmread.m | |||
@@ -0,0 +1,26 @@ | |||
1 | function img = pgmread(filename) | ||
2 | % function img = pgmread(filename) | ||
3 | % this is my version of pgmread for the pgm file created by XV. | ||
4 | % | ||
5 | % this program also corrects for the shifts in the image from pm file. | ||
6 | |||
7 | fid = fopen(filename,'r'); | ||
8 | fscanf(fid, 'P5\n'); | ||
9 | cmt = '#'; | ||
10 | while findstr(cmt, '#'), | ||
11 | cmt = fgets(fid); | ||
12 | if length(findstr(cmt, '#')) ~= 1, | ||
13 | YX = sscanf(cmt, '%d %d'); | ||
14 | y = YX(1); x = YX(2); | ||
15 | end | ||
16 | end | ||
17 | |||
18 | %fgets(fid); | ||
19 | |||
20 | %img = fscanf(fid,'%d',size); | ||
21 | %img = img'; | ||
22 | |||
23 | img = fread(fid,[y,x],'uint8'); | ||
24 | img = img'; | ||
25 | fclose(fid); | ||
26 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/project2_oulu.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/project2_oulu.m new file mode 100755 index 0000000..c5c4a34 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/project2_oulu.m | |||
@@ -0,0 +1,53 @@ | |||
1 | function [x] = project2_oulu(X,R,T,f,t,k) | ||
2 | %PROJECT Subsidiary to calib | ||
3 | |||
4 | % (c) Pietro Perona -- March 24, 1994 | ||
5 | % California Institute of Technology | ||
6 | % Pasadena, CA | ||
7 | % | ||
8 | % Renamed because project exists in matlab 5.2!!! | ||
9 | % Now uses the more elaborate intrinsic model from Oulu | ||
10 | |||
11 | |||
12 | |||
13 | [m,n] = size(X); | ||
14 | |||
15 | Y = R*X + T*ones(1,n); | ||
16 | Z = Y(3,:); | ||
17 | |||
18 | f = f(:); %% make a column vector | ||
19 | if length(f)==1, | ||
20 | f = [f f]'; | ||
21 | end; | ||
22 | |||
23 | x = (Y(1:2,:) ./ (ones(2,1) * Z)) ; | ||
24 | |||
25 | |||
26 | radius_2 = x(1,:).^2 + x(2,:).^2; | ||
27 | |||
28 | if length(k) > 1, | ||
29 | |||
30 | radial_distortion = 1 + ones(2,1) * ((k(1) * radius_2) + (k(2) * radius_2.^2)); | ||
31 | |||
32 | if length(k) < 4, | ||
33 | |||
34 | delta_x = zeros(2,n); | ||
35 | |||
36 | else | ||
37 | |||
38 | delta_x = [2*k(3)*x(1,:).*x(2,:) + k(4)*(radius_2 + 2*x(1,:).^2) ; | ||
39 | k(3) * (radius_2 + 2*x(2,:).^2)+2*k(4)*x(1,:).*x(2,:)]; | ||
40 | |||
41 | end; | ||
42 | |||
43 | |||
44 | else | ||
45 | |||
46 | radial_distortion = 1 + ones(2,1) * ((k(1) * radius_2)); | ||
47 | |||
48 | delta_x = zeros(2,n); | ||
49 | |||
50 | end; | ||
51 | |||
52 | |||
53 | x = (x .* radial_distortion + delta_x).* (f * ones(1,n)) + t*ones(1,n); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/project_points.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/project_points.m new file mode 100755 index 0000000..1823490 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/project_points.m | |||
@@ -0,0 +1,276 @@ | |||
1 | function [xp,dxpdom,dxpdT,dxpdf,dxpdc,dxpdk] = project_points(X,om,T,f,c,k) | ||
2 | |||
3 | %project_points.m | ||
4 | % | ||
5 | %[xp,dxpdom,dxpdT,dxpdf,dxpdc,dxpdk] = project_points(X,om,T,f,c,k) | ||
6 | % | ||
7 | %Projects a 3D structure onto the image plane. | ||
8 | % | ||
9 | %INPUT: X: 3D structure in the world coordinate frame (3xN matrix for N points) | ||
10 | % (om,T): Rigid motion parameters between world coordinate frame and camera reference frame | ||
11 | % om: rotation vector (3x1 vector); T: translation vector (3x1 vector) | ||
12 | % f: camera focal length in units of horizontal and vertical pixel units (2x1 vector) | ||
13 | % c: principal point location in pixel units (2x1 vector) | ||
14 | % k: Distortion coefficients (radial and tangential) (4x1 vector) | ||
15 | % | ||
16 | %OUTPUT: xp: Projected pixel coordinates (2xN matrix for N points) | ||
17 | % dxpdom: Derivative of xp with respect to om ((2N)x3 matrix) | ||
18 | % dxpdT: Derivative of xp with respect to T ((2N)x3 matrix) | ||
19 | % dxpdf: Derivative of xp with respect to f ((2N)x2 matrix) | ||
20 | % dxpdc: Derivative of xp with respect to c ((2N)x2 matrix) | ||
21 | % dxpdk: Derivative of xp with respect to k ((2N)x4 matrix) | ||
22 | % | ||
23 | %Definitions: | ||
24 | %Let P be a point in 3D of coordinates X in the world reference frame (stored in the matrix X) | ||
25 | %The coordinate vector of P in the camera reference frame is: Xc = R*X + T | ||
26 | %where R is the rotation matrix corresponding to the rotation vector om: R = rodrigues(om); | ||
27 | %call x, y and z the 3 coordinates of Xc: x = Xc(1); y = Xc(2); z = Xc(3); | ||
28 | %The pinehole projection coordinates of P is [a;b] where a=x/z and b=y/z. | ||
29 | %call r^2 = a^2 + b^2. | ||
30 | %The distorted point coordinates are: xd = [xx;yy] where: | ||
31 | % | ||
32 | %xx = a * (1 + kc(1)*r^2 + kc(2)*r^4) + 2*kc(3)*a*b + kc(4)*(r^2 + 2*a^2); | ||
33 | %yy = b * (1 + kc(1)*r^2 + kc(2)*r^4) + kc(3)*(r^2 + 2*b^2) + 2*kc(4)*a*b; | ||
34 | % | ||
35 | %The left terms correspond to radial distortion, the right terms correspond to tangential distortion | ||
36 | % | ||
37 | %Fianlly, convertion into pixel coordinates: The final pixel coordinates vector xp=[xxp;yyp] where: | ||
38 | % | ||
39 | %xxp = f(1)*xx + c(1) | ||
40 | %yyp = f(2)*yy + c(2) | ||
41 | % | ||
42 | % | ||
43 | %NOTE: About 90 percent of the code takes care fo computing the Jacobian matrices | ||
44 | % | ||
45 | % | ||
46 | %Important function called within that program: | ||
47 | % | ||
48 | %rodrigues.m: Computes the rotation matrix corresponding to a rotation vector | ||
49 | % | ||
50 | %rigid_motion.m: Computes the rigid motion transformation of a given structure | ||
51 | |||
52 | |||
53 | |||
54 | if nargin < 6, | ||
55 | k = zeros(4,1); | ||
56 | if nargin < 5, | ||
57 | c = zeros(2,1); | ||
58 | if nargin < 4, | ||
59 | f = ones(2,1); | ||
60 | if nargin < 3, | ||
61 | T = zeros(3,1); | ||
62 | if nargin < 2, | ||
63 | om = zeros(3,1); | ||
64 | if nargin < 1, | ||
65 | error('Need at least a 3D structure to project (in project_points.m)'); | ||
66 | return; | ||
67 | end; | ||
68 | end; | ||
69 | end; | ||
70 | end; | ||
71 | end; | ||
72 | end; | ||
73 | |||
74 | |||
75 | [m,n] = size(X); | ||
76 | |||
77 | [Y,dYdom,dYdT] = rigid_motion(X,om,T); | ||
78 | |||
79 | |||
80 | inv_Z = 1./Y(3,:); | ||
81 | |||
82 | x = (Y(1:2,:) .* (ones(2,1) * inv_Z)) ; | ||
83 | |||
84 | |||
85 | bb = (-x(1,:) .* inv_Z)'*ones(1,3); | ||
86 | cc = (-x(2,:) .* inv_Z)'*ones(1,3); | ||
87 | |||
88 | |||
89 | dxdom = zeros(2*n,3); | ||
90 | dxdom(1:2:end,:) = ((inv_Z')*ones(1,3)) .* dYdom(1:3:end,:) + bb .* dYdom(3:3:end,:); | ||
91 | dxdom(2:2:end,:) = ((inv_Z')*ones(1,3)) .* dYdom(2:3:end,:) + cc .* dYdom(3:3:end,:); | ||
92 | |||
93 | dxdT = zeros(2*n,3); | ||
94 | dxdT(1:2:end,:) = ((inv_Z')*ones(1,3)) .* dYdT(1:3:end,:) + bb .* dYdT(3:3:end,:); | ||
95 | dxdT(2:2:end,:) = ((inv_Z')*ones(1,3)) .* dYdT(2:3:end,:) + cc .* dYdT(3:3:end,:); | ||
96 | |||
97 | |||
98 | % Add distortion: | ||
99 | |||
100 | r2 = x(1,:).^2 + x(2,:).^2; | ||
101 | |||
102 | |||
103 | |||
104 | dr2dom = 2*((x(1,:)')*ones(1,3)) .* dxdom(1:2:end,:) + 2*((x(2,:)')*ones(1,3)) .* dxdom(2:2:end,:); | ||
105 | dr2dT = 2*((x(1,:)')*ones(1,3)) .* dxdT(1:2:end,:) + 2*((x(2,:)')*ones(1,3)) .* dxdT(2:2:end,:); | ||
106 | |||
107 | |||
108 | r4 = r2.^2; | ||
109 | |||
110 | dr4dom = 2*((r2')*ones(1,3)) .* dr2dom; | ||
111 | dr4dT = 2*((r2')*ones(1,3)) .* dr2dT; | ||
112 | |||
113 | |||
114 | % Radial distortion: | ||
115 | |||
116 | cdist = 1 + k(1) * r2 + k(2) * r4; | ||
117 | |||
118 | dcdistdom = k(1) * dr2dom + k(2) * dr4dom; | ||
119 | dcdistdT = k(1) * dr2dT+ k(2) * dr4dT; | ||
120 | dcdistdk = [ r2' r4' zeros(n,2)]; | ||
121 | |||
122 | |||
123 | xd1 = x .* (ones(2,1)*cdist); | ||
124 | |||
125 | dxd1dom = zeros(2*n,3); | ||
126 | dxd1dom(1:2:end,:) = (x(1,:)'*ones(1,3)) .* dcdistdom; | ||
127 | dxd1dom(2:2:end,:) = (x(2,:)'*ones(1,3)) .* dcdistdom; | ||
128 | coeff = (reshape([cdist;cdist],2*n,1)*ones(1,3)); | ||
129 | dxd1dom = dxd1dom + coeff.* dxdom; | ||
130 | |||
131 | dxd1dT = zeros(2*n,3); | ||
132 | dxd1dT(1:2:end,:) = (x(1,:)'*ones(1,3)) .* dcdistdT; | ||
133 | dxd1dT(2:2:end,:) = (x(2,:)'*ones(1,3)) .* dcdistdT; | ||
134 | dxd1dT = dxd1dT + coeff.* dxdT; | ||
135 | |||
136 | dxd1dk = zeros(2*n,4); | ||
137 | dxd1dk(1:2:end,:) = (x(1,:)'*ones(1,4)) .* dcdistdk; | ||
138 | dxd1dk(2:2:end,:) = (x(2,:)'*ones(1,4)) .* dcdistdk; | ||
139 | |||
140 | |||
141 | |||
142 | % tangential distortion: | ||
143 | |||
144 | a1 = 2.*x(1,:).*x(2,:); | ||
145 | a2 = r2 + 2*x(1,:).^2; | ||
146 | a3 = r2 + 2*x(2,:).^2; | ||
147 | |||
148 | delta_x = [k(3)*a1 + k(4)*a2 ; | ||
149 | k(3) * a3 + k(4)*a1]; | ||
150 | |||
151 | |||
152 | ddelta_xdx = zeros(2*n,2*n); | ||
153 | aa = (2*k(3)*x(2,:)+6*k(4)*x(1,:))'*ones(1,3); | ||
154 | bb = (2*k(3)*x(1,:)+2*k(4)*x(2,:))'*ones(1,3); | ||
155 | cc = (6*k(3)*x(2,:)+2*k(4)*x(1,:))'*ones(1,3); | ||
156 | |||
157 | ddelta_xdom = zeros(2*n,3); | ||
158 | ddelta_xdom(1:2:end,:) = aa .* dxdom(1:2:end,:) + bb .* dxdom(2:2:end,:); | ||
159 | ddelta_xdom(2:2:end,:) = bb .* dxdom(1:2:end,:) + cc .* dxdom(2:2:end,:); | ||
160 | |||
161 | ddelta_xdT = zeros(2*n,3); | ||
162 | ddelta_xdT(1:2:end,:) = aa .* dxdT(1:2:end,:) + bb .* dxdT(2:2:end,:); | ||
163 | ddelta_xdT(2:2:end,:) = bb .* dxdT(1:2:end,:) + cc .* dxdT(2:2:end,:); | ||
164 | |||
165 | ddelta_xdk = zeros(2*n,4); | ||
166 | ddelta_xdk(1:2:end,3) = a1'; | ||
167 | ddelta_xdk(1:2:end,4) = a2'; | ||
168 | ddelta_xdk(2:2:end,3) = a3'; | ||
169 | ddelta_xdk(2:2:end,4) = a1'; | ||
170 | |||
171 | |||
172 | |||
173 | xd2 = xd1 + delta_x; | ||
174 | |||
175 | dxd2dom = dxd1dom + ddelta_xdom ; | ||
176 | dxd2dT = dxd1dT + ddelta_xdT; | ||
177 | dxd2dk = dxd1dk + ddelta_xdk ; | ||
178 | |||
179 | |||
180 | % Pixel coordinates: | ||
181 | |||
182 | xp = xd2 .* (f * ones(1,n)) + c*ones(1,n); | ||
183 | |||
184 | coeff = reshape(f*ones(1,n),2*n,1); | ||
185 | |||
186 | dxpdom = (coeff*ones(1,3)) .* dxd2dom; | ||
187 | dxpdT = (coeff*ones(1,3)) .* dxd2dT; | ||
188 | dxpdk = (coeff*ones(1,4)) .* dxd2dk; | ||
189 | |||
190 | dxpdf = zeros(2*n,2); | ||
191 | dxpdf(1:2:end,1) = xd2(1,:)'; | ||
192 | dxpdf(2:2:end,2) = xd2(2,:)'; | ||
193 | |||
194 | dxpdc = zeros(2*n,2); | ||
195 | dxpdc(1:2:end,1) = ones(n,1); | ||
196 | dxpdc(2:2:end,2) = ones(n,1); | ||
197 | |||
198 | |||
199 | return; | ||
200 | |||
201 | % Test of the Jacobians: | ||
202 | |||
203 | n = 10; | ||
204 | |||
205 | X = 10*randn(3,n); | ||
206 | om = randn(3,1); | ||
207 | T = [10*randn(2,1);40]; | ||
208 | f = 1000*rand(2,1); | ||
209 | c = 1000*randn(2,1); | ||
210 | k = 0.5*randn(4,1); | ||
211 | |||
212 | |||
213 | [x,dxdom,dxdT,dxdf,dxdc,dxdk] = project_points(X,om,T,f,c,k); | ||
214 | |||
215 | |||
216 | % Test on om: NOT OK | ||
217 | |||
218 | dom = 0.000000001 * norm(om)*randn(3,1); | ||
219 | om2 = om + dom; | ||
220 | |||
221 | [x2] = project_points(X,om2,T,f,c,k); | ||
222 | |||
223 | x_pred = x + reshape(dxdom * dom,2,n); | ||
224 | |||
225 | |||
226 | norm(x2-x)/norm(x2 - x_pred) | ||
227 | |||
228 | |||
229 | % Test on T: OK!! | ||
230 | |||
231 | dT = 0.0001 * norm(T)*randn(3,1); | ||
232 | T2 = T + dT; | ||
233 | |||
234 | [x2] = project_points(X,om,T2,f,c,k); | ||
235 | |||
236 | x_pred = x + reshape(dxdT * dT,2,n); | ||
237 | |||
238 | |||
239 | norm(x2-x)/norm(x2 - x_pred) | ||
240 | |||
241 | |||
242 | |||
243 | % Test on f: OK!! | ||
244 | |||
245 | df = 0.001 * norm(f)*randn(2,1); | ||
246 | f2 = f + df; | ||
247 | |||
248 | [x2] = project_points(X,om,T,f2,c,k); | ||
249 | |||
250 | x_pred = x + reshape(dxdf * df,2,n); | ||
251 | |||
252 | |||
253 | norm(x2-x)/norm(x2 - x_pred) | ||
254 | |||
255 | |||
256 | % Test on c: OK!! | ||
257 | |||
258 | dc = 0.01 * norm(c)*randn(2,1); | ||
259 | c2 = c + dc; | ||
260 | |||
261 | [x2] = project_points(X,om,T,f,c2,k); | ||
262 | |||
263 | x_pred = x + reshape(dxdc * dc,2,n); | ||
264 | |||
265 | norm(x2-x)/norm(x2 - x_pred) | ||
266 | |||
267 | % Test on k: OK!! | ||
268 | |||
269 | dk = 0.001 * norm(4)*randn(4,1); | ||
270 | k2 = k + dk; | ||
271 | |||
272 | [x2] = project_points(X,om,T,f,c,k2); | ||
273 | |||
274 | x_pred = x + reshape(dxdk * dk,2,n); | ||
275 | |||
276 | norm(x2-x)/norm(x2 - x_pred) | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/project_points2.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/project_points2.m new file mode 100755 index 0000000..5bb1b91 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/project_points2.m | |||
@@ -0,0 +1,312 @@ | |||
1 | function [xp,dxpdom,dxpdT,dxpdf,dxpdc,dxpdk,dxpdalpha] = project_points2(X,om,T,f,c,k,alpha) | ||
2 | |||
3 | %project_points.m | ||
4 | % | ||
5 | %[xp,dxpdom,dxpdT,dxpdf,dxpdc,dxpdk] = project_points2(X,om,T,f,c,k,alpha) | ||
6 | % | ||
7 | %Projects a 3D structure onto the image plane. | ||
8 | % | ||
9 | %INPUT: X: 3D structure in the world coordinate frame (3xN matrix for N points) | ||
10 | % (om,T): Rigid motion parameters between world coordinate frame and camera reference frame | ||
11 | % om: rotation vector (3x1 vector); T: translation vector (3x1 vector) | ||
12 | % f: camera focal length in units of horizontal and vertical pixel units (2x1 vector) | ||
13 | % c: principal point location in pixel units (2x1 vector) | ||
14 | % k: Distortion coefficients (radial and tangential) (4x1 vector) | ||
15 | % alpha: Skew coefficient between x and y pixel (alpha = 0 <=> square pixels) | ||
16 | % | ||
17 | %OUTPUT: xp: Projected pixel coordinates (2xN matrix for N points) | ||
18 | % dxpdom: Derivative of xp with respect to om ((2N)x3 matrix) | ||
19 | % dxpdT: Derivative of xp with respect to T ((2N)x3 matrix) | ||
20 | % dxpdf: Derivative of xp with respect to f ((2N)x2 matrix) | ||
21 | % dxpdc: Derivative of xp with respect to c ((2N)x2 matrix) | ||
22 | % dxpdk: Derivative of xp with respect to k ((2N)x4 matrix) | ||
23 | % | ||
24 | %Definitions: | ||
25 | %Let P be a point in 3D of coordinates X in the world reference frame (stored in the matrix X) | ||
26 | %The coordinate vector of P in the camera reference frame is: Xc = R*X + T | ||
27 | %where R is the rotation matrix corresponding to the rotation vector om: R = rodrigues(om); | ||
28 | %call x, y and z the 3 coordinates of Xc: x = Xc(1); y = Xc(2); z = Xc(3); | ||
29 | %The pinehole projection coordinates of P is [a;b] where a=x/z and b=y/z. | ||
30 | %call r^2 = a^2 + b^2. | ||
31 | %The distorted point coordinates are: xd = [xx;yy] where: | ||
32 | % | ||
33 | %xx = a * (1 + kc(1)*r^2 + kc(2)*r^4) + 2*kc(3)*a*b + kc(4)*(r^2 + 2*a^2); | ||
34 | %yy = b * (1 + kc(1)*r^2 + kc(2)*r^4) + kc(3)*(r^2 + 2*b^2) + 2*kc(4)*a*b; | ||
35 | % | ||
36 | %The left terms correspond to radial distortion, the right terms correspond to tangential distortion | ||
37 | % | ||
38 | %Finally, convertion into pixel coordinates: The final pixel coordinates vector xp=[xxp;yyp] where: | ||
39 | % | ||
40 | %xxp = f(1)*(xx + alpha*yy) + c(1) | ||
41 | %yyp = f(2)*yy + c(2) | ||
42 | % | ||
43 | % | ||
44 | %NOTE: About 90 percent of the code takes care fo computing the Jacobian matrices | ||
45 | % | ||
46 | % | ||
47 | %Important function called within that program: | ||
48 | % | ||
49 | %rodrigues.m: Computes the rotation matrix corresponding to a rotation vector | ||
50 | % | ||
51 | %rigid_motion.m: Computes the rigid motion transformation of a given structure | ||
52 | |||
53 | |||
54 | if nargin < 7, | ||
55 | alpha = 0; | ||
56 | if nargin < 6, | ||
57 | k = zeros(4,1); | ||
58 | if nargin < 5, | ||
59 | c = zeros(2,1); | ||
60 | if nargin < 4, | ||
61 | f = ones(2,1); | ||
62 | if nargin < 3, | ||
63 | T = zeros(3,1); | ||
64 | if nargin < 2, | ||
65 | om = zeros(3,1); | ||
66 | if nargin < 1, | ||
67 | error('Need at least a 3D structure to project (in project_points.m)'); | ||
68 | return; | ||
69 | end; | ||
70 | end; | ||
71 | end; | ||
72 | end; | ||
73 | end; | ||
74 | end; | ||
75 | end; | ||
76 | |||
77 | |||
78 | [m,n] = size(X); | ||
79 | |||
80 | [Y,dYdom,dYdT] = rigid_motion(X,om,T); | ||
81 | |||
82 | |||
83 | inv_Z = 1./Y(3,:); | ||
84 | |||
85 | x = (Y(1:2,:) .* (ones(2,1) * inv_Z)) ; | ||
86 | |||
87 | |||
88 | bb = (-x(1,:) .* inv_Z)'*ones(1,3); | ||
89 | cc = (-x(2,:) .* inv_Z)'*ones(1,3); | ||
90 | |||
91 | |||
92 | dxdom = zeros(2*n,3); | ||
93 | dxdom(1:2:end,:) = ((inv_Z')*ones(1,3)) .* dYdom(1:3:end,:) + bb .* dYdom(3:3:end,:); | ||
94 | dxdom(2:2:end,:) = ((inv_Z')*ones(1,3)) .* dYdom(2:3:end,:) + cc .* dYdom(3:3:end,:); | ||
95 | |||
96 | dxdT = zeros(2*n,3); | ||
97 | dxdT(1:2:end,:) = ((inv_Z')*ones(1,3)) .* dYdT(1:3:end,:) + bb .* dYdT(3:3:end,:); | ||
98 | dxdT(2:2:end,:) = ((inv_Z')*ones(1,3)) .* dYdT(2:3:end,:) + cc .* dYdT(3:3:end,:); | ||
99 | |||
100 | |||
101 | % Add distortion: | ||
102 | |||
103 | r2 = x(1,:).^2 + x(2,:).^2; | ||
104 | |||
105 | |||
106 | |||
107 | dr2dom = 2*((x(1,:)')*ones(1,3)) .* dxdom(1:2:end,:) + 2*((x(2,:)')*ones(1,3)) .* dxdom(2:2:end,:); | ||
108 | dr2dT = 2*((x(1,:)')*ones(1,3)) .* dxdT(1:2:end,:) + 2*((x(2,:)')*ones(1,3)) .* dxdT(2:2:end,:); | ||
109 | |||
110 | |||
111 | r4 = r2.^2; | ||
112 | |||
113 | dr4dom = 2*((r2')*ones(1,3)) .* dr2dom; | ||
114 | dr4dT = 2*((r2')*ones(1,3)) .* dr2dT; | ||
115 | |||
116 | |||
117 | % Radial distortion: | ||
118 | |||
119 | cdist = 1 + k(1) * r2 + k(2) * r4; | ||
120 | |||
121 | dcdistdom = k(1) * dr2dom + k(2) * dr4dom; | ||
122 | dcdistdT = k(1) * dr2dT+ k(2) * dr4dT; | ||
123 | dcdistdk = [ r2' r4' zeros(n,2)]; | ||
124 | |||
125 | |||
126 | xd1 = x .* (ones(2,1)*cdist); | ||
127 | |||
128 | dxd1dom = zeros(2*n,3); | ||
129 | dxd1dom(1:2:end,:) = (x(1,:)'*ones(1,3)) .* dcdistdom; | ||
130 | dxd1dom(2:2:end,:) = (x(2,:)'*ones(1,3)) .* dcdistdom; | ||
131 | coeff = (reshape([cdist;cdist],2*n,1)*ones(1,3)); | ||
132 | dxd1dom = dxd1dom + coeff.* dxdom; | ||
133 | |||
134 | dxd1dT = zeros(2*n,3); | ||
135 | dxd1dT(1:2:end,:) = (x(1,:)'*ones(1,3)) .* dcdistdT; | ||
136 | dxd1dT(2:2:end,:) = (x(2,:)'*ones(1,3)) .* dcdistdT; | ||
137 | dxd1dT = dxd1dT + coeff.* dxdT; | ||
138 | |||
139 | dxd1dk = zeros(2*n,4); | ||
140 | dxd1dk(1:2:end,:) = (x(1,:)'*ones(1,4)) .* dcdistdk; | ||
141 | dxd1dk(2:2:end,:) = (x(2,:)'*ones(1,4)) .* dcdistdk; | ||
142 | |||
143 | |||
144 | |||
145 | % tangential distortion: | ||
146 | |||
147 | a1 = 2.*x(1,:).*x(2,:); | ||
148 | a2 = r2 + 2*x(1,:).^2; | ||
149 | a3 = r2 + 2*x(2,:).^2; | ||
150 | |||
151 | delta_x = [k(3)*a1 + k(4)*a2 ; | ||
152 | k(3) * a3 + k(4)*a1]; | ||
153 | |||
154 | |||
155 | ddelta_xdx = zeros(2*n,2*n); | ||
156 | aa = (2*k(3)*x(2,:)+6*k(4)*x(1,:))'*ones(1,3); | ||
157 | bb = (2*k(3)*x(1,:)+2*k(4)*x(2,:))'*ones(1,3); | ||
158 | cc = (6*k(3)*x(2,:)+2*k(4)*x(1,:))'*ones(1,3); | ||
159 | |||
160 | ddelta_xdom = zeros(2*n,3); | ||
161 | ddelta_xdom(1:2:end,:) = aa .* dxdom(1:2:end,:) + bb .* dxdom(2:2:end,:); | ||
162 | ddelta_xdom(2:2:end,:) = bb .* dxdom(1:2:end,:) + cc .* dxdom(2:2:end,:); | ||
163 | |||
164 | ddelta_xdT = zeros(2*n,3); | ||
165 | ddelta_xdT(1:2:end,:) = aa .* dxdT(1:2:end,:) + bb .* dxdT(2:2:end,:); | ||
166 | ddelta_xdT(2:2:end,:) = bb .* dxdT(1:2:end,:) + cc .* dxdT(2:2:end,:); | ||
167 | |||
168 | ddelta_xdk = zeros(2*n,4); | ||
169 | ddelta_xdk(1:2:end,3) = a1'; | ||
170 | ddelta_xdk(1:2:end,4) = a2'; | ||
171 | ddelta_xdk(2:2:end,3) = a3'; | ||
172 | ddelta_xdk(2:2:end,4) = a1'; | ||
173 | |||
174 | |||
175 | |||
176 | xd2 = xd1 + delta_x; | ||
177 | |||
178 | dxd2dom = dxd1dom + ddelta_xdom ; | ||
179 | dxd2dT = dxd1dT + ddelta_xdT; | ||
180 | dxd2dk = dxd1dk + ddelta_xdk ; | ||
181 | |||
182 | |||
183 | % Add Skew: | ||
184 | |||
185 | xd3 = [xd2(1,:) + alpha*xd2(2,:);xd2(2,:)]; | ||
186 | |||
187 | % Compute: dxd3dom, dxd3dT, dxd3dk, dxd3dalpha | ||
188 | |||
189 | dxd3dom = zeros(2*n,3); | ||
190 | dxd3dom(1:2:2*n,:) = dxd2dom(1:2:2*n,:) + alpha*dxd2dom(2:2:2*n,:); | ||
191 | dxd3dom(2:2:2*n,:) = dxd2dom(2:2:2*n,:); | ||
192 | dxd3dT = zeros(2*n,3); | ||
193 | dxd3dT(1:2:2*n,:) = dxd2dT(1:2:2*n,:) + alpha*dxd2dT(2:2:2*n,:); | ||
194 | dxd3dT(2:2:2*n,:) = dxd2dT(2:2:2*n,:); | ||
195 | dxd3dk = zeros(2*n,4); | ||
196 | dxd3dk(1:2:2*n,:) = dxd2dk(1:2:2*n,:) + alpha*dxd2dk(2:2:2*n,:); | ||
197 | dxd3dk(2:2:2*n,:) = dxd2dk(2:2:2*n,:); | ||
198 | dxd3dalpha = zeros(2*n,1); | ||
199 | dxd3dalpha(1:2:2*n,:) = xd2(2,:)'; | ||
200 | |||
201 | |||
202 | |||
203 | % Pixel coordinates: | ||
204 | |||
205 | xp = xd3 .* (f * ones(1,n)) + c*ones(1,n); | ||
206 | |||
207 | coeff = reshape(f*ones(1,n),2*n,1); | ||
208 | |||
209 | dxpdom = (coeff*ones(1,3)) .* dxd3dom; | ||
210 | dxpdT = (coeff*ones(1,3)) .* dxd3dT; | ||
211 | dxpdk = (coeff*ones(1,4)) .* dxd3dk; | ||
212 | dxpdalpha = (coeff) .* dxd3dalpha; | ||
213 | |||
214 | dxpdf = zeros(2*n,2); | ||
215 | dxpdf(1:2:end,1) = xd2(1,:)'; | ||
216 | dxpdf(2:2:end,2) = xd2(2,:)'; | ||
217 | |||
218 | dxpdc = zeros(2*n,2); | ||
219 | dxpdc(1:2:end,1) = ones(n,1); | ||
220 | dxpdc(2:2:end,2) = ones(n,1); | ||
221 | |||
222 | |||
223 | return; | ||
224 | |||
225 | % Test of the Jacobians: | ||
226 | |||
227 | n = 10; | ||
228 | |||
229 | X = 10*randn(3,n); | ||
230 | om = randn(3,1); | ||
231 | T = [10*randn(2,1);40]; | ||
232 | f = 1000*rand(2,1); | ||
233 | c = 1000*randn(2,1); | ||
234 | k = 0.5*randn(4,1); | ||
235 | alpha = 0.01*randn(1,1); | ||
236 | |||
237 | [x,dxdom,dxdT,dxdf,dxdc,dxdk,dxdalpha] = project_points2(X,om,T,f,c,k,alpha); | ||
238 | |||
239 | |||
240 | % Test on om: NOT OK | ||
241 | |||
242 | dom = 0.000000001 * norm(om)*randn(3,1); | ||
243 | om2 = om + dom; | ||
244 | |||
245 | [x2] = project_points2(X,om2,T,f,c,k,alpha); | ||
246 | |||
247 | x_pred = x + reshape(dxdom * dom,2,n); | ||
248 | |||
249 | |||
250 | norm(x2-x)/norm(x2 - x_pred) | ||
251 | |||
252 | |||
253 | % Test on T: OK!! | ||
254 | |||
255 | dT = 0.0001 * norm(T)*randn(3,1); | ||
256 | T2 = T + dT; | ||
257 | |||
258 | [x2] = project_points2(X,om,T2,f,c,k,alpha); | ||
259 | |||
260 | x_pred = x + reshape(dxdT * dT,2,n); | ||
261 | |||
262 | |||
263 | norm(x2-x)/norm(x2 - x_pred) | ||
264 | |||
265 | |||
266 | |||
267 | % Test on f: OK!! | ||
268 | |||
269 | df = 0.001 * norm(f)*randn(2,1); | ||
270 | f2 = f + df; | ||
271 | |||
272 | [x2] = project_points2(X,om,T,f2,c,k,alpha); | ||
273 | |||
274 | x_pred = x + reshape(dxdf * df,2,n); | ||
275 | |||
276 | |||
277 | norm(x2-x)/norm(x2 - x_pred) | ||
278 | |||
279 | |||
280 | % Test on c: OK!! | ||
281 | |||
282 | dc = 0.01 * norm(c)*randn(2,1); | ||
283 | c2 = c + dc; | ||
284 | |||
285 | [x2] = project_points2(X,om,T,f,c2,k,alpha); | ||
286 | |||
287 | x_pred = x + reshape(dxdc * dc,2,n); | ||
288 | |||
289 | norm(x2-x)/norm(x2 - x_pred) | ||
290 | |||
291 | % Test on k: OK!! | ||
292 | |||
293 | dk = 0.001 * norm(k)*randn(4,1); | ||
294 | k2 = k + dk; | ||
295 | |||
296 | [x2] = project_points2(X,om,T,f,c,k2,alpha); | ||
297 | |||
298 | x_pred = x + reshape(dxdk * dk,2,n); | ||
299 | |||
300 | norm(x2-x)/norm(x2 - x_pred) | ||
301 | |||
302 | |||
303 | % Test on alpha: OK!! | ||
304 | |||
305 | dalpha = 0.001 * norm(k)*randn(1,1); | ||
306 | alpha2 = alpha + dalpha; | ||
307 | |||
308 | [x2] = project_points2(X,om,T,f,c,k,alpha2); | ||
309 | |||
310 | x_pred = x + reshape(dxdalpha * dalpha,2,n); | ||
311 | |||
312 | norm(x2-x)/norm(x2 - x_pred) | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/projectedGrid.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/projectedGrid.m new file mode 100755 index 0000000..561a7d0 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/projectedGrid.m | |||
@@ -0,0 +1,24 @@ | |||
1 | function [XX,H] = projectedGrid ( P1, P2, P3, P4 , nx, ny); | ||
2 | |||
3 | % new formalism using homographies | ||
4 | |||
5 | a00 = [P1;1]; | ||
6 | a10 = [P2;1]; | ||
7 | a11 = [P3;1]; | ||
8 | a01 = [P4;1]; | ||
9 | |||
10 | % Compute the planart collineation: | ||
11 | |||
12 | [H] = compute_collineation (a00, a10, a11, a01); | ||
13 | |||
14 | |||
15 | % Build the grid using the planar collineation: | ||
16 | |||
17 | x_l = ((0:(nx-1))'*ones(1,ny))/(nx-1); | ||
18 | y_l = (ones(nx,1)*(0:(ny-1)))/(ny-1); | ||
19 | |||
20 | pts = [x_l(:) y_l(:) ones(nx*ny,1)]'; | ||
21 | |||
22 | XX = H*pts; | ||
23 | |||
24 | XX = XX(1:2,:) ./ (ones(2,1)*XX(3,:)); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/projector_calib.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/projector_calib.m new file mode 100755 index 0000000..bb4ef86 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/projector_calib.m | |||
@@ -0,0 +1,258 @@ | |||
1 | %%% This code is an additional code that helps doing projector calibration in 3D scanning setup. | ||
2 | %%% This is not a useful code for anyone else but me. | ||
3 | %%% I included it in the toolbox for illustration only. | ||
4 | |||
5 | |||
6 | load camera_results; | ||
7 | |||
8 | |||
9 | proj_name = input('Basename projector calibration images (without number nor suffix): ','s'); | ||
10 | |||
11 | |||
12 | i = 1; | ||
13 | |||
14 | while (i <= n_ima), % & (~no_image_file), | ||
15 | |||
16 | if active_images(i), | ||
17 | |||
18 | %fprintf(1,'Loading image %d...\n',i); | ||
19 | |||
20 | if ~type_numbering, | ||
21 | number_ext = num2str(image_numbers(i)); | ||
22 | else | ||
23 | number_ext = sprintf(['%.' num2str(N_slots) 'd'],image_numbers(i)); | ||
24 | end; | ||
25 | |||
26 | ima_namep = [proj_name number_ext 'p.' format_image]; | ||
27 | ima_namen = [proj_name number_ext 'n.' format_image]; | ||
28 | |||
29 | if i == ind_active(1), | ||
30 | fprintf(1,'Loading image '); | ||
31 | end; | ||
32 | |||
33 | fprintf(1,'%d...',i); | ||
34 | |||
35 | if format_image(1) == 'p', | ||
36 | if format_image(2) == 'p', | ||
37 | Ip = double(loadppm(ima_namep)); | ||
38 | In = double(loadppm(ima_namen)); | ||
39 | else | ||
40 | Ip = double(loadpgm(ima_namep)); | ||
41 | In = double(loadpgm(ima_namen)); | ||
42 | end; | ||
43 | else | ||
44 | if format_image(1) == 'r', | ||
45 | Ip = readras(ima_namep); | ||
46 | In = readras(ima_namen); | ||
47 | else | ||
48 | Ip = double(imread(ima_namep)); | ||
49 | In = double(imread(ima_namen)); | ||
50 | end; | ||
51 | end; | ||
52 | |||
53 | |||
54 | if size(Ip,3)>1, | ||
55 | Ip = Ip(:,:,2); | ||
56 | In = In(:,:,2); | ||
57 | end; | ||
58 | |||
59 | eval(['Ip_' num2str(i) ' = Ip;']); | ||
60 | eval(['In_' num2str(i) ' = In;']); | ||
61 | |||
62 | end; | ||
63 | |||
64 | i = i+1; | ||
65 | |||
66 | end; | ||
67 | |||
68 | |||
69 | fprintf(1,'\nExtraction of the grid corners on the image\n'); | ||
70 | |||
71 | disp('Window size for corner finder (wintx and winty):'); | ||
72 | wintx = input('wintx ([] = 5) = '); | ||
73 | if isempty(wintx), wintx = 5; end; | ||
74 | wintx = round(wintx); | ||
75 | winty = input('winty ([] = 5) = '); | ||
76 | if isempty(winty), winty = 5; end; | ||
77 | winty = round(winty); | ||
78 | fprintf(1,'Window size = %dx%d\n',2*wintx+1,2*winty+1); | ||
79 | |||
80 | |||
81 | disp('The projector you are using is the DLP or Intel'); | ||
82 | nx = 800; | ||
83 | ny = 600; | ||
84 | |||
85 | dX = input('Size dX in x of the squares (in pixels) [50] = '); | ||
86 | dY = input('Size dY in y of the squares (in pixels) [50] = '); | ||
87 | |||
88 | if isempty(dX), dX=50; end; | ||
89 | if isempty(dY), dY=50; end; | ||
90 | |||
91 | dXoff = input('Position in x of your reference (in pixels) [399.5] = '); | ||
92 | dYoff = input('Position in y of your reference (in pixels) [299.5] = '); | ||
93 | |||
94 | if isempty(dXoff), dXoff=399.5; end; | ||
95 | if isempty(dYoff), dYoff=299.5; end; | ||
96 | |||
97 | end; | ||
98 | |||
99 | |||
100 | |||
101 | for kk = ind_active, | ||
102 | |||
103 | eval(['Ip = Ip_' num2str(kk) ';']); | ||
104 | eval(['In = In_' num2str(kk) ';']); | ||
105 | |||
106 | [x,X,n_sq_x,n_sq_y,ind_orig,ind_x,ind_y] = extract_grid(In,wintx,winty,fc,cc,kc,dX,dY); | ||
107 | xproj = x; | ||
108 | |||
109 | Np_proj = size(x,2); | ||
110 | |||
111 | figure(2); | ||
112 | image(Ip); | ||
113 | hold on; | ||
114 | plot(xproj(1,:)+1,xproj(2,:)+1,'r+'); | ||
115 | title('Click on your reference point'); | ||
116 | xlabel('Xc (in camera frame)'); | ||
117 | ylabel('Yc (in camera frame)'); | ||
118 | hold off; | ||
119 | |||
120 | disp('Click on your reference point...'); | ||
121 | |||
122 | [xr,yr] = ginput2(1); | ||
123 | |||
124 | err = sqrt(sum((xproj - [xr;yr]*ones(1,Np_proj)).^2)); | ||
125 | ind_ref = find(err == min(err)); | ||
126 | |||
127 | ref_pt = xproj(:,ind_ref); | ||
128 | |||
129 | |||
130 | figure(2); | ||
131 | hold on; | ||
132 | plot(ref_pt(1)+1,ref_pt(2)+1,'go'); hold off; | ||
133 | |||
134 | |||
135 | nn = floor(ind_ref/(n_sq_x+1)); | ||
136 | off_x = ind_ref - nn*(n_sq_x+1) - 1; | ||
137 | off_y = n_sq_y - nn; | ||
138 | |||
139 | |||
140 | xprojn = xproj - cc * ones(1,Np_proj); | ||
141 | xprojn = xprojn ./ (fc * ones(1,Np_proj)); | ||
142 | xprojn = comp_distortion(xprojn,kc); | ||
143 | |||
144 | eval(['Rc = Rc_' num2str(kk) ';']); | ||
145 | eval(['Tc = Tc_' num2str(kk) ';']); | ||
146 | |||
147 | Zc = ((Rc(:,3)'*Tc) * (1./(Rc(:,3)' * [xprojn; ones(1,Np_proj)]))); | ||
148 | Xcp = (ones(3,1)*Zc) .* [xprojn; ones(1,Np_proj)]; % % in the camera frame | ||
149 | %Xproj = Rc'* Xcp - (Rc'*Tc)*ones(1,Np); % in the object frame !!! it works! | ||
150 | %Xproj(3,:) = zeros(1,Np); | ||
151 | |||
152 | eval(['X_proj_' num2str(kk) ' = Xcp;']); % coordinates of the points in the | ||
153 | |||
154 | x_proj = X(1:2,:) + ([dXoff - dX * off_x ; dYoff - dY * off_y]*ones(1,Np_proj)); | ||
155 | |||
156 | eval(['x_proj_' num2str(kk) ' = x_proj;']); % coordinates of the points in the | ||
157 | |||
158 | end; | ||
159 | |||
160 | |||
161 | |||
162 | X_proj = []; | ||
163 | x_proj = []; | ||
164 | |||
165 | for kk = ind_active, | ||
166 | eval(['X_proj = [X_proj X_proj_' num2str(kk) '];']); | ||
167 | eval(['x_proj = [x_proj x_proj_' num2str(kk) '];']); | ||
168 | end; | ||
169 | |||
170 | |||
171 | %Save camera parameters: | ||
172 | fc_save = fc; | ||
173 | cc_save = cc; | ||
174 | kc_save = kc; | ||
175 | |||
176 | omc_1_save = omc_1; | ||
177 | Rc_1_save = Rc_1; | ||
178 | Tc_1_save = Tc_1; | ||
179 | |||
180 | |||
181 | % Get started to calibrate projector: | ||
182 | clear fc cc kc | ||
183 | |||
184 | n_ima = 1; | ||
185 | X_1 = X_proj; | ||
186 | x_1 = x_proj; | ||
187 | |||
188 | |||
189 | % Image size: (may or may not be available) | ||
190 | |||
191 | nx = 800; | ||
192 | ny = 600; | ||
193 | |||
194 | % No calibration image is available (only the corner coordinates) | ||
195 | |||
196 | no_image = 1; | ||
197 | |||
198 | % Set the toolbox not to prompt the user (choose default values) | ||
199 | |||
200 | dont_ask = 1; | ||
201 | |||
202 | % Do not estimate distortion: | ||
203 | |||
204 | est_dist = [0;0;0;0]; | ||
205 | est_dist = ones(4,1); | ||
206 | |||
207 | center_optim = 1; | ||
208 | |||
209 | % Run the main calibration routine: | ||
210 | |||
211 | go_calib_optim_iter; | ||
212 | |||
213 | % Shows the extrinsic parameters: | ||
214 | |||
215 | dX = 3; | ||
216 | dY = 3; | ||
217 | |||
218 | ext_calib; | ||
219 | |||
220 | % Reprojection on the original images: | ||
221 | |||
222 | reproject_calib; | ||
223 | |||
224 | |||
225 | |||
226 | |||
227 | %----------------------- Retrieve results: | ||
228 | |||
229 | % Intrinsic: | ||
230 | |||
231 | % Projector: | ||
232 | fp = fc; | ||
233 | cp = cc; | ||
234 | kp = kc; | ||
235 | |||
236 | % Camera: | ||
237 | fc = fc_save; | ||
238 | cc = cc_save; | ||
239 | kc = kc_save; | ||
240 | |||
241 | % Extrinsic: | ||
242 | |||
243 | % Relative position of projector and camera: | ||
244 | T = Tc_1; | ||
245 | om = omc_1; | ||
246 | R = rodrigues(om); | ||
247 | |||
248 | % Relative prosition of camera wrt world: | ||
249 | omc = omc_1_save; | ||
250 | Rc = Rc_1_save; | ||
251 | Tc = Tc_1_save; | ||
252 | |||
253 | % relative position of projector wrt world: | ||
254 | Rp = R*Rc; | ||
255 | omp = rodrigues(Rp); | ||
256 | Tp = T + R*Tc; | ||
257 | |||
258 | eval(['save calib_cam_proj R om T fc fp cc cp kc kp Rc Rp Tc Tp']); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/readras.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/readras.m new file mode 100755 index 0000000..fc1820b --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/readras.m | |||
@@ -0,0 +1,87 @@ | |||
1 | function [X, map] = readras(filename, ys, ye, xs, xe); | ||
2 | %READRAS Read an image file in sun raster format. | ||
3 | % READRAS('imagefile.ras') reads a "sun.raster" image file. | ||
4 | % [X, map] = READRAS('imagefile.ras') returns both the image and a | ||
5 | % color map, so that | ||
6 | % [X, map] = readras('imagefile.ras'); | ||
7 | % image(X) | ||
8 | % colormap(map) | ||
9 | % axis('equal') | ||
10 | % will display the result with the proper colors. | ||
11 | % NOTE: readras cannot deal with complicated color maps. | ||
12 | % In fact, Matlab doesn't quite allow to work with colormaps | ||
13 | % with more than 64 entries. | ||
14 | % | ||
15 | |||
16 | %% | ||
17 | %% (C) Thomas K. Leung 3/30/93. | ||
18 | %% California Institute of Technology. | ||
19 | %% Modified by Andrea Mennucci to deal with color images | ||
20 | %% | ||
21 | |||
22 | % PC and UNIX version of readras - Jean-Yves Bouguet - Dec. 1998 | ||
23 | |||
24 | dot = max(find(filename == '.')); | ||
25 | suffix = filename(dot+1:dot+3); | ||
26 | |||
27 | if(strcmp(suffix, 'ras')) % raster file format % | ||
28 | fp = fopen(filename, 'rb'); | ||
29 | if(fp<0) error(['Cannot open ' filename '.']), end | ||
30 | |||
31 | %Read and crack the 32-byte header | ||
32 | fseek(fp, 4, -1); | ||
33 | |||
34 | width = 2^24 * fread(fp, 1, 'uchar') + 2^16 * fread(fp, 1, 'uchar') + 2^8 * fread(fp, 1, 'uchar') + fread(fp, 1, 'uchar'); | ||
35 | |||
36 | height = 2^24 * fread(fp, 1, 'uchar') + 2^16 * fread(fp, 1, 'uchar') + 2^8 * fread(fp, 1, 'uchar') + fread(fp, 1, 'uchar'); | ||
37 | |||
38 | depth = 2^24 * fread(fp, 1, 'uchar') + 2^16 * fread(fp, 1, 'uchar') + 2^8 * fread(fp, 1, 'uchar') + fread(fp, 1, 'uchar'); | ||
39 | |||
40 | length = 2^24 * fread(fp, 1, 'uchar') + 2^16 * fread(fp, 1, 'uchar') + 2^8 * fread(fp, 1, 'uchar') + fread(fp, 1, 'uchar'); | ||
41 | |||
42 | type = 2^24 * fread(fp, 1, 'uchar') + 2^16 * fread(fp, 1, 'uchar') + 2^8 * fread(fp, 1, 'uchar') + fread(fp, 1, 'uchar'); | ||
43 | |||
44 | maptype = 2^24 * fread(fp, 1, 'uchar') + 2^16 * fread(fp, 1, 'uchar') + 2^8 * fread(fp, 1, 'uchar') + fread(fp, 1, 'uchar'); | ||
45 | |||
46 | maplen = 2^24 * fread(fp, 1, 'uchar') + 2^16 * fread(fp, 1, 'uchar') + 2^8 * fread(fp, 1, 'uchar') + fread(fp, 1, 'uchar'); | ||
47 | |||
48 | maplen = maplen / 3; | ||
49 | |||
50 | if maptype == 2 % RMT_RAW | ||
51 | map = fread(fp, [maplen, 3], 'uchar')/255; | ||
52 | % if maplen<64, map=[map',zeros(3,64-maplen)]';maplen=64; end; | ||
53 | elseif maptype == 1 % RMT_EQUAL_RGB | ||
54 | map(:,1) = fread(fp, [maplen], 'uchar'); | ||
55 | map(:,2) = fread(fp, [maplen], 'uchar'); | ||
56 | map(:,3) = fread(fp, [maplen], 'uchar'); | ||
57 | %maxmap = max(max(map)); | ||
58 | map = map/255; | ||
59 | if maplen<64, map=[map',zeros(3,64-maplen)]'; maplen=64; end; | ||
60 | else % RMT_NONE | ||
61 | map = []; | ||
62 | end | ||
63 | % if maplen>64, | ||
64 | % map=[map',zeros(3,256-maplen)]'; | ||
65 | % end; | ||
66 | |||
67 | % Read the image | ||
68 | |||
69 | if rem(width,2) == 1 | ||
70 | Xt = fread(fp, [width+1, height], 'uchar'); | ||
71 | X = Xt(1:width, :)'; | ||
72 | else | ||
73 | Xt = fread(fp, [width, height], 'uchar'); | ||
74 | X = Xt'; | ||
75 | end | ||
76 | X = X + 1; | ||
77 | fclose(fp); | ||
78 | else | ||
79 | error('Image file name must end in either ''ras'' or ''rast''.'); | ||
80 | end | ||
81 | |||
82 | |||
83 | if nargin == 5 | ||
84 | |||
85 | X = X(ys:ye, xs:xe); | ||
86 | |||
87 | end \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/recomp_corner_calib.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/recomp_corner_calib.m new file mode 100755 index 0000000..0909c69 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/recomp_corner_calib.m | |||
@@ -0,0 +1,119 @@ | |||
1 | % Re-select te corners after calibration | ||
2 | |||
3 | if ~exist('n_ima')|~exist('fc'), | ||
4 | fprintf(1,'No calibration data available.\n'); | ||
5 | return; | ||
6 | end; | ||
7 | |||
8 | check_active_images; | ||
9 | |||
10 | flag = 0; | ||
11 | for kk = ind_active, | ||
12 | if ~exist(['y_' num2str(kk)]), | ||
13 | flag = 1; | ||
14 | else | ||
15 | eval(['ykk = y_' num2str(kk) ';']); | ||
16 | if isnan(ykk(1,1)), | ||
17 | flag = 1; | ||
18 | end; | ||
19 | end; | ||
20 | end; | ||
21 | |||
22 | if flag, | ||
23 | fprintf(1,'Need to calibrate once before before recomputing image corners. Maybe need to load Calib_Results.mat file.\n'); | ||
24 | return; | ||
25 | end; | ||
26 | |||
27 | |||
28 | if ~exist(['I_' num2str(ind_active(1))]), | ||
29 | n_ima_save = n_ima; | ||
30 | active_images_save = active_images; | ||
31 | ima_read_calib; | ||
32 | n_ima = n_ima_save; | ||
33 | active_images = active_images_save; | ||
34 | check_active_images; | ||
35 | if no_image_file, | ||
36 | disp('Cannot extract corners without images'); | ||
37 | return; | ||
38 | end; | ||
39 | end; | ||
40 | |||
41 | fprintf(1,'\nRe-extraction of the grid corners on the images (after first calibration)\n'); | ||
42 | |||
43 | disp('Window size for corner finder (wintx and winty):'); | ||
44 | wintx = input('wintx ([] = 5) = '); | ||
45 | if isempty(wintx), wintx = 5; end; | ||
46 | wintx = round(wintx); | ||
47 | winty = input('winty ([] = 5) = '); | ||
48 | if isempty(winty), winty = 5; end; | ||
49 | winty = round(winty); | ||
50 | |||
51 | fprintf(1,'Window size = %dx%d\n',2*wintx+1,2*winty+1); | ||
52 | |||
53 | ima_numbers = input('Number(s) of image(s) to process ([] = all images) = '); | ||
54 | |||
55 | if isempty(ima_numbers), | ||
56 | ima_proc = 1:n_ima; | ||
57 | else | ||
58 | ima_proc = ima_numbers; | ||
59 | end; | ||
60 | |||
61 | q_auto = input('Use the projection of 3D grid or manual click ([]=auto, other=manual): '); | ||
62 | |||
63 | fprintf(1,'Processing image '); | ||
64 | |||
65 | for kk = ima_proc; | ||
66 | |||
67 | if active_images(kk), | ||
68 | |||
69 | fprintf(1,'%d...',kk); | ||
70 | |||
71 | if isempty(q_auto), | ||
72 | |||
73 | eval(['I = I_' num2str(kk) ';']); | ||
74 | |||
75 | eval(['y = y_' num2str(kk) ';']); | ||
76 | |||
77 | xc = cornerfinder(y+1,I,winty,wintx); % the four corners | ||
78 | |||
79 | eval(['wintx_' num2str(kk) ' = wintx;']); | ||
80 | eval(['winty_' num2str(kk) ' = winty;']); | ||
81 | |||
82 | eval(['x_' num2str(kk) '= xc - 1;']); | ||
83 | |||
84 | else | ||
85 | |||
86 | fprintf(1,'\n'); | ||
87 | |||
88 | click_ima_calib; | ||
89 | |||
90 | end; | ||
91 | |||
92 | else | ||
93 | |||
94 | if ~exist(['omc_' num2str(kk)]), | ||
95 | |||
96 | eval(['dX_' num2str(kk) ' = NaN;']); | ||
97 | eval(['dY_' num2str(kk) ' = NaN;']); | ||
98 | |||
99 | eval(['wintx_' num2str(kk) ' = NaN;']); | ||
100 | eval(['winty_' num2str(kk) ' = NaN;']); | ||
101 | |||
102 | eval(['x_' num2str(kk) ' = NaN*ones(2,1);']); | ||
103 | eval(['X_' num2str(kk) ' = NaN*ones(3,1);']); | ||
104 | |||
105 | eval(['n_sq_x_' num2str(kk) ' = NaN;']); | ||
106 | eval(['n_sq_y_' num2str(kk) ' = NaN;']); | ||
107 | |||
108 | end; | ||
109 | |||
110 | end; | ||
111 | |||
112 | |||
113 | end; | ||
114 | |||
115 | % Recompute the error: | ||
116 | |||
117 | comp_error_calib; | ||
118 | |||
119 | fprintf(1,'\ndone\n'); \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/rect.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/rect.m new file mode 100755 index 0000000..ccac7a5 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/rect.m | |||
@@ -0,0 +1,127 @@ | |||
1 | function [Irec] = rect(I,R,f,c,k,alpha,KK_new); | ||
2 | |||
3 | |||
4 | if nargin < 5, | ||
5 | k = 0; | ||
6 | if nargin < 4, | ||
7 | c = [0;0]; | ||
8 | if nargin < 3, | ||
9 | f = [1;1]; | ||
10 | if nargin < 2, | ||
11 | R = eye(3); | ||
12 | if nargin < 1, | ||
13 | error('ERROR: Need an image to rectify'); | ||
14 | break; | ||
15 | end; | ||
16 | end; | ||
17 | end; | ||
18 | end; | ||
19 | end; | ||
20 | |||
21 | |||
22 | if nargin < 7, | ||
23 | if nargin < 6, | ||
24 | KK_new = [f(1) 0 c(1);0 f(2) c(2);0 0 1]; | ||
25 | else | ||
26 | KK_new = alpha; % the 6th argument is actually KK_new | ||
27 | end; | ||
28 | alpha = 0; | ||
29 | end; | ||
30 | |||
31 | |||
32 | |||
33 | % Note: R is the motion of the points in space | ||
34 | % So: X2 = R*X where X: coord in the old reference frame, X2: coord in the new ref frame. | ||
35 | |||
36 | |||
37 | if ~exist('KK_new'), | ||
38 | KK_new = [f(1) alpha_c*fc(1) c(1);0 f(2) c(2);0 0 1]; | ||
39 | end; | ||
40 | |||
41 | |||
42 | [nr,nc] = size(I); | ||
43 | |||
44 | Irec = 255*ones(nr,nc); | ||
45 | |||
46 | [mx,my] = meshgrid(1:nc, 1:nr); | ||
47 | px = reshape(mx',nc*nr,1); | ||
48 | py = reshape(my',nc*nr,1); | ||
49 | |||
50 | rays = inv(KK_new)*[(px - 1)';(py - 1)';ones(1,length(px))]; | ||
51 | |||
52 | |||
53 | % Rotation: (or affine transformation): | ||
54 | |||
55 | rays2 = R'*rays; | ||
56 | |||
57 | x = [rays2(1,:)./rays2(3,:);rays2(2,:)./rays2(3,:)]; | ||
58 | |||
59 | |||
60 | % Add distortion: | ||
61 | |||
62 | k1 = k(1); | ||
63 | k2 = k(2); | ||
64 | |||
65 | p1 = k(3); | ||
66 | p2 = k(4); | ||
67 | |||
68 | r_2 = sum(x.^2); | ||
69 | |||
70 | delta_x = [2*p1*x(1,:).*x(2,:) + p2*(r_2 + 2*x(1,:).^2) ; | ||
71 | p1 * (r_2 + 2*x(2,:).^2)+2*p2*x(1,:).*x(2,:)]; | ||
72 | |||
73 | xd = (ones(2,1)*( 1 + k1 * r_2 + k2 * r_2.^2)) .* x + delta_x; | ||
74 | |||
75 | |||
76 | % Reconvert in pixels: | ||
77 | |||
78 | px2 = f(1)*(xd(1,:)+alpha_c*xd(2,:))+c(1); | ||
79 | py2 = f(2)*xd(2,:)+c(2); | ||
80 | |||
81 | |||
82 | % Interpolate between the closest pixels: | ||
83 | |||
84 | px_0 = floor(px2); | ||
85 | px_1 = px_0 + 1; | ||
86 | alpha_x = px2 - px_0; | ||
87 | |||
88 | py_0 = floor(py2); | ||
89 | py_1 = py_0 + 1; | ||
90 | alpha_y = py2 - py_0; | ||
91 | |||
92 | good_points = find((px_0 >= 0) & (px_1 <= (nc-1)) & (py_0 >= 0) & (py_1 <= (nr-1))); | ||
93 | |||
94 | I_lu = I(px_0(good_points) * nr + py_0(good_points) + 1); | ||
95 | I_ru = I(px_1(good_points) * nr + py_0(good_points) + 1); | ||
96 | I_ld = I(px_0(good_points) * nr + py_1(good_points) + 1); | ||
97 | I_rd = I(px_1(good_points) * nr + py_1(good_points) + 1); | ||
98 | |||
99 | |||
100 | I_interp = (1 - alpha_y(good_points)).*((1 - alpha_x(good_points)).* I_lu + alpha_x(good_points) .* I_ru) + alpha_y(good_points) .* ((1 - alpha_x(good_points)).* I_ld + alpha_x(good_points) .* I_rd); | ||
101 | |||
102 | |||
103 | Irec((px(good_points)-1)*nr + py(good_points)) = I_interp; | ||
104 | |||
105 | |||
106 | |||
107 | return; | ||
108 | |||
109 | |||
110 | % Convert in indices: | ||
111 | |||
112 | fact = 3; | ||
113 | |||
114 | [XX,YY]= meshgrid(1:nc,1:nr); | ||
115 | [XXi,YYi]= meshgrid(1:1/fact:nc,1:1/fact:nr); | ||
116 | |||
117 | %tic; | ||
118 | Iinterp = interp2(XX,YY,I,XXi,YYi); | ||
119 | %toc | ||
120 | |||
121 | [nri,nci] = size(Iinterp); | ||
122 | |||
123 | |||
124 | ind_col = round(fact*(f(1)*xd(1,:)+c(1)))+1; | ||
125 | ind_row = round(fact*(f(2)*xd(2,:)+c(2)))+1; | ||
126 | |||
127 | good_points = find((ind_col >=1)&(ind_col<=nci)&(ind_row >=1)& (ind_row <=nri)); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/reproject_calib.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/reproject_calib.m new file mode 100755 index 0000000..d3ad3d2 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/reproject_calib.m | |||
@@ -0,0 +1,121 @@ | |||
1 | %%%%%%%%%%%%%%%%%%%% REPROJECT ON THE IMAGES %%%%%%%%%%%%%%%%%%%%%%%% | ||
2 | |||
3 | if ~exist('n_ima')|~exist('fc'), | ||
4 | fprintf(1,'No calibration data available.\n'); | ||
5 | return; | ||
6 | end; | ||
7 | |||
8 | if ~exist('no_image'), | ||
9 | no_image = 0; | ||
10 | end; | ||
11 | |||
12 | if ~exist('nx')&~exist('ny'), | ||
13 | fprintf(1,'WARNING: No image size (nx,ny) available. Setting nx=640 and ny=480\n'); | ||
14 | nx = 640; | ||
15 | ny = 480; | ||
16 | end; | ||
17 | |||
18 | |||
19 | check_active_images; | ||
20 | |||
21 | |||
22 | % Color code for each image: | ||
23 | |||
24 | colors = 'brgkcm'; | ||
25 | |||
26 | % Reproject the patterns on the images, and compute the pixel errors: | ||
27 | |||
28 | % Reload the images if necessary | ||
29 | |||
30 | if ~exist(['omc_' num2str(ind_active(1)) ]), | ||
31 | fprintf(1,'Need to calibrate before showing image reprojection. Maybe need to load Calib_Results.mat file.\n'); | ||
32 | return; | ||
33 | end; | ||
34 | |||
35 | if ~no_image, | ||
36 | if ~exist(['I_' num2str(ind_active(1)) ]'), | ||
37 | n_ima_save = n_ima; | ||
38 | active_images_save = active_images; | ||
39 | ima_read_calib; | ||
40 | n_ima = n_ima_save; | ||
41 | active_images = active_images_save; | ||
42 | check_active_images; | ||
43 | if no_image_file, | ||
44 | fprintf(1,'WARNING: Do not show the original images\n'); %return; | ||
45 | end; | ||
46 | end; | ||
47 | else | ||
48 | no_image_file = 1; | ||
49 | end; | ||
50 | |||
51 | |||
52 | if ~exist('dont_ask'), | ||
53 | dont_ask = 0; | ||
54 | end; | ||
55 | |||
56 | |||
57 | if ~dont_ask, | ||
58 | ima_numbers = input('Number(s) of image(s) to show ([] = all images) = '); | ||
59 | else | ||
60 | ima_numbers = []; | ||
61 | end; | ||
62 | |||
63 | |||
64 | if isempty(ima_numbers), | ||
65 | ima_proc = 1:n_ima; | ||
66 | else | ||
67 | ima_proc = ima_numbers; | ||
68 | end; | ||
69 | |||
70 | |||
71 | figure(5); | ||
72 | for kk = ima_proc, %1:n_ima, | ||
73 | if exist(['y_' num2str(kk)]), | ||
74 | if active_images(kk) & eval(['~isnan(y_' num2str(kk) '(1,1))']), | ||
75 | eval(['plot(ex_' num2str(kk) '(1,:),ex_' num2str(kk) '(2,:),''' colors(rem(kk-1,6)+1) '+'');']); | ||
76 | hold on; | ||
77 | end; | ||
78 | end; | ||
79 | end; | ||
80 | hold off; | ||
81 | axis('equal'); | ||
82 | title('Reprojection error (in pixel)'); | ||
83 | xlabel('x'); | ||
84 | ylabel('y'); | ||
85 | drawnow; | ||
86 | |||
87 | set(5,'Name','error','NumberTitle','off'); | ||
88 | |||
89 | |||
90 | |||
91 | for kk = ima_proc, | ||
92 | if exist(['y_' num2str(kk)]), | ||
93 | if active_images(kk) & eval(['~isnan(y_' num2str(kk) '(1,1))']), | ||
94 | |||
95 | if exist(['I_' num2str(kk)]), | ||
96 | eval(['I = I_' num2str(kk) ';']); | ||
97 | else | ||
98 | I = 255*ones(ny,nx); | ||
99 | end; | ||
100 | |||
101 | figure(5+kk); | ||
102 | image(I); hold on; | ||
103 | colormap(gray(256)); | ||
104 | title(['Image ' num2str(kk) ' - Image points (+) and reprojected grid points (o)']); | ||
105 | eval(['plot(x_' num2str(kk) '(1,:)+1,x_' num2str(kk) '(2,:)+1,''r+'');']); | ||
106 | eval(['plot(y_' num2str(kk) '(1,:)+1,y_' num2str(kk) '(2,:)+1,''' colors(rem(kk-1,6)+1) 'o'');']); | ||
107 | zoom on; | ||
108 | axis([1 nx 1 ny]); | ||
109 | hold off; | ||
110 | drawnow; | ||
111 | |||
112 | set(5+kk,'Name',num2str(kk),'NumberTitle','off'); | ||
113 | |||
114 | end; | ||
115 | end; | ||
116 | end; | ||
117 | |||
118 | |||
119 | err_std = std(ex')'; | ||
120 | |||
121 | fprintf(1,'Pixel error: err = [%3.5f %3.5f] (all active images)\n\n',err_std); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/rigid_motion.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/rigid_motion.m new file mode 100755 index 0000000..473405c --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/rigid_motion.m | |||
@@ -0,0 +1,66 @@ | |||
1 | function [Y,dYdom,dYdT] = rigid_motion(X,om,T); | ||
2 | |||
3 | %rigid_motion.m | ||
4 | % | ||
5 | %[Y,dYdom,dYdT] = rigid_motion(X,om,T) | ||
6 | % | ||
7 | %Computes the rigid motion transformation Y = R*X+T, where R = rodrigues(om). | ||
8 | % | ||
9 | %INPUT: X: 3D structure in the world coordinate frame (3xN matrix for N points) | ||
10 | % (om,T): Rigid motion parameters between world coordinate frame and camera reference frame | ||
11 | % om: rotation vector (3x1 vector); T: translation vector (3x1 vector) | ||
12 | % | ||
13 | %OUTPUT: Y: 3D coordinates of the structure points in the camera reference frame (3xN matrix for N points) | ||
14 | % dYdom: Derivative of Y with respect to om ((3N)x3 matrix) | ||
15 | % dYdT: Derivative of Y with respect to T ((3N)x3 matrix) | ||
16 | % | ||
17 | %Definitions: | ||
18 | %Let P be a point in 3D of coordinates X in the world reference frame (stored in the matrix X) | ||
19 | %The coordinate vector of P in the camera reference frame is: Y = R*X + T | ||
20 | %where R is the rotation matrix corresponding to the rotation vector om: R = rodrigues(om); | ||
21 | % | ||
22 | %Important function called within that program: | ||
23 | % | ||
24 | %rodrigues.m: Computes the rotation matrix corresponding to a rotation vector | ||
25 | |||
26 | |||
27 | |||
28 | if nargin < 3, | ||
29 | T = zeros(3,1); | ||
30 | if nargin < 2, | ||
31 | om = zeros(3,1); | ||
32 | if nargin < 1, | ||
33 | error('Need at least a 3D structure as input (in rigid_motion.m)'); | ||
34 | return; | ||
35 | end; | ||
36 | end; | ||
37 | end; | ||
38 | |||
39 | |||
40 | [R,dRdom] = rodrigues(om); | ||
41 | |||
42 | [m,n] = size(X); | ||
43 | |||
44 | Y = R*X + T*ones(1,n); | ||
45 | |||
46 | if nargout > 1, | ||
47 | |||
48 | |||
49 | dYdR = zeros(3*n,9); | ||
50 | dYdT = zeros(3*n,3); | ||
51 | |||
52 | dYdR(1:3:end,1:3:end) = X'; | ||
53 | dYdR(2:3:end,2:3:end) = X'; | ||
54 | dYdR(3:3:end,3:3:end) = X'; | ||
55 | |||
56 | dYdT(1:3:end,1) = ones(n,1); | ||
57 | dYdT(2:3:end,2) = ones(n,1); | ||
58 | dYdT(3:3:end,3) = ones(n,1); | ||
59 | |||
60 | dYdom = dYdR * dRdom; | ||
61 | |||
62 | end; | ||
63 | |||
64 | |||
65 | |||
66 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/rodrigues.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/rodrigues.m new file mode 100755 index 0000000..9d55337 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/rodrigues.m | |||
@@ -0,0 +1,217 @@ | |||
1 | function [out,dout]=rodrigues(in) | ||
2 | |||
3 | % RODRIGUES Transform rotation matrix into rotation vector and viceversa. | ||
4 | % | ||
5 | % Sintax: [OUT]=RODRIGUES(IN) | ||
6 | % If IN is a 3x3 rotation matrix then OUT is the | ||
7 | % corresponding 3x1 rotation vector | ||
8 | % if IN is a rotation 3-vector then OUT is the | ||
9 | % corresponding 3x3 rotation matrix | ||
10 | % | ||
11 | |||
12 | %% | ||
13 | %% Copyright (c) March 1993 -- Pietro Perona | ||
14 | %% California Institute of Technology | ||
15 | %% | ||
16 | |||
17 | %% ALL CHECKED BY JEAN-YVES BOUGUET, October 1995. | ||
18 | %% FOR ALL JACOBIAN MATRICES !!! LOOK AT THE TEST AT THE END !! | ||
19 | |||
20 | %% BUG when norm(om)=pi fixed -- April 6th, 1997; | ||
21 | %% Jean-Yves Bouguet | ||
22 | |||
23 | |||
24 | [m,n] = size(in); | ||
25 | %bigeps = 10e+4*eps; | ||
26 | bigeps = 10e+20*eps; | ||
27 | |||
28 | if ((m==1) & (n==3)) | ((m==3) & (n==1)) %% it is a rotation vector | ||
29 | theta = norm(in); | ||
30 | if theta < eps | ||
31 | R = eye(3); | ||
32 | |||
33 | %if nargout > 1, | ||
34 | |||
35 | dRdin = [0 0 0; | ||
36 | 0 0 1; | ||
37 | 0 -1 0; | ||
38 | 0 0 -1; | ||
39 | 0 0 0; | ||
40 | 1 0 0; | ||
41 | 0 1 0; | ||
42 | -1 0 0; | ||
43 | 0 0 0]; | ||
44 | |||
45 | %end; | ||
46 | |||
47 | else | ||
48 | if n==length(in) in=in'; end; %% make it a column vec. if necess. | ||
49 | |||
50 | %m3 = [in,theta] | ||
51 | |||
52 | dm3din = [eye(3);in'/theta]; | ||
53 | |||
54 | omega = in/theta; | ||
55 | |||
56 | %m2 = [omega;theta] | ||
57 | |||
58 | dm2dm3 = [eye(3)/theta -in/theta^2; zeros(1,3) 1]; | ||
59 | |||
60 | alpha = cos(theta); | ||
61 | beta = sin(theta); | ||
62 | gamma = 1-cos(theta); | ||
63 | omegav=[[0 -omega(3) omega(2)];[omega(3) 0 -omega(1)];[-omega(2) omega(1) 0 ]]; | ||
64 | A = omega*omega'; | ||
65 | |||
66 | %m1 = [alpha;beta;gamma;omegav;A]; | ||
67 | |||
68 | dm1dm2 = zeros(21,4); | ||
69 | dm1dm2(1,4) = -sin(theta); | ||
70 | dm1dm2(2,4) = cos(theta); | ||
71 | dm1dm2(3,4) = sin(theta); | ||
72 | dm1dm2(4:12,1:3) = [0 0 0 0 0 1 0 -1 0; | ||
73 | 0 0 -1 0 0 0 1 0 0; | ||
74 | 0 1 0 -1 0 0 0 0 0]'; | ||
75 | |||
76 | w1 = omega(1); | ||
77 | w2 = omega(2); | ||
78 | w3 = omega(3); | ||
79 | |||
80 | dm1dm2(13:21,1) = [2*w1;w2;w3;w2;0;0;w3;0;0]; | ||
81 | dm1dm2(13: 21,2) = [0;w1;0;w1;2*w2;w3;0;w3;0]; | ||
82 | dm1dm2(13:21,3) = [0;0;w1;0;0;w2;w1;w2;2*w3]; | ||
83 | |||
84 | R = eye(3)*alpha + omegav*beta + A*gamma; | ||
85 | |||
86 | dRdm1 = zeros(9,21); | ||
87 | |||
88 | dRdm1([1 5 9],1) = ones(3,1); | ||
89 | dRdm1(:,2) = omegav(:); | ||
90 | dRdm1(:,4:12) = beta*eye(9); | ||
91 | dRdm1(:,3) = A(:); | ||
92 | dRdm1(:,13:21) = gamma*eye(9); | ||
93 | |||
94 | dRdin = dRdm1 * dm1dm2 * dm2dm3 * dm3din; | ||
95 | |||
96 | |||
97 | end; | ||
98 | out = R; | ||
99 | dout = dRdin; | ||
100 | |||
101 | %% it is prob. a rot matr. | ||
102 | elseif ((m==n) & (m==3) & (norm(in' * in - eye(3)) < bigeps)... | ||
103 | & (abs(det(in)-1) < bigeps)) | ||
104 | R = in; | ||
105 | |||
106 | |||
107 | |||
108 | tr = (trace(R)-1)/2; | ||
109 | dtrdR = [1 0 0 0 1 0 0 0 1]/2; | ||
110 | theta = real(acos(tr)); | ||
111 | |||
112 | |||
113 | if sin(theta) >= 1e-5, | ||
114 | |||
115 | dthetadtr = -1/sqrt(1-tr^2); | ||
116 | |||
117 | dthetadR = dthetadtr * dtrdR; | ||
118 | % var1 = [vth;theta]; | ||
119 | vth = 1/(2*sin(theta)); | ||
120 | dvthdtheta = -vth*cos(theta)/sin(theta); | ||
121 | dvar1dtheta = [dvthdtheta;1]; | ||
122 | |||
123 | dvar1dR = dvar1dtheta * dthetadR; | ||
124 | |||
125 | |||
126 | om1 = [R(3,2)-R(2,3), R(1,3)-R(3,1), R(2,1)-R(1,2)]'; | ||
127 | |||
128 | dom1dR = [0 0 0 0 0 1 0 -1 0; | ||
129 | 0 0 -1 0 0 0 1 0 0; | ||
130 | 0 1 0 -1 0 0 0 0 0]; | ||
131 | |||
132 | % var = [om1;vth;theta]; | ||
133 | dvardR = [dom1dR;dvar1dR]; | ||
134 | |||
135 | % var2 = [om;theta]; | ||
136 | om = vth*om1; | ||
137 | domdvar = [vth*eye(3) om1 zeros(3,1)]; | ||
138 | dthetadvar = [0 0 0 0 1]; | ||
139 | dvar2dvar = [domdvar;dthetadvar]; | ||
140 | |||
141 | |||
142 | out = om*theta; | ||
143 | domegadvar2 = [theta*eye(3) om]; | ||
144 | |||
145 | dout = domegadvar2 * dvar2dvar * dvardR; | ||
146 | |||
147 | |||
148 | else | ||
149 | if tr > 0; % case norm(om)=0; | ||
150 | |||
151 | out = [0 0 0]'; | ||
152 | |||
153 | dout = [0 0 0 0 0 1/2 0 -1/2 0; | ||
154 | 0 0 -1/2 0 0 0 1/2 0 0; | ||
155 | 0 1/2 0 -1/2 0 0 0 0 0]; | ||
156 | else % case norm(om)=pi; %% fixed April 6th | ||
157 | |||
158 | |||
159 | out = theta * (sqrt((diag(R)+1)/2).*[1;2*(R(1,2:3)>=0)'-1]); | ||
160 | %keyboard; | ||
161 | |||
162 | if nargout > 1, | ||
163 | fprintf(1,'WARNING!!!! Jacobian domdR undefined!!!\n'); | ||
164 | dout = NaN*ones(3,9); | ||
165 | end; | ||
166 | end; | ||
167 | end; | ||
168 | |||
169 | else | ||
170 | error('Neither a rotation matrix nor a rotation vector were provided'); | ||
171 | end; | ||
172 | |||
173 | return; | ||
174 | |||
175 | %% test of the Jacobians: | ||
176 | |||
177 | %%%% TEST OF dRdom: | ||
178 | om = randn(3,1); | ||
179 | dom = randn(3,1)/1000000; | ||
180 | |||
181 | [R1,dR1] = rodrigues(om); | ||
182 | R2 = rodrigues(om+dom); | ||
183 | |||
184 | R2a = R1 + reshape(dR1 * dom,3,3); | ||
185 | |||
186 | gain = norm(R2 - R1)/norm(R2 - R2a) | ||
187 | |||
188 | %%% TEST OF dOmdR: | ||
189 | om = randn(3,1); | ||
190 | R = rodrigues(om); | ||
191 | dom = randn(3,1)/10000; | ||
192 | dR = rodrigues(om+dom) - R; | ||
193 | |||
194 | [omc,domdR] = rodrigues(R); | ||
195 | [om2] = rodrigues(R+dR); | ||
196 | |||
197 | om_app = omc + domdR*dR(:); | ||
198 | |||
199 | gain = norm(om2 - omc)/norm(om2 - om_app) | ||
200 | |||
201 | |||
202 | %%% OTHER BUG: (FIXED NOW!!!) | ||
203 | |||
204 | omu = randn(3,1); | ||
205 | omu = omu/norm(omu) | ||
206 | om = pi*omu; | ||
207 | [R,dR]= rodrigues(om); | ||
208 | [om2] = rodrigues(R); | ||
209 | [om om2] | ||
210 | |||
211 | %%% NORMAL OPERATION | ||
212 | |||
213 | om = randn(3,1); | ||
214 | [R,dR]= rodrigues(om); | ||
215 | [om2] = rodrigues(R); | ||
216 | [om om2] | ||
217 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/rotation.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/rotation.m new file mode 100755 index 0000000..87ee2fe --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/rotation.m | |||
@@ -0,0 +1,23 @@ | |||
1 | function [] = rotation(st); | ||
2 | |||
3 | if nargin < 1, | ||
4 | st= 1; | ||
5 | end; | ||
6 | |||
7 | |||
8 | fig = gcf; | ||
9 | |||
10 | ax = gca; | ||
11 | |||
12 | vv = get(ax,'view'); | ||
13 | |||
14 | az = vv(1); | ||
15 | el = vv(2); | ||
16 | |||
17 | for azi = az:-abs(st):az-360, | ||
18 | |||
19 | set(ax,'view',[azi el]); | ||
20 | figure(fig); | ||
21 | drawnow; | ||
22 | |||
23 | end; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/run_error_analysis.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/run_error_analysis.m new file mode 100755 index 0000000..095e17e --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/run_error_analysis.m | |||
@@ -0,0 +1,65 @@ | |||
1 | %%% Program that launchs the complete | ||
2 | |||
3 | for N_ima_active = 1:30, | ||
4 | |||
5 | error_analysis; | ||
6 | |||
7 | end; | ||
8 | |||
9 | |||
10 | |||
11 | return; | ||
12 | |||
13 | |||
14 | f = []; | ||
15 | f_std = []; | ||
16 | |||
17 | c = []; | ||
18 | c_std = []; | ||
19 | |||
20 | k = []; | ||
21 | k_std = []; | ||
22 | |||
23 | NN = 30; | ||
24 | |||
25 | for rr = 1:NN, | ||
26 | |||
27 | load(['Calib_Accuracies_' num2str(rr)]); | ||
28 | |||
29 | [m1,s1] = mean_std_robust(fc_list(1,:)); | ||
30 | [m2,s2] = mean_std_robust(fc_list(2,:)); | ||
31 | |||
32 | f = [f [m1;m2]]; | ||
33 | f_std = [f_std [s1;s2]]; | ||
34 | |||
35 | [m1,s1] = mean_std_robust(cc_list(1,:)); | ||
36 | [m2,s2] = mean_std_robust(cc_list(2,:)); | ||
37 | |||
38 | c = [c [m1;m2]]; | ||
39 | c_std = [c_std [s1;s2]]; | ||
40 | |||
41 | [m1,s1] = mean_std_robust(kc_list(1,:)); | ||
42 | [m2,s2] = mean_std_robust(kc_list(2,:)); | ||
43 | [m3,s3] = mean_std_robust(kc_list(3,:)); | ||
44 | [m4,s4] = mean_std_robust(kc_list(4,:)); | ||
45 | |||
46 | k = [k [m1;m2;m3;m4]]; | ||
47 | k_std = [k_std [s1;s2;s3;s4]]; | ||
48 | |||
49 | end; | ||
50 | |||
51 | figure(1); | ||
52 | errorbar([1:NN;1:NN]',f',f_std'); | ||
53 | figure(2); | ||
54 | errorbar([1:NN;1:NN]',c',c_std'); | ||
55 | figure(3); | ||
56 | errorbar([1:NN;1:NN;1:NN;1:NN]',k',k_std'); | ||
57 | |||
58 | figure(4); | ||
59 | semilogy(f_std'); | ||
60 | |||
61 | figure(5); | ||
62 | semilogy(c_std'); | ||
63 | |||
64 | figure(6); | ||
65 | semilogy(k_std'); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/saveinr.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/saveinr.m new file mode 100755 index 0000000..a176e39 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/saveinr.m | |||
@@ -0,0 +1,46 @@ | |||
1 | %SAVEINR Write an INRIMAGE format file | ||
2 | % | ||
3 | % SAVEINR(filename, im) | ||
4 | % | ||
5 | % Saves the specified image array in a INRIA image format file. | ||
6 | % | ||
7 | % SEE ALSO: loadinr | ||
8 | % | ||
9 | % Copyright (c) Peter Corke, 1999 Machine Vision Toolbox for Matlab | ||
10 | |||
11 | % Peter Corke 1996 | ||
12 | |||
13 | function saveinr(fname, im) | ||
14 | |||
15 | fid = fopen(fname, 'w'); | ||
16 | [r,c] = size(im'); | ||
17 | |||
18 | % build the header | ||
19 | hdr = []; | ||
20 | s = sprintf('#INRIMAGE-4#{\n'); | ||
21 | hdr = [hdr s]; | ||
22 | s = sprintf('XDIM=%d\n',c); | ||
23 | hdr = [hdr s]; | ||
24 | s = sprintf('YDIM=%d\n',r); | ||
25 | hdr = [hdr s]; | ||
26 | s = sprintf('ZDIM=1\n'); | ||
27 | hdr = [hdr s]; | ||
28 | s = sprintf('VDIM=1\n'); | ||
29 | hdr = [hdr s]; | ||
30 | s = sprintf('TYPE=float\n'); | ||
31 | hdr = [hdr s]; | ||
32 | s = sprintf('PIXSIZE=32\n'); | ||
33 | hdr = [hdr s]; | ||
34 | s = sprintf('SCALE=2**0\n'); | ||
35 | hdr = [hdr s]; | ||
36 | s = sprintf('CPU=sun\n#'); | ||
37 | hdr = [hdr s]; | ||
38 | |||
39 | % make it 256 bytes long and write it | ||
40 | hdr256 = zeros(1,256); | ||
41 | hdr256(1:length(hdr)) = hdr; | ||
42 | fwrite(fid, hdr256, 'uchar'); | ||
43 | |||
44 | % now the binary data | ||
45 | fwrite(fid, im', 'float32'); | ||
46 | fclose(fid) | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/savepgm.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/savepgm.m new file mode 100755 index 0000000..0cee75d --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/savepgm.m | |||
@@ -0,0 +1,22 @@ | |||
1 | %SAVEPGM Write a PGM format file | ||
2 | % | ||
3 | % SAVEPGM(filename, im) | ||
4 | % | ||
5 | % Saves the specified image array in a binary (P5) format PGM image file. | ||
6 | % | ||
7 | % SEE ALSO: loadpgm | ||
8 | % | ||
9 | % Copyright (c) Peter Corke, 1999 Machine Vision Toolbox for Matlab | ||
10 | |||
11 | |||
12 | % Peter Corke 1994 | ||
13 | |||
14 | function savepgm(fname, im) | ||
15 | |||
16 | fid = fopen(fname, 'w'); | ||
17 | [r,c] = size(im'); | ||
18 | fprintf(fid, 'P5\n'); | ||
19 | fprintf(fid, '%d %d\n', r, c); | ||
20 | fprintf(fid, '255\n'); | ||
21 | fwrite(fid, im', 'uchar'); | ||
22 | fclose(fid); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/saveppm.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/saveppm.m new file mode 100755 index 0000000..ece092b --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/saveppm.m | |||
@@ -0,0 +1,45 @@ | |||
1 | %SAVEPPM Write a PPM format file | ||
2 | % | ||
3 | % SAVEPPM(filename, I) | ||
4 | % | ||
5 | % Saves the specified red, green and blue planes in a binary (P6) | ||
6 | % format PPM image file. | ||
7 | % | ||
8 | % SEE ALSO: loadppm | ||
9 | % | ||
10 | % Copyright (c) Peter Corke, 1999 Machine Vision Toolbox for Matlab | ||
11 | |||
12 | |||
13 | % Peter Corke 1994 | ||
14 | |||
15 | function saveppm(fname, I) | ||
16 | |||
17 | I = double(I); | ||
18 | |||
19 | if size(I,3) == 1, | ||
20 | R = I; | ||
21 | G = I; | ||
22 | B = I; | ||
23 | else | ||
24 | R = I(:,:,1); | ||
25 | G = I(:,:,2); | ||
26 | B = I(:,:,3); | ||
27 | end; | ||
28 | |||
29 | %keyboard; | ||
30 | |||
31 | fid = fopen(fname, 'w'); | ||
32 | [r,c] = size(R'); | ||
33 | fprintf(fid, 'P6\n'); | ||
34 | fprintf(fid, '%d %d\n', r, c); | ||
35 | fprintf(fid, '255\n'); | ||
36 | R = R'; | ||
37 | G = G'; | ||
38 | B = B'; | ||
39 | im = [R(:) G(:) B(:)]; | ||
40 | %im = reshape(im,r,c*3); | ||
41 | im = im'; | ||
42 | %im = im(:); | ||
43 | fwrite(fid, im, 'uchar'); | ||
44 | fclose(fid); | ||
45 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/saving_calib.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/saving_calib.m new file mode 100755 index 0000000..3f98a8b --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/saving_calib.m | |||
@@ -0,0 +1,95 @@ | |||
1 | |||
2 | if ~exist('n_ima')|~exist('fc'), | ||
3 | fprintf(1,'No calibration data available.\n'); | ||
4 | return; | ||
5 | end; | ||
6 | |||
7 | check_active_images; | ||
8 | |||
9 | if ~exist('solution_init'), solution_init = []; end; | ||
10 | |||
11 | for kk = 1:n_ima, | ||
12 | if ~exist(['dX_' num2str(kk)]), eval(['dX_' num2str(kk) '= dX;']); end; | ||
13 | if ~exist(['dY_' num2str(kk)]), eval(['dY_' num2str(kk) '= dY;']); end; | ||
14 | end; | ||
15 | |||
16 | if ~exist('param_list'), | ||
17 | param_list = solution; | ||
18 | end; | ||
19 | |||
20 | if ~exist('wintx'), | ||
21 | wintx = []; | ||
22 | winty = []; | ||
23 | end; | ||
24 | |||
25 | if ~exist('dX_default'), | ||
26 | dX_default = []; | ||
27 | dY_default = []; | ||
28 | end; | ||
29 | |||
30 | if ~exist('alpha_c'), | ||
31 | alpha_c = 0; | ||
32 | end; | ||
33 | |||
34 | for kk = 1:n_ima, | ||
35 | if ~exist(['y_' num2str(kk)]), | ||
36 | eval(['y_' num2str(kk) ' = NaN*ones(2,1);']); | ||
37 | end; | ||
38 | if ~exist(['n_sq_x_' num2str(kk)]), | ||
39 | eval(['n_sq_x_' num2str(kk) ' = NaN;']); | ||
40 | eval(['n_sq_y_' num2str(kk) ' = NaN;']); | ||
41 | end; | ||
42 | if ~exist(['wintx_' num2str(kk)]), | ||
43 | eval(['wintx_' num2str(kk) ' = NaN;']); | ||
44 | eval(['winty_' num2str(kk) ' = NaN;']); | ||
45 | end; | ||
46 | end; | ||
47 | |||
48 | save_name = 'Calib_Results'; | ||
49 | |||
50 | if exist([ save_name '.mat'])==2, | ||
51 | disp('WARNING: File Calib_Results.mat already exists'); | ||
52 | pfn = -1; | ||
53 | cont = 1; | ||
54 | while cont, | ||
55 | pfn = pfn + 1; | ||
56 | postfix = ['_old'num2str(pfn)]; | ||
57 | save_name = [ 'Calib_Results' postfix]; | ||
58 | cont = (exist([ save_name '.mat'])==2); | ||
59 | end; | ||
60 | copyfile('Calib_Results.mat',[save_name '.mat']); | ||
61 | disp(['Copying the current Calib_Results.mat file to ' save_name '.mat']); | ||
62 | end; | ||
63 | |||
64 | |||
65 | save_name = 'Calib_Results'; | ||
66 | |||
67 | if exist('calib_name'), | ||
68 | |||
69 | fprintf(1,['\nSaving calibration results under ' save_name '.mat\n']); | ||
70 | |||
71 | string_save = ['save ' save_name ' center_optim param_list active_images ind_active center_optim est_alpha est_dist fc kc cc alpha_c ex x y solution solution_init wintx winty n_ima type_numbering N_slots small_calib_image first_num image_numbers format_image calib_name Hcal Wcal nx ny map dX_default dY_default KK inv_KK dX dY']; | ||
72 | |||
73 | for kk = 1:n_ima, | ||
74 | string_save = [string_save ' X_' num2str(kk) ' x_' num2str(kk) ' y_' num2str(kk) ' ex_' num2str(kk) ' omc_' num2str(kk) ' Rc_' num2str(kk) ' Tc_' num2str(kk) ' H_' num2str(kk) ' n_sq_x_' num2str(kk) ' n_sq_y_' num2str(kk) ' wintx_' num2str(kk) ' winty_' num2str(kk) ' dX_' num2str(kk) ' dY_' num2str(kk)]; | ||
75 | end; | ||
76 | |||
77 | else | ||
78 | |||
79 | fprintf(1,['\nSaving calibration results under ' save_name '.mat (no image version)\n']); | ||
80 | |||
81 | string_save = ['save ' save_name ' center_optim param_list active_images ind_active center_optim est_alpha est_dist fc kc cc alpha_c ex x y solution solution_init wintx winty n_ima nx ny dX_default dY_default KK inv_KK dX dY']; | ||
82 | |||
83 | for kk = 1:n_ima, | ||
84 | string_save = [string_save ' X_' num2str(kk) ' x_' num2str(kk) ' y_' num2str(kk) ' ex_' num2str(kk) ' omc_' num2str(kk) ' Rc_' num2str(kk) ' Tc_' num2str(kk) ' H_' num2str(kk) ' n_sq_x_' num2str(kk) ' n_sq_y_' num2str(kk) ' wintx_' num2str(kk) ' winty_' num2str(kk) ' dX_' num2str(kk) ' dY_' num2str(kk)]; | ||
85 | end; | ||
86 | |||
87 | end; | ||
88 | |||
89 | |||
90 | |||
91 | %fprintf(1,'To load later click on Load\n'); | ||
92 | |||
93 | eval(string_save); | ||
94 | |||
95 | fprintf(1,'done\n'); \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/script_fit_distortion.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/script_fit_distortion.m new file mode 100755 index 0000000..c5e5430 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/script_fit_distortion.m | |||
@@ -0,0 +1,39 @@ | |||
1 | |||
2 | satis_distort = 0; | ||
3 | |||
4 | disp(['Estimated focal: ' num2str(f_g) ' pixels']); | ||
5 | |||
6 | while ~satis_distort, | ||
7 | |||
8 | k_g = input('Guess for distortion factor kc ([]=0): '); | ||
9 | |||
10 | if isempty(k_g), k_g = 0; end; | ||
11 | |||
12 | xy_corners_undist = comp_distortion2([x' - c_g(1);y'-c_g(2)]/f_g,k_g); | ||
13 | |||
14 | xu = xy_corners_undist(1,:)'; | ||
15 | yu = xy_corners_undist(2,:)'; | ||
16 | |||
17 | [XXu] = projectedGrid ( [xu(1);yu(1)], [xu(2);yu(2)],[xu(3);yu(3)], [xu(4);yu(4)],n_sq_x+1,n_sq_y+1); % The full grid | ||
18 | |||
19 | XX = (ones(2,1)*(1 + k_g * sum(XXu.^2))) .* XXu; | ||
20 | XX(1,:) = f_g*XX(1,:)+c_g(1); | ||
21 | XX(2,:) = f_g*XX(2,:)+c_g(2); | ||
22 | |||
23 | figure(2); | ||
24 | image(I); | ||
25 | colormap(map); | ||
26 | zoom on; | ||
27 | hold on; | ||
28 | %plot(f_g*XXu(1,:)+c_g(1),f_g*XXu(2,:)+c_g(2),'ro'); | ||
29 | plot(XX(1,:),XX(2,:),'r+'); | ||
30 | title('The red crosses should be on the grid corners...'); | ||
31 | hold off; | ||
32 | |||
33 | satis_distort = input('Satisfied with distortion? ([]=no, other=yes) '); | ||
34 | |||
35 | satis_distort = ~isempty(satis_distort); | ||
36 | |||
37 | |||
38 | end; | ||
39 | \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/startup.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/startup.m new file mode 100755 index 0000000..aad0fa4 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/startup.m | |||
@@ -0,0 +1,9 @@ | |||
1 | % Main camera calibration toolbox: | ||
2 | |||
3 | calib_gui; | ||
4 | |||
5 | %calib_gui; | ||
6 | |||
7 | path(pwd,path); | ||
8 | |||
9 | format compact | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/undistort_image.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/undistort_image.m new file mode 100755 index 0000000..d9a7574 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/undistort_image.m | |||
@@ -0,0 +1,193 @@ | |||
1 | %%% INPUT THE IMAGE FILE NAME: | ||
2 | |||
3 | if ~exist('fc')|~exist('cc')|~exist('kc')|~exist('alpha_c'), | ||
4 | fprintf(1,'No intrinsic camera parameters available.\n'); | ||
5 | return; | ||
6 | end; | ||
7 | |||
8 | KK = [fc(1) alpha_c*fc(1) cc(1);0 fc(2) cc(2) ; 0 0 1]; | ||
9 | |||
10 | disp('Program that undistorts images'); | ||
11 | disp('The intrinsic camera parameters are assumed to be known (previously computed)'); | ||
12 | |||
13 | fprintf(1,'\n'); | ||
14 | |||
15 | quest = input('Do you want to undistort all the calibration images ([],0) or a new image (1)? '); | ||
16 | |||
17 | if isempty(quest), | ||
18 | quest = 0; | ||
19 | end; | ||
20 | |||
21 | if ~quest, | ||
22 | |||
23 | if ~exist(['I_' num2str(ind_active(1))]), | ||
24 | ima_read_calib; | ||
25 | end; | ||
26 | |||
27 | check_active_images; | ||
28 | |||
29 | format_image2 = format_image; | ||
30 | if format_image2(1) == 'j', | ||
31 | format_image2 = 'bmp'; | ||
32 | end; | ||
33 | |||
34 | for kk = 1:n_ima, | ||
35 | |||
36 | if exist(['I_' num2str(kk)]), | ||
37 | |||
38 | eval(['I = I_' num2str(kk) ';']); | ||
39 | [I2] = rect(I,eye(3),fc,cc,kc,KK); | ||
40 | |||
41 | if ~type_numbering, | ||
42 | number_ext = num2str(image_numbers(kk)); | ||
43 | else | ||
44 | number_ext = sprintf(['%.' num2str(N_slots) 'd'],image_numbers(kk)); | ||
45 | end; | ||
46 | |||
47 | ima_name2 = [calib_name '_rect' number_ext '.' format_image2]; | ||
48 | |||
49 | fprintf(1,['Saving undistorted image under ' ima_name2 '...\n']); | ||
50 | |||
51 | |||
52 | if format_image2(1) == 'p', | ||
53 | if format_images2(2) == 'p', | ||
54 | saveppm(ima_name2,uint8(round(I2))); | ||
55 | else | ||
56 | savepgm(ima_name2,uint8(round(I2))); | ||
57 | end; | ||
58 | else | ||
59 | if format_image2(1) == 'r', | ||
60 | writeras(ima_name2,round(I2),gray(256)); | ||
61 | else | ||
62 | imwrite(uint8(round(I2)),gray(256),ima_name2,format_image2); | ||
63 | end; | ||
64 | end; | ||
65 | |||
66 | |||
67 | end; | ||
68 | |||
69 | end; | ||
70 | |||
71 | fprintf(1,'done\n'); | ||
72 | |||
73 | else | ||
74 | |||
75 | dir; | ||
76 | fprintf(1,'\n'); | ||
77 | |||
78 | image_name = input('Image name (full name without extension): ','s'); | ||
79 | |||
80 | format_image2 = '0'; | ||
81 | |||
82 | while format_image2 == '0', | ||
83 | |||
84 | format_image2 = input('Image format: ([]=''r''=''ras'', ''b''=''bmp'', ''t''=''tif'', ''p''=''pgm'', ''j''=''jpg'', ''m''=''ppm'') ','s'); | ||
85 | |||
86 | if isempty(format_image2), | ||
87 | format_image2 = 'ras'; | ||
88 | end; | ||
89 | |||
90 | if lower(format_image2(1)) == 'm', | ||
91 | format_image2 = 'ppm'; | ||
92 | else | ||
93 | if lower(format_image2(1)) == 'b', | ||
94 | format_image2 = 'bmp'; | ||
95 | else | ||
96 | if lower(format_image2(1)) == 't', | ||
97 | format_image2 = 'tif'; | ||
98 | else | ||
99 | if lower(format_image2(1)) == 'p', | ||
100 | format_image2 = 'pgm'; | ||
101 | else | ||
102 | if lower(format_image2(1)) == 'j', | ||
103 | format_image2 = 'jpg'; | ||
104 | else | ||
105 | if lower(format_image2(1)) == 'r', | ||
106 | format_image2 = 'ras'; | ||
107 | else | ||
108 | disp('Invalid image format'); | ||
109 | format_image2 = '0'; % Ask for format once again | ||
110 | end; | ||
111 | end; | ||
112 | end; | ||
113 | end; | ||
114 | end; | ||
115 | end; | ||
116 | end; | ||
117 | |||
118 | ima_name = [image_name '.' format_image2]; | ||
119 | |||
120 | |||
121 | %%% READ IN IMAGE: | ||
122 | |||
123 | if format_image2(1) == 'p', | ||
124 | if format_image2(2) == 'p', | ||
125 | I = double(loadppm(ima_name)); | ||
126 | else | ||
127 | I = double(loadpgm(ima_name)); | ||
128 | end; | ||
129 | else | ||
130 | if format_image2(1) == 'r', | ||
131 | I = readras(ima_name); | ||
132 | else | ||
133 | I = double(imread(ima_name)); | ||
134 | end; | ||
135 | end; | ||
136 | |||
137 | if size(I,3)>1, | ||
138 | I = I(:,:,2); | ||
139 | end; | ||
140 | |||
141 | |||
142 | if (size(I,1)>ny)|(size(I,2)>nx), | ||
143 | I = I(1:ny,1:nx); | ||
144 | end; | ||
145 | |||
146 | |||
147 | %% SHOW THE ORIGINAL IMAGE: | ||
148 | |||
149 | figure(2); | ||
150 | image(I); | ||
151 | colormap(gray(256)); | ||
152 | title('Original image (with distortion) - Stored in array I'); | ||
153 | drawnow; | ||
154 | |||
155 | |||
156 | %% UNDISTORT THE IMAGE: | ||
157 | |||
158 | fprintf(1,'Computing the undistorted image...') | ||
159 | |||
160 | [I2] = rect(I,eye(3),fc,cc,kc,alpha_c,KK); | ||
161 | |||
162 | fprintf(1,'done\n'); | ||
163 | |||
164 | figure(3); | ||
165 | image(I2); | ||
166 | colormap(gray(256)); | ||
167 | title('Undistorted image - Stored in array I2'); | ||
168 | drawnow; | ||
169 | |||
170 | |||
171 | %% SAVE THE IMAGE IN FILE: | ||
172 | |||
173 | ima_name2 = [image_name '_rect.' format_image2]; | ||
174 | |||
175 | fprintf(1,['Saving undistorted image under ' ima_name2 '...']); | ||
176 | |||
177 | if format_image2(1) == 'p', | ||
178 | if format_images2(2) == 'p', | ||
179 | saveppm(ima_name2,uint8(round(I2))); | ||
180 | else | ||
181 | savepgm(ima_name2,uint8(round(I2))); | ||
182 | end; | ||
183 | else | ||
184 | if format_image2(1) == 'r', | ||
185 | writeras(ima_name2,round(I2),gray(256)); | ||
186 | else | ||
187 | imwrite(uint8(round(I2)),gray(256),ima_name2,format_image2); | ||
188 | end; | ||
189 | end; | ||
190 | |||
191 | fprintf(1,'done\n'); | ||
192 | |||
193 | end; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/willson_convert.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/willson_convert.m new file mode 100755 index 0000000..8946349 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/willson_convert.m | |||
@@ -0,0 +1,89 @@ | |||
1 | function [fc,cc,kc,Rc,Tc,omc,nx,ny] = willson_convert(Ncx,Nfx,dx,dy,dpx,dpy,Cx,Cy,sx,f,kappa1,Tx,Ty,Tz,Rx,Ry,Rz,p1,p2); | ||
2 | |||
3 | %Conversion from Reg Willson's calibration format to my format | ||
4 | |||
5 | % Conversion: | ||
6 | |||
7 | % Focal length: | ||
8 | fc = [sx/dpx ; 1/dpy]*f; | ||
9 | |||
10 | % Principal point; | ||
11 | cc = [Cx;Cy]; | ||
12 | |||
13 | % Extrinsic parameters: | ||
14 | Rx = rodrigues([Rx;0;0]); | ||
15 | Ry = rodrigues([0;Ry;0]); | ||
16 | Rz = rodrigues([0;0;Rz]); | ||
17 | |||
18 | Rc = Rz * Ry * Rx; | ||
19 | |||
20 | omc = rodrigues(Rc); | ||
21 | |||
22 | Tc = [Tx;Ty;Tz]; | ||
23 | |||
24 | |||
25 | % More tricky: Take care of the distorsion: | ||
26 | |||
27 | Nfy = round(Nfx * 3/4); | ||
28 | |||
29 | nx = Nfx; | ||
30 | ny = Nfy; | ||
31 | |||
32 | % Select a set of DISTORTED coordinates uniformely distributed across the image: | ||
33 | |||
34 | [xp_dist,yp_dist] = meshgrid(0:Nfx-1,0:Nfy); | ||
35 | |||
36 | xp_dist = xp_dist(:)'; | ||
37 | yp_dist = yp_dist(:)'; | ||
38 | |||
39 | |||
40 | % Apply UNDISTORTION according to Willson: | ||
41 | |||
42 | xp_sensor_dist = dpx*(xp_dist - Cx)/sx; | ||
43 | yp_sensor_dist = dpy*(yp_dist - Cy); | ||
44 | |||
45 | dist_fact = 1 + kappa1*(xp_sensor_dist.^2 + yp_sensor_dist.^2); | ||
46 | |||
47 | xp_sensor = xp_sensor_dist .* dist_fact; | ||
48 | yp_sensor = yp_sensor_dist .* dist_fact; | ||
49 | |||
50 | xp = xp_sensor * sx / dpx + Cx; | ||
51 | yp = yp_sensor / dpy + Cy; | ||
52 | |||
53 | ind= find((xp > 0) & (xp < Nfx-1) & (yp > 0) & (yp < Nfy-1)); | ||
54 | |||
55 | xp = xp(ind); | ||
56 | yp = yp(ind); | ||
57 | xp_dist = xp_dist(ind); | ||
58 | yp_dist = yp_dist(ind); | ||
59 | |||
60 | |||
61 | % Now, find my own set of parameters: | ||
62 | |||
63 | x_dist = [(xp_dist - cc(1))/fc(1);(yp_dist - cc(2))/fc(2)]; | ||
64 | x = [(xp - cc(1))/fc(1);(yp - cc(2))/fc(2)]; | ||
65 | |||
66 | k = [0;0;0;0]; | ||
67 | |||
68 | for kk = 1:5, | ||
69 | |||
70 | [xd,dxddk] = apply_distortion(x,k); | ||
71 | |||
72 | err = x_dist - xd; | ||
73 | |||
74 | %norm(err) | ||
75 | |||
76 | k_step = inv(dxddk'*dxddk)*(dxddk')*err(:); | ||
77 | |||
78 | k = k + k_step; %inv(dxddk'*dxddk)*(dxddk')*err(:); | ||
79 | |||
80 | %norm(k_step)/norm(k) | ||
81 | |||
82 | if norm(k_step)/norm(k) < 10e-10, | ||
83 | break; | ||
84 | end; | ||
85 | |||
86 | end; | ||
87 | |||
88 | |||
89 | kc = k; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/willson_read.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/willson_read.m new file mode 100755 index 0000000..bbde63c --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/willson_read.m | |||
@@ -0,0 +1,59 @@ | |||
1 | % Read in Reg Willson's data file, and convert it into my data format: | ||
2 | |||
3 | %dir; | ||
4 | |||
5 | %calib_file = input('Reg Willson calibration file name: ','s'); | ||
6 | |||
7 | if exist(calib_file), | ||
8 | |||
9 | |||
10 | load(calib_file); | ||
11 | |||
12 | inddot = find(calib_file == '.'); | ||
13 | |||
14 | if isempty(inddot), | ||
15 | varname = calib_file; | ||
16 | else | ||
17 | varname = calib_file(1:inddot(1)-1); | ||
18 | end; | ||
19 | |||
20 | eval(['calib_params = ' varname ';']) | ||
21 | |||
22 | Ncx = calib_params(1); | ||
23 | Nfx = calib_params(2); | ||
24 | dx = calib_params(3); | ||
25 | dy = calib_params(4); | ||
26 | dpx = calib_params(5); | ||
27 | dpy = calib_params(6); | ||
28 | Cx = calib_params(7); | ||
29 | Cy = calib_params(8); | ||
30 | sx = calib_params(9); | ||
31 | f = calib_params(10); | ||
32 | kappa1 = calib_params(11); | ||
33 | Tx = calib_params(12); | ||
34 | Ty = calib_params(13); | ||
35 | Tz = calib_params(14); | ||
36 | Rx = calib_params(15); | ||
37 | Ry = calib_params(16); | ||
38 | Rz = calib_params(17); | ||
39 | p1 = calib_params(18); | ||
40 | p2 = calib_params(19); | ||
41 | |||
42 | % Conversion: | ||
43 | [fc,cc,kc,Rc_1,Tc_1,omc_1,nx,ny] = willson_convert(Ncx,Nfx,dx,dy,dpx,dpy,Cx,Cy,sx,f,kappa1,Tx,Ty,Tz,Rx,Ry,Rz,p1,p2); | ||
44 | |||
45 | KK = [fc(1) 0 cc(1);0 fc(2) cc(2) ; 0 0 1]; | ||
46 | |||
47 | n_ima = 1; | ||
48 | |||
49 | X_1 = [NaN;NaN;NaN]; | ||
50 | x_1 = [NaN;NaN]; | ||
51 | |||
52 | map = gray(256); | ||
53 | |||
54 | else | ||
55 | |||
56 | disp(['WARNING: Calibration file ' calib_file ' not found']); | ||
57 | |||
58 | end; | ||
59 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/writeras.m b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/writeras.m new file mode 100755 index 0000000..c7eb7bc --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/TOOLBOX_calib/writeras.m | |||
@@ -0,0 +1,105 @@ | |||
1 | function writeras(filename, image, map); | ||
2 | %WRITERAS Write an image file in sun raster format. | ||
3 | % WRITERAS('imagefile.ras', image_matrix, map) writes a | ||
4 | % "sun.raster" image file. | ||
5 | |||
6 | % Written by Thomas K. Leung 3/30/93. | ||
7 | % @ California Institute of Technology. | ||
8 | |||
9 | |||
10 | % PC and UNIX version of writeras - Jean-Yves Bouguet - Dec. 1998 | ||
11 | |||
12 | dot = max(find(filename == '.')); | ||
13 | suffix = filename(dot+1:dot+3); | ||
14 | |||
15 | if nargin < 3, | ||
16 | map = []; | ||
17 | end; | ||
18 | |||
19 | if(strcmp(suffix, 'ras')) | ||
20 | %Write header | ||
21 | |||
22 | fp = fopen(filename, 'wb'); | ||
23 | if(fp < 0) error(['Cannot open ' filename '.']), end | ||
24 | |||
25 | [height, width] = size(image); | ||
26 | image = image - 1; | ||
27 | mapsize = size(map, 1)*size(map,2); | ||
28 | %fwrite(fp, ... | ||
29 | % [1504078485, width, height, 8, height*width, 1, 1, mapsize], ... | ||
30 | % 'long'); | ||
31 | |||
32 | |||
33 | zero_str = '00000000'; | ||
34 | |||
35 | % MAGIC NUMBER: | ||
36 | |||
37 | |||
38 | fwrite(fp,89,'uchar'); | ||
39 | fwrite(fp,166,'uchar'); | ||
40 | fwrite(fp,106,'uchar'); | ||
41 | fwrite(fp,149,'uchar'); | ||
42 | |||
43 | width_str = dec2hex(width); | ||
44 | width_str = [zero_str(1:8-length(width_str)) width_str]; | ||
45 | |||
46 | for ii = 1:2:7, | ||
47 | fwrite(fp,hex2dec(width_str(ii:ii+1)),'uchar'); | ||
48 | end; | ||
49 | |||
50 | |||
51 | height_str = dec2hex(height); | ||
52 | height_str = [zero_str(1:8-length(height_str)) height_str]; | ||
53 | |||
54 | for ii = 1:2:7, | ||
55 | fwrite(fp,hex2dec(height_str(ii:ii+1)),'uchar'); | ||
56 | end; | ||
57 | |||
58 | fwrite(fp,0,'uchar'); | ||
59 | fwrite(fp,0,'uchar'); | ||
60 | fwrite(fp,0,'uchar'); | ||
61 | fwrite(fp,8,'uchar'); | ||
62 | |||
63 | ll = height*width; | ||
64 | ll_str = dec2hex(ll); | ||
65 | ll_str = [zero_str(1:8-length(ll_str)) ll_str]; | ||
66 | |||
67 | for ii = 1:2:7, | ||
68 | fwrite(fp,hex2dec(ll_str(ii:ii+1)),'uchar'); | ||
69 | end; | ||
70 | |||
71 | fwrite(fp,0,'uchar'); | ||
72 | fwrite(fp,0,'uchar'); | ||
73 | fwrite(fp,0,'uchar'); | ||
74 | fwrite(fp,1,'uchar'); | ||
75 | fwrite(fp,0,'uchar'); | ||
76 | fwrite(fp,0,'uchar'); | ||
77 | fwrite(fp,0,'uchar'); | ||
78 | fwrite(fp,~~mapsize,'uchar'); | ||
79 | |||
80 | mapsize_str = dec2hex(mapsize); | ||
81 | mapsize_str = [zero_str(1:8-length(mapsize_str)) mapsize_str]; | ||
82 | |||
83 | %keyboard; | ||
84 | |||
85 | for ii = 1:2:7, | ||
86 | fwrite(fp,hex2dec(mapsize_str(ii:ii+1)),'uchar'); | ||
87 | end; | ||
88 | |||
89 | |||
90 | if mapsize ~= 0 | ||
91 | map = min(255, fix(255*map)); | ||
92 | fwrite(fp, map, 'uchar'); | ||
93 | end | ||
94 | if rem(width,2) == 1 | ||
95 | image = [image'; zeros(1, height)]'; | ||
96 | top = 255 * ones(size(image)); | ||
97 | fwrite(fp, min(top,image)', 'uchar'); | ||
98 | else | ||
99 | top = 255 * ones(size(image)); | ||
100 | fwrite(fp, min(top,image)', 'uchar'); | ||
101 | end | ||
102 | fclose(fp); | ||
103 | else | ||
104 | error('Image file name must end in either ''ras'' or ''rast''.'); | ||
105 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/README b/SD-VBS/common/toolbox/toolbox_basic/affine/README new file mode 100755 index 0000000..e578a74 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/README | |||
@@ -0,0 +1,5 @@ | |||
1 | Top level program is "compute_AD.m". Use "compute_AD_disp.m" if one | ||
2 | wants to display results as program runs. | ||
3 | |||
4 | The testing programs are called "simulation.m" for synthetic images, | ||
5 | and "test_affine.m" for real images. | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/carve_it.m b/SD-VBS/common/toolbox/toolbox_basic/affine/carve_it.m new file mode 100755 index 0000000..1a44f89 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/carve_it.m | |||
@@ -0,0 +1,25 @@ | |||
1 | function img = carve_it(I,center,window_size_h) | ||
2 | |||
3 | [size_y,size_x]= size(I); | ||
4 | min_x = round(center(1)-window_size_h(1)); | ||
5 | max_x = round(center(1)+window_size_h(1)); | ||
6 | min_y = round(center(2)-window_size_h(2)); | ||
7 | max_y = round(center(2)+window_size_h(2)); | ||
8 | window_size = window_size_h*2 +1; | ||
9 | |||
10 | if (min_x <1)|(max_x > size_x)|(min_y<1)|(max_y>size_y), | ||
11 | disp('window too big'); | ||
12 | center | ||
13 | window_size_h | ||
14 | img = zeros(window_size(2),window_size(1)); | ||
15 | n_min_x = max(1,round(min_x)); | ||
16 | n_min_y = max(1,round(min_y)); | ||
17 | n_max_x = min(size_x,round(max_x)); | ||
18 | n_max_y = min(size_y,round(max_y)); | ||
19 | img(1+(n_min_y-min_y):window_size(2)-(max_y-n_max_y),1+(n_min_x-min_x):window_size(1)-(max_x-n_max_x))=I(n_min_y:n_max_y,n_min_x:n_max_x); | ||
20 | else | ||
21 | img = I(center(2)-window_size_h(2):center(2)+window_size_h(2),... | ||
22 | center(1)-window_size_h(1):center(1)+window_size_h(1)); | ||
23 | end | ||
24 | |||
25 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/compute_AD.m b/SD-VBS/common/toolbox/toolbox_basic/affine/compute_AD.m new file mode 100755 index 0000000..a39acd6 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/compute_AD.m | |||
@@ -0,0 +1,90 @@ | |||
1 | function [A,D,mask] =... | ||
2 | compute_AD(img_i,img_j,center_i,center_j,window_size_h,num_iter,w,num_trans,Dest,mask) | ||
3 | % | ||
4 | % function [A,D,mask] = ... | ||
5 | % compute_AD(img_i,img_j,center_i,center_j,window_size_h,num_iter,w, | ||
6 | % mask,num_trans) | ||
7 | % | ||
8 | % A: Affine motion; | ||
9 | % D: Displacement; | ||
10 | % | ||
11 | % img_i, img_j: the two image(in full size); | ||
12 | % center_i, center_j: the centers of the feature in two images; | ||
13 | % window_size_h: half size of the feature window; | ||
14 | % num_iter: number of iterations; | ||
15 | % w: parameter used in "grad.m" for computing gaussians used for | ||
16 | % gradient estimation; | ||
17 | % | ||
18 | % num_trans: OPTIONAL, number of translation iteration; default = 3; | ||
19 | % mask: OPTIONAL, if some area of the square shaped feature window should | ||
20 | % be weighted less; | ||
21 | % | ||
22 | |||
23 | % | ||
24 | % Jianbo Shi | ||
25 | % | ||
26 | |||
27 | if ~exist('Dest'), | ||
28 | Dest = [0,0]; | ||
29 | end | ||
30 | |||
31 | if ~exist('mask'), | ||
32 | mask = ones(2*window_size_h+1)'; | ||
33 | end | ||
34 | |||
35 | % set the default num_trans | ||
36 | if ~exist('num_trans'), | ||
37 | num_trans= 3; | ||
38 | end | ||
39 | |||
40 | % normalize image intensity to the range of 0.0-1.0 | ||
41 | img_i = norm_inten(img_i); | ||
42 | img_j = norm_inten(img_j); | ||
43 | |||
44 | window_size = 2*window_size_h + 1; | ||
45 | I = carve_it(img_i,center_i,window_size_h); | ||
46 | J = carve_it(img_j,center_j,window_size_h); | ||
47 | |||
48 | % init. step | ||
49 | J_computed = I; | ||
50 | D_computed = Dest; | ||
51 | A_computed = eye(2); | ||
52 | J_computed = compute_J(A_computed,D_computed,img_i,center_i,window_size_h); | ||
53 | |||
54 | %% level of noise | ||
55 | sig = 0.1; | ||
56 | |||
57 | records = zeros(num_iter,6); | ||
58 | errs = zeros(1,num_iter); | ||
59 | |||
60 | k = 1; | ||
61 | % iteration | ||
62 | while k <= num_iter, | ||
63 | [A,D] = iter_AD(J_computed,J,mask,w,k,num_trans); | ||
64 | |||
65 | A_computed = A*A_computed; | ||
66 | D_computed = (A*D_computed')' + D; | ||
67 | |||
68 | % compute the warped image | ||
69 | J_computed = compute_J(A_computed,D_computed,img_i,center_i,window_size_h); | ||
70 | |||
71 | % compute the SSD error | ||
72 | errs(k) = sqrt(sum(sum((mask.*(J_computed-J)).^2)))/prod(size(J)); | ||
73 | |||
74 | % update the mask, discounting possible occlusion region | ||
75 | if (k>num_trans), | ||
76 | mask = exp(-abs(J_computed-J)/sig); | ||
77 | end | ||
78 | |||
79 | % record the A and D | ||
80 | records(k,:) = [reshape(A_computed,1,4),reshape(D_computed,1,2)]; | ||
81 | |||
82 | k = k+1; | ||
83 | end | ||
84 | |||
85 | [tmp,id] = min(errs); | ||
86 | A = reshape(records(id,1:4),2,2); | ||
87 | D = reshape(records(id,5:6),1,2); | ||
88 | |||
89 | J_computed = compute_J(A,D,img_i,center_i,window_size_h); | ||
90 | mask = exp(-abs(J_computed-J)/sig); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/compute_AD_disp.m b/SD-VBS/common/toolbox/toolbox_basic/affine/compute_AD_disp.m new file mode 100755 index 0000000..f2e6c62 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/compute_AD_disp.m | |||
@@ -0,0 +1,103 @@ | |||
1 | function [A,D,mask] =... | ||
2 | compute_AD_disp(img_i,img_j,center_i,center_j,window_size_h,num_iter,w,fig_disp,num_trans,Dest,mask) | ||
3 | % | ||
4 | % function [A,D,mask] = ... | ||
5 | % compute_AD_disp(img_i,img_j,center_i,center_j,window_size_h,num_iter,w, | ||
6 | % fig_disp,mask,num_trans) | ||
7 | % | ||
8 | % Computing affine transform for matching to image patches. Display results | ||
9 | % as program runs. | ||
10 | % | ||
11 | % A: Affine motion; | ||
12 | % D: Displacement; | ||
13 | % | ||
14 | % | ||
15 | % img_i, img_j: the two image(in full size); | ||
16 | % center_i, center_j: the centers of the feature in two images; | ||
17 | % window_size_h: half size of the feature window; | ||
18 | % num_iter: number of iterations; | ||
19 | % w: parameter used in "grad.m" for computing gaussians used for | ||
20 | % gradient estimation; | ||
21 | % fig_disp: figure for display; | ||
22 | % | ||
23 | % num_trans: OPTIONAL, number of translation iteration; | ||
24 | % mask: OPTIONAL, if some area of the square shaped feature window should | ||
25 | % be weighted less; | ||
26 | % | ||
27 | |||
28 | |||
29 | % | ||
30 | % Jianbo Shi | ||
31 | % | ||
32 | |||
33 | if ~exist('mask'), | ||
34 | mask = ones(2*window_size_h+1)'; | ||
35 | end | ||
36 | |||
37 | if ~exist('Dest'), | ||
38 | Dest = [0,0]; | ||
39 | end | ||
40 | |||
41 | % set the default num_trans | ||
42 | if ~exist('num_trans'), | ||
43 | num_trans= 3; | ||
44 | end | ||
45 | |||
46 | % normalize image intensity to the range of 0.0-1.0 | ||
47 | img_i = norm_inten(img_i); | ||
48 | img_j = norm_inten(img_j); | ||
49 | |||
50 | window_size = 2*window_size_h + 1; | ||
51 | I = carve_it(img_i,center_i,window_size_h); | ||
52 | J = carve_it(img_j,center_j,window_size_h); | ||
53 | |||
54 | % init. step | ||
55 | D_computed = Dest; | ||
56 | A_computed = eye(2); | ||
57 | J_computed = compute_J(A_computed,D_computed,img_i,center_i,window_size_h); | ||
58 | |||
59 | |||
60 | |||
61 | figure(fig_disp);subplot(1,3,1);imagesc(I);colormap(gray);axis('image'); | ||
62 | subplot(1,3,3);imagesc(J);axis('image'); | ||
63 | drawnow; | ||
64 | |||
65 | sig = 0.1; | ||
66 | |||
67 | records = zeros(num_iter,6); | ||
68 | errs = zeros(1,num_iter); | ||
69 | |||
70 | k = 1; | ||
71 | % iteration | ||
72 | while k <= num_iter, | ||
73 | [A,D] = iter_AD(J_computed,J,mask,w,k,num_trans); | ||
74 | |||
75 | A_computed = A*A_computed; | ||
76 | D_computed = (A*D_computed')' + D; | ||
77 | |||
78 | % compute the warped image | ||
79 | J_computed = compute_J(A_computed,D_computed,img_i,center_i,window_size_h); | ||
80 | |||
81 | % compute the SSD error | ||
82 | errs(k) = sqrt(sum(sum((mask.*(J_computed-J)).^2)))/prod(size(J)) | ||
83 | |||
84 | % update the mask, discounting possible occlusion region | ||
85 | if (k>num_trans+1), | ||
86 | mask = exp(-abs(J_computed-J)/sig); | ||
87 | end | ||
88 | |||
89 | % record the A and D | ||
90 | records(k,:) = [reshape(A_computed,1,4),reshape(D_computed,1,2)]; | ||
91 | |||
92 | figure(fig_disp);subplot(1,3,2);imagesc(J_computed);axis('image'); | ||
93 | title(sprintf('iter:%d: dx=%3.3f, dy = %3.3f',k,D_computed(1),D_computed(2)));drawnow; | ||
94 | |||
95 | k = k+1; | ||
96 | end | ||
97 | |||
98 | [tmp,id] = min(errs); | ||
99 | A = reshape(records(id,1:4),2,2); | ||
100 | D = reshape(records(id,5:6),1,2); | ||
101 | |||
102 | J_computed = compute_J(A,D,img_i,center_i,window_size_h); | ||
103 | mask = exp(-abs(J_computed-J)/sig); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/compute_J.m b/SD-VBS/common/toolbox/toolbox_basic/affine/compute_J.m new file mode 100755 index 0000000..80db273 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/compute_J.m | |||
@@ -0,0 +1,31 @@ | |||
1 | function [JJ,mask] = compute_J(A,D,I,center,window_size_h) | ||
2 | %% function J = compute_J(A,D,I,center,window_size_h) | ||
3 | % | ||
4 | |||
5 | [size_y,size_x] = size(I); | ||
6 | |||
7 | center_x = center(1); | ||
8 | center_y = center(2); | ||
9 | |||
10 | [XX,YY] = meshgrid(1:size_x,1:size_y); | ||
11 | x = reshape(XX,size_x*size_y,1); | ||
12 | y = reshape(YY,size_x*size_y,1); | ||
13 | index(:,1) = x-center_x; | ||
14 | index(:,2) = y-center_y; | ||
15 | |||
16 | position_new = A*index'+ [D(1),0;0,D(2)]*ones(2,size_x*size_y); | ||
17 | position_new(1,:) = position_new(1,:)+center_x; | ||
18 | position_new(2,:) = position_new(2,:)+center_y; | ||
19 | |||
20 | position_new_x = reshape(position_new(1,:),size_y,size_x); | ||
21 | position_new_y = reshape(position_new(2,:),size_y,size_x); | ||
22 | |||
23 | [J,mask]= m_interp4(I,position_new_x,position_new_y); | ||
24 | |||
25 | JJ = J(center(2)-window_size_h(2):center(2)+window_size_h(2),... | ||
26 | center(1)-window_size_h(1):center(1)+window_size_h(1)); | ||
27 | mask = mask(center(2)-window_size_h(2):center(2)+window_size_h(2),... | ||
28 | center(1)-window_size_h(1):center(1)+window_size_h(1)); | ||
29 | |||
30 | |||
31 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/find_AD.m b/SD-VBS/common/toolbox/toolbox_basic/affine/find_AD.m new file mode 100755 index 0000000..3cccefb --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/find_AD.m | |||
@@ -0,0 +1,82 @@ | |||
1 | function [A,D] = find_AD(I,J,mask,w) | ||
2 | % | ||
3 | % [A,D] = find_AD(I,J,mask,w) | ||
4 | % | ||
5 | % find the matrix affine transform A and displacement D, | ||
6 | % such that SSD difference of I(Ax-d)-J(x) is minimized, | ||
7 | % | ||
8 | |||
9 | % | ||
10 | % Jianbo Shi | ||
11 | % | ||
12 | |||
13 | |||
14 | [gy1,gx1] = grad(I,w); | ||
15 | [gy2,gx2] = grad(J,w); | ||
16 | |||
17 | gx = 0.5*(gx1+gx2); | ||
18 | gy = 0.5*(gy1+gy2); | ||
19 | |||
20 | [size_y,size_x] = size(I); | ||
21 | [center_y,center_x] = find_center(size_y,size_x); | ||
22 | mask = mask(w+1:size_y-w,w+1:size_x-w); | ||
23 | |||
24 | [x,y] = meshgrid(1:size_x,1:size_y); | ||
25 | x = x- center_x; | ||
26 | y = y-center_y; | ||
27 | |||
28 | x = x(w+1:size_y-w,w+1:size_x-w); | ||
29 | y = y(w+1:size_y-w,w+1:size_x-w); | ||
30 | |||
31 | gx_sqr = gx.*mask.*gx; | ||
32 | gx_gy = gx.*mask.*gy; | ||
33 | gy_sqr = gy.*mask.*gy; | ||
34 | |||
35 | x_sqr = x.*x; | ||
36 | x_y = x.*y; | ||
37 | y_sqr = y.*y; | ||
38 | |||
39 | T= zeros(6,6); | ||
40 | T(1,1) = 0.5*trapz(trapz(gx_sqr.*x_sqr)); | ||
41 | T(2,1) = trapz(trapz(gx_gy.*x_y)); | ||
42 | T(3,1) = trapz(trapz(gx_sqr.*x_y)); | ||
43 | T(4,1) = trapz(trapz(gx_gy.*x_sqr)); | ||
44 | T(5,1) = trapz(trapz(gx_sqr.*x)); | ||
45 | T(6,1) = trapz(trapz(gx_gy.*x)); | ||
46 | T(2,2) = 0.5*trapz(trapz(gy_sqr.*y_sqr)); | ||
47 | T(3,2) = trapz(trapz(gx_gy.*y_sqr)); | ||
48 | T(4,2) = trapz(trapz(gy_sqr.*x_y)); | ||
49 | T(5,2) = trapz(trapz(gx_gy.*y)); | ||
50 | T(6,2) = trapz(trapz(gy_sqr.*y)); | ||
51 | T(3,3) = 0.5*trapz(trapz(gx_sqr.*y_sqr)); | ||
52 | T(4,3) = trapz(trapz(gx_gy.*x_y)); | ||
53 | T(5,3) = trapz(trapz(gx_sqr.*y)); | ||
54 | T(6,3) = trapz(trapz(gx_gy.*y)); | ||
55 | T(4,4) = 0.5*trapz(trapz(gy_sqr.*x_sqr)); | ||
56 | T(5,4) = trapz(trapz(gx_gy.*x)); | ||
57 | T(6,4) = trapz(trapz(gy_sqr.*x)); | ||
58 | T(5,5) = 0.5*trapz(trapz(gx_sqr)); | ||
59 | T(6,5) = trapz(trapz(gx_gy)); | ||
60 | T(6,6) = 0.5*trapz(trapz(gy_sqr)); | ||
61 | |||
62 | T = T+T'; | ||
63 | |||
64 | J = J(w+1:size_y-w,w+1:size_x-w); | ||
65 | I = I(w+1:size_y-w,w+1:size_x-w); | ||
66 | |||
67 | |||
68 | diff = (J-I).*mask; | ||
69 | b(1) = trapz(trapz(diff.*gx.*x)); | ||
70 | b(2) = trapz(trapz(diff.*gy.*y)); | ||
71 | b(3) = trapz(trapz(diff.*gx.*y)); | ||
72 | b(4) = trapz(trapz(diff.*gy.*x)); | ||
73 | b(5) = trapz(trapz(diff.*gx)); | ||
74 | b(6) = trapz(trapz(diff.*gy)); | ||
75 | |||
76 | a = inv(T)*b'; | ||
77 | |||
78 | A = [1+a(1), a(3); | ||
79 | a(4),1+a(2)]; | ||
80 | |||
81 | D= [a(5),a(6)]; | ||
82 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/find_D.m b/SD-VBS/common/toolbox/toolbox_basic/affine/find_D.m new file mode 100755 index 0000000..1e42cb2 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/find_D.m | |||
@@ -0,0 +1,65 @@ | |||
1 | function D = find_D(I,J,mask,w) | ||
2 | % | ||
3 | % function D = find_D(I,J,mask,w) | ||
4 | % | ||
5 | % find the vector D such that it minimizes then | ||
6 | % difference between I(Ax-d)-J(x). | ||
7 | % | ||
8 | % mask: the weight matrix, | ||
9 | % w: window size for estimating gradiant, use a large value | ||
10 | % when A,D are large. | ||
11 | % | ||
12 | |||
13 | % | ||
14 | % NOTE: Because gradient values on the boarder regions of | ||
15 | % I and J can not be computed accuately when using | ||
16 | % a gaussian of large support, those boarder regions | ||
17 | % of width w are not used in computing D. | ||
18 | % | ||
19 | |||
20 | % | ||
21 | % Jianbo Shi | ||
22 | % | ||
23 | |||
24 | [gy1,gx1] = grad(I,w); | ||
25 | [gy2,gx2] = grad(J,w); | ||
26 | |||
27 | gx = 0.5*(gx1+gx2); | ||
28 | gy = 0.5*(gy1+gy2); | ||
29 | |||
30 | [size_y,size_x] = size(I); | ||
31 | [center_y,center_x] = find_center(size_y,size_x); | ||
32 | mask = mask(w+1:size_y-w,w+1:size_x-w); | ||
33 | |||
34 | [x,y] = meshgrid(1:size_x,1:size_y); | ||
35 | x = x- center_x; | ||
36 | y = y-center_y; | ||
37 | |||
38 | x = x(w+1:size_y-w,w+1:size_x-w); | ||
39 | y = y(w+1:size_y-w,w+1:size_x-w); | ||
40 | |||
41 | gx_sqr = gx.*mask.*gx; | ||
42 | gx_gy = gx.*mask.*gy; | ||
43 | gy_sqr = gy.*mask.*gy; | ||
44 | |||
45 | |||
46 | T= zeros(2,2); | ||
47 | |||
48 | T(1,1) = 0.5*trapz(trapz(gx_sqr)); | ||
49 | T(2,1) = trapz(trapz(gx_gy)); | ||
50 | T(2,2) = 0.5*trapz(trapz(gy_sqr)); | ||
51 | |||
52 | T = T+T'; | ||
53 | |||
54 | J = J(w+1:size_y-w,w+1:size_x-w); | ||
55 | I = I(w+1:size_y-w,w+1:size_x-w); | ||
56 | |||
57 | |||
58 | diff = (J-I).*mask; | ||
59 | b(1) = trapz(trapz(diff.*gx)); | ||
60 | b(2) = trapz(trapz(diff.*gy)); | ||
61 | |||
62 | a = inv(T)*b'; | ||
63 | |||
64 | D= [a(1),a(2)]; | ||
65 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/find_center.m b/SD-VBS/common/toolbox/toolbox_basic/affine/find_center.m new file mode 100755 index 0000000..b12ac7b --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/find_center.m | |||
@@ -0,0 +1,4 @@ | |||
1 | function [center_x,center_y] = find_center(size_x,size_y) | ||
2 | |||
3 | center_x = 0.5*(size_x +1); | ||
4 | center_y = 0.5*(size_y +1); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/gen_feature_s.m b/SD-VBS/common/toolbox/toolbox_basic/affine/gen_feature_s.m new file mode 100755 index 0000000..3c113e9 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/gen_feature_s.m | |||
@@ -0,0 +1,17 @@ | |||
1 | function I = gen_feature_s(size_of_feature) | ||
2 | % function I = gen_feature(size_of_feature) | ||
3 | % generates a spherical features with size | ||
4 | % of "size_of_feature" | ||
5 | % | ||
6 | |||
7 | ss = round(0.4*size_of_feature); | ||
8 | [X,Y,II] = hemisphere_s(ss); | ||
9 | |||
10 | II = abs(II); | ||
11 | II = 1/max(max(II))*II; | ||
12 | |||
13 | I = zeros(size_of_feature,size_of_feature); | ||
14 | |||
15 | t = round((size_of_feature-ss)/2); | ||
16 | |||
17 | I(1+t:1+t+ss,1+t:1+t+ss) = II; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/grad.m b/SD-VBS/common/toolbox/toolbox_basic/affine/grad.m new file mode 100755 index 0000000..53bab55 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/grad.m | |||
@@ -0,0 +1,24 @@ | |||
1 | % gradient of an image | ||
2 | % coordinates (r, c) follow matrix convention; | ||
3 | % the gaussian is truncated at x = +- tail, and there are samples samples | ||
4 | % inbetween, where samples = hsamples * 2 + 1 | ||
5 | |||
6 | function[gr,gc] = gradient(image, hsamples) | ||
7 | |||
8 | tail=4; | ||
9 | samples = hsamples * 2 + 1; | ||
10 | |||
11 | x = linspace(-tail, tail, samples); | ||
12 | gauss = exp(-x.^2); | ||
13 | n = gauss * ones(samples,1); | ||
14 | gauss = gauss/n; | ||
15 | |||
16 | gaussderiv = -x.*gauss; | ||
17 | n = -gaussderiv*linspace(1,samples,samples)'; | ||
18 | gaussderiv = gaussderiv/n; | ||
19 | |||
20 | gr = conv2(conv2(image, gaussderiv','valid'), gauss,'valid'); | ||
21 | gc = conv2(conv2(image, gaussderiv,'valid'), gauss','valid'); | ||
22 | |||
23 | %gr = conv2(conv2(image, gaussderiv','same'), gauss,'same'); | ||
24 | %gc = conv2(conv2(image, gaussderiv,'same'), gauss','same'); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/hemisphere_s.m b/SD-VBS/common/toolbox/toolbox_basic/affine/hemisphere_s.m new file mode 100755 index 0000000..5300183 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/hemisphere_s.m | |||
@@ -0,0 +1,27 @@ | |||
1 | function [x,y,z] = hemisphere(r) | ||
2 | %HEMISPHERE Generate sphere and transform from spherical coordinates. | ||
3 | % | ||
4 | % [X,Y,Z] = HEMISPHERE(N) generates three (n+1)-by-(n+1) | ||
5 | % matrices so that SURF(X,Y,Z) produces a sphere. | ||
6 | % | ||
7 | % [X,Y,Z] = HEMISPHERE(R,N) generates three (n+1)-by-(n+1) | ||
8 | % matrices so that SURF(X,Y,Z,R) produces a sphere colored by R | ||
9 | % | ||
10 | % [X,Y,Z] = HEMISPHERE(R,THETA,PHI) converts from spherical coordinates | ||
11 | % to cartesian coordinates. | ||
12 | |||
13 | % Modified from | ||
14 | % Clay M. Thompson 4-24-91 | ||
15 | % Copyright (c) 1991-92 by the MathWorks, Inc. | ||
16 | % by Carlo Tomasi | ||
17 | |||
18 | error(nargchk(1,3,nargin)); | ||
19 | |||
20 | n = r; | ||
21 | % 0 <= theta <= 2*pi and 0 <= phi <= pi/2 | ||
22 | [theta,phi] = meshgrid((pi/n/2)*[-n:2:n],(pi/2/n)*[-n:2:n]); | ||
23 | r = ones(n+1,n+1); | ||
24 | |||
25 | x = r .* cos(phi) .* sin(theta); | ||
26 | y = r .* sin(phi); | ||
27 | z = r .* cos(phi) .* cos(theta).*phi.*theta; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/im.m b/SD-VBS/common/toolbox/toolbox_basic/affine/im.m new file mode 100755 index 0000000..6450120 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/im.m | |||
@@ -0,0 +1,3 @@ | |||
1 | function im(I) | ||
2 | |||
3 | imagesc(I);axis('image');drawnow; \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/iter_AD.m b/SD-VBS/common/toolbox/toolbox_basic/affine/iter_AD.m new file mode 100755 index 0000000..50bdae1 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/iter_AD.m | |||
@@ -0,0 +1,26 @@ | |||
1 | function [A,D] = iter_AD(I,J,mask,w,k,num_trans) | ||
2 | % | ||
3 | % function [A,D] = iter_AD(I,J,mask,w,k,num_trans) | ||
4 | % | ||
5 | % find the affine motion A, and displacement D, | ||
6 | % such that difference between I(Ax-D) and J(x) is minimized. | ||
7 | % If k <= num_trans, only translation is computed. This is useful | ||
8 | % in practice, when translation is relative large. | ||
9 | % | ||
10 | % mask: the weight matrix, | ||
11 | % w: window size for estimating gradiant, use a large value | ||
12 | % when A,D are large. | ||
13 | % | ||
14 | |||
15 | % | ||
16 | % Jianbo Shi | ||
17 | % | ||
18 | |||
19 | |||
20 | if k <= num_trans, | ||
21 | D = find_D(I,J,mask,w); | ||
22 | A = eye(2); | ||
23 | else | ||
24 | [A,D] = find_AD(I,J,mask,w); | ||
25 | end | ||
26 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/m_interp4.m b/SD-VBS/common/toolbox/toolbox_basic/affine/m_interp4.m new file mode 100755 index 0000000..314f140 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/m_interp4.m | |||
@@ -0,0 +1,49 @@ | |||
1 | function [F,mask] = m_interp4(z,s,t) | ||
2 | %INTERP4 2-D bilinear data interpolation. | ||
3 | % ZI = INTERP4(Z,XI,YI) assumes X = 1:N and Y = 1:M, where | ||
4 | % [M,N] = SIZE(Z). | ||
5 | % | ||
6 | % Copyright (c) 1984-93 by The MathWorks, Inc. | ||
7 | % Clay M. Thompson 4-26-91, revised 7-3-91, 3-22-93 by CMT. | ||
8 | % | ||
9 | % modified to | ||
10 | |||
11 | |||
12 | [nrows,ncols] = size(z); | ||
13 | |||
14 | |||
15 | if any(size(z)<[3 3]), error('Z must be at least 3-by-3.'); end | ||
16 | if size(s)~=size(t), error('XI and YI must be the same size.'); end | ||
17 | |||
18 | % Check for out of range values of s and set to 1 | ||
19 | sout = find((s<1)|(s>ncols)); | ||
20 | if length(sout)>0, s(sout) = ones(size(sout)); end | ||
21 | |||
22 | % Check for out of range values of t and set to 1 | ||
23 | tout = find((t<1)|(t>nrows)); | ||
24 | if length(tout)>0, t(tout) = ones(size(tout)); end | ||
25 | |||
26 | % Matrix element indexing | ||
27 | ndx = floor(t)+floor(s-1)*nrows; | ||
28 | |||
29 | % Compute intepolation parameters, check for boundary value. | ||
30 | d = find(s==ncols); | ||
31 | s(:) = (s - floor(s)); | ||
32 | if length(d)>0, s(d) = s(d)+1; ndx(d) = ndx(d)-nrows; end | ||
33 | |||
34 | % Compute intepolation parameters, check for boundary value. | ||
35 | d = find(t==nrows); | ||
36 | t(:) = (t - floor(t)); | ||
37 | if length(d)>0, t(d) = t(d)+1; ndx(d) = ndx(d)-1; end | ||
38 | d = []; | ||
39 | |||
40 | % Now interpolate, reuse u and v to save memory. | ||
41 | F = ( z(ndx).*(1-t) + z(ndx+1).*t ).*(1-s) + ... | ||
42 | ( z(ndx+nrows).*(1-t) + z(ndx+(nrows+1)).*t ).*s; | ||
43 | |||
44 | mask = ones(size(z)); | ||
45 | |||
46 | % Now set out of range values to zeros. | ||
47 | if length(sout)>0, F(sout) = zeros(size(sout));mask(sout)=zeros(size(sout));end | ||
48 | if length(tout)>0, F(tout) = zeros(size(tout));mask(tout)=zeros(size(tout));end | ||
49 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/norm_inten.m b/SD-VBS/common/toolbox/toolbox_basic/affine/norm_inten.m new file mode 100755 index 0000000..8e8865b --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/norm_inten.m | |||
@@ -0,0 +1,11 @@ | |||
1 | function I = norm_inten(J) | ||
2 | % | ||
3 | % I = norm_inten(J) | ||
4 | % | ||
5 | % normalize image intensity to the range of 0.0-1.0 | ||
6 | % | ||
7 | |||
8 | max_J = max(max(J)); | ||
9 | min_J = min(min(J)); | ||
10 | |||
11 | I = (J-min_J)/(max_J-min_J); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/pan.0.pgm b/SD-VBS/common/toolbox/toolbox_basic/affine/pan.0.pgm new file mode 100755 index 0000000..2e7b5f6 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/pan.0.pgm | |||
@@ -0,0 +1,53 @@ | |||
1 | P5 | ||
2 | # CREATOR: XV Version 3.10a Rev: 12/29/94 | ||
3 | 128 96 | ||
4 | 255 | ||
5 | qquvvvvwzyz{}~€‚‚‚ƒ„††…†‡ˆˆŠŠŽŒŽ‘’“•–”–——›œž ¡ ©¤¢£¥¥¥¥§¥§©««¬°±²²¶¶µ´³²´³³¶¹»ÀÀ¿ÁÃÄÂÄÄÃÄÃÅÆÊÇÆÆÅÊÉÈÊÏÞËÄÃÄÂÂÃÃÀÁ»qrrsvxwxyzzz{{|~~€‚ƒƒ…………†‡†‡ˆ‰ŠŒŽŽŽ‘’’“”•–•“•˜™šœœŸŸŸ¡¡Ÿª°¥¤¦§¥©«ªªª«¬®°³´¶¶¹·¶··¸¸¹¹º½½¾¿»¼¿ÀÀÂÂÃÈÇÈÊËÉÈÊÊËÎÍÉØ×ÈÆÄÄÃÅÅÃÂÃÀtuwuruzzyzz{}}}‚„„„†‡‡‰‰‰‰‹‹‘”’’““•—–˜——™š›žžŸŸ¡¤¥¦¤¦·¬§¨©ª¬ª¬¯¯²³³¶·¹¹¹½¼½½¼¼¼¾¿ÀÁÃÃÁÄÄÃÆÇÇÈÉÊÉÉÊÊÎÍËËÌËÍÞÌÂÄÂÂÃÅÅÃÁÃÂtvwxyxwwz{{z|{|}‚„„…‡ˆˆ‰‰Š‹‹Œ‘‘’“•—˜˜™™š›œžžž ¢¢¡¢£¢±º¬©ªª«¬®®®°³´µ¸¹¹¹»¿¾¾½¾¾¾½¿¿ÂÂÁÀÀ¿¿¿ÂÆÈËÎÒÔÖ×ÖÔÓÐÎÎÎßâÒÕØÜááááàÜÙÕtvwwyz{ywz}}‚‚ƒ†‰‰ˆˆ‡‡ˆŒ‘“”’“–—˜™š™šš›œœ›œžœœž Ÿ š ´œ•™š¡¥¨¬®®®ª©ªª¬ª¨¦¥¢ÇÕÃÄÅÅÅÇÅÅÅÂÅÆÇÇÊËËÍÊÍÐÐÑÐÑâÖÓÓÔÖ×Ô×ÖÖ××Ðm„zuuvvvurvuwxz{{{}€ƒ„ƒ„††‡‰Šˆ‰ŠŒŽ“•™šœœ›œžž¡¢££¤¤¦¦©¨§¨§µ³¢¦ª®±³®¢žžžŸŸŸŸ ¤§©©ªª§ËÚÁÁÀÂÅÄÅÇÆÇËÍÎÏÐÏÍÏÑÒÔ×ÙÙãèÝÛÜÝÜÛÛÝÚØÙØÓBUw…xz}~}~{{€€‚„„ƒ…‡†ˆ‡Š‹‹Ž‘“”““•—˜˜š›Ÿ¡ Ÿ¢¤¦¦§¦ªª«®®±Á®±³µ°¡šš™š™™›¡¥§¨©«¥ÃàÈÇÊÎÍËÎÐÑÒÔÖÖÕØÖÖÚÞàáãâáîéâæåçéåâÞàâààÝGcZW„}}~}~ƒƒ„…„†‰‰‰‹‹‹‘‘’’’“••–—˜œŸŸžŸ ¡££¥¨§§ªª«®°°°¯ÅÀ¨³·µ 𡢡 ŸŸ ¤ª«¯¨ÄèÑÏÑÓÔרØ×ÛßÞßââãæéêêêêéíòéëììîíëíîïïííêGeoxae“~€‚‚ƒ~„ˆ‡‰‰ˆ‰‰‹Š’“”—šššœ ¡¢¡¡£¥¦¦¦¨¬®¯®¯°²²²²³´»Î·°¸¹µ¥ œš›œœž¢¦ª¬®®²¸²ÇëØ×××ÝàáåæéêìëïîìïîðððóóöôðñóôóôôööõõóòîFakswvey‚ƒ„……„€ƒˆ‰Š‹‹ŒŒ‘‘’”•–˜˜™š›Ÿ ¢£¥¨©ª¬¬¬®°°³´µ¹ºº½¾ÁÁ¿ÊÓº¿Ã¹±«¥§±²±®©©±´²³´±ËñáßáãæèìðòõõõöøùøõîæßØÏÓõðïñóõ÷ùõôöîëççïIbjnpu|x_‹Ž„††‡‰ˆ„‰Ž‘‘’”–———›œž ¢¤¥§ª©ª¬®¯°²¯®³´µ³²´¸º¼¿ÅÎâ¡nbb_eq†¦Â¿Ìå÷ýýýýýüüüüýýýýþþþþþþþþýýýýüüüüçæ¼®ã–½øúú§>¸áq±}̶Gbjkloqw|pn‹rcbbehq…‡ˆ‰‹Ž‘’”•–ššœžŸ¢¤¦©ª«®°¥Œ› “ »ÂÄÅÅÆÊÍÏÓ×ÙÜç«Õûúúü÷‹.ÃýýýýýýýüüøíüýÚÞîØüÝÈþþ«¨î–Ù»“ô臞‰fšb€’Žf0^xF_VYqH^ehkoopqy€f†ðþþþûä‹|”–˜–‹“¢£ ŸŸŸ¢¤§¨ª¬²±°°x;33>AV¨ËÐÒ×ÞáÌÆçñúã•ÄyÂýýýÉi5!q¸¬ŽcMi<2<3WWB=XFoZMqeHNtMdfV„wNi…v\uat}ˆŽc*dHY]ZtG]aced`C233++%)(*59:@7B>F>FEA=<\g^gb\^Ya][\PD83.2<Fgua?>X_=Hj?42)Wh3%GkgpD8€…€xb`vJQjFktVR|LvtTytLU{OdoU…}N]‡sSwZl‚Š‘[+e€IVYRqI[^___W?519+&'112>;9G<@;E8BG<:5V[FYYLPIHHMA4=A83:PMd{m@BdmUOi?$ByC!'Q_pS$l„‚|hSrJMqG^ugp‡Os~Rq|QRN\wM}€SYŒyQuPe‡’X#_€NQ_RpFX\]^YK512:)&(032>?9B=E:G7AJ@B;W\GRWHOHEJIB5>C@:4NQ^xp<5[njF€lJ, %pIQk]L*&X€w{qReNBnIGe’Ô¨Yj‡KayPR€XQ€Qu‚XQOtUb‰Ž”^%[QPcRoGUY]YNC445=)%+.01?98EAG=E6>H@B<S\KPY?LFKOKG9GA8>7BFRwvN\r>itK2WRJmRZ9(AepvPZ[BpVCf‡Î¨U]ŠN[zSKgU‡Pj‰bJ‘QpX\‹Ž”d%U…VPhNmFUYYTG>26;?*'+247><;HCM@I7<LCE:T[JKWAJJMVJMAGB394<GLny]#HpGY‡Y:!Eh-(ekhG'2zli{_UkBgfAXl³§YLˆWP~cO€qQ‚T_rM…†TlaZŒŽ”m'LƒYMiMrGVYVNC?368@.)+123?<9JEL@K;;K?D;QXNL\FOTQYOVKB@3:26FHg}o/ | ||
6 | 3oXKŒrJ*4r=UzhI'-%lzp|mWtF[n<GZŸžhIbO„nVSx]X~MŽUgkZŽŽ“u,H†^MoPqHTTPH?</4<?*),.+2><<I>J@H:;JAF>O[SM_PR]XVLSJ8>8565BD_v>)hiEwU-"lLGpcaHA$U~o~wRjLJrCCZ†ŒuDtsF}yPq„SmlT…MsY`tZŒŽ“~2CƒeMrRqIRSMGMXPF>A.**0.<C>APIR>L?9K;DEQ]XP`VS]\[OML5?C8?7BDX|~R[sBm‚_7[_"=cqfj_W;Is|~T\[HvRCa^DxGj…HqPg…W\yX‰ŠSe”e^ZŠ•„9@„kLrPmGOOIM[\MC>@+(*-,7>;<MDM=G<7G>GAJYUU_ZU^ZOKGP?IH2?5>GRu€e&KuK]”gH#DoNXhj]FE]jb|rvZRmIp_?fbCxV[‘NdƒQ\…[U…Qy‹W`”o[Š\‚‘”ˆA<qNvPmHOKFM[\NB>?)(,,+>BBDSHP@FA8ICG@F\WV]bS_\KLISOED2:4:FNpˆt85teTœhQ+*ENWOG6*+;PVm|x…kPpK`pVp–zuoZ–YW…_Z‹hP…PmŽ`[•{[“\}‘—ŽL;~wSvQiFIHDLXVJ@<>(''+)7AEESGO<GE;HBG@B_a[^^RTURVNWUGC3789KNh„}F*lxM‚zV3)7/5FHD:*"7JKTy~†yOiKQn69.bƒR„hR‡oW‡uT†Ve“m[–ˆ^‹]s‘–‘Q3t|PuRdDFECJTM?3 | ||
7 | |||
8 | ")+8ABBSFN=FD8HFHFB`a]^UONRRYRWVH=:787AA_‚ƒ`!aMd‘gN,!*5?>4*))(ATq~†„Q[VIt<6:RTq}U‚VV|a^˜x]^af‘–“V+nOoS]EFEELOB/&5?ABREK=CI;KLIH=b_\YVPMT[cZVVGDA4<6>BT}‡m+N|\[šf/"$');GGC7,%2W]l€ƒ^UhHk:+DE‡Z`ŽWw†Tr‡Vmn]˜ƒXŠ”byeb”•–\%h†QlV]GGHDJL;+.%%1'1-!<?BRIH>?L@GMIN@\aYTVVQWgaWPMKIC1:6<ES}|><€pY‚;%%"&/BPF<>9* ,NUVzƒmV{GW5 #FBuhZUj‹\c‹XiX“‹W}•epmc–•—c(^†Pf[[EEFDJH4$&(COEZsW.<CCNEFEAN?FQHM?Z_UTSZYc_`^QVTNI3726BKo‹ƒO+t}O<*-,2<@=71-*($%9GJn„}XlKD2";Dc}X‹^]‹b\ˆ^]ŒZˆUv—ijwd••˜k'XˆTbaXDDECJD+3N<.Av‚h:8B?NIDE>Q=GQDR:V]U^]`_`\^[M]VOI8868CIfˆ‰_!a‚_.')/3:1-35.+)#,DPFcƒƒbdY:1,;M[ŠXv\m\‹k[”\~•Wo˜pg‚a“–s(TŠUafUBCGBF:&&""$.ReV4 8A?NHDJ>O>DPISAP][dcb[ZSZfX`QBH?37/AD\„u0F~T.31./:?:'9DBGJW}…dVj@5"3@XXŒWo„^Ž}_…xY[n™bjžyjŒdŽ”—|+RŠ[ZlWDFGDA3+,!12'6FDIKJO>RBGUMUCQdcjfaWWT^gZXYFHK291<FW}’‚D6sC%8LPFFpmM,39j†t]qH'1LfT_d–\„_ŒY~egœlh¤gf‘”„4Q‡a[s[CDECB.'+-3'7EFLNKR?QDGRDMDJadh[UVY_ecUMXPTM18*2FQwˆU+^..?Xga\o„d4+8i„~aoN$RvUpsaœasŠ\qŽ^wmcŸzj¥Ši’g‡”–Œ>K‰hZuWHGDDE.# | ||
9 | !"9HGJOLUCPEHRKMFJaf`XW^_e`^aUa^KI5:.,FLkd$I#:WRQXXiy|wz‹s;1/]ƒaf]%! DuZg…\˜g`ŒWhŒ_i}e™‚c¡Žje|—˜’EDiXzVEGFDC1-)%0ZdH')3;=HGEMKVBQJJTJNHHfc`WOjg_X]dXabOK674+EId‹p6+!Njv„†„}}‚›v>-"S~ƒvŠ‚zˆ{šc…sbŽb`ˆfd„g˜a“o‹hx–••XA€s\[GFFFC/44,-ZkL+*0=AGFCILUHQLJPAMHA^ZX[OkcVXdfYX]LLA3:1>K^‡“„C $Tgmt{vuz{}‡”–|>%R|ž¦¦©¨«¯²©pn‚hŠs^ˆqb‰m‹’Zz”kfr–“”]<vw[}_EGIJSK>AOUaga^bcehnppprvvvtw{xz{x~€ƒƒ„‚„‡‡‡‰‰‡ŠŠŠ‹Œ‘”šœ˜’v)+UL>516HZU?8?QhsE!cª¯°®¯®¯°²±²²²´³´´³³³´µ³²µ³´µ±°±¯±°¯¯®®««¬«ªFFIL[bcfjlnoqruwyyz|~~}}„€€€€€€„……ƒƒƒƒ„………„‚ƒƒ‚ƒ„ƒ‚‚‚€‚zE:\?+)69:“|=.0BTx^28^nmkijiiijfffdbcb`aa`_]^^``_\\\\]^`__a`b`bdb_GHJM[XPNOQTTVVWYZZ[[\\^]]^_`aabbbbbbcdfgfggghikllmoppqqrqqrrsrB>eSLIE:[²˜C<LahjDZ~‡Š‹‹ŒŽŽ‘‘‘’’“”“”••——––———˜˜™˜˜˜˜˜˜—–•IJKK_kmmoqrsuwyz}~‚ƒ‚„†ˆˆ‰ˆ‰Œ‹‹ŒŒ’’‘’““”••—™›š››œ›ššžW.Ex†wft‹ £„aq‰œœg8Xž©¨«ª¬¬®®¯¬«««¬®®®¬«««ªª¬ª««ª©ªª©©ª¨¨¦¥¢HHJKZddcfhkmopttvxyz}~}}~‚‚ƒ‚„†……†‡‡ˆˆ‡ŠŠŠŠŠŠŠŒŒŒŒŒŠŠŠ‹Œs@;kž˜ŸŸ‰¥±®¬¢´·bNp‰‰‰‰ˆ‡††††…†„„ƒ€~}{zxwwwttrrppmmihhfdb`_][VIKMLI5 | ||
10 | |||
11 | |||
12 | |||
13 | |||
14 | |||
15 | |||
16 | |||
17 | |||
18 | 5H]vˆŸ§˜‚‹Ž´¸®¢‰bW* #$$&&%'&%$&'%$##&$$$#$$$##$$#!##$"IIIHG=* | ||
19 | |||
20 | (KUf~•žv1GCV¨´§—ƒvN$!-01* ! ! ! ILLJLE2 | ||
21 | |||
22 | |||
23 | |||
24 | |||
25 | |||
26 | |||
27 | ;R]qŠ–vHE`…¨¨™ŠsF'&0/!=?B' JJLJGB8(3>2,94>BB.7AB11<'' | ||
28 | "5$EXg€‘Œ~p€š©¤•ˆ|W5((..!!%GHN) <YT:EBMXS\jcIM\kfKJJJIE?)5B42@;FKH3@IG9;D | ||
29 | |||
30 | #nf$!" | ||
31 | ;Xfx€’µš˜š‘†|yr:T¤‰47A3,MSQ* $2 TigRMHYc]]ieMLbonIKLLIGB4DR;;HAVXY9M]^CN^' | ||
32 | "^Z%!"<iTIªœ<h–G:’œ™W7YcmZ<).+1LtŠ„{€‚=F†€Cy—o6…šs' Bk*B]RSKSr|qWSRhxqnvq\et€ƒLKJJKGE:VeCK\TkokBcruL[q/ | ||
33 | |||
34 | *m`%06$?hRJ§žBn—EQÃÈÈ΂0W`adw•–¥¡‡„otp5RŠt9^X7£Ê‡jßïÙæ1@1;QOQP`Š“|`d`„™‹ƒ“‰xŠž‘JLMLIHG;YoJUg]t}pEn}~L^o(*n[,PdC M©™?q—DT½ÄÄÌ!EY\bYQZ^hy}|wcql3T“u.5ªÏ_¾Õ¨º¿×€/C5LPTXNi‘—‰qpoš£ŒŽ•Šˆš¨ŽIKMKKIG<\rGZg^zmDpz~Mcn% | ||
35 | /td0g|K O¬—<xœBYÅÉÈÊ{?UXWL<4C_v{yyixo1\—w.;¯ÏzX º®È½áz>5*U{`<S“”€qs{¦ ‹’ІŒš¬ˆJLMNNKG>_uH\h_xfDt|~Ngk! /t_$$&T¬’={ž@^ÇÈÊËz @U\iux†’’‚xzx—s3Z”s-AµËyj«´ÄÁÛvO@2RRIQMx™“xst¢ž–Œ‚¦¬~KNNNOO_WesG_jbx‚fHw}Nnj | ||
36 | 5|]$##Z²’?—?bËÊÎÍpQdPY`inr}‡„|u}e¨š7V”u%OÀÏvl§¶¿»Ëz8HwgMeZƒ˜•xvr„£›•£¥•Œ¤¢rLNNNVgjYgvKegcy„gJx}~Qsi !#3_O#>EL™¥§\cOONWWRT]kqkozdÀ¯:1><"2LTSq«·¹ÐÙÀgM=FNHFIUŽ£‘qrq‰¥œ‘ œ–Ž–£œpOPRRdmkXfuQjhg~ˆjLzPxf | ||
37 | |||
38 | |||
39 | #&!]½mOKIOY_badin\‚ùø¨G:6$<WZ_y• ¿ԵH^\EKEAA[“¦‘rrsš±˜“£™•”›¦›oMMPTellUewWqfa€‰lLz€~S|b | ||
40 | "$5—ÆÁŸOMMJFMXafdVlãùûûöÃs1#">WZb§ÇÇܬNRJDKB>Bg›¨qvv•–˜« •—œ¥oMNQVgolUiv[sdc€‰qN}ƒ€S|b | ||
41 | |||
42 | %%Ÿôêۼ׎GOPMKQ\\SSÖøùûûûûûû¸=&FX[f€¦ÍÉá¶\<R^MVL?s¤¬rwwŸ®”žªœ–©§‡pMOPWhnmNez]we_€ŠtO|‚|Zƒ^ | ||
43 | |||
44 | $%J×ÚÛôè»ÄàwHMMLNOHZ«óøúûûùöûûûý¾l\]o•¡×çíˆ>KWZOUOF|ª‰uzz£”¡¨›™œ¥¨~tMPRXjqlJb|e{eby†zV~„|[†\ | ||
45 | |||
46 | !$' ÷ôãäóòص»¢nILJG;q¦Vªöüüüû÷úûûúúúÉfqœ²kCY‚aDGZbOVWQ“²©†zƒ¬°˜©¦ž›¡ª§wzKMPXinkC[}awhbˆ|Y‡|\‡Z | ||
47 | $%>¬ôüüôèæôõë·—\{€S@F‡•b„å÷üüüûôõûûúúúúûç¾¥lY\Z<=5czK^nb³¥{}†©–®§Ÿ¢§ t{KMQXjojFW€fyqf„Œ…`‡|_ŽY | ||
48 | '&KåôøüüüôêçôöôØžh]j<w¤‰v¾ïýüüüüùùûûúúúúûûûû°SPO5>7PŠwO|w©¸¤~€‚´ª˜¬ª¢¡¨›pzLNOZloh>N‚csyh††[|‰}aY %&NÐýûùüüüüôîìôööï·œˆexh´òú¿Îüýüüüûøùûûúúù÷úûûûôôôºG?5Lp^;^zµ·˜s€~•À« µ³©««‘qwLMOZloh>F…cpƒm†’c~‹€b”_ '%8Ìûøøöõ÷÷÷÷÷ïï÷õõõ鼸ª—åúìãÊ÷úüüüüùùúúýýýóóûûûýýý§9><Sa`FZž¾¿˜sƒ¤Ë¨¨¶´±¬¬¶ŽvnLNPYmpi@AƒjhŒl‘’]{‡^j | ||
49 | $%6Ðûûøø÷óö÷÷÷÷ðï÷õõõõéÒßàãííúöìóúüüüûõöúúýýüòõûûûýúø±RJTXOFKEˆÁÁ‘w…‚«Ñ±«º³±®°´„}qIMNYknhG>~p^”k}—žbz‘’\ˆw! | ||
50 | )' Ÿûûûøøóð÷÷÷÷÷óîõõõõõåÖñòýýýýõéôúüüüûöøúúýýüòôûûúûúúÈxŒf\WVIH”ÅÇŒz…|²Ï´´¿º²«²³{…kMOOZoqhE9~`pwšžbv’•a€|* | ||
51 | ()aÚäêûøøóðö÷÷÷÷óïõõõõõïÙîøýýýýøõ÷úüüüû÷÷úúýýõçóûúøýøú÷Ã`‰µ“›´£ÂÊ|„³É°¸Ã½µ°´¬q‚bNNP^ppiC0{a„yu¡jq“™l…4 % | ||
52 | "*(ÙÚØñùùöõöööö÷ôòöööööêÜîõúúúúùö÷ùûûûûøøûûüüùëñøóñýêòûÕgaG]uVÁ¸‚‚‡‹ÀźÇù¶º¦q‚SMNQ^qohI&jYfˆu•œqd“—szˆ6 | ||
53 | ! !)+ >ÌïáÒßùù÷òôööö÷ôóöööööïçïôúúúúøõ÷ùûûûû÷÷ûûüüûêñøîïýòîöÑS‡Å_˜¨s¾Â²{†ŠÁ¿£¼ÈÁ¸µ´–p~JMMO_wwpcVapXWkWr{OKƒ‘fpk' $!#..!^ÄóáÈÙùùùóóööö÷õñõööööòëðõúúúúøö÷ùûûûûøøûûüüûðôøíñýðèñáef}rWh„ÅÂ¥x†„’¸¤ÅÅ¿¸·²‘x{DKOQbrrtwy|€„ˆ‹’“–——™œ¡¤¥¨ª«ª«ª©¨§¨¨¥£¡£¡žš”¥»ìéÂÑøù÷ìîööö÷ôðôööööôïïî÷úúúôñ÷ùûûûû÷÷ûûüü÷ëóøööýûáßû„GNBF7s»±‰gkwšÅ¨Â¼·´¥†s?MPRYF997:<><>>><<;;:<<?@BCGKQTV[_bhmuz…‰¥ÊÅáÚ¸Ëøøõëñ÷÷÷÷òíöööööõëè×ðùùùôð÷øúúúùóöûûûûùîóøðòýýÖÎýîÔÖÖÕ×ÕÕÕÙÛÛÙÙÙÙÖÕÖÖÕØÚÛÚÜÚLNR_jkhilmmoqtttuuvussrpoommlkjigedbba^\ZXXUCҿȸÏÂóøöïñ÷÷÷÷óåðööööôéåÕóùùùôðöøúúúúøøûûûûúëò÷îóýüÚØýë—€€ƒƒ„††‡ˆ‰‹Œ‘’‘’““”•——LLQbrsuvy{}‚†‰ŠŽ‘’“”••–˜˜™šž žžž ¡¤¤¢¥§¥§§˜Ì×ÁÇ´íÃîøòçóöö÷÷öäîööööõéêâùùùùòòøøúúúúùùûûûûûîòøéðýüßåýüµz{ywvvtstuqpqponmlkkjljigHMMH2 "%*,17;>AEINS[aflqtx}v¹Í½ÉÄÖÅìøõéï÷÷÷÷ôäïööööõéãìøøøùíî÷øúúúúùúûûûûûù÷ôÁãú÷ÙåýýëÌÈÈÈÇÇÆÇÇÆÆÅÄÃÁÁÀ¾½¾»º¸¸¶ILLMB$ LÒâÎØÝÔ²æøøíî÷÷÷õòæî÷÷÷÷öïàòøøøøëéøøúúú÷÷ûûû÷÷÷÷ûôºåðåØñýý÷žƒƒˆ‹”˜žŸ£¦ª®°³´·¹»½¿Á¿IKKJD- TÐæÕÐä×¶Ù÷÷êé÷÷÷õóæë÷÷÷÷öðäîøøøøéå÷øúúúôóùûû÷÷÷÷úùÜçßÖÑ÷ýýý“#&$# ! ! !!JKLIF7 PÐóèÎßÓ»Ööøîî÷÷÷õõêç÷÷÷÷öïàîøøøøòîøøúúúòíùûû÷÷÷òùòÎÕÕÔàýýýýÎC&$#" !""!"""!"#"%$EJLHC;' ]ÔöñÔÚñÖõøñð÷÷÷õõéç÷÷÷÷öíÝðøøø÷îìøøúúúðç÷ûû÷÷õéïðÙÈÍÖáüýýýõw%&%##"!#"!"#"#""""#$$&'IJIHF?.uÚùôÜØÂ›Çôøòíöøøõõëæ÷÷÷÷øîÌéøøø÷íð÷÷úúúïÝöýýúú÷ìòàľÒÜàöüüüü¨2)&$"#$#!"""#"#&%%&)(()HJKGDA7$ &‹ØùöâÖÆ¯ÅñøóæôøøõõçÞõ÷÷÷÷êÞöøøøöëñ÷÷úúúïÞóøýúúôÞïß²«Óß×èüüüüâW,(%%%$"#$####$&&()(+.0GHJJHB=,@¯áùøé×À¥¸êøóéôøøõóåÅë÷÷ôðæÜóøøøöéï÷÷úúúèÙ÷ýýúúõàò衤Üèßäüüüüú‡$('''%%&''&%&&'(),*,/2FGFGEB?2 [ÌëùùïÔ¯œ¤Üòñçôøøòïã¿ßóòìßÝòøøøøòåñ÷÷øöö×âýýýúúñßôâÖðêàúüüüúÀ9-))('%'''&&((+---.022GHHGFB?7& oÜóøùíϦœ—ÍëïêöøöóïÛ»ÛïðæÛäöøùùùõåóûûüüûæíùùùûûèÑéÊ™©ÔöóÖêûûûüîn+++(()'&%&'*+--.04333FFFGFB?9*~Ýó÷ùó×§¤œÂÙáØòøõðëÖ·ÑëçÞßðö÷ùùùôäöûûüûéÈçùùùûùÔ×õ§°ËùñØêûûûüüŸ.-+*((')()+,-./013444FGJIGDA;0 "—âùùùõݵ±£ÁÖÑÎóøöïêâÃËæÞÕäñóôùùùïÞ÷ûûüûêÐëùùùûùäîð³·½ÚùùÜãûûûüüÛS5/++,+++-/./10362251DGGGEB@<4& B»ñ÷óôõÒ°³¢¹ËÊ´àøôâÔÖÁÆáââðêðòøùùïÛ÷ûûüüïÜóùùùùóØîâ¡¶ÛõùùíÛóûûüüü…)-.,,+*,.00122244444FFEEDA@=8- _Öôôíëôླྀ£´À±ÇÞÖÍÏÒźÔÜêóáìòùùùïÖòøøüüìëûûûúøèØõÑ›´à÷ùúõÞêúúûûû¹60,,-.../0334555553/BBDDCB?;6." yÐéèæÞÝìܵ›°À̹ÀÚÞÔÊÒǹÑàïðâîñòñ÷íÙõøøüüíéúûúúúçÛøÄ‘µæöùùöàáøúûûûîn-.-/../112333335421EDDEB@?<80%6–á÷÷÷öèÃÓÑ•¨¸ÆÂÀÚÏÈÈÑIJÌäòíÛëóùùùíÚôøøüøàãûûûú÷ÔÙú¿Œ¶èøúúúèÌéúûûûû¥6.,/121134464543244ADECAA?<93'N—Ñö÷÷÷øëÖⲫ½ÈĹÒÓÍÐØÌ¬ÉëôçØîò÷õöÜÐôøøüôÓâúúúùïÓãô¸‰©ÑôùúúïÙìúûùùûßZ20012/233121132122@?B@A?A=:4+!d‡†ÏÍ·¼¼œ¥½®¬ÂÌȵÈÒО¿¨ÁæòãÕïñö÷÷ãÃñøøüöÑåùûöôïÜìö°˜¹ñøðíñæàýýýýû™/44314442034532441BABBCB@><82& ‚ÆÞô÷õÑ™”˜†˜³ÂĬ´³›‘Ÿ««¾ëòáÏßðòò÷îËîøøüøÔàø÷ðøîÝíö¤}Ÿ°äêæçîõòûýýýýúÐQ84443444222333121>@CDDCB?<93(DÀúÝ÷÷÷ùúÝŠb‚¯¬™‹“§n‚ž®ÃìòáÓêð÷÷öíËáøøüüÝäüüûûöàìç€t¡¸¼áúúýúìöýýýýû÷…88432421255422122=>@AABA@<94+"nݱ³Ùô÷캙”™vkwwy„œ¯¢yWp’¥ÐòÜÍéò÷÷õçÈØôøüøæîñìêéæÍæævp›±òúúúýý÷öüýð½‹U973222122233220252@AABCB@><97.#(®rH 9ltvpmb\ZZr™³¢T !&¡ËÊñòìô÷ïÎÓïöýîÞíåàëìçÊëÞnkœ¥ÖúúúûÝs2.BS@78423322312311221/11>@ABABA=<;72'(0&;_ggea\SQU]i™¯žSˆÆÌÝæôõõíÎÏëöýùè÷üûúûöâñÖfl–¡ÆÅV7@CDK<3443223322334443233110=>CCBBAB@<94)! ""!!"""##%"#&'!(AW^_``\XY^XWb‚Ÿ“P%¤µÈñøöøøðÐÍáôýýýýüüûùôæñÒxmŒ—€Z8:>FNI:899:7878557677766777554>?@BABB@?<95. !!"""##$%%##$%%&((''(-5@LSWYXVTRKDI^`hz`5*, /“©´øüøøøóÑÑßðüýüüüüüøíÛîÎuaƒ‹X=;=DOYI889:9::999879::999:98886 \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/pan.1.pgm b/SD-VBS/common/toolbox/toolbox_basic/affine/pan.1.pgm new file mode 100755 index 0000000..9d57f70 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/pan.1.pgm | |||
@@ -0,0 +1,59 @@ | |||
1 | P5 | ||
2 | # CREATOR: XV Version 3.10a Rev: 12/29/94 | ||
3 | 128 96 | ||
4 | 255 | ||
5 | prsrxxwxz{{||||}~~‚‚‚„ƒ„…ˆ‡‰‰‰ŠŠŠ‹‘’’’””–™ššœžœœžž¡ «§££¤¦¦§¨¨§¨««¬¬«¯°±³µ·µ³´´µ´·¸¹¼¿¾¿ÂÅÄÄÄÄÂÂÃÃÄÉÈÇÆÆÈÊÈÈÌØÅ¿Ã¿À¿¾¸prsttuyxyyz{|{{|~ƒƒƒ„†…††‡‡‰‰Š‰ŒŽŽ‘‘’“’“””“—ššš›žŸŸ¡¢¢Ÿ«®£¤¤§§¨©««¬®¯°°°µ·¹¸·¸¸¹¸¶º»½¾¾¿»¼¾¿ÀÀÂÄÇÇÇÊËËÉÊÊÊÌÌÉרÇÅÂÁÀÂÁÀ¼tuuuwwvwyxzz{|}€€ƒ‚„†‡ˆˆŠ‹‹ŒŽŒ’’’”•–•˜”•š›™šŸž¢££¤£¦·ª¨©©ªªª¬®°²²±³¶¹¹¹¾½½¿¼¼¼ÀÃÂÂÂÁÃÃÆÄÄÅÆÇÊÉÆÇÊÈËÍÌËÊÊÆÚÊÀÀ¿¿¾ÁÀ¿¼tuwwxxzyy{{{{||}~ƒ†…„†‡ˆ‰ŠŠŒŽŽ‘““••”•–—˜™šœœžŸŸŸ ¢£££¥¡°¹¬ª«ª¬®®¯±³µµ···º¼¾¾¿½¼½¾¿¿¿ÃÁÁÀ¿À¿ÁÄÇËÍÓÖÖ×ÖÕÔÒÑÑÑÏÞäÕÖÖÙÛØÕÓÒËuvuwyyz{~{z~~~€€‚ƒ……†ˆ‰‰ˆ‡ŠŠ‹Œ“••—˜˜š›œ›œœœŸŸŸŸ ¡¡¡Ÿ››¡³œ—˜œ¢£¦ª®¯¬¬¬ª¨©«ª©§¦¥¥ÌÕÄÃÁÂÅÉÅÄÆÃÅÇÊÊÍÍÌÎÊÍÎÏÑÑÓâ×ÕÔÓÕ×ÓÔÖÕÏ_`k€{x{{zzywzyz{{{}~~€‚„……†††‡‡‰‰‰ŠŠ‹“•™šœžŸ¡¢££¤¥¦§©¨©ª¦¶µ£§©®³µ®£œœžžŸŸŸ¡£¦©¨«¬ªÎÚÁÂÁÂÅÅÇÈÈÇËÍÏÏÐÍÍÑÒÓÕרÙâèÞÜÛÜÜÛÚÚרÕ8:E[‡{|€‚‚}…„ƒ„…‡…‡‰‰‹ŒŒŽŽ’’’””˜˜˜˜š›Ÿ £Ÿ¢¤¨§¨ªªª«¬¾¬®±µµ¯¢™™šš›››œ›Ÿ¤¨¨©¬§ÆâÊÇÌÎÌÊÍÐÒÒÒÕÕÕÕÔÕÛÝáááááïæâäãäåãàßááÛ57@_WY…„€€‚‚€ƒƒ……‡ˆˆˆŠŒŒŒ‘‘’“”•––™šžž ¡¡¢£¥§¨¨ª««¯¯²±Ä¿¨´·´¢š¢¡ ¡ŸžŸ £ª¬°©ÅéÑÏÑÓÓ×ØØØÛÞÞàäããåèèèëéèìóéèééëìêìííîê:9D`ny_i”ƒ€‚ƒ†‚‡‰‡‡‡Š‹Š‰‹ŒŽŽŽ‘’“•–™™™›œž ¡¤¤£¥§¨©©®¯°¯®±³´³³´µ¾Î´¯·¹³®¨ ›žŸžŸ¡¦¬¯°¯´¸°ÈëÖØÙÙßßàèèëìëëïííññðððòîïôòôóôóõöö÷öóí8:B^kryxc}„……††ˆ„†ŠŠ‹ŒŒŽ‘‘’••˜˜˜™š›Ÿ¡£¦§©«¬¬°±³´¶»½½¿¿¿Á¼ÈÑ·¿Â¸°¬§¨¯³³²¯¨ª®±´³´´¯ÇïÜÜßâæéìòôôöøøøøøóìæâÜÒÉ÷õóô÷ø÷÷îëôÝÛÚ8;C[gorv}wb‘…ˆŠŠ‹ˆ†‹Ž‘’“““’”——˜š›žŸ¡£¤¤¦ª«°±²²²´²³·¸·µ¶¹»¹½ÄÊà ned_gxÇÊÙñüýýýüüüüüüüüþþþþýýýýýýýýüüüüûûÕÑÀ®¥ß·øúø¥0çmšt9;D^iloquz~nq’xifdefq€„…ˆŠ‹’“•—˜™›Ÿ¡¢¦§§ª°ª’Ÿ¥—¤½ÂÄÅÆÉËÍÐÓØÙÜç¨Õûûûü÷†1ÅýýýýýüüüüõèûüÚÞíÕûÛÀüýª¦ï‘ͺŒäØx—„^Ž[r‚‡ˆk4\|JSZ87A[gjknqtw{€f”öýýýû䀔–˜”•œŸžž ¢¡£¨¨«°¯°°y962??XªÉÏÑÔÛßÍÇîñúà•ÁvÃøøüÃb0 n® ’WGa7-84Z`HA`Hu_NulKQwIaiTƒxNc‡w]uZm|‡i&[~KQ_8:BZdeffcK5850)%)09::B6BAIAGIEB>]linhbc[e_^aRC71/4=Eera?=Y_=He<30(Wd0$FkenD9„y_]wKQlImuVS|LvvSvrKT{MbqSƒ|R[ŠvSvUb€‰]$\KM`;;CX`cba[A2/41)&2-/=74C<?9G9AE=;5U`BVTDJBDEJB6<A7,4RNc{l?BenWOi?"Bu@#$M[lP'mƒyfWtLNsK`vkv‡St}NmSQ€MZ~Nz}UT‹{OrQcƒ‰b$XRIb:;CU^__\Q:226-%'/03=75C<C:D7@J??8V]DPVBIE@DI@2=A@;5NS^xn;9`lgH‚kH+$lBSi]I((Z~tzpNaQErKGe”Ú¨Wj‡L`wPQ€ZPOpZNŽOqV\ˆŒ’e$QVKl;=EVZ]\RF7559.+)32/:;9C>C8H8?H<?<TYFMY=MFHPLF9FB9?6DHRsuK ]p?lqJ5\UIiNX9'C‚fnuPYZBpWCg‡ÐªUZˆNYyVNjV†Qf‹kK‹ƒNi]YŠŽ”n(I…^Go<=DQYZVLA579<*'+1-4=66E@H=D7;LCE<TZGGU=GJLULL@DA5:4=FLpyZ HqH\‡X:!Fe)$agiG&0yjgz]TlCgfDZk³¥ZK†WM}fQ€tQ€W^tK‚ˆSgeW‹Œ“w.D€aJp>?EUYVQF>7:>A,%(2-6A:;N@KBL:7L?G@UYJ@XEMQP\GTF@@4:58EHh}m/6nXOmG*3q<S{jJ$)&lwqnUvG[n>FU™hJƒcLƒqV|ƒStbW…MzTcoY‹Œ’~3C‚iLq??ESURJA=46<?,)+2,6A<=J?H=H;:J?G=OVMK`NQ]YWIRI8?8875CF`u=)kiGƒqO,"nL*Vn]T)*T~n~xNiLKsDC\ˆŠuErtG|yOm„ShpUއLm’_\{V‡”†::}oLtA@FSSNFFTSFA@+*,.-;=?AOBO:F=6L?IDQ^WN]RP_YTKIJ2@D8<6FFY|zN]vFpƒ^6$^cDSYjlt;0@‚s|T]^GuRBb`FyGh‡Ko}NgƒWV|T„‹Wd—jY‹[€”ŠJ6xsMq@BFQQKL[[QD>A+)*+*7>>>LEL>I?7G<GBL\ZQ_YS\XKHBL;GG3?8@HSw€c$ItP_•hG4RgqgRJ]q{G&%5|rv€[RlHoaAfcBxWZ’OaR[†`V†Pu‹[`—u[ŽZyŽ”J2vzPu=@GNLJN]]QD<>+,,0+<>>ES@KDGC;GBHBF^^X]aP[WEKBRNGC0969GKo„q45teWjJERTOC3,7O_K*#h}{‡oRqJanUi†rwqW—]U„`WkR†Qne[–…Z]sŽ”T1t~PrACEJIFKYWLB>>'#(-*8>>@REM<EF:HBEEC`a\\[MOPMSITPED6847KMhƒ{E+mzO}_53CMKB.#6FKH3+Vƒ€‡{PiJOm69.aƒOjP†oT†xVƒXb•s[”\…]j‘••T)l‚Nl@?DFFDISQG>) | ||
6 | &':=@CSDJ>GH<HFHI@ab\VPJFNMVSVXG<<696AA_…^a~S6(#'3BJ</(*'>UC/ Gˆ~„ƒPZWIr:37Q“SnV}V~Tyf_˜{\”b|ca•”•\&a‚MeACEHGELUF6&6<@BREH;?K<JLII>caYUSNLRX`YWUEDB4;7?EVˆm*O{P'$&)8DIG;.'.S[E'2}„^RiGh:*ED„[^Vt†To‡Tjr\–…V‚•cqj`’“•b"[‡Oa?CHIGELQ?/1) -#+'&7=DTHI==L>GOFO=^\WRPUSYd^PKIHHC062;EP{‹}7 | ||
7 | =S*# (>RG9?9/ @VJ3'j~~ƒmUyGX1!FCujYŽUf†ZaXgƒYŽVz“ffub”•—k'UˆR]ACDEFFKL8'&#@UERnX-9BCNEDC=L=FPFL:X\RRSZYc]]YKPPOI3616CLn‰ƒL".),*-8A@;53/*%$8HH;R„}„~YmLC/#;Ec~YŒa[ˆ`[‰b\ŽY‚Vp˜mgc““—r%RˆWXCCEFHFKG-+OA3;t„n98@@QFEJAS?GRGR:S`W]\_b`W[[P]VNH8845BIf…ˆ`" #&+/40/78/,+%!8NE>#B„„‚^aW;2.9NY‹W~v]q^ˆq^•Ys•^lui‡dŽ–˜{+O†_UACEEFCE>''')',JeZ=!7A<JHFL>Q@EPEP?P^Ycdc]WOXd\cSDG>46.CF[„s4!!,42-.7;8)-<CJKJ26z|~„dXmB5$6CYXŒXn†]‹`…}Z‹]h™igŸ}hg‹”–0K‡eWEFFHHGE7..!%&34$2C>EKEP@THIULTAMbajebUUV`h[XUFIN2;-;FW}‘F%(4HPH=blQ49:1$f}w‡uZrF%.MjX€ee˜^‡^{]hc›ul¥…hf†“•‰?G„lVBDDEHFC1(- | ||
8 | )2%0@DEKHS>SFIUFLCHachZYXW`fbUOYPUO19*2GPu„B'8Od`Ue€l<)51U†zƒ}`qN&QuTpwaœaoŠYm]tr`f¡i’e~”—’EAƒqWEEGIHEG0! | ||
9 | #"6FEHQKTEQDERKMDEae^UR^^d\V[P`^KI3</.GNmŒŠB/LMEMTcu{zv…‘ŽzJ53/Bˆy€ƒ\aY Dw[eŒ]–faVd‹`c‚h˜Š_š‘jŒcy——–J<|tXEFGIIIG3+(%+O`H'(2:>IIFOLU@NIHTKKDCe_ZTMkg\UXcW^^JH6:6+DGbЉ<@es€…††€~‚žŸ“|I0*3.2y}ƒs‡Œ…„|ˆ‚z›a„ue‘eaŠe_ˆh•’`Œ—k„hr–”—]:z}YFEFIIJI323()UkO*(.9AIDBKGOCNJKRCNHA^UT[Jg`WVbdZV[JNA5<0>I\†.Ehpx}yxz{‹™£ž„I'!,$#g~‚z£¦«¬®¬©®¥nl„gŠt[†qcŠh€Yu™fwii””i;oYEGIKLIPI;:GM[c^X[]acgklmmqpoqswuvwt{zy}z€‚†………‡†ˆ‡‰‹Œ’›“BKSG<69G[ZI@EUlwT(I¦±¯¯±²°®®®°±±±¯¯°²´µ¶µµ´³²±±³³±²°°¯¯°¯¯®¬¬ªª§FEFILMYgiikoprvwy}€}‚……†…†„…††…††‡†‡‡ˆ††‡‡‡‰‰‰ˆŠˆ‡‡‡ˆ‰ˆ†…„ƒY-UM2)-88{}B/'8Xsi4(Imnnmnmlhhigeccecb__`a^^\^]\\\]^]]][\^^``bbceebFGGJLLZYOMNOOQRTTSUVYYYZ[[\\^^___^^^`abbcegffffgijiknnnonooqY(2`TGCA=K¦©K9>V_xwHPo…†ˆ‰‰‰‹‹ŽŽŽ“’’““•••———™˜—˜™™˜™š›šš™š›š˜HIJMMN^lqopqrsuwzz}ƒ‚‚„†‰ŒŒŒŽŽ‘’“”””““”–••–˜››œ›œœšn4Ajymeiƒœ¨†`_v“žM@‚¦©©ªªª¬«¬¬®®«¬¯®®®®°°¯¬®®®®ªª©¨©¨©©ªªª©¨§FGHJKKZghgilnoruwwz|}~‚ƒ‚ƒ„………………†‡ˆ‰ˆˆ‰Š‹ŒŽŽŽŽŽŽ~M;aŠ—˜¡¬«šº¨wWj‚ŠŠ‰ˆ‰ˆˆ‡……‚ƒ„ƒ‚€€~}|{yxwvtrpomlkhffebaaa_\[YWTKMMLNMK8" | ||
10 | |||
11 | |||
12 | |||
13 | |||
14 | |||
15 | |||
16 | |||
17 | |||
18 | |||
19 | |||
20 | ,?Qt‰œ§š†˜ž·»´«”taA!!"$&%$&'''&(&'&'(&%%#%$"$$%#!"##"HKKJJKI?+ | ||
21 | |||
22 | |||
23 | |||
24 | ASd|“ ƒ>AGR¡¶®ž‰ve5"++!$" .12,!! "! ! JJLMLLKD5 | ||
25 | |||
26 | |||
27 | |||
28 | 3P\m†•|E?Ww¤®Ÿz¦ƒ*11''1/ =AB) KKNMKKID;%->5-:3:@C.5AC52= (+3 !?Wf{Ž~o{˜©¨™‹²~(00&%-. #$EDN+ 8WX=GCMZTZfdIL]IJLJKKKJA+1D3,@8FKL.9GG64F kj(#$4S`u‚“¿Â£šž”ˆ|œÄx3qq;S¤Š69G6*MQQ( + | ||
29 | NeeRMDRd^]feGG[JJKLONMKE2>S@9LAVXY9H[]CG_) | ||
30 | |||
31 | |||
32 | \[%"$<hSF¨š=j—F:|\bmdJ1005QuŒ…|ŸÀt:ƒ?FˆDz™r6…œu' | ||
33 | <l,=^SUMOq{rXUNdvpmwu^_qKKKKONMJE6JgLEbSmopC]rtORo, | ||
34 | &kb'-4%@gTI¦›:k˜CNÄ©caa[exp„„„´Ås:vq6RŒt8[|Z0ŸË‰gÝò›ªÜé”3A2:QPQU_ˆ•€hd]™‡‘Žy{ƒIKLLNMLJH:QoOOm`s}xFg|NWt- | ||
35 | (l`*QfDK§˜;o˜ES¼¹|[_d_Xccfx€x‡ÁËt;vl2T–x-4ªÑ‚_¾Ö¦·¿×„,D5JOSYQf–ˆrqj˜¤‹‹”‰ˆ”LLJKOLLJH=TsKToc{vFm{€N[r( | ||
36 | +rc.g€NP—<vŸG[ÆÉ™YWUPB9C]pwxv’ÅÆp<yq3Y—w-:ÕY¡¸©É¿å~;6(Nt_<Rz’–€nurŸŠ‹“ŠƒŠ—LLLMNOOKI=XuITk_x€pEo{€Ods% | ||
37 | |||
38 | -tb%&)!T“;{ŸB^ÆÈŸZ[eqr~‰‘…xxo¥Åp=u3X˜u,AµÎye«³ªÄ¾ÞuK=.QQDOKv™“xrv{ŸžŽ•‰†žLLNPRQPO[V\zJWi`{‚qGu|„Rlq" | ||
39 | 3{`$"%Y±“>˜>cÊÃUYbksw‚ŒŠwx_’Þp:{s3O–v-I¿Óvj¥°¾¼Î€z7GuhLc[–˜{ts£Ÿ”¡¤ŽŠ’žJLNNOOUfkW`zL\ia|ƒoHv~Soo #& 5bR$AHM˜¡pMNUXSSZhqlkx^›ër0QK-.<:#2NUQmª´µÏÖÀeO:FMGCHR¥”ssq†¥ŽŸž’Œ–¡PORRRSdnmYb|Naj_}†rJx„Tsj | ||
40 | $% ˆyFLIQY]dhbgnvlÚú±=77*,43$8UZ\lŽ”½¼Ï¸IY\DNHBF\”¥oop’³š‘ š–“— MOOOORdnmV`|Sgk^~‡uKw‚Tuh #%+€¸¦UKKHEJS^dda[Ëûûýñ°^/1:8':VX`|˜¤ÆÃÖªKPICMD?Abš¨Žnrq«—•ª¡“–˜¢NNMQSUgpoU^SgiZ‰{Mx‚„Sye | ||
41 | |||
42 | |||
43 | |||
44 | %%!¤çٺɒBJNMKQ[\WL·ûûûýýýýû«G9$ ! >W[bx˜¡ËÅÛ³Z5G_LZN@q¢«Šnvs˜°”™¬ž˜œ¥¤MNOQQTgpnP^Zni\~†}QuU|c | ||
45 | |||
46 | |||
47 | $& _×ÒáäÆÂÛyFKLKLNKOùúûûýýýýûûù¹K'%%EX[kœª×èîˆ<HR`RTODx¨®‰pwt™¬“œ¨™•ž¤©OONOQWiqoJRbul[}‡„Vzƒ„Z€a | ||
48 | &'‡øõäîîÞ¹ÙÎpHLKFB[`©õúúüüüüýýýýü½<)HY[o™±g?W_BCUgGMZJŒ±¬‡wvz¥®•¡¦œ™¡¨¥NOOPQViqmEQ‚_nk\‰„Xz†„[†a | ||
49 | &' -”ðúúöêóóê™]svM>Azqv×ôúúüüùùýýýýüüüÊ…^^vœ¢jT[[;;*UzKYn^›´ª}x{©§’¥©£ž£¦ŸLMNOQViqkDN„bqt_…‹^z‰ƒ_‹_ %&AÒïúúúúõèóõóà¢f]kAjŸ†n¯êúúúüüûûýýýýüüüüùø§‚Ç¡nOOP7</H‰yKyt¢¹¦z}ƒ‰¬”¨¯¨¡ ¤œLNNPQYkplFHƒbk~e‚Ž‘\v‹„`Œ` | ||
50 | %'SÔý÷ùýúúú÷ìóõõó½—ˆhzg«òúÓÖúúúúüüüüýýýýüüüüùùùõÖÀìë»D>.Do[6^t³ºr½«š¯°ª¦§£“PMMPRVjokIBilŽn~Ž•]xŠad | ||
51 | %'!?Ñøø÷ô÷÷öööôñôôôõ渲Ÿ‹‘ÝüííÛîûûûýýýýüüüüúùùúýýýýüÄÇØá¨7<3La^CV”·¼—l€šÇ¨¥´´±««µ”MNOQRYlpmK>€rc‘lx–^vŽ[ˆo | ||
52 | ')`êøøø÷õö÷öööóïóôôõõëÔÖÝäðë÷üúúûûûýýýýüüüüúøøúýýýýüßÉÒì¨QEMTQFHB¿Á“s‚~¢Ñ³¨¹´²®µ‰NMPOOYmpkN8|~`‘kv–at•^„z' | ||
53 | '&:Éøøøø÷òó÷öööõñóôôõõîåõõøúüüüüûûûûýýýýüüüüúúúúýýýýüùñùûYƒ[[UTG@‡ÅÊŽw…zªÏ´®¼¶³ª¯µƒLMNPPYnrlO6zŠ]‡tp›Ÿcn’—`z€- | ||
54 | ))–ìïõøø÷ôõ÷öööõñóôôõõñæóùùúüüüüûûûûýýýýüüüüù÷÷úýýýüûü˵٠a€²˜²ˆ—ÀÇzƒ|DZ´Â¼µ±³²uNPQPQ]qtlN+o‘`{}t›žmg•šmw‹7& | ||
55 | ! !/MÈàáè÷÷ø÷÷øùùùøòôööõõóìðöööûûûûûûûûûûûûùùùùù÷÷ùúùúøùû¸OHnµlZFZ}Q¤Â¾„€†·Æª³Ã¿·´¸ªmNNMNQ]qtlP$a^]Žrvb•™xv9 !!xúæÙâ÷÷øõöøùùùøõõööõõôóôöööûûûûûûûûûûûûùùùùùøøùõóúø÷úàkD\‹P|Ã]’p¸À¸~„‰‰»Ã¡µÇÁµ±²›lLNPRR_wytgYbs]XpYk~UF{ees,$!!6æèÕØ÷÷ø÷÷øùùùùóôööõõõóõöööûûûûûûûûûûûûùùùùùøùùôõúúùøùû¶™–RazrVi‡ÇƬxˆ‡’ÅÀ¸³‘nKLMPS`rssvy|ƒ†‹‘“•™šœŸ£¥§©©«¬««ª¨§¦¥¤£ ›°¼ÖðÛÏó÷øõõøùùùùôôööõõõôôôõöûûúúûûûûûûûûùùùùùøøùúúúúõëøð†LZ?HKDG:r¾±kny•Ƴ§Â½¶´¥‹wKLNPRZH9:99<=<>=@=::<;;==?@BGLORUY_ciosx~ƒ„€±ÄÏãоï÷øôóøöööõóöööõõõñóéó÷øøø÷ûûûûûûûûøøøøûûûû÷÷ùùôÓùùÜÑÑÒÔÔÕÖÖÕÔÔ×ÙÞÜÛÙ×ÖÖÙØ×ÙÚÜÙLKMOP^lnlllmnopsuuuwwvutsqpopnmmjhgeeb`__]\_»ÀÐÇÛÂç÷øõõøöööõðòööõõôïëÞô÷øøø÷ûûûûûûûûøøøøûùúûîñøù÷Ùúü¶x{}}~€ƒ…‡ŠŠ‹Œ“”••–—˜–JLMKN\nrsru{}€…‡‹ŒŽ’“•”•—˜—˜™›Ÿž Ÿ¡££££¢£¯ßÆÚÂÚÐß÷øôôøõõöôîóööõõõðìä÷÷øøøøûûûûûûûûøøøøûûûûðòùùøâüüÕ…{zvvtrrqpprqpoommmmkkihgheLKJNOK: | ||
56 | |||
57 | $',048:>CHNTX^chd—æÉÍÇÂÇáöøôôøöööôíñööõõõîëñ÷÷ø÷õöûûûûûûûûøøøøûûûûÑßøõêàüüùØÉÇÅÅÄÄÄÄÅÃÄÄÄÄÂÁÁ¿¿¿½»º¸·´LMLLMNH* }èÖËÚՏɸùõôùõõõóíñ÷÷öööðêöùùööòôûûûûúúúúùùùùûûûûÅÖöñÝäùùý¶o{…ˆ•™ ¢¥©®´¸·¸¹¼ÀÃÆÂLJJLJJG4 | ||
58 | †ëæÇâá½É÷ùõñøõõõôïð÷÷öööïé÷ùùööíðûûûûúúúúùùùùûûûûáêëáÍäùùýÐE(%!KKLLIIH>%ˆíïÓÚÙ¼Îõù÷ñ÷õõõõðñ÷÷öööïç÷ùùööóôûûûûúùùúùùùùûûûúãâåâÞôùùýõ{&#!! !!!!" !#LLKLKIE?- êóàÒÏÉóùøõøõõõôðð÷÷öööðçõùùööòóûûûûúøøúùùùùûö÷÷æÙÍÚÜôùùýý¯2&$#""!!! !!""!!"!#""$MKLMJFGB5 4¬ðöèÓÖ¥»ðøöôøõõõõñï÷÷÷÷÷ðâòøøööòôûûûûûùôúûûûûüüüæÏÊËÞàôüüûûì`+$#$$!$$""#! ######%'&KIJJIGEB:( N¾ñöìØÎ¶¿ëø÷òõõõõõïêö÷÷÷õëæ÷ø÷öôñôûûûûûöðùúûûûùíöâÉ»Îåéïûüûûû#)'%$"###""#####!#%%&%&)KHHJIIFC?/ lÒò÷ñßɪáööô÷õõõòãÈì÷÷õðéê÷øøöôòöûûûûûìåúûûûûùêùá°¡ÚíöðûüûûûÃ<+($$$'&&$#$$%$#$%&&&),+KIHJJHGD?4# …Þô÷ôäÁ¦ ÒñõòöõóïëÛÃâóòíááóøøøöòîöûú÷øõäòûûûûûîáùâ«—Îìøìöüûûûós(*(&'&&&&&&&&&'('&)*,..IHHIJFECA9(-¢æö÷õฤžÅéòðõôïëèÚÄÙñòçßç÷øøøõðíóýýýýùôúûùùù÷ßÓëÚ¬§Éïûåèüúúúú¨7-,)(''&'''')(&'*-./123IIIHEFECA<0 =¹ìõ÷÷뾬¢¸×èæñóïëçÖ½Óëèßãòøøøøõíêôýýýüïãöûùùù÷ØØóЫºÈóüïðûúúúúã\0-*)(''''('')*+,--0123HHGHHIGEC>4%UÙùöö÷îó¥ºÖÜàôõòìçÜÉÏåÞ×çòøøøøõìèõýýýýéÜöûùùùõâèôÁ¦ÀÓúüòçùúúúúû(,*+)))*+***+,-/223365GEHIFFDDB?7)kàúóñõí¶¡®ËÓÆæôòåÒÑÇÌáâäñòö÷øøôçäõýýýýöñúûùùøðÚïì°¯ÏëüüúïõúúúúûÈD0,**((*+++++./0344223GGHGGFIFCA</"ìøðëïïÑ»¤®ÂɾÍßÍ¿ÅËÈÈÙßêïîùøúúöæâöüüüü÷÷ûûúúøèßöÛ¡®Õõýûûòðûûûûüòz-,-.-)+,,-./131343343EDDFEEEDC@<2&3¬åìêæÜèëÆŸ©ÀÎÃÃÕ×ÍÅÐÊÃÕãðñïùõòóõåâöüüüüõöûûúúøãàøÐ™¬×öýûûòíúûûûüü6.,---,,..0/023332222CCDFGHGEA><6-!FÁúúööóÚËØ©£»ÌÐÉÐÇÃÇÔÌÀÓçòñí÷ùúúöãßöüüüûïõûûúúöÜçú‘¬Ùöýûû÷éóûûûüüîk0/-/.,-./01212342243DDDEGGECB@<7."`¯÷úöööóáÞĪ»ÆÉ¼ÊÎÈÍÚλÓëõïí÷÷ø÷óÕßöüüüùèóûúùøîÛêò¹‹¦Ìðüûûûìîûûúûüü 1.-.--.-0/0223310110CBDDECDB??<80$,{w³Ù¼µ¿® ¯°§ºÅʶ¶¿Ç¼²º±ÆçóëèñóùùôÕÍôüüü÷âòûûòóòèõ÷¶‚”àûúúúïÙòûûüüüÜZ111/./0110111310110BABDEEFC@?=;4) 7§Ïðúûí²‘–ެºÆº°¥”Š™§³ÉìôæÚêöôõõâÑòüüüøãíõôðõõñ÷÷ªy˜¤ÐííçÜÛìûûûüüüú’0200010011331110121D?ACEDEECA>;7,#lͺÎ÷ûûûûô®qy¢ ‘‰“§›qw’¢¼ìóßÜíôùùóâÌíüüüüòöûöóúúãîð–n›´È½ÝøúúûûûûüüüüÌM5331121/1220100220?=@BDDDDB@=97.%!¢Ì¯ÐñûŒ™ˆjrut˜¯¥~UhŠ¢ÆìÕÕëõùøðÝÇæüüüùëîìêíìäÚðìˆj’¤Ôýúúúúûûûûü÷ÍŸ`9431121212111100/00@=AAEHGDC@>:62&R¯…A*\qsrmaYWUk•±¤T#’ÊÚòóñøõçÉß÷úúñéñíï÷öíÚòæ€j Àþøøøøû¿j;=UG7322243122112100110-.?=>@CDEDCA><83* ,0$,Rfgeb_URU]h¨™S | ||
59 | ŽÈ×ÜïõöóåËÚóùúöôûüøøüöîøæ|b‘«›Çð¹X5?BIL;2222201232332111221011/?<=>BDDA@BA>;4+! !" !""!$$%$'&(6Q\\_b]ZXZXR^yœ Y(œ¬ÁíõùùõçÍÓîúúúüüüûúú÷ñøÜŠo‡ Œ|Z:;AJOE7355356866544565565553311>=??BBCDCA@>950! "!!#"!""$$%#$$%%&*29GQUWYUTTLDEVWZeX9180>Ž£°òøùùöìÒÕæöúúüüüüùöñìõךry•M==AJTS<6799788768987677886676765 \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/readpgm.m b/SD-VBS/common/toolbox/toolbox_basic/affine/readpgm.m new file mode 100755 index 0000000..a5fd7f2 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/readpgm.m | |||
@@ -0,0 +1,26 @@ | |||
1 | function img = pgmread(filename) | ||
2 | % function img = pgmread(filename) | ||
3 | % this is my version of pgmread for the pgm file created by XV. | ||
4 | % | ||
5 | % this program also corrects for the shifts in the image from pm file. | ||
6 | |||
7 | |||
8 | fid = fopen(filename,'r'); | ||
9 | fscanf(fid, 'P5\n'); | ||
10 | cmt = '#'; | ||
11 | while findstr(cmt, '#'), | ||
12 | cmt = fgets(fid); | ||
13 | if length(findstr(cmt, '#')) ~= 1, | ||
14 | YX = sscanf(cmt, '%d %d'); | ||
15 | y = YX(1); x = YX(2); | ||
16 | end | ||
17 | end | ||
18 | |||
19 | fgets(fid); | ||
20 | |||
21 | %img = fscanf(fid,'%d',size); | ||
22 | %img = img'; | ||
23 | |||
24 | img = fread(fid,[y,x],'uint8'); | ||
25 | img = img'; | ||
26 | fclose(fid); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/simulation.m b/SD-VBS/common/toolbox/toolbox_basic/affine/simulation.m new file mode 100755 index 0000000..2186a6d --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/simulation.m | |||
@@ -0,0 +1,42 @@ | |||
1 | clear | ||
2 | |||
3 | figure(1);colormap(gray); | ||
4 | |||
5 | %------------ Parameters -------------------------- | ||
6 | window_size_h = 40; | ||
7 | window_size = 2*window_size_h+1; | ||
8 | noise_level = 40/256; | ||
9 | |||
10 | % define A and D | ||
11 | x_ext = -0.423; | ||
12 | ext = 1.232; | ||
13 | A = [ext+x_ext, 0.2534; 0.3423,ext]; | ||
14 | |||
15 | D = [3,1]; | ||
16 | |||
17 | %------------- compute image I and J --------------- | ||
18 | disp('generating I') | ||
19 | I_init = gen_feature_s(window_size); | ||
20 | [size_y,size_x] = size(I_init); | ||
21 | |||
22 | %define image center | ||
23 | [center_x,center_y] = find_center(size_x,size_y); | ||
24 | |||
25 | % adding noise to image I | ||
26 | I = I_init+noise_level*rand(size_y,size_x); | ||
27 | % make sure all intensities are positive | ||
28 | I = I.*(I>0); | ||
29 | |||
30 | disp('computing J') | ||
31 | J_init = compute_J(A,D,I_init,[center_x,center_y],[window_size_h,window_size_h]); | ||
32 | J = J_init+noise_level*rand(size_y,size_x); | ||
33 | J = J.*(J>0); | ||
34 | |||
35 | |||
36 | %------------- compute A and residue ---------------- | ||
37 | c = [center_x,center_y]; | ||
38 | num_iter = 8; w = 9;win_h = [window_size_h,window_size_h]; | ||
39 | |||
40 | fig_disp = 1; | ||
41 | [Ac,Dc,mask] = compute_AD_disp(I,J,c,c,win_h,num_iter,w,fig_disp); | ||
42 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/sports1_11_28.jpeg b/SD-VBS/common/toolbox/toolbox_basic/affine/sports1_11_28.jpeg new file mode 100755 index 0000000..39ebed5 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/sports1_11_28.jpeg | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/affine/test_affine.m b/SD-VBS/common/toolbox/toolbox_basic/affine/test_affine.m new file mode 100755 index 0000000..41b48b9 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affine/test_affine.m | |||
@@ -0,0 +1,33 @@ | |||
1 | %%% This is a test program for Affine tracker %%%% | ||
2 | |||
3 | disp(sprintf('This is a test program of Affine tracker')); | ||
4 | |||
5 | %% read in images | ||
6 | |||
7 | disp(sprintf('read in images')); | ||
8 | I = readpgm('pan.0.pgm'); | ||
9 | J = readpgm('pan.1.pgm'); | ||
10 | |||
11 | figure(1); im(I); colormap(gray); | ||
12 | figure(2); im(J); colormap(gray); | ||
13 | |||
14 | |||
15 | figure(1);disp(sprintf('click on the center of a image window')); | ||
16 | c = round(ginput(1)); | ||
17 | |||
18 | %% compute the displacement of that image window | ||
19 | disp(sprintf('computing...')); | ||
20 | |||
21 | win_hsize_temp = [8,8]; | ||
22 | w = 3; | ||
23 | num_iter = 6; | ||
24 | |||
25 | disp_flag = 1; | ||
26 | |||
27 | win_h = win_hsize_temp + [w,w]; | ||
28 | if disp_flag == 1, | ||
29 | figure_id = 3; | ||
30 | [A,D,mask] = compute_AD_disp(I,J,c,c,win_h,num_iter,w,figure_id); | ||
31 | else | ||
32 | [A,D,mask] = compute_AD(I,J,c,c,win_h,num_iter,w); | ||
33 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/affinityic.c b/SD-VBS/common/toolbox/toolbox_basic/affinityic.c new file mode 100755 index 0000000..e48762a --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/affinityic.c | |||
@@ -0,0 +1,186 @@ | |||
1 | /*================================================================ | ||
2 | * function w = affinityic(emag,ephase,pi,pj,sigma) | ||
3 | * Input: | ||
4 | * emag = edge strength at each pixel | ||
5 | * ephase = edge phase at each pixel | ||
6 | * [pi,pj] = index pair representation for MALTAB sparse matrices | ||
7 | * sigma = sigma for IC energy | ||
8 | * Output: | ||
9 | * w = affinity with IC at [pi,pj] | ||
10 | * | ||
11 | |||
12 | % test sequence | ||
13 | f = synimg(10); | ||
14 | [i,j] = cimgnbmap(size(f),2); | ||
15 | [ex,ey,egx,egy] = quadedgep(f); | ||
16 | a = affinityic(ex,ey,egx,egy,i,j) | ||
17 | show_dist_w(f,a); | ||
18 | |||
19 | * Jianbo Shi, Stella X. Yu, Nov 19, 2001. | ||
20 | *=================================================================*/ | ||
21 | |||
22 | # include "mex.h" | ||
23 | # include "math.h" | ||
24 | |||
25 | void mexFunction( | ||
26 | int nargout, | ||
27 | mxArray *out[], | ||
28 | int nargin, | ||
29 | const mxArray *in[] | ||
30 | ) | ||
31 | { | ||
32 | /* declare variables */ | ||
33 | int nr, nc, np, total; | ||
34 | int i, j, k, ix, iy, jx, jy, ii, jj, iip1, jjp1, iip2, jjp2, step; | ||
35 | double sigma, di, dj, a, z, maxori, phase1, phase2, slope; | ||
36 | int *ir, *jc; | ||
37 | unsigned long *pi, *pj; | ||
38 | double *emag, *ephase, *w; | ||
39 | |||
40 | /* check argument */ | ||
41 | if (nargin<4) { | ||
42 | mexErrMsgTxt("Four input arguments required"); | ||
43 | } | ||
44 | if (nargout>1) { | ||
45 | mexErrMsgTxt("Too many output arguments"); | ||
46 | } | ||
47 | |||
48 | /* get edgel information */ | ||
49 | nr = mxGetM(in[0]); | ||
50 | nc = mxGetN(in[0]); | ||
51 | if ( nr*nc ==0 || nr != mxGetM(in[1]) || nc != mxGetN(in[1]) ) { | ||
52 | mexErrMsgTxt("Edge magnitude and phase shall be of the same image size"); | ||
53 | } | ||
54 | emag = mxGetPr(in[0]); | ||
55 | ephase = mxGetPr(in[1]); | ||
56 | np = nr * nc; | ||
57 | |||
58 | /* get new index pair */ | ||
59 | if (!mxIsUint32(in[2]) | !mxIsUint32(in[3])) { | ||
60 | mexErrMsgTxt("Index pair shall be of type UINT32"); | ||
61 | } | ||
62 | if (mxGetM(in[3]) * mxGetN(in[3]) != np + 1) { | ||
63 | mexErrMsgTxt("Wrong index representation"); | ||
64 | } | ||
65 | pi = mxGetData(in[2]); | ||
66 | pj = mxGetData(in[3]); | ||
67 | |||
68 | /* create output */ | ||
69 | out[0] = mxCreateSparse(np,np,pj[np],mxREAL); | ||
70 | if (out[0]==NULL) { | ||
71 | mexErrMsgTxt("Not enough memory for the output matrix"); | ||
72 | } | ||
73 | w = mxGetPr(out[0]); | ||
74 | ir = mxGetIr(out[0]); | ||
75 | jc = mxGetJc(out[0]); | ||
76 | |||
77 | /* find my sigma */ | ||
78 | if (nargin<5) { | ||
79 | sigma = 0; | ||
80 | for (k=0; k<np; k++) { | ||
81 | if (emag[k]>sigma) { sigma = emag[k]; } | ||
82 | } | ||
83 | sigma = sigma / 10; | ||
84 | printf("sigma = %6.5f",sigma); | ||
85 | } else { | ||
86 | sigma = mxGetScalar(in[4]); | ||
87 | } | ||
88 | a = 1.0/ (sigma); | ||
89 | |||
90 | /* computation */ | ||
91 | total = 0; | ||
92 | for (j=0; j<np; j++) { | ||
93 | |||
94 | jc[j] = total; | ||
95 | jx = j / nr; /* col */ | ||
96 | jy = j % nr; /* row */ | ||
97 | |||
98 | for (k=pj[j]; k<pj[j+1]; k++) { | ||
99 | |||
100 | i = pi[k]; | ||
101 | |||
102 | if (i==j) { | ||
103 | maxori = 1; | ||
104 | |||
105 | } else { | ||
106 | |||
107 | ix = i / nr; | ||
108 | iy = i % nr; | ||
109 | |||
110 | /* scan */ | ||
111 | di = (double) (iy - jy); | ||
112 | dj = (double) (ix - jx); | ||
113 | |||
114 | maxori = 0.; | ||
115 | phase1 = ephase[j]; | ||
116 | |||
117 | |||
118 | /* sample in i direction */ | ||
119 | if (abs(di) >= abs(dj)) { | ||
120 | slope = dj / di; | ||
121 | step = (iy>=jy) ? 1 : -1; | ||
122 | |||
123 | iip1 = jy; | ||
124 | jjp1 = jx; | ||
125 | |||
126 | |||
127 | for (ii=0;ii<abs(di);ii++){ | ||
128 | iip2 = iip1 + step; | ||
129 | jjp2 = (int)(0.5 + slope*(iip2-jy) + jx); | ||
130 | |||
131 | phase2 = ephase[iip2+jjp2*nr]; | ||
132 | |||
133 | if (phase1 != phase2) { | ||
134 | z = (emag[iip1+jjp1*nr] + emag[iip2+jjp2*nr]); | ||
135 | if (z > maxori){ | ||
136 | maxori = z; | ||
137 | } | ||
138 | } | ||
139 | |||
140 | iip1 = iip2; | ||
141 | jjp1 = jjp2; | ||
142 | phase1 = phase2; | ||
143 | } | ||
144 | |||
145 | /* sample in j direction */ | ||
146 | } else { | ||
147 | slope = di / dj; | ||
148 | step = (ix>=jx) ? 1: -1; | ||
149 | |||
150 | jjp1 = jx; | ||
151 | iip1 = jy; | ||
152 | |||
153 | |||
154 | for (jj=0;jj<abs(dj);jj++){ | ||
155 | jjp2 = jjp1 + step; | ||
156 | iip2 = (int)(0.5+ slope*(jjp2-jx) + jy); | ||
157 | |||
158 | phase2 = ephase[iip2+jjp2*nr]; | ||
159 | |||
160 | if (phase1 != phase2){ | ||
161 | z = (emag[iip1+jjp1*nr] + emag[iip2+jjp2*nr]); | ||
162 | if (z > maxori){ | ||
163 | maxori = z; | ||
164 | } | ||
165 | |||
166 | } | ||
167 | |||
168 | iip1 = iip2; | ||
169 | jjp1 = jjp2; | ||
170 | phase1 = phase2; | ||
171 | } | ||
172 | } | ||
173 | |||
174 | maxori = 0.5 * maxori*a; | ||
175 | maxori = exp(-maxori*maxori); | ||
176 | } | ||
177 | ir[total] = i; | ||
178 | |||
179 | w[total] = maxori + 0.005; | ||
180 | total = total + 1; | ||
181 | |||
182 | } /* i */ | ||
183 | } /* j */ | ||
184 | |||
185 | jc[np] = total; | ||
186 | } | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib/TOOLBOX_calib.tar b/SD-VBS/common/toolbox/toolbox_basic/calib/TOOLBOX_calib.tar new file mode 100755 index 0000000..92ab3a0 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib/TOOLBOX_calib.tar | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/Distor2Calib.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/Distor2Calib.m new file mode 100755 index 0000000..a82f583 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/Distor2Calib.m | |||
@@ -0,0 +1,391 @@ | |||
1 | function [fc_2,Rc_2,Tc_2,H_2,distance,V_vert,V_hori,x_all_c,V_hori_pix,V_vert_pix,V_diag1_pix,V_diag2_pix]=Distor2Calib(k_dist,grid_pts_centered,n_sq_x,n_sq_y,Np,W,L,Xgrid_2,f_ini,N_iter,two_focal); | ||
2 | |||
3 | % Computes the calibration parameters knowing the | ||
4 | % distortion factor k_dist | ||
5 | |||
6 | % grid_pts_centered are the grid point coordinates after substraction of | ||
7 | % the optical center. | ||
8 | |||
9 | % can give an optional guess for the focal length f_ini (can set to []) | ||
10 | % can provide the number of iterations for the Iterative Vanishing Point Algorithm | ||
11 | |||
12 | % if the focal length is known perfectly, then, there is no need to iterate, | ||
13 | % and therefore, one can fix: N_iter = 0; | ||
14 | |||
15 | % California Institute of Technology | ||
16 | % (c) Jean-Yves Bouguet - October 7th, 1997 | ||
17 | |||
18 | |||
19 | |||
20 | %keyboard; | ||
21 | |||
22 | if exist('two_focal'), | ||
23 | if isempty(two_focal), | ||
24 | two_focal=0; | ||
25 | end; | ||
26 | else | ||
27 | two_focal = 0; | ||
28 | end; | ||
29 | |||
30 | |||
31 | if exist('N_iter'), | ||
32 | if ~isempty(N_iter), | ||
33 | disp('Use number of iterations provided'); | ||
34 | else | ||
35 | N_iter = 10; | ||
36 | end; | ||
37 | else | ||
38 | N_iter = 10; | ||
39 | end; | ||
40 | |||
41 | if exist('f_ini'), | ||
42 | if ~isempty(f_ini), | ||
43 | disp('Use focal provided'); | ||
44 | if length(f_ini)<2, f_ini=[f_ini;f_ini]; end; | ||
45 | fc_2 = f_ini; | ||
46 | x_all_c = [grid_pts_centered(1,:)/fc_2(1);grid_pts_centered(2,:)/fc_2(2)]; | ||
47 | x_all_c = comp_distortion(x_all_c,k_dist); % we can this time!!! | ||
48 | else | ||
49 | fc_2 = [1;1]; | ||
50 | x_all_c = grid_pts_centered; | ||
51 | end; | ||
52 | else | ||
53 | fc_2 = [1;1]; | ||
54 | x_all_c = grid_pts_centered; | ||
55 | end; | ||
56 | |||
57 | |||
58 | dX = W/n_sq_x; | ||
59 | dY = L/n_sq_y; | ||
60 | |||
61 | |||
62 | N_x = n_sq_x+1; | ||
63 | N_y = n_sq_y+1; | ||
64 | |||
65 | |||
66 | x_grid = zeros(N_x,N_y); | ||
67 | y_grid = zeros(N_x,N_y); | ||
68 | |||
69 | |||
70 | |||
71 | |||
72 | |||
73 | %%% Computation of the four vanishing points in pixels | ||
74 | |||
75 | |||
76 | x_grid(:) = grid_pts_centered(1,:); | ||
77 | y_grid(:) = grid_pts_centered(2,:); | ||
78 | |||
79 | for k=1:n_sq_x+1, | ||
80 | [U,S,V] = svd([x_grid(k,:);y_grid(k,:);ones(1,n_sq_y+1)]); | ||
81 | vert(:,k) = U(:,3); | ||
82 | end; | ||
83 | |||
84 | for k=1:n_sq_y+1, | ||
85 | [U,S,V] = svd([x_grid(:,k)';y_grid(:,k)';ones(1,n_sq_x+1)]); | ||
86 | hori(:,k) = U(:,3); | ||
87 | end; | ||
88 | |||
89 | % 2 principle Vanishing points: | ||
90 | [U,S,V] = svd(vert); | ||
91 | V_vert = U(:,3); | ||
92 | [U,S,V] = svd(hori); | ||
93 | V_hori = U(:,3); | ||
94 | |||
95 | |||
96 | |||
97 | % Square warping: | ||
98 | |||
99 | |||
100 | vert_first = vert(:,1) - dot(V_vert,vert(:,1))/dot(V_vert,V_vert) * V_vert; | ||
101 | vert_last = vert(:,n_sq_x+1) - dot(V_vert,vert(:,n_sq_x+1))/dot(V_vert,V_vert) * V_vert; | ||
102 | |||
103 | hori_first = hori(:,1) - dot(V_hori,hori(:,1))/dot(V_hori,V_hori) * V_hori; | ||
104 | hori_last = hori(:,n_sq_y+1) - dot(V_hori,hori(:,n_sq_y+1))/dot(V_hori,V_hori) * V_hori; | ||
105 | |||
106 | |||
107 | x1 = cross(hori_first,vert_first); | ||
108 | x2 = cross(hori_first,vert_last); | ||
109 | x3 = cross(hori_last,vert_last); | ||
110 | x4 = cross(hori_last,vert_first); | ||
111 | |||
112 | x1 = x1/x1(3); | ||
113 | x2 = x2/x2(3); | ||
114 | x3 = x3/x3(3); | ||
115 | x4 = x4/x4(3); | ||
116 | |||
117 | |||
118 | |||
119 | [square] = Rectangle2Square([x1 x2 x3 x4],W,L); | ||
120 | |||
121 | y1 = square(:,1); | ||
122 | y2 = square(:,2); | ||
123 | y3 = square(:,3); | ||
124 | y4 = square(:,4); | ||
125 | |||
126 | H2 = cross(V_vert,V_hori); | ||
127 | |||
128 | V_diag1 = cross(cross(y1,y3),H2); | ||
129 | V_diag2 = cross(cross(y2,y4),H2); | ||
130 | |||
131 | V_diag1 = V_diag1 / norm(V_diag1); | ||
132 | V_diag2 = V_diag2 / norm(V_diag2); | ||
133 | |||
134 | V_hori_pix = V_hori; | ||
135 | V_vert_pix = V_vert; | ||
136 | V_diag1_pix = V_diag1; | ||
137 | V_diag2_pix = V_diag2; | ||
138 | |||
139 | |||
140 | % end of computation of the vanishing points in pixels. | ||
141 | |||
142 | |||
143 | |||
144 | |||
145 | |||
146 | |||
147 | |||
148 | |||
149 | if two_focal, % only if we attempt to estimate two focals... | ||
150 | % Use diagonal lines also to add two extra vanishing points (?) | ||
151 | N_min = min(N_x,N_y); | ||
152 | |||
153 | if N_min < 2, | ||
154 | use_diag = 0; | ||
155 | two_focal = 0; | ||
156 | disp('Cannot estimate two focals (no existing diagonals)'); | ||
157 | else | ||
158 | use_diag = 1; | ||
159 | Delta_N = abs(N_x-N_y); | ||
160 | N_extra = round((N_min - Delta_N - 1)/2); | ||
161 | diag_list = -N_extra:Delta_N+N_extra; | ||
162 | N_diag = length(diag_list); | ||
163 | diag_1 = zeros(3,N_diag); | ||
164 | diag_2 = zeros(3,N_diag); | ||
165 | end; | ||
166 | else | ||
167 | % Give up the use of the diagonals (so far) | ||
168 | % it seems that the error is increased | ||
169 | use_diag = 0; | ||
170 | end; | ||
171 | |||
172 | |||
173 | |||
174 | % The vertical lines: vert, Horizontal lines: hori | ||
175 | vert = zeros(3,n_sq_x+1); | ||
176 | hori = zeros(3,n_sq_y+1); | ||
177 | |||
178 | for counter_k = 1:N_iter, % the Iterative Vanishing Points Algorithm to | ||
179 | % estimate the focal length accurately | ||
180 | |||
181 | x_grid(:) = x_all_c(1,:); | ||
182 | y_grid(:) = x_all_c(2,:); | ||
183 | |||
184 | for k=1:n_sq_x+1, | ||
185 | [U,S,V] = svd([x_grid(k,:);y_grid(k,:);ones(1,n_sq_y+1)]); | ||
186 | vert(:,k) = U(:,3); | ||
187 | end; | ||
188 | |||
189 | for k=1:n_sq_y+1, | ||
190 | [U,S,V] = svd([x_grid(:,k)';y_grid(:,k)';ones(1,n_sq_x+1)]); | ||
191 | hori(:,k) = U(:,3); | ||
192 | end; | ||
193 | |||
194 | % 2 principle Vanishing points: | ||
195 | [U,S,V] = svd(vert); | ||
196 | V_vert = U(:,3); | ||
197 | [U,S,V] = svd(hori); | ||
198 | V_hori = U(:,3); | ||
199 | |||
200 | |||
201 | |||
202 | % Square warping: | ||
203 | |||
204 | |||
205 | vert_first = vert(:,1) - dot(V_vert,vert(:,1))/dot(V_vert,V_vert) * V_vert; | ||
206 | vert_last = vert(:,n_sq_x+1) - dot(V_vert,vert(:,n_sq_x+1))/dot(V_vert,V_vert) * V_vert; | ||
207 | |||
208 | hori_first = hori(:,1) - dot(V_hori,hori(:,1))/dot(V_hori,V_hori) * V_hori; | ||
209 | hori_last = hori(:,n_sq_y+1) - dot(V_hori,hori(:,n_sq_y+1))/dot(V_hori,V_hori) * V_hori; | ||
210 | |||
211 | |||
212 | x1 = cross(hori_first,vert_first); | ||
213 | x2 = cross(hori_first,vert_last); | ||
214 | x3 = cross(hori_last,vert_last); | ||
215 | x4 = cross(hori_last,vert_first); | ||
216 | |||
217 | x1 = x1/x1(3); | ||
218 | x2 = x2/x2(3); | ||
219 | x3 = x3/x3(3); | ||
220 | x4 = x4/x4(3); | ||
221 | |||
222 | |||
223 | |||
224 | [square] = Rectangle2Square([x1 x2 x3 x4],W,L); | ||
225 | |||
226 | y1 = square(:,1); | ||
227 | y2 = square(:,2); | ||
228 | y3 = square(:,3); | ||
229 | y4 = square(:,4); | ||
230 | |||
231 | H2 = cross(V_vert,V_hori); | ||
232 | |||
233 | V_diag1 = cross(cross(y1,y3),H2); | ||
234 | V_diag2 = cross(cross(y2,y4),H2); | ||
235 | |||
236 | V_diag1 = V_diag1 / norm(V_diag1); | ||
237 | V_diag2 = V_diag2 / norm(V_diag2); | ||
238 | |||
239 | |||
240 | |||
241 | |||
242 | % Estimation of the focal length, and normalization: | ||
243 | |||
244 | % Compute the ellipsis of (1/f^2) positions: | ||
245 | % a * (1/fx)^2 + b * (1/fx)^2 = -c | ||
246 | |||
247 | |||
248 | a1 = V_hori(1); | ||
249 | b1 = V_hori(2); | ||
250 | c1 = V_hori(3); | ||
251 | |||
252 | a2 = V_vert(1); | ||
253 | b2 = V_vert(2); | ||
254 | c2 = V_vert(3); | ||
255 | |||
256 | a3 = V_diag1(1); | ||
257 | b3 = V_diag1(2); | ||
258 | c3 = V_diag1(3); | ||
259 | |||
260 | a4 = V_diag2(1); | ||
261 | b4 = V_diag2(2); | ||
262 | c4 = V_diag2(3); | ||
263 | |||
264 | |||
265 | if two_focal, | ||
266 | |||
267 | |||
268 | A = [a1*a2 b1*b2;a3*a4 b3*b4]; | ||
269 | b = -[c1*c2;c3*c4]; | ||
270 | |||
271 | f = sqrt(abs(1./(inv(A)*b))); | ||
272 | |||
273 | else | ||
274 | |||
275 | f = sqrt(abs(-(c1*c2*(a1*a2 + b1*b2) + c3*c4*(a3*a4 + b3*b4))/(c1^2*c2^2 + c3^2*c4^2))); | ||
276 | |||
277 | f = [f;f]; | ||
278 | |||
279 | end; | ||
280 | |||
281 | |||
282 | |||
283 | % REMARK: | ||
284 | % if both a and b are small, the calibration is impossible. | ||
285 | % if one of them is small, only the other focal length is observable | ||
286 | % if none is small, both focals are observable | ||
287 | |||
288 | |||
289 | fc_2 = fc_2 .* f; | ||
290 | |||
291 | |||
292 | % DEBUG PART: fix focal to 500... | ||
293 | %fc_2= [500;500]; disp('Line 293 to be earased in Distor2Calib.m'); | ||
294 | |||
295 | |||
296 | % end of focal compensation | ||
297 | |||
298 | % normalize by the current focal: | ||
299 | |||
300 | x_all = [grid_pts_centered(1,:)/fc_2(1);grid_pts_centered(2,:)/fc_2(2)]; | ||
301 | |||
302 | % Compensate by the distortion factor: | ||
303 | |||
304 | x_all_c = comp_distortion(x_all,k_dist); | ||
305 | |||
306 | end; | ||
307 | |||
308 | % At that point, we hope that the distortion is gone... | ||
309 | |||
310 | x_grid(:) = x_all_c(1,:); | ||
311 | y_grid(:) = x_all_c(2,:); | ||
312 | |||
313 | for k=1:n_sq_x+1, | ||
314 | [U,S,V] = svd([x_grid(k,:);y_grid(k,:);ones(1,n_sq_y+1)]); | ||
315 | vert(:,k) = U(:,3); | ||
316 | end; | ||
317 | |||
318 | for k=1:n_sq_y+1, | ||
319 | [U,S,V] = svd([x_grid(:,k)';y_grid(:,k)';ones(1,n_sq_x+1)]); | ||
320 | hori(:,k) = U(:,3); | ||
321 | end; | ||
322 | |||
323 | % Vanishing points: | ||
324 | [U,S,V] = svd(vert); | ||
325 | V_vert = U(:,3); | ||
326 | [U,S,V] = svd(hori); | ||
327 | V_hori = U(:,3); | ||
328 | |||
329 | % Horizon: | ||
330 | |||
331 | H_2 = cross(V_vert,V_hori); | ||
332 | |||
333 | % H_2 = cross(V_vert,V_hori); | ||
334 | |||
335 | % pick a plane in front of the camera (positive depth) | ||
336 | if H_2(3) < 0, H_2 = -H_2; end; | ||
337 | |||
338 | |||
339 | % Rotation matrix: | ||
340 | |||
341 | if V_hori(1) < 0, V_hori = -V_hori; end; | ||
342 | |||
343 | V_hori = V_hori/norm(V_hori); | ||
344 | H_2 = H_2/norm(H_2); | ||
345 | |||
346 | V_hori = V_hori - dot(V_hori,H_2)*H_2; | ||
347 | |||
348 | Rc_2 = [V_hori cross(H_2,V_hori) H_2]; | ||
349 | |||
350 | Rc_2 = Rc_2 / det(Rc_2); | ||
351 | |||
352 | %omc_2 = rodrigues(Rc_2); | ||
353 | |||
354 | %Rc_2 = rodrigues(omc_2); | ||
355 | |||
356 | % Find the distance of the plane for translation vector: | ||
357 | |||
358 | xc_2 = [x_all_c;ones(1,Np)]; | ||
359 | |||
360 | Zc_2 = 1./sum(xc_2 .* (Rc_2(:,3)*ones(1,Np))); | ||
361 | |||
362 | Xo_2 = [sum(xc_2 .* (Rc_2(:,1)*ones(1,Np))).*Zc_2 ; sum(xc_2 .* (Rc_2(:,2)*ones(1,Np))).*Zc_2]; | ||
363 | |||
364 | XXo_2 = Xo_2 - mean(Xo_2')'*ones(1,Np); | ||
365 | |||
366 | distance_x = norm(Xgrid_2(1,:))/norm(XXo_2(1,:)); | ||
367 | distance_y = norm(Xgrid_2(2,:))/norm(XXo_2(2,:)); | ||
368 | |||
369 | |||
370 | distance = sum(sum(XXo_2(1:2,:).*Xgrid_2(1:2,:)))/sum(sum(XXo_2(1:2,:).^2)); | ||
371 | |||
372 | alpha = abs(distance_x - distance_y)/distance; | ||
373 | |||
374 | if (alpha>0.1)&~two_focal, | ||
375 | disp('Should use two focals in x and y...'); | ||
376 | end; | ||
377 | |||
378 | % Deduce the translation vector: | ||
379 | |||
380 | Tc_2 = distance * H_2; | ||
381 | |||
382 | |||
383 | |||
384 | |||
385 | |||
386 | return; | ||
387 | |||
388 | V_hori_pix/V_hori_pix(3) | ||
389 | V_vert_pix/V_vert_pix(3) | ||
390 | V_diag1_pix/V_diag1_pix(3) | ||
391 | V_diag2_pix/V_diag2_pix(3) | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/Multi_Calib_oulu.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/Multi_Calib_oulu.m new file mode 100755 index 0000000..62ca9ae --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/Multi_Calib_oulu.m | |||
@@ -0,0 +1,12 @@ | |||
1 | |||
2 | % enter image names, numbers, ... | ||
3 | data_calib; | ||
4 | |||
5 | %read images from files | ||
6 | ima_read_calib; | ||
7 | |||
8 | click_calib; | ||
9 | |||
10 | %go_calib; % the original version | ||
11 | |||
12 | go_calib_optim; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/Rectangle2Square.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/Rectangle2Square.m new file mode 100755 index 0000000..a6bbbe5 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/Rectangle2Square.m | |||
@@ -0,0 +1,19 @@ | |||
1 | function [square] = Rectangle2Square(rectangle,L,W); | ||
2 | |||
3 | % Generate the square from a rectangle of known segment lengths | ||
4 | % from pt1 to pt2 : L | ||
5 | % from pt2 to pt3 : W | ||
6 | |||
7 | [u_hori,u_vert] = UnWarpPlane(rectangle); | ||
8 | |||
9 | coeff_x = sqrt(W/L); | ||
10 | coeff_y = 1/coeff_x; | ||
11 | |||
12 | x_coord = [ 0 coeff_x coeff_x 0]; | ||
13 | y_coord = [ 0 0 coeff_y coeff_y]; | ||
14 | |||
15 | |||
16 | square = rectangle(:,1) * ones(1,4) + u_hori*x_coord + u_vert*y_coord; | ||
17 | square = square ./ (ones(3,1)*square(3,:)); | ||
18 | |||
19 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/UnWarpPlane.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/UnWarpPlane.m new file mode 100755 index 0000000..8addf52 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/UnWarpPlane.m | |||
@@ -0,0 +1,54 @@ | |||
1 | function [u_hori,u_vert] = UnWarpPlane(x1,x2,x3,x4); | ||
2 | |||
3 | % Recovers the two 3D directions of the rectangular patch x1x2x3x4 | ||
4 | % x1 is the origin point, ie any point of planar coordinate (x,y) on the | ||
5 | % rectangular patch will be projected on the image plane at: | ||
6 | % x1 + x * u_hori + y * u_vert | ||
7 | % | ||
8 | % Note: u_hori and u_vert are also the two vanishing points. | ||
9 | |||
10 | |||
11 | if nargin < 4, | ||
12 | |||
13 | x4 = x1(:,4); | ||
14 | x3 = x1(:,3); | ||
15 | x2 = x1(:,2); | ||
16 | x1 = x1(:,1); | ||
17 | |||
18 | end; | ||
19 | |||
20 | |||
21 | % Image Projection: | ||
22 | L1 = cross(x1,x2); | ||
23 | L2 = cross(x4,x3); | ||
24 | L3 = cross(x2,x3); | ||
25 | L4 = cross(x1,x4); | ||
26 | |||
27 | % Vanishing point: | ||
28 | V1 = cross(L1,L2); | ||
29 | V2 = cross(L3,L4); | ||
30 | |||
31 | % Horizon line: | ||
32 | H = cross(V1,V2); | ||
33 | |||
34 | if H(3) < 0, H = -H; end; | ||
35 | |||
36 | |||
37 | H = H / norm(H); | ||
38 | |||
39 | |||
40 | X1 = x1 / dot(H,x1); | ||
41 | X2 = x2 / dot(H,x2); | ||
42 | X3 = x3 / dot(H,x3); | ||
43 | X4 = x4 / dot(H,x4); | ||
44 | |||
45 | scale = X1(3); | ||
46 | |||
47 | X1 = X1/scale; | ||
48 | X2 = X2/scale; | ||
49 | X3 = X3/scale; | ||
50 | X4 = X4/scale; | ||
51 | |||
52 | |||
53 | u_hori = X2 - X1; | ||
54 | u_vert = X4 - X1; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/add_suppress.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/add_suppress.m new file mode 100755 index 0000000..b9bcc57 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/add_suppress.m | |||
@@ -0,0 +1,91 @@ | |||
1 | check_active_images; | ||
2 | |||
3 | |||
4 | fprintf(1,'\nThis function is useful to select a subset of images to calibrate\n'); | ||
5 | |||
6 | fprintf(1,'\nThere are currently %d active images selected for calibration (out of %d):\n',length(ind_active),n_ima); | ||
7 | |||
8 | if ~isempty(ind_active), | ||
9 | |||
10 | for ii = 1:length(ind_active)-2, | ||
11 | |||
12 | fprintf(1,'%d, ',ind_active(ii)); | ||
13 | |||
14 | end; | ||
15 | |||
16 | fprintf(1,'%d and %d.',ind_active(end-1),ind_active(end)); | ||
17 | |||
18 | end; | ||
19 | |||
20 | fprintf(1,'\n'); | ||
21 | |||
22 | |||
23 | fprintf(1,'\nDo you want to suppress or add images from that list?\n'); | ||
24 | |||
25 | choice = 2; | ||
26 | |||
27 | while (choice~=0)&(choice~=1), | ||
28 | choice = input('For suppressing images enter 0, for adding images enter 1 ([]=no change): '); | ||
29 | if isempty(choice), | ||
30 | fprintf(1,'No change applied to the list of active images.\n'); | ||
31 | return; | ||
32 | end; | ||
33 | if (choice~=0)&(choice~=1), | ||
34 | disp('Bad entry. Try again.'); | ||
35 | end; | ||
36 | end; | ||
37 | |||
38 | |||
39 | if choice, | ||
40 | |||
41 | ima_numbers = input('Number(s) of image(s) to add ([] = all images) = '); | ||
42 | |||
43 | if isempty(ima_numbers), | ||
44 | fprintf(1,'All %d images are now active\n',n_ima); | ||
45 | ima_proc = 1:n_ima; | ||
46 | else | ||
47 | ima_proc = ima_numbers; | ||
48 | end; | ||
49 | |||
50 | else | ||
51 | |||
52 | |||
53 | ima_numbers = input('Number(s) of image(s) to suppress ([] = no image) = '); | ||
54 | |||
55 | if isempty(ima_numbers), | ||
56 | fprintf(1,'No image has been suppressed. No modication of the list of active images.\n',n_ima); | ||
57 | ima_proc = []; | ||
58 | else | ||
59 | ima_proc = ima_numbers; | ||
60 | end; | ||
61 | |||
62 | end; | ||
63 | |||
64 | if ~isempty(ima_proc), | ||
65 | |||
66 | active_images(ima_proc) = choice * ones(1,length(ima_proc)); | ||
67 | |||
68 | end; | ||
69 | |||
70 | |||
71 | check_active_images; | ||
72 | |||
73 | |||
74 | fprintf(1,'\nThere is now a total of %d active images for calibration:\n',length(ind_active)); | ||
75 | |||
76 | if ~isempty(ind_active), | ||
77 | |||
78 | for ii = 1:length(ind_active)-2, | ||
79 | |||
80 | fprintf(1,'%d, ',ind_active(ii)); | ||
81 | |||
82 | end; | ||
83 | |||
84 | fprintf(1,'%d and %d.',ind_active(end-1),ind_active(end)); | ||
85 | |||
86 | end; | ||
87 | |||
88 | fprintf(1,'\n\nYou may now run ''Calibration'' to recalibrate based on this new set of images.\n'); | ||
89 | |||
90 | |||
91 | \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/analyse_error.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/analyse_error.m new file mode 100755 index 0000000..5bfa3b5 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/analyse_error.m | |||
@@ -0,0 +1,104 @@ | |||
1 | % Color code for each image: | ||
2 | |||
3 | check_active_images; | ||
4 | |||
5 | if ~exist(['ex_' num2str(ind_active(1)) ]), | ||
6 | fprintf(1,'Need to calibrate before analysing reprojection error. Maybe need to load Calib_Results.mat file.\n'); | ||
7 | return; | ||
8 | end; | ||
9 | |||
10 | |||
11 | if ~exist('no_grid'), | ||
12 | no_grid = 0; | ||
13 | end; | ||
14 | |||
15 | colors = 'brgkcm'; | ||
16 | |||
17 | |||
18 | figure(5); | ||
19 | |||
20 | for kk = 1:n_ima, | ||
21 | if active_images(kk) & eval(['~isnan(y_' num2str(kk) '(1,1))']), | ||
22 | eval(['plot(ex_' num2str(kk) '(1,:),ex_' num2str(kk) '(2,:),''' colors(rem(kk-1,6)+1) '+'');']); | ||
23 | hold on; | ||
24 | end; | ||
25 | end; | ||
26 | hold off; | ||
27 | axis('equal'); | ||
28 | if 1, %~no_grid, | ||
29 | title('Reprojection error (in pixel) - To exit: right button'); | ||
30 | else | ||
31 | title('Reprojection error (in pixel)'); | ||
32 | end; | ||
33 | xlabel('x'); | ||
34 | ylabel('y'); | ||
35 | |||
36 | set(5,'Name','error','NumberTitle','off'); | ||
37 | |||
38 | |||
39 | |||
40 | %err_std = std(ex')'; | ||
41 | |||
42 | %fprintf(1,'Pixel error: err = [ %3.5f %3.5f]\n\n',err_std); | ||
43 | |||
44 | b = 1; | ||
45 | |||
46 | while b==1, | ||
47 | |||
48 | [xp,yp,b] = ginput3(1); | ||
49 | |||
50 | if b==1, | ||
51 | ddd = (ex(1,:)-xp).^2 + (ex(2,:)-yp).^2; | ||
52 | |||
53 | [mind,indmin] = min(ddd); | ||
54 | |||
55 | |||
56 | done = 0; | ||
57 | kk_ima = 1; | ||
58 | while (~done)&(kk_ima<=n_ima), | ||
59 | %fprintf(1,'%d...',kk_ima); | ||
60 | eval(['ex_kk = ex_' num2str(kk_ima) ';']); | ||
61 | sol_kk = find((ex_kk(1,:) == ex(1,indmin))&(ex_kk(2,:) == ex(2,indmin))); | ||
62 | if isempty(sol_kk), | ||
63 | kk_ima = kk_ima + 1; | ||
64 | else | ||
65 | done = 1; | ||
66 | end; | ||
67 | end; | ||
68 | |||
69 | if ~no_grid, | ||
70 | |||
71 | eval(['n_sq_x = n_sq_x_' num2str(kk_ima) ';']); | ||
72 | eval(['n_sq_y = n_sq_y_' num2str(kk_ima) ';']); | ||
73 | |||
74 | Nx = n_sq_x+1; | ||
75 | Ny = n_sq_y+1; | ||
76 | |||
77 | y1 = floor((sol_kk-1)./Nx); | ||
78 | x1 = sol_kk - 1 - Nx*y1; %rem(sol_kk-1,Nx); | ||
79 | |||
80 | y1 = (n_sq_y+1) - y1; | ||
81 | x1 = x1 + 1; | ||
82 | |||
83 | fprintf(1,'\nSelected image: %d\nSelected point: (col,row)=(%d,%d)\nNcol=%d, Nrow=%d\n',[kk_ima x1 y1 Nx Ny]); | ||
84 | fprintf(1,'Pixel error = (%3.5f,%3.5f)\n',[ex(1,indmin) ex(2,indmin)]); | ||
85 | |||
86 | else | ||
87 | |||
88 | eval(['x_kk = x_' num2str(kk_ima) ';']); | ||
89 | |||
90 | xpt = x_kk(:,sol_kk); | ||
91 | |||
92 | fprintf(1,'\nSelected image: %d\nImage coordinates (in pixel): (%3.2f,%3.2f)\n',[kk_ima xpt']); | ||
93 | fprintf(1,'Pixel error = (%3.5f,%3.5f)\n',[ex(1,indmin) ex(2,indmin)]); | ||
94 | |||
95 | |||
96 | end; | ||
97 | |||
98 | |||
99 | end; | ||
100 | |||
101 | end; | ||
102 | |||
103 | disp('done'); | ||
104 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/calib.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/calib.m new file mode 100755 index 0000000..5b0fdac --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/calib.m | |||
@@ -0,0 +1,74 @@ | |||
1 | if ~exist('instructions'), instructions = 1; end; | ||
2 | |||
3 | if instructions, | ||
4 | |||
5 | fprintf(1,'\n'); | ||
6 | fprintf(1,'*----------------------------------------------------------------------------------------------------*\n'); | ||
7 | fprintf(1,'| Main Calibration toolbox (2D and 3D rigs) |\n'); | ||
8 | fprintf(1,'| (c) Jean-Yves Bouguet - September 9th, 1999 |\n'); | ||
9 | fprintf(1,'*----------------------------------------------------------------------------------------------------*\n\n\n'); | ||
10 | |||
11 | fprintf(1,'CLICK ON:\n\n'); | ||
12 | |||
13 | fprintf(1,'2D: To perform camera calibration from multiple views of a 2D planar grid. \n'); | ||
14 | fprintf(1,' Set default size of grid (in dX_default and dY_default) in click_calib.m.\n'); | ||
15 | fprintf(1,'3D: To perform camera calibration from multiple views of a 3D grid corner. \n'); | ||
16 | fprintf(1,' Set default size of grids (in dX_default and dY_default) in click_calib3D.m.\n'); | ||
17 | fprintf(1,'Exit: To close the calibration tool. \n'); | ||
18 | |||
19 | end; | ||
20 | |||
21 | instructions = 0; | ||
22 | |||
23 | fig_number = 1; | ||
24 | |||
25 | n_row = 1; | ||
26 | n_col = 3; | ||
27 | |||
28 | string_list = cell(n_row,n_col); | ||
29 | callback_list = cell(n_row,n_col); | ||
30 | |||
31 | x_size = 40; | ||
32 | y_size = 20; | ||
33 | |||
34 | title_figure = 'Calibration tool'; | ||
35 | |||
36 | string_list{1,1} = '2D rig'; | ||
37 | string_list{1,2} = '3D rig'; | ||
38 | string_list{1,3} = 'Exit'; | ||
39 | |||
40 | callback_list{1,1} = 'calib_gui;'; | ||
41 | callback_list{1,2} = 'calib3D_gui;'; | ||
42 | callback_list{1,3} = ['disp(''Bye. To run again, type calib.''); close(' num2str(fig_number) ');']; | ||
43 | |||
44 | |||
45 | figure(fig_number); clf; | ||
46 | pos = get(fig_number,'Position'); | ||
47 | |||
48 | fig_size_x = x_size*n_col+(n_col+1)*2; | ||
49 | fig_size_y = y_size*n_row+(n_row+1)*2; | ||
50 | |||
51 | set(fig_number,'Units','points', ... | ||
52 | 'BackingStore','off', ... | ||
53 | 'Color',[0.8 0.8 0.8], ... | ||
54 | 'MenuBar','none', ... | ||
55 | 'Resize','off', ... | ||
56 | 'Name',title_figure, ... | ||
57 | 'Position',[pos(1) pos(2) fig_size_x fig_size_y], ... | ||
58 | 'NumberTitle','off'); | ||
59 | |||
60 | |||
61 | for i=n_row:-1:1, | ||
62 | for j = n_col:-1:1, | ||
63 | if (~isempty(callback_list{i,j}))&(~isempty(string_list{i,j})), | ||
64 | uicontrol('Parent',fig_number, ... | ||
65 | 'Units','points', ... | ||
66 | 'Callback',callback_list{i,j}, ... | ||
67 | 'ListboxTop',0, ... | ||
68 | 'Position',[(2+(j-1)*(x_size+2)) (fig_size_y - i*(2+y_size)) x_size y_size], ... | ||
69 | 'String',string_list{i,j}, ... | ||
70 | 'Tag','Pushbutton1'); | ||
71 | end; | ||
72 | end; | ||
73 | end; | ||
74 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/calib3D_gui.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/calib3D_gui.m new file mode 100755 index 0000000..ff24f6b --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/calib3D_gui.m | |||
@@ -0,0 +1,115 @@ | |||
1 | if ~exist('instructions3D'), instructions3D = 1; end; | ||
2 | |||
3 | if instructions3D, | ||
4 | |||
5 | fprintf(1,'\n'); | ||
6 | fprintf(1,'*----------------------------------------------------------------------------------------------------*\n'); | ||
7 | fprintf(1,'| Canera calibration from multiple images of the Intel 3D calibration rig |\n'); | ||
8 | fprintf(1,'| (c) Jean-Yves Bouguet - September 2nd, 1999 |\n'); | ||
9 | fprintf(1,'*----------------------------------------------------------------------------------------------------*\n\n\n'); | ||
10 | |||
11 | fprintf(1,'LIST OF CALIBRATION COMMANDS (to be executed from 1 to 5):\n\n'); | ||
12 | |||
13 | fprintf(1,'1- Image names: Lets the user enter the file names of the calibration images (max = 30 images).\n'); | ||
14 | fprintf(1,' It includes basename, image type (''tif'', ''bmp'' or ''ras''), numbering scheme.\n'); | ||
15 | fprintf(1,' Automatically launchs the next step (Read images).\n'); | ||
16 | fprintf(1,'2- Read images: Reads in the calibration images from files.\n'); | ||
17 | fprintf(1,' Does not automatically launch the next step (Extract grid corners).\n'); | ||
18 | fprintf(1,'3- Extract grid corners: Extracts the grid corners from the image.\n'); | ||
19 | fprintf(1,' Based six maual clicks per image.\n'); | ||
20 | fprintf(1,' The calibration data is saved under ''calib_data.mat''.\n'); | ||
21 | fprintf(1,' Automatically launchs the next step (Run calibration).\n'); | ||
22 | fprintf(1,'4- Run calibration: Main calibration procedure.\n'); | ||
23 | fprintf(1,' Optimization of intrinsic and extrinsic parameters to minimize\n'); | ||
24 | fprintf(1,' the reprojection error (in the least squares sense.\n'); | ||
25 | fprintf(1,' Estimated parameters: 2 focal lengths, principal point,\n'); | ||
26 | fprintf(1,' radial (2 coeff. -> 4 degree model) and tangential (2 coeff.) distortion,\n'); | ||
27 | fprintf(1,' and extrinsic parameters (6 parameters per image).\n'); | ||
28 | fprintf(1,' The final solution is saved under ''Calib_Results.mat''.\n'); | ||
29 | fprintf(1,' For a description of the intrinsic camera model, refer to the reference:\n'); | ||
30 | fprintf(1,' "A Four-step Camera Calibration Procedure with implicit Image Correction"\n'); | ||
31 | fprintf(1,' Janne Heikkila and Olli Silven, Infotech Oulu and Department of EE\n'); | ||
32 | fprintf(1,' University of Oulu, Appeared in CVPR''97, Puerto Rico.\n'); | ||
33 | fprintf(1,' Visit http://www.ee.oulu.fi/~jth/calibr/Calibration.html\n'); | ||
34 | fprintf(1,' Automatically launchs the next step (Graphic out).\n'); | ||
35 | fprintf(1,'5- Graphic out: Generates the graphical output associated to the current calibration solution.\n'); | ||
36 | fprintf(1,' It shows the 3D locations of the grids, and reprojects the 3D patterns on the\n'); | ||
37 | fprintf(1,' original calibration images.\n'); | ||
38 | fprintf(1,'6- sol. with center: Lets the user select the calibration solution with computed principal point.\n'); | ||
39 | fprintf(1,' This is the default case (solution retained after Run calibration).\n'); | ||
40 | fprintf(1,' Automatically (re)generates the graphical output associated to that solution.\n'); | ||
41 | fprintf(1,'7- sol. without center: Lets the users select the calibration solution without computed principal point.\n'); | ||
42 | fprintf(1,' In that case, the principal point is assumed at the center of the image.\n'); | ||
43 | fprintf(1,' Automatically generates the graphical output associated to that solution.\n'); | ||
44 | fprintf(1,' This option is sometimes useful when the principal point is difficult to\n'); | ||
45 | fprintf(1,' estimate (in particular when the camera field of view is small).\n'); | ||
46 | fprintf(1,'8- Back to main: Goes back to the main calbration toolbox window.\n\n\n'); | ||
47 | |||
48 | end; | ||
49 | |||
50 | instructions3D = 0; | ||
51 | |||
52 | global X_1 x_1 X_2 x_2 X_3 x_3 X_4 x_4 X_5 x_5 X_6 x_6 X_7 x_7 X_8 x_8 X_9 x_9 X_10 x_10 X_11 x_11 X_12 x_12 X_13 x_13 X_14 x_14 X_15 x_15 X_16 x_16 X_17 x_17 X_18 x_18 X_19 x_19 X_20 x_20 X_21 x_21 X_22 x_22 X_23 x_23 X_24 x_24 X_25 x_25 X_26 x_26 X_27 x_27 X_28 x_28 X_29 x_29 X_30 x_30 | ||
53 | |||
54 | |||
55 | fig_number = 1; | ||
56 | |||
57 | n_row = 2; | ||
58 | n_col = 4; | ||
59 | |||
60 | string_list = cell(n_row,n_col); | ||
61 | callback_list = cell(n_row,n_col); | ||
62 | |||
63 | x_size = 85; | ||
64 | y_size = 20; | ||
65 | |||
66 | title_figure = 'Camera calibration tool (3D rig)'; | ||
67 | |||
68 | string_list{1,1} = 'Image names'; | ||
69 | string_list{1,2} = 'Read images'; | ||
70 | string_list{1,3} = 'Extract grid corners'; | ||
71 | string_list{1,4} = 'Run calibration'; | ||
72 | string_list{2,1} = 'Graphic out'; | ||
73 | string_list{2,2} = 'sol. with center'; | ||
74 | string_list{2,3} = 'sol. without center'; | ||
75 | string_list{2,4} = 'Back to main'; | ||
76 | |||
77 | callback_list{1,1} = 'data_calib;'; | ||
78 | callback_list{1,2} = 'ima_read_calib;'; | ||
79 | callback_list{1,3} = 'click_calib3D;'; | ||
80 | callback_list{1,4} = 'go_calib_optim3D;'; | ||
81 | callback_list{2,1} = 'graphout_calib3D;'; | ||
82 | callback_list{2,2} = 'select_sol_with_center3D;'; | ||
83 | callback_list{2,3} = 'select_sol_no_center3D;'; | ||
84 | callback_list{2,4} = 'calib;'; | ||
85 | |||
86 | |||
87 | figure(fig_number); clf; | ||
88 | pos = get(fig_number,'Position'); | ||
89 | |||
90 | fig_size_x = x_size*n_col+(n_col+1)*2; | ||
91 | fig_size_y = y_size*n_row+(n_row+1)*2; | ||
92 | |||
93 | set(fig_number,'Units','points', ... | ||
94 | 'BackingStore','off', ... | ||
95 | 'Color',[0.8 0.8 0.8], ... | ||
96 | 'MenuBar','none', ... | ||
97 | 'Resize','off', ... | ||
98 | 'Name',title_figure, ... | ||
99 | 'Position',[pos(1) pos(2) fig_size_x fig_size_y], ... | ||
100 | 'NumberTitle','off'); | ||
101 | |||
102 | |||
103 | for i=n_row:-1:1, | ||
104 | for j = n_col:-1:1, | ||
105 | if (~isempty(callback_list{i,j}))&(~isempty(string_list{i,j})), | ||
106 | uicontrol('Parent',fig_number, ... | ||
107 | 'Units','points', ... | ||
108 | 'Callback',callback_list{i,j}, ... | ||
109 | 'ListboxTop',0, ... | ||
110 | 'Position',[(2+(j-1)*(x_size+2)) (fig_size_y - i*(2+y_size)) x_size y_size], ... | ||
111 | 'String',string_list{i,j}, ... | ||
112 | 'Tag','Pushbutton1'); | ||
113 | end; | ||
114 | end; | ||
115 | end; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/calib_gui.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/calib_gui.m new file mode 100755 index 0000000..62a45dd --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/calib_gui.m | |||
@@ -0,0 +1,81 @@ | |||
1 | fig_number = 1; | ||
2 | |||
3 | n_row = 5; | ||
4 | n_col = 4; | ||
5 | |||
6 | string_list = cell(n_row,n_col); | ||
7 | callback_list = cell(n_row,n_col); | ||
8 | |||
9 | x_size = 85; | ||
10 | y_size = 20; | ||
11 | |||
12 | title_figure = 'Camera calibration tool (2D rig)'; | ||
13 | |||
14 | string_list{1,1} = 'Image names'; | ||
15 | string_list{1,2} = 'Read images'; | ||
16 | string_list{1,3} = 'Extract grid corners'; | ||
17 | %string_list{1,4} = 'Initialization'; | ||
18 | string_list{1,4} = 'Calibration'; | ||
19 | string_list{2,1} = 'Show Extrinsic'; | ||
20 | string_list{2,2} = 'Reproject on images'; | ||
21 | string_list{2,3} = 'Analyse error'; | ||
22 | string_list{2,4} = 'Recomp. corners'; | ||
23 | string_list{3,1} = 'Add/Suppress images'; | ||
24 | string_list{3,2} = 'Save'; | ||
25 | string_list{3,3} = 'Load'; | ||
26 | string_list{3,4} = 'Exit'; | ||
27 | |||
28 | string_list{5,1} = 'Comp. Extrinsic'; | ||
29 | string_list{5,2} = 'Undistort image'; | ||
30 | |||
31 | |||
32 | callback_list{1,1} = 'data_calib;'; | ||
33 | callback_list{1,2} = 'ima_read_calib;'; | ||
34 | callback_list{1,3} = 'click_calib;'; | ||
35 | %callback_list{1,4} = 'init_calib_param;'; | ||
36 | callback_list{1,4} = 'go_calib_optim;'; | ||
37 | callback_list{2,1} = 'ext_calib;'; | ||
38 | callback_list{2,2} = 'reproject_calib;'; | ||
39 | callback_list{2,3} = 'analyse_error;'; | ||
40 | callback_list{2,4} = 'recomp_corner_calib;'; | ||
41 | callback_list{3,1} = 'add_suppress;'; | ||
42 | callback_list{3,2} = 'saving_calib;'; | ||
43 | callback_list{3,3} = 'loading_calib;'; | ||
44 | callback_list{3,4} = ['disp(''Bye. To run again, type calib_gui.''); close(' num2str(fig_number) ');']; | ||
45 | |||
46 | callback_list{5,1} = 'extrinsic_computation;'; | ||
47 | callback_list{5,2} = 'undistort_image;'; | ||
48 | |||
49 | |||
50 | figure(fig_number); clf; | ||
51 | pos = get(fig_number,'Position'); | ||
52 | |||
53 | fig_size_x = x_size*n_col+(n_col+1)*2; | ||
54 | fig_size_y = y_size*n_row+(n_row+1)*2; | ||
55 | |||
56 | set(fig_number,'Units','points', ... | ||
57 | 'BackingStore','off', ... | ||
58 | 'Color',[0.8 0.8 0.8], ... | ||
59 | 'MenuBar','none', ... | ||
60 | 'Resize','off', ... | ||
61 | 'Name',title_figure, ... | ||
62 | 'Position',[pos(1) pos(2) fig_size_x fig_size_y], ... | ||
63 | 'NumberTitle','off'); %,'WindowButtonMotionFcn',['figure(' num2str(fig_number) ');']); | ||
64 | |||
65 | |||
66 | for i=n_row:-1:1, | ||
67 | for j = n_col:-1:1, | ||
68 | if (~isempty(callback_list{i,j}))&(~isempty(string_list{i,j})), | ||
69 | uicontrol('Parent',fig_number, ... | ||
70 | 'Units','points', ... | ||
71 | 'Callback',callback_list{i,j}, ... | ||
72 | 'ListboxTop',0, ... | ||
73 | 'Position',[(2+(j-1)*(x_size+2)) (fig_size_y - i*(2+y_size)) x_size y_size], ... | ||
74 | 'String',string_list{i,j}, ... | ||
75 | 'Tag','Pushbutton1'); | ||
76 | end; | ||
77 | end; | ||
78 | end; | ||
79 | |||
80 | |||
81 | clear callback_list string_list fig_number fig_size_x fig_size_y i j n_col n_row pos string_list title_figure x_size y_size | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/check_active_images.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/check_active_images.m new file mode 100755 index 0000000..4f09b62 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/check_active_images.m | |||
@@ -0,0 +1,14 @@ | |||
1 | |||
2 | if ~exist('active_images'), | ||
3 | active_images = ones(1,n_ima); | ||
4 | end; | ||
5 | n_act = length(active_images); | ||
6 | if n_act < n_ima, | ||
7 | active_images = [active_images ones(1,n_ima-n_act)]; | ||
8 | else | ||
9 | if n_act > n_ima, | ||
10 | active_images = active_images(1:n_ima); | ||
11 | end; | ||
12 | end; | ||
13 | |||
14 | ind_active = find(active_images); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/check_convergence.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/check_convergence.m new file mode 100755 index 0000000..8602c39 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/check_convergence.m | |||
@@ -0,0 +1,17 @@ | |||
1 | %%% Replay the set of solution vectors: | ||
2 | |||
3 | N_iter = size(param_list,2); | ||
4 | |||
5 | for nn = 1:N_iter, | ||
6 | |||
7 | solution = param_list(:,nn); | ||
8 | |||
9 | extract_parameters; | ||
10 | comp_error_calib; | ||
11 | |||
12 | ext_calib; | ||
13 | |||
14 | drawnow; | ||
15 | |||
16 | |||
17 | end; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/check_planarity.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/check_planarity.m new file mode 100755 index 0000000..be0410b --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/check_planarity.m | |||
@@ -0,0 +1,41 @@ | |||
1 | % Check the planarity of a structure: | ||
2 | |||
3 | X = X_1; | ||
4 | N = size(X,2); | ||
5 | |||
6 | %X(3,:) = 0.1*randn(1,N); | ||
7 | |||
8 | om = rand(3,1); | ||
9 | T = 10*rand(3,1); | ||
10 | R = rodrigues(om); | ||
11 | |||
12 | X = R * X + T*ones(1,N); | ||
13 | |||
14 | |||
15 | |||
16 | |||
17 | |||
18 | |||
19 | N = size(X,2); | ||
20 | X_mean = mean(X')'; | ||
21 | |||
22 | Y = X - (X_mean*ones(1,N)); | ||
23 | |||
24 | YY = Y*Y'; | ||
25 | |||
26 | [U,S,V] = svd(YY); | ||
27 | |||
28 | r = S(3,3)/S(2,2); | ||
29 | |||
30 | % if r is less than 1e-4: | ||
31 | |||
32 | R_transform = V'; | ||
33 | T_transform = -(V')*X_mean; | ||
34 | |||
35 | |||
36 | % Thresh for r: 1e-4 | ||
37 | |||
38 | X_new = R_transform*X + T_transform*ones(1,N); | ||
39 | |||
40 | |||
41 | % If Xc = Rc * X_new + Tc, then Xc = Rc * R_transform * X + Tc + T_transform | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/click_calib.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/click_calib.m new file mode 100755 index 0000000..047cc7b --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/click_calib.m | |||
@@ -0,0 +1,99 @@ | |||
1 | |||
2 | if ~exist('I_1'), | ||
3 | ima_read_calib; | ||
4 | if no_image_file, | ||
5 | disp('Cannot extract corners without images'); | ||
6 | return; | ||
7 | end; | ||
8 | end; | ||
9 | |||
10 | check_active_images; | ||
11 | |||
12 | %wintx = 10; % neigborhood of integration for | ||
13 | %winty = 10; % the corner finder | ||
14 | |||
15 | fprintf(1,'\nExtraction of the grid corners on the images\n'); | ||
16 | |||
17 | disp('Window size for corner finder (wintx and winty):'); | ||
18 | wintx = input('wintx ([] = 5) = '); | ||
19 | if isempty(wintx), wintx = 5; end; | ||
20 | wintx = round(wintx); | ||
21 | winty = input('winty ([] = 5) = '); | ||
22 | if isempty(winty), winty = 5; end; | ||
23 | winty = round(winty); | ||
24 | |||
25 | fprintf(1,'Window size = %dx%d\n',2*wintx+1,2*winty+1); | ||
26 | |||
27 | if ~exist('map'), map = gray(256); end; | ||
28 | |||
29 | |||
30 | disp('WARNING!!! Do not forget to change dX_default and dY_default in click_calib.m!!!') | ||
31 | |||
32 | |||
33 | % Default size of the pattern squares; | ||
34 | |||
35 | % Setup of JY (old at Caltech) | ||
36 | dX_default = 21.9250/11; | ||
37 | dY_default = 18.1250/9; | ||
38 | |||
39 | % Setup of JY (new at Intel) | ||
40 | dX_default = 1.9750; | ||
41 | dY_default = 1.9865; | ||
42 | |||
43 | |||
44 | % Setup of Luis and Enrico | ||
45 | dX_default = 67.7/16; | ||
46 | dY_default = 50.65/12; | ||
47 | |||
48 | |||
49 | % Setup of German | ||
50 | dX_default = 10.16; | ||
51 | dY_default = 10.16; | ||
52 | |||
53 | % Setup of JY (new at Intel) | ||
54 | dX_default = 1.9750*2.54; | ||
55 | dY_default = 1.9865*2.54; | ||
56 | |||
57 | % Setup of JY - 3D calibration rig at Intel (new at Intel) | ||
58 | dX_default = 3; | ||
59 | dY_default = 3; | ||
60 | |||
61 | % Useful option to add images: | ||
62 | kk_first = input('Start image number ([]=1=first): '); | ||
63 | |||
64 | if isempty(kk_first), kk_first = 1; end; | ||
65 | |||
66 | for kk = kk_first:n_ima, | ||
67 | if active_images(kk), | ||
68 | click_ima_calib; | ||
69 | else | ||
70 | eval(['dX_' num2str(kk) ' = NaN;']); | ||
71 | eval(['dY_' num2str(kk) ' = NaN;']); | ||
72 | |||
73 | eval(['wintx_' num2str(kk) ' = NaN;']); | ||
74 | eval(['winty_' num2str(kk) ' = NaN;']); | ||
75 | |||
76 | eval(['x_' num2str(kk) ' = NaN*ones(2,1);']); | ||
77 | eval(['X_' num2str(kk) ' = NaN*ones(3,1);']); | ||
78 | |||
79 | eval(['n_sq_x_' num2str(kk) ' = NaN;']); | ||
80 | eval(['n_sq_y_' num2str(kk) ' = NaN;']); | ||
81 | end; | ||
82 | end; | ||
83 | |||
84 | |||
85 | |||
86 | string_save = 'save calib_data active_images ind_active wintx winty n_ima type_numbering N_slots first_num image_numbers format_image calib_name Hcal Wcal nx ny map dX_default dY_default dX dY'; | ||
87 | |||
88 | for kk = 1:n_ima, | ||
89 | string_save = [string_save ' X_' num2str(kk) ' x_' num2str(kk) ' n_sq_x_' num2str(kk) ' n_sq_y_' num2str(kk) ' wintx_' num2str(kk) ' winty_' num2str(kk) ' dX_' num2str(kk) ' dY_' num2str(kk)]; | ||
90 | end; | ||
91 | |||
92 | eval(string_save); | ||
93 | |||
94 | disp('done'); | ||
95 | |||
96 | return; | ||
97 | |||
98 | go_calib_optim; | ||
99 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/click_calib3D.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/click_calib3D.m new file mode 100755 index 0000000..e761cd1 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/click_calib3D.m | |||
@@ -0,0 +1,79 @@ | |||
1 | |||
2 | if ~exist('I_1'), | ||
3 | ima_read_calib; | ||
4 | if no_image_file, | ||
5 | disp('Cannot extract corners without images'); | ||
6 | return; | ||
7 | end; | ||
8 | end; | ||
9 | |||
10 | %wintx = 10; % neigborhood of integration for | ||
11 | %winty = 10; % the corner finder | ||
12 | |||
13 | fprintf(1,'\nExtraction of the grid corners on the images\n'); | ||
14 | |||
15 | disp('Window size for corner finder (wintx and winty):'); | ||
16 | wintx = input('wintx ([] = 5) = '); | ||
17 | if isempty(wintx), wintx = 5; end; | ||
18 | wintx = round(wintx); | ||
19 | winty = input('winty ([] = 5) = '); | ||
20 | if isempty(winty), winty = 5; end; | ||
21 | winty = round(winty); | ||
22 | |||
23 | |||
24 | fprintf(1,'Window size = %dx%d\n',2*wintx+1,2*winty+1); | ||
25 | |||
26 | |||
27 | disp('WARNNG!!! Do not forget to change dX_default and dY_default in click_calib.m!!!') | ||
28 | |||
29 | |||
30 | % Default size of the pattern squares; | ||
31 | |||
32 | % Setup of JY (old at Caltech) | ||
33 | dX_default = 21.9250/11; | ||
34 | dY_default = 18.1250/9; | ||
35 | |||
36 | % Setup of JY (new at Intel) | ||
37 | dX_default = 1.9750; | ||
38 | dY_default = 1.9865; | ||
39 | |||
40 | |||
41 | % Setup of Luis and Enrico | ||
42 | dX_default = 67.7/16; | ||
43 | dY_default = 50.65/12; | ||
44 | |||
45 | |||
46 | % Setup of German | ||
47 | dX_default = 10.16; | ||
48 | dY_default = 10.16; | ||
49 | |||
50 | % Setup of JY (new at Intel) | ||
51 | dX_default = 1.9750*2.54; | ||
52 | dY_default = 1.9865*2.54; | ||
53 | |||
54 | |||
55 | % Setup of JY - 3D calibration rig at Intel (new at Intel) | ||
56 | dX_default = 3; | ||
57 | dY_default = 3; | ||
58 | |||
59 | % Useful option to add images: | ||
60 | kk_first = input('Start image number ([]=1=first): '); | ||
61 | |||
62 | if isempty(kk_first), kk_first = 1; end; | ||
63 | |||
64 | for kk = kk_first:n_ima, | ||
65 | click_ima_calib3D; %Simple version | ||
66 | %init_calib; %advanced vesion (more messy) | ||
67 | end; | ||
68 | |||
69 | |||
70 | |||
71 | string_save = 'save calib_data wintx winty n_ima type_numbering N_slots first_num image_numbers format_image calib_name Hcal Wcal nx ny map dX_default dY_default dX dY'; | ||
72 | |||
73 | for kk = 1:n_ima, | ||
74 | string_save = [string_save ' X_' num2str(kk) ' x_' num2str(kk) ' Hl_' num2str(kk) ' nl_sq_x_' num2str(kk) ' nl_sq_y_' num2str(kk) ' Hr_' num2str(kk) ' nr_sq_x_' num2str(kk) ' nr_sq_y_' num2str(kk)]; | ||
75 | end; | ||
76 | |||
77 | eval(string_save); | ||
78 | |||
79 | go_calib_optim3D; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/click_ima_calib.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/click_ima_calib.m new file mode 100755 index 0000000..5197870 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/click_ima_calib.m | |||
@@ -0,0 +1,218 @@ | |||
1 | % Cleaned-up version of init_calib.m | ||
2 | |||
3 | fprintf(1,'\nProcessing image %d...\n',kk); | ||
4 | |||
5 | eval(['I = I_' num2str(kk) ';']); | ||
6 | |||
7 | figure(2); | ||
8 | image(I); | ||
9 | colormap(map); | ||
10 | |||
11 | title(['Click on the four extreme corners of the rectangular pattern... Image ' num2str(kk)]); | ||
12 | |||
13 | disp('Click on the four extreme corners of the rectangular complete pattern...'); | ||
14 | |||
15 | [x,y] = ginput3(4); | ||
16 | |||
17 | [Xc,good,bad,type] = cornerfinder([x';y'],I,winty,wintx); % the four corners | ||
18 | |||
19 | x = Xc(1,:)'; | ||
20 | y = Xc(2,:)'; | ||
21 | |||
22 | [y,indy] = sort(y); | ||
23 | x = x(indy); | ||
24 | |||
25 | if (x(2) > x(1)), | ||
26 | x4 = x(1);y4 = y(1); x3 = x(2); y3 = y(2); | ||
27 | else | ||
28 | x4 = x(2);y4 = y(2); x3 = x(1); y3 = y(1); | ||
29 | end; | ||
30 | if (x(3) > x(4)), | ||
31 | x2 = x(3);y2 = y(3); x1 = x(4); y1 = y(4); | ||
32 | else | ||
33 | x2 = x(4);y2 = y(4); x1 = x(3); y1 = y(3); | ||
34 | end; | ||
35 | |||
36 | x = [x1;x2;x3;x4]; | ||
37 | y = [y1;y2;y3;y4]; | ||
38 | |||
39 | |||
40 | figure(2); hold on; | ||
41 | plot([x;x(1)],[y;y(1)],'g-'); | ||
42 | plot(x,y,'og'); | ||
43 | hx=text((x(4)+x(3))/2,(y(4)+y(3))/2 - 20,'X'); | ||
44 | set(hx,'color','g','Fontsize',14); | ||
45 | hy=text((x(4)+x(1))/2-20,(y(4)+y(1))/2,'Y'); | ||
46 | set(hy,'color','g','Fontsize',14); | ||
47 | hold off; | ||
48 | |||
49 | |||
50 | % Try to automatically count the number of squares in the grid | ||
51 | |||
52 | n_sq_x1 = count_squares(I,x1,y1,x2,y2,wintx); | ||
53 | n_sq_x2 = count_squares(I,x3,y3,x4,y4,wintx); | ||
54 | n_sq_y1 = count_squares(I,x2,y2,x3,y3,wintx); | ||
55 | n_sq_y2 = count_squares(I,x4,y4,x1,y1,wintx); | ||
56 | |||
57 | |||
58 | |||
59 | % If could not count the number of squares, enter manually | ||
60 | |||
61 | if (n_sq_x1~=n_sq_x2)|(n_sq_y1~=n_sq_y2), | ||
62 | |||
63 | |||
64 | disp('Could not count the number of squares in the grid. Enter manually.'); | ||
65 | n_sq_x = input('Number of squares along the X direction ([]=10) = '); %6 | ||
66 | if isempty(n_sq_x), n_sq_x = 10; end; | ||
67 | n_sq_y = input('Number of squares along the Y direction ([]=10) = '); %6 | ||
68 | if isempty(n_sq_y), n_sq_y = 10; end; | ||
69 | |||
70 | else | ||
71 | |||
72 | n_sq_x = n_sq_x1; | ||
73 | n_sq_y = n_sq_y1; | ||
74 | |||
75 | end; | ||
76 | |||
77 | |||
78 | % Enter the size of each square | ||
79 | |||
80 | dX = input(['Size dX of each square along the X direction ([]=' num2str(dX_default) 'cm) = ']); | ||
81 | dY = input(['Size dY of each square along the Y direction ([]=' num2str(dY_default) 'cm) = ']); | ||
82 | if isempty(dX), dX = dX_default; else dX_default = dX; end; | ||
83 | if isempty(dY), dY = dY_default; else dY_default = dY; end; | ||
84 | |||
85 | % Compute the inside points through computation of the planar homography (collineation) | ||
86 | |||
87 | a00 = [x(1);y(1);1]; | ||
88 | a10 = [x(2);y(2);1]; | ||
89 | a11 = [x(3);y(3);1]; | ||
90 | a01 = [x(4);y(4);1]; | ||
91 | |||
92 | |||
93 | % Compute the planar collineation: (return the normalization matrix as well) | ||
94 | |||
95 | [Homo,Hnorm,inv_Hnorm] = compute_homography ([a00 a10 a11 a01],[0 1 1 0;0 0 1 1;1 1 1 1]); | ||
96 | |||
97 | |||
98 | % Build the grid using the planar collineation: | ||
99 | |||
100 | x_l = ((0:n_sq_x)'*ones(1,n_sq_y+1))/n_sq_x; | ||
101 | y_l = (ones(n_sq_x+1,1)*(0:n_sq_y))/n_sq_y; | ||
102 | pts = [x_l(:) y_l(:) ones((n_sq_x+1)*(n_sq_y+1),1)]'; | ||
103 | |||
104 | XX = Homo*pts; | ||
105 | XX = XX(1:2,:) ./ (ones(2,1)*XX(3,:)); | ||
106 | |||
107 | |||
108 | % Complete size of the rectangle | ||
109 | |||
110 | W = n_sq_x*dX; | ||
111 | L = n_sq_y*dY; | ||
112 | |||
113 | |||
114 | |||
115 | |||
116 | %%%%%%%%%%%%%%%%%%%%%%%% ADDITIONAL STUFF IN THE CASE OF HIGHLY DISTORTED IMAGES %%%%%%%%%%%%% | ||
117 | figure(2); | ||
118 | hold on; | ||
119 | plot(XX(1,:),XX(2,:),'r+'); | ||
120 | title('The red crosses should be close to the image corners'); | ||
121 | hold off; | ||
122 | |||
123 | disp('If the guessed grid corners (red crosses on the image) are not close to the actual corners,'); | ||
124 | disp('it is necessary to enter an initial guess for the radial distortion factor kc (useful for subpixel detection)'); | ||
125 | quest_distort = input('Need of an initial guess for distortion? ([]=no, other=yes) '); | ||
126 | |||
127 | quest_distort = ~isempty(quest_distort); | ||
128 | |||
129 | if quest_distort, | ||
130 | % Estimation of focal length: | ||
131 | c_g = [size(I,2);size(I,1)]/2 + .5; | ||
132 | f_g = Distor2Calib(0,[[x(1) x(2) x(4) x(3)] - c_g(1);[y(1) y(2) y(4) y(3)] - c_g(2)],1,1,4,W,L,[-W/2 W/2 W/2 -W/2;L/2 L/2 -L/2 -L/2; 0 0 0 0],100,1,1); | ||
133 | f_g = mean(f_g); | ||
134 | script_fit_distortion; | ||
135 | end; | ||
136 | %%%%%%%%%%%%%%%%%%%%% END ADDITIONAL STUFF IN THE CASE OF HIGHLY DISTORTED IMAGES %%%%%%%%%%%%% | ||
137 | |||
138 | |||
139 | |||
140 | |||
141 | |||
142 | Np = (n_sq_x+1)*(n_sq_y+1); | ||
143 | |||
144 | disp('Corner extraction...'); | ||
145 | |||
146 | grid_pts = cornerfinder(XX,I,winty,wintx); %%% Finds the exact corners at every points! | ||
147 | |||
148 | |||
149 | |||
150 | %save all_corners x y grid_pts | ||
151 | |||
152 | grid_pts = grid_pts - 1; % subtract 1 to bring the origin to (0,0) instead of (1,1) in matlab (not necessary in C) | ||
153 | |||
154 | |||
155 | % Global Homography from plane to pixel coordinates: | ||
156 | |||
157 | |||
158 | |||
159 | |||
160 | ind_corners = [1 n_sq_x+1 (n_sq_x+1)*n_sq_y+1 (n_sq_x+1)*(n_sq_y+1)]; % index of the 4 corners | ||
161 | ind_orig = (n_sq_x+1)*n_sq_y + 1; | ||
162 | xorig = grid_pts(1,ind_orig); | ||
163 | yorig = grid_pts(2,ind_orig); | ||
164 | dxpos = mean([grid_pts(:,ind_orig) grid_pts(:,ind_orig+1)]'); | ||
165 | dypos = mean([grid_pts(:,ind_orig) grid_pts(:,ind_orig-n_sq_x-1)]'); | ||
166 | |||
167 | |||
168 | x_box_kk = [grid_pts(1,:)-(wintx+.5);grid_pts(1,:)+(wintx+.5);grid_pts(1,:)+(wintx+.5);grid_pts(1,:)-(wintx+.5);grid_pts(1,:)-(wintx+.5)]; | ||
169 | y_box_kk = [grid_pts(2,:)-(winty+.5);grid_pts(2,:)-(winty+.5);grid_pts(2,:)+(winty+.5);grid_pts(2,:)+(winty+.5);grid_pts(2,:)-(winty+.5)]; | ||
170 | |||
171 | |||
172 | figure(3); | ||
173 | image(I); colormap(map); hold on; | ||
174 | plot(grid_pts(1,:)+1,grid_pts(2,:)+1,'r+'); | ||
175 | plot(x_box_kk+1,y_box_kk+1,'-b'); | ||
176 | plot(grid_pts(1,ind_corners)+1,grid_pts(2,ind_corners)+1,'mo'); | ||
177 | plot(xorig+1,yorig+1,'*m'); | ||
178 | h = text(xorig-15,yorig-15,'O'); | ||
179 | set(h,'Color','m','FontSize',14); | ||
180 | h2 = text(dxpos(1)-10,dxpos(2)-10,'dX'); | ||
181 | set(h2,'Color','g','FontSize',14); | ||
182 | h3 = text(dypos(1)-25,dypos(2)-3,'dY'); | ||
183 | set(h3,'Color','g','FontSize',14); | ||
184 | xlabel('Xc (in camera frame)'); | ||
185 | ylabel('Yc (in camera frame)'); | ||
186 | title('Extracted corners'); | ||
187 | zoom on; | ||
188 | drawnow; | ||
189 | hold off; | ||
190 | |||
191 | |||
192 | Xi = reshape(([0:n_sq_x]*dX)'*ones(1,n_sq_y+1),Np,1)'; | ||
193 | Yi = reshape(ones(n_sq_x+1,1)*[n_sq_y:-1:0]*dY,Np,1)'; | ||
194 | Zi = zeros(1,Np); | ||
195 | |||
196 | Xgrid = [Xi;Yi;Zi]; | ||
197 | |||
198 | |||
199 | % All the point coordinates (on the image, and in 3D) - for global optimization: | ||
200 | |||
201 | x = grid_pts; | ||
202 | X = Xgrid; | ||
203 | |||
204 | |||
205 | % Saves all the data into variables: | ||
206 | |||
207 | eval(['dX_' num2str(kk) ' = dX;']); | ||
208 | eval(['dY_' num2str(kk) ' = dY;']); | ||
209 | |||
210 | eval(['wintx_' num2str(kk) ' = wintx;']); | ||
211 | eval(['winty_' num2str(kk) ' = winty;']); | ||
212 | |||
213 | eval(['x_' num2str(kk) ' = x;']); | ||
214 | eval(['X_' num2str(kk) ' = X;']); | ||
215 | |||
216 | eval(['n_sq_x_' num2str(kk) ' = n_sq_x;']); | ||
217 | eval(['n_sq_y_' num2str(kk) ' = n_sq_y;']); | ||
218 | \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/click_ima_calib3D.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/click_ima_calib3D.m new file mode 100755 index 0000000..7718268 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/click_ima_calib3D.m | |||
@@ -0,0 +1,482 @@ | |||
1 | % Cleaned-up version of init_calib.m | ||
2 | |||
3 | eval(['I = I_' num2str(kk) ';']); | ||
4 | |||
5 | figure(2); | ||
6 | image(I); | ||
7 | colormap(map); | ||
8 | |||
9 | |||
10 | |||
11 | |||
12 | |||
13 | %%%%%%%%%%%%%%%%%%%%%%%%% LEFT PATTERN ACQUISITION %%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||
14 | |||
15 | |||
16 | |||
17 | title(['Click on the four extreme corners of the left rectangular pattern... Image ' num2str(kk)]); | ||
18 | |||
19 | disp('Click on the four extreme corners of the left rectangular pattern...'); | ||
20 | |||
21 | [x,y] = ginput3(4); | ||
22 | |||
23 | [Xc,good,bad,type] = cornerfinder([x';y'],I,winty,wintx); % the four corners | ||
24 | |||
25 | x = Xc(1,:)'; | ||
26 | y = Xc(2,:)'; | ||
27 | |||
28 | [y,indy] = sort(y); | ||
29 | x = x(indy); | ||
30 | |||
31 | if (x(2) > x(1)), | ||
32 | x4 = x(1);y4 = y(1); x3 = x(2); y3 = y(2); | ||
33 | else | ||
34 | x4 = x(2);y4 = y(2); x3 = x(1); y3 = y(1); | ||
35 | end; | ||
36 | if (x(3) > x(4)), | ||
37 | x2 = x(3);y2 = y(3); x1 = x(4); y1 = y(4); | ||
38 | else | ||
39 | x2 = x(4);y2 = y(4); x1 = x(3); y1 = y(3); | ||
40 | end; | ||
41 | |||
42 | x = [x1;x2;x3;x4]; | ||
43 | y = [y1;y2;y3;y4]; | ||
44 | |||
45 | |||
46 | figure(2); hold on; | ||
47 | plot([x;x(1)],[y;y(1)],'g-'); | ||
48 | plot(x,y,'og'); | ||
49 | hx=text((x(4)+x(3))/2,(y(4)+y(3))/2 - 20,'X'); | ||
50 | set(hx,'color','g','Fontsize',14); | ||
51 | hy=text((x(4)+x(1))/2-20,(y(4)+y(1))/2,'Y'); | ||
52 | set(hy,'color','g','Fontsize',14); | ||
53 | hold off; | ||
54 | |||
55 | drawnow; | ||
56 | |||
57 | |||
58 | % Try to automatically count the number of squares in the grid | ||
59 | |||
60 | n_sq_x1 = count_squares(I,x1,y1,x2,y2,wintx); | ||
61 | n_sq_x2 = count_squares(I,x3,y3,x4,y4,wintx); | ||
62 | n_sq_y1 = count_squares(I,x2,y2,x3,y3,wintx); | ||
63 | n_sq_y2 = count_squares(I,x4,y4,x1,y1,wintx); | ||
64 | |||
65 | |||
66 | |||
67 | % If could not count the number of squares, enter manually | ||
68 | |||
69 | if (n_sq_x1~=n_sq_x2)|(n_sq_y1~=n_sq_y2), | ||
70 | |||
71 | |||
72 | disp('Could not count the number of squares in the grid. Enter manually.'); | ||
73 | n_sq_x = input('Number of squares along the X direction ([]=10) = '); %6 | ||
74 | if isempty(n_sq_x), n_sq_x = 10; end; | ||
75 | n_sq_y = input('Number of squares along the Y direction ([]=10) = '); %6 | ||
76 | if isempty(n_sq_y), n_sq_y = 10; end; | ||
77 | |||
78 | else | ||
79 | |||
80 | n_sq_x = n_sq_x1; | ||
81 | n_sq_y = n_sq_y1; | ||
82 | |||
83 | end; | ||
84 | |||
85 | |||
86 | if 1, | ||
87 | % Enter the size of each square | ||
88 | |||
89 | dX = input(['Size dX of each square along the X direction ([]=' num2str(dX_default) 'cm) = ']); | ||
90 | dY = input(['Size dY of each square along the Y direction ([]=' num2str(dY_default) 'cm) = ']); | ||
91 | if isempty(dX), dX = dX_default; else dX_default = dX; end; | ||
92 | if isempty(dY), dY = dY_default; else dY_default = dY; end; | ||
93 | |||
94 | else | ||
95 | |||
96 | dX = 3; | ||
97 | dY = 3; | ||
98 | |||
99 | end; | ||
100 | |||
101 | |||
102 | % Compute the inside points through computation of the planar homography (collineation) | ||
103 | |||
104 | a00 = [x(1);y(1);1]; | ||
105 | a10 = [x(2);y(2);1]; | ||
106 | a11 = [x(3);y(3);1]; | ||
107 | a01 = [x(4);y(4);1]; | ||
108 | |||
109 | |||
110 | % Compute the planart collineation: (return the normalization matrice as well) | ||
111 | |||
112 | [Homo,Hnorm,inv_Hnorm] = compute_collineation (a00, a10, a11, a01); | ||
113 | |||
114 | |||
115 | % Build the grid using the planar collineation: | ||
116 | |||
117 | x_l = ((0:n_sq_x)'*ones(1,n_sq_y+1))/n_sq_x; | ||
118 | y_l = (ones(n_sq_x+1,1)*(0:n_sq_y))/n_sq_y; | ||
119 | pts = [x_l(:) y_l(:) ones((n_sq_x+1)*(n_sq_y+1),1)]'; | ||
120 | |||
121 | XX = Homo*pts; | ||
122 | XX = XX(1:2,:) ./ (ones(2,1)*XX(3,:)); | ||
123 | |||
124 | |||
125 | % Complete size of the rectangle | ||
126 | |||
127 | W = n_sq_x*dX; | ||
128 | L = n_sq_y*dY; | ||
129 | |||
130 | |||
131 | |||
132 | if 1, | ||
133 | %%%%%%%%%%%%%%%%%%%%%%%% ADDITIONAL STUFF IN THE CASE OF HIGHLY DISTORTED IMAGES %%%%%%%%%%%%% | ||
134 | figure(2); | ||
135 | hold on; | ||
136 | plot(XX(1,:),XX(2,:),'r+'); | ||
137 | title('The red crosses should be close to the image corners'); | ||
138 | hold off; | ||
139 | |||
140 | disp('If the guessed grid corners (red crosses on the image) are not close to the actual corners,'); | ||
141 | disp('it is necessary to enter an initial guess for the radial distortion factor kc (useful for subpixel detection)'); | ||
142 | quest_distort = input('Need of an initial guess for distortion? ([]=no, other=yes) '); | ||
143 | |||
144 | quest_distort = ~isempty(quest_distort); | ||
145 | |||
146 | if quest_distort, | ||
147 | % Estimation of focal length: | ||
148 | c_g = [size(I,2);size(I,1)]/2 + .5; | ||
149 | f_g = Distor2Calib(0,[[x(1) x(2) x(4) x(3)] - c_g(1);[y(1) y(2) y(4) y(3)] - c_g(2)],1,1,4,W,L,[-W/2 W/2 W/2 -W/2;L/2 L/2 -L/2 -L/2; 0 0 0 0],100,1,1); | ||
150 | f_g = mean(f_g); | ||
151 | script_fit_distortion; | ||
152 | end; | ||
153 | %%%%%%%%%%%%%%%%%%%%% END ADDITIONAL STUFF IN THE CASE OF HIGHLY DISTORTED IMAGES %%%%%%%%%%%%% | ||
154 | end; | ||
155 | |||
156 | |||
157 | Np = (n_sq_x+1)*(n_sq_y+1); | ||
158 | |||
159 | disp('Corner extraction...'); | ||
160 | |||
161 | grid_pts = cornerfinder(XX,I,winty,wintx); %%% Finds the exact corners at every points! | ||
162 | |||
163 | %save all_corners x y grid_pts | ||
164 | |||
165 | grid_pts = grid_pts - 1; % subtract 1 to bring the origin to (0,0) instead of (1,1) in matlab (not necessary in C) | ||
166 | |||
167 | |||
168 | % Global Homography from plane to pixel coordinates: | ||
169 | |||
170 | H_total = [1 0 -1 ; 0 1 -1 ; 0 0 1]*Homo*[1 0 0;0 -1 1;0 0 1]*[1/W 0 0 ; 0 1/L 0; 0 0 1]; | ||
171 | % WARNING!!! the first matrix (on the left side) takes care of the transformation of the pixel cooredinates by -1 (previous line) | ||
172 | % If it is not done, then this matrix should not appear (in C) | ||
173 | H_total = H_total / H_total(3,3); | ||
174 | |||
175 | |||
176 | ind_corners = [1 n_sq_x+1 (n_sq_x+1)*n_sq_y+1 (n_sq_x+1)*(n_sq_y+1)]; % index of the 4 corners | ||
177 | ind_orig = (n_sq_x+1)*n_sq_y + 1; | ||
178 | xorig = grid_pts(1,ind_orig); | ||
179 | yorig = grid_pts(2,ind_orig); | ||
180 | dxpos = mean([grid_pts(:,ind_orig) grid_pts(:,ind_orig+1)]'); | ||
181 | dypos = mean([grid_pts(:,ind_orig) grid_pts(:,ind_orig-n_sq_x-1)]'); | ||
182 | |||
183 | |||
184 | x_box_kk = [grid_pts(1,:)-(wintx+.5);grid_pts(1,:)+(wintx+.5);grid_pts(1,:)+(wintx+.5);grid_pts(1,:)-(wintx+.5);grid_pts(1,:)-(wintx+.5)]; | ||
185 | y_box_kk = [grid_pts(2,:)-(winty+.5);grid_pts(2,:)-(winty+.5);grid_pts(2,:)+(winty+.5);grid_pts(2,:)+(winty+.5);grid_pts(2,:)-(winty+.5)]; | ||
186 | |||
187 | |||
188 | figure(3); | ||
189 | image(I); colormap(map); hold on; | ||
190 | plot(grid_pts(1,:)+1,grid_pts(2,:)+1,'r+'); | ||
191 | plot(x_box_kk+1,y_box_kk+1,'-b'); | ||
192 | plot(grid_pts(1,ind_corners)+1,grid_pts(2,ind_corners)+1,'mo'); | ||
193 | plot(xorig+1,yorig+1,'*m'); | ||
194 | h = text(xorig-15,yorig-15,'O'); | ||
195 | set(h,'Color','m','FontSize',14); | ||
196 | h2 = text(dxpos(1)-10,dxpos(2)-10,'dX'); | ||
197 | set(h2,'Color','g','FontSize',14); | ||
198 | h3 = text(dypos(1)-25,dypos(2)-3,'dY'); | ||
199 | set(h3,'Color','g','FontSize',14); | ||
200 | xlabel('Xc (in camera frame)'); | ||
201 | ylabel('Yc (in camera frame)'); | ||
202 | title('Extracted corners'); | ||
203 | zoom on; | ||
204 | drawnow; | ||
205 | hold off; | ||
206 | |||
207 | |||
208 | Xi = reshape(([0:n_sq_x]*dX)'*ones(1,n_sq_y+1),Np,1)'; | ||
209 | Yi = reshape(ones(n_sq_x+1,1)*[n_sq_y:-1:0]*dY,Np,1)'; | ||
210 | Zi = zeros(1,Np); | ||
211 | |||
212 | Xgrid = [Xi;Yi;Zi]; | ||
213 | |||
214 | |||
215 | % All the point coordinates (on the image, and in 3D) - for global optimization: | ||
216 | |||
217 | x = grid_pts; | ||
218 | X = Xgrid; | ||
219 | |||
220 | |||
221 | % The left pannel info: | ||
222 | |||
223 | xl = x; | ||
224 | Xl = X; | ||
225 | nl_sq_x = n_sq_x; | ||
226 | nl_sq_y = n_sq_y; | ||
227 | Hl = H_total; | ||
228 | |||
229 | |||
230 | |||
231 | |||
232 | |||
233 | |||
234 | %%%%%%%%%%%%%%%%%%%%%%%%% RIGHT PATTERN ACQUISITION %%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||
235 | |||
236 | |||
237 | x1 = a10(1)/a10(3); | ||
238 | x4 = a11(1)/a11(3); | ||
239 | |||
240 | y1 = a10(2)/a10(3); | ||
241 | y4 = a11(2)/a11(3); | ||
242 | |||
243 | |||
244 | figure(2); | ||
245 | hold on; | ||
246 | plot([x1 x4],[y1 y4],'c-'); | ||
247 | plot([x1 x4],[y1 y4],'co'); | ||
248 | hold off; | ||
249 | |||
250 | title(['Click on the two remaining extreme corners of the right rectangular pattern... Image ' num2str(kk)]); | ||
251 | |||
252 | disp('Click on the two remaining extreme corners of the right rectangular pattern...'); | ||
253 | |||
254 | [x,y] = ginput3(2); | ||
255 | |||
256 | [Xc,good,bad,type] = cornerfinder([x';y'],I,winty,wintx); % the four corners | ||
257 | |||
258 | x = Xc(1,:)'; | ||
259 | y = Xc(2,:)'; | ||
260 | |||
261 | [y,indy] = sort(y); | ||
262 | x = x(indy); | ||
263 | |||
264 | x2 = x(2); | ||
265 | x3 = x(1); | ||
266 | |||
267 | y2 = y(2); | ||
268 | y3 = y(1); | ||
269 | |||
270 | |||
271 | x = [x1;x2;x3;x4]; | ||
272 | y = [y1;y2;y3;y4]; | ||
273 | |||
274 | figure(2); hold on; | ||
275 | plot([x;x(1)],[y;y(1)],'c-'); | ||
276 | plot(x,y,'oc'); | ||
277 | hx=text((x(4)+x(3))/2,(y(4)+y(3))/2 - 20,'X'); | ||
278 | set(hx,'color','c','Fontsize',14); | ||
279 | hy=text((x(4)+x(1))/2-20,(y(4)+y(1))/2,'Y'); | ||
280 | set(hy,'color','c','Fontsize',14); | ||
281 | hold off; | ||
282 | drawnow; | ||
283 | |||
284 | |||
285 | % Try to automatically count the number of squares in the grid | ||
286 | |||
287 | n_sq_x1 = count_squares(I,x1,y1,x2,y2,wintx); | ||
288 | n_sq_x2 = count_squares(I,x3,y3,x4,y4,wintx); | ||
289 | n_sq_y1 = count_squares(I,x2,y2,x3,y3,wintx); | ||
290 | n_sq_y2 = count_squares(I,x4,y4,x1,y1,wintx); | ||
291 | |||
292 | |||
293 | |||
294 | % If could not count the number of squares, enter manually | ||
295 | |||
296 | if (n_sq_x1~=n_sq_x2)|(n_sq_y1~=n_sq_y2), | ||
297 | |||
298 | |||
299 | disp('Could not count the number of squares in the grid. Enter manually.'); | ||
300 | n_sq_x = input('Number of squares along the X direction ([]=10) = '); %6 | ||
301 | if isempty(n_sq_x), n_sq_x = 10; end; | ||
302 | n_sq_y = input('Number of squares along the Y direction ([]=10) = '); %6 | ||
303 | if isempty(n_sq_y), n_sq_y = 10; end; | ||
304 | |||
305 | else | ||
306 | |||
307 | n_sq_x = n_sq_x1; | ||
308 | n_sq_y = n_sq_y1; | ||
309 | |||
310 | end; | ||
311 | |||
312 | |||
313 | if 1, | ||
314 | % Enter the size of each square | ||
315 | |||
316 | dX = input(['Size dX of each square along the X direction ([]=' num2str(dX_default) 'cm) = ']); | ||
317 | dY = input(['Size dY of each square along the Y direction ([]=' num2str(dY_default) 'cm) = ']); | ||
318 | if isempty(dX), dX = dX_default; else dX_default = dX; end; | ||
319 | if isempty(dY), dY = dY_default; else dY_default = dY; end; | ||
320 | |||
321 | else | ||
322 | |||
323 | dX = 3; | ||
324 | dY = 3; | ||
325 | |||
326 | end; | ||
327 | |||
328 | |||
329 | % Compute the inside points through computation of the planar homography (collineation) | ||
330 | |||
331 | a00 = [x(1);y(1);1]; | ||
332 | a10 = [x(2);y(2);1]; | ||
333 | a11 = [x(3);y(3);1]; | ||
334 | a01 = [x(4);y(4);1]; | ||
335 | |||
336 | |||
337 | % Compute the planart collineation: (return the normalization matrice as well) | ||
338 | |||
339 | [Homo,Hnorm,inv_Hnorm] = compute_collineation (a00, a10, a11, a01); | ||
340 | |||
341 | |||
342 | % Build the grid using the planar collineation: | ||
343 | |||
344 | x_l = ((0:n_sq_x)'*ones(1,n_sq_y+1))/n_sq_x; | ||
345 | y_l = (ones(n_sq_x+1,1)*(0:n_sq_y))/n_sq_y; | ||
346 | pts = [x_l(:) y_l(:) ones((n_sq_x+1)*(n_sq_y+1),1)]'; | ||
347 | |||
348 | XX = Homo*pts; | ||
349 | XX = XX(1:2,:) ./ (ones(2,1)*XX(3,:)); | ||
350 | |||
351 | |||
352 | % Complete size of the rectangle | ||
353 | |||
354 | W = n_sq_x*dX; | ||
355 | L = n_sq_y*dY; | ||
356 | |||
357 | |||
358 | |||
359 | if 1, | ||
360 | %%%%%%%%%%%%%%%%%%%%%%%% ADDITIONAL STUFF IN THE CASE OF HIGHLY DISTORTED IMAGES %%%%%%%%%%%%% | ||
361 | figure(2); | ||
362 | hold on; | ||
363 | plot(XX(1,:),XX(2,:),'r+'); | ||
364 | title('The red crosses should be close to the image corners'); | ||
365 | hold off; | ||
366 | |||
367 | disp('If the guessed grid corners (red crosses on the image) are not close to the actual corners,'); | ||
368 | disp('it is necessary to enter an initial guess for the radial distortion factor kc (useful for subpixel detection)'); | ||
369 | quest_distort = input('Need of an initial guess for distortion? ([]=no, other=yes) '); | ||
370 | |||
371 | quest_distort = ~isempty(quest_distort); | ||
372 | |||
373 | if quest_distort, | ||
374 | % Estimation of focal length: | ||
375 | c_g = [size(I,2);size(I,1)]/2 + .5; | ||
376 | f_g = Distor2Calib(0,[[x(1) x(2) x(4) x(3)] - c_g(1);[y(1) y(2) y(4) y(3)] - c_g(2)],1,1,4,W,L,[-W/2 W/2 W/2 -W/2;L/2 L/2 -L/2 -L/2; 0 0 0 0],100,1,1); | ||
377 | f_g = mean(f_g); | ||
378 | script_fit_distortion; | ||
379 | end; | ||
380 | %%%%%%%%%%%%%%%%%%%%% END ADDITIONAL STUFF IN THE CASE OF HIGHLY DISTORTED IMAGES %%%%%%%%%%%%% | ||
381 | end; | ||
382 | |||
383 | |||
384 | Np = (n_sq_x+1)*(n_sq_y+1); | ||
385 | |||
386 | disp('Corner extraction...'); | ||
387 | |||
388 | grid_pts = cornerfinder(XX,I,winty,wintx); %%% Finds the exact corners at every points! | ||
389 | |||
390 | %save all_corners x y grid_pts | ||
391 | |||
392 | grid_pts = grid_pts - 1; % subtract 1 to bring the origin to (0,0) instead of (1,1) in matlab (not necessary in C) | ||
393 | |||
394 | |||
395 | % Global Homography from plane to pixel coordinates: | ||
396 | |||
397 | H_total = [1 0 -1 ; 0 1 -1 ; 0 0 1]*Homo*[1 0 0;0 -1 1;0 0 1]*[1/W 0 0 ; 0 1/L 0; 0 0 1]; | ||
398 | % WARNING!!! the first matrix (on the left side) takes care of the transformation of the pixel cooredinates by -1 (previous line) | ||
399 | % If it is not done, then this matrix should not appear (in C) | ||
400 | H_total = H_total / H_total(3,3); | ||
401 | |||
402 | |||
403 | ind_corners = [1 n_sq_x+1 (n_sq_x+1)*n_sq_y+1 (n_sq_x+1)*(n_sq_y+1)]; % index of the 4 corners | ||
404 | ind_orig = (n_sq_x+1)*n_sq_y + 1; | ||
405 | xorig = grid_pts(1,ind_orig); | ||
406 | yorig = grid_pts(2,ind_orig); | ||
407 | dxpos = mean([grid_pts(:,ind_orig) grid_pts(:,ind_orig+1)]'); | ||
408 | dypos = mean([grid_pts(:,ind_orig) grid_pts(:,ind_orig-n_sq_x-1)]'); | ||
409 | |||
410 | |||
411 | x_box_kk = [grid_pts(1,:)-(wintx+.5);grid_pts(1,:)+(wintx+.5);grid_pts(1,:)+(wintx+.5);grid_pts(1,:)-(wintx+.5);grid_pts(1,:)-(wintx+.5)]; | ||
412 | y_box_kk = [grid_pts(2,:)-(winty+.5);grid_pts(2,:)-(winty+.5);grid_pts(2,:)+(winty+.5);grid_pts(2,:)+(winty+.5);grid_pts(2,:)-(winty+.5)]; | ||
413 | |||
414 | |||
415 | figure(3); | ||
416 | hold on; | ||
417 | plot(grid_pts(1,:)+1,grid_pts(2,:)+1,'r+'); | ||
418 | plot(x_box_kk+1,y_box_kk+1,'-b'); | ||
419 | plot(grid_pts(1,ind_corners)+1,grid_pts(2,ind_corners)+1,'mo'); | ||
420 | plot(xorig+1,yorig+1,'*m'); | ||
421 | h = text(xorig-15,yorig-15,'O'); | ||
422 | set(h,'Color','m','FontSize',14); | ||
423 | h2 = text(dxpos(1)-10,dxpos(2)-10,'dX'); | ||
424 | set(h2,'Color','g','FontSize',14); | ||
425 | h3 = text(dypos(1)-25,dypos(2)-3,'dY'); | ||
426 | set(h3,'Color','g','FontSize',14); | ||
427 | xlabel('Xc (in camera frame)'); | ||
428 | ylabel('Yc (in camera frame)'); | ||
429 | title('Extracted corners'); | ||
430 | zoom on; | ||
431 | drawnow; | ||
432 | hold off; | ||
433 | |||
434 | |||
435 | Xi = reshape(([0:n_sq_x]*dX)'*ones(1,n_sq_y+1),Np,1)'; | ||
436 | Yi = reshape(ones(n_sq_x+1,1)*[n_sq_y:-1:0]*dY,Np,1)'; | ||
437 | Zi = zeros(1,Np); | ||
438 | |||
439 | Xgrid = [Xi;Yi;Zi]; | ||
440 | |||
441 | |||
442 | % All the point coordinates (on the image, and in 3D) - for global optimization: | ||
443 | |||
444 | x = grid_pts; | ||
445 | X = Xgrid; | ||
446 | |||
447 | |||
448 | % The right pannel info: | ||
449 | |||
450 | xr = x; | ||
451 | Xr = X; | ||
452 | nr_sq_x = n_sq_x; | ||
453 | nr_sq_y = n_sq_y; | ||
454 | Hr = H_total; | ||
455 | |||
456 | |||
457 | |||
458 | %%%%%%%% REGROUP THE LEFT AND RIHT PATTERNS %%%%%%%%%%%%% | ||
459 | |||
460 | |||
461 | Xr2 = [0 0 1;0 1 0;-1 0 0]*Xr + [dX*nl_sq_x;0;0]*ones(1,length(Xr)); | ||
462 | |||
463 | |||
464 | x = [xl xr]; | ||
465 | |||
466 | X = [Xl Xr2]; | ||
467 | |||
468 | |||
469 | |||
470 | eval(['x_' num2str(kk) ' = x;']); | ||
471 | eval(['X_' num2str(kk) ' = X;']); | ||
472 | |||
473 | eval(['nl_sq_x_' num2str(kk) ' = nl_sq_x;']); | ||
474 | eval(['nl_sq_y_' num2str(kk) ' = nl_sq_y;']); | ||
475 | |||
476 | eval(['nr_sq_x_' num2str(kk) ' = nr_sq_x;']); | ||
477 | eval(['nr_sq_y_' num2str(kk) ' = nr_sq_y;']); | ||
478 | |||
479 | % Save the global planar homography: | ||
480 | |||
481 | eval(['Hl_' num2str(kk) ' = Hl;']); | ||
482 | eval(['Hr_' num2str(kk) ' = Hr;']); \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/comp_distortion.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/comp_distortion.m new file mode 100755 index 0000000..a0f03de --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/comp_distortion.m | |||
@@ -0,0 +1,38 @@ | |||
1 | function [x_comp] = comp_distortion(x_dist,k2); | ||
2 | |||
3 | % [x_comp] = comp_distortion(x_dist,k2); | ||
4 | % | ||
5 | % compensates the radial distortion of the camera | ||
6 | % on the image plane. | ||
7 | % | ||
8 | % x_dist : the image points got without considering the | ||
9 | % radial distortion. | ||
10 | % x : The image plane points after correction for the distortion | ||
11 | % | ||
12 | % x and x_dist are 2xN arrays | ||
13 | % | ||
14 | % NOTE : This compensation has to be done after the substraction | ||
15 | % of the center of projection, and division by the focal | ||
16 | % length. | ||
17 | % | ||
18 | % (do it up to a second order approximation) | ||
19 | |||
20 | [two,N] = size(x_dist); | ||
21 | |||
22 | if (two ~= 2 ), | ||
23 | error('ERROR : The dimension of the points should be 2xN'); | ||
24 | end; | ||
25 | |||
26 | if length(k2) > 2, | ||
27 | [x_comp] = comp_distortion_oulu(x_dist,k2); | ||
28 | else | ||
29 | |||
30 | radius_2= x_dist(1,:).^2 + x_dist(2,:).^2; | ||
31 | radial_distortion = 1 + ones(2,1)*(k2 * radius_2); | ||
32 | radius_2_comp = (x_dist(1,:).^2 + x_dist(2,:).^2) ./ radial_distortion(1,:); | ||
33 | radial_distortion = 1 + ones(2,1)*(k2 * radius_2_comp); | ||
34 | x_comp = x_dist ./ radial_distortion; | ||
35 | |||
36 | end; | ||
37 | |||
38 | %% Function completely checked : It works fine !!! \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/comp_distortion2.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/comp_distortion2.m new file mode 100755 index 0000000..532ee9a --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/comp_distortion2.m | |||
@@ -0,0 +1,71 @@ | |||
1 | function [x_comp] = comp_distortion(x_dist,k2); | ||
2 | |||
3 | % [x_comp] = comp_distortion(x_dist,k2); | ||
4 | % | ||
5 | % compensates the radial distortion of the camera | ||
6 | % on the image plane. | ||
7 | % | ||
8 | % x_dist : the image points got without considering the | ||
9 | % radial distortion. | ||
10 | % k2: Radial distortion factor | ||
11 | % | ||
12 | % x : The image plane points after correction for the distortion | ||
13 | % | ||
14 | % x and x_dist are 2xN arrays | ||
15 | % | ||
16 | % NOTE : This compensation has to be done after the substraction | ||
17 | % of the center of projection, and division by the focal | ||
18 | % length. | ||
19 | % | ||
20 | % Solve for cubic roots using method from Numerical Recipes in C 2nd Ed. | ||
21 | % pages 184-185. | ||
22 | |||
23 | |||
24 | % California Institute of Technology | ||
25 | % (c) Jean-Yves Bouguet - April 27th, 1998 | ||
26 | |||
27 | % fully checked! JYB, april 27th, 1998 - 2am | ||
28 | |||
29 | if k2 ~= 0, | ||
30 | |||
31 | [two,N] = size(x_dist); | ||
32 | |||
33 | if (two ~= 2 ), | ||
34 | error('ERROR : The dimension of the points should be 2xN'); | ||
35 | end; | ||
36 | |||
37 | |||
38 | ph = atan2(x_dist(2,:),x_dist(1,:)); | ||
39 | |||
40 | Q = -1/(3*k2); | ||
41 | R = -x_dist(1,:)./(2*k2*cos(ph)); | ||
42 | |||
43 | R2 = R.^2; | ||
44 | Q3 = Q^3; | ||
45 | |||
46 | |||
47 | if k2 < 0, | ||
48 | |||
49 | % this works in all practical situations (it starts failing for very large | ||
50 | % values of k2) | ||
51 | |||
52 | th = acos(R./sqrt(Q3)); | ||
53 | r = -2*sqrt(Q)*cos((th-2*pi)/3); | ||
54 | |||
55 | else | ||
56 | |||
57 | % note: this always works, even for ridiculous values of k2 | ||
58 | |||
59 | A = (sqrt(R2-Q3)-R).^(1/3); | ||
60 | B = Q*(1./A); | ||
61 | r = (A+B); | ||
62 | |||
63 | end; | ||
64 | |||
65 | x_comp = [r.*cos(ph); r.*sin(ph)]; | ||
66 | |||
67 | else | ||
68 | |||
69 | x_comp = x_dist; | ||
70 | |||
71 | end; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/comp_distortion_oulu.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/comp_distortion_oulu.m new file mode 100755 index 0000000..67d02d5 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/comp_distortion_oulu.m | |||
@@ -0,0 +1,47 @@ | |||
1 | function [x] = comp_distortion_oulu(xd,k); | ||
2 | |||
3 | %comp_distortion_oulu.m | ||
4 | % | ||
5 | %[x] = comp_distortion_oulu(xd,k) | ||
6 | % | ||
7 | %Compensates for radial and tangential distortion. Model From Oulu university. | ||
8 | %For more informatino about the distortion model, check the forward projection mapping function: | ||
9 | %project_points.m | ||
10 | % | ||
11 | %INPUT: xd: distorted (normalized) point coordinates in the image plane (2xN matrix) | ||
12 | % k: Distortion coefficients (radial and tangential) (4x1 vector) | ||
13 | % | ||
14 | %OUTPUT: x: undistorted (normalized) point coordinates in the image plane (2xN matrix) | ||
15 | % | ||
16 | %Method: Iterative method for compensation. | ||
17 | % | ||
18 | %NOTE: This compensation has to be done after the subtraction | ||
19 | % of the principal point, and division by the focal length. | ||
20 | |||
21 | |||
22 | if length(k) < 4, | ||
23 | |||
24 | [x] = comp_distortion(xd,k); | ||
25 | |||
26 | else | ||
27 | |||
28 | |||
29 | k1 = k(1); | ||
30 | k2 = k(2); | ||
31 | p1 = k(3); | ||
32 | p2 = k(4); | ||
33 | |||
34 | x = xd; % initial guess | ||
35 | |||
36 | for kk=1:5; | ||
37 | |||
38 | r_2 = sum(x.^2); | ||
39 | k_radial = 1 + k1 * r_2 + k2 * r_2.^2; | ||
40 | delta_x = [2*p1*x(1,:).*x(2,:) + p2*(r_2 + 2*x(1,:).^2) ; | ||
41 | p1 * (r_2 + 2*x(2,:).^2)+2*p2*x(1,:).*x(2,:)]; | ||
42 | x = (xd - delta_x)./(ones(2,1)*k_radial); | ||
43 | |||
44 | end; | ||
45 | |||
46 | end; | ||
47 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/comp_error_calib.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/comp_error_calib.m new file mode 100755 index 0000000..f8d6fde --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/comp_error_calib.m | |||
@@ -0,0 +1,40 @@ | |||
1 | %%%%%%%%%%%%%%%%%%%% RECOMPUTES THE REPROJECTION ERROR %%%%%%%%%%%%%%%%%%%%%%%% | ||
2 | |||
3 | check_active_images; | ||
4 | |||
5 | % Reproject the patterns on the images, and compute the pixel errors: | ||
6 | |||
7 | ex = []; % Global error vector | ||
8 | x = []; % Detected corners on the image plane | ||
9 | y = []; % Reprojected points | ||
10 | |||
11 | for kk = 1:n_ima, | ||
12 | |||
13 | eval(['omckk = omc_' num2str(kk) ';']); | ||
14 | eval(['Tckk = Tc_' num2str(kk) ';']); | ||
15 | |||
16 | if active_images(kk) & (~isnan(omckk(1,1))), | ||
17 | |||
18 | Rkk = rodrigues(omckk); | ||
19 | |||
20 | eval(['y_' num2str(kk) ' = project2_oulu(X_' num2str(kk) ',Rkk,Tckk,fc,cc,kc);']); | ||
21 | |||
22 | eval(['ex_' num2str(kk) ' = x_' num2str(kk) ' -y_' num2str(kk) ';']); | ||
23 | |||
24 | eval(['x_kk = x_' num2str(kk) ';']); | ||
25 | |||
26 | eval(['ex = [ex ex_' num2str(kk) '];']); | ||
27 | eval(['x = [x x_' num2str(kk) '];']); | ||
28 | eval(['y = [y y_' num2str(kk) '];']); | ||
29 | |||
30 | else | ||
31 | |||
32 | eval(['y_' num2str(kk) ' = NaN*ones(2,1);']); | ||
33 | |||
34 | eval(['ex_' num2str(kk) ' = NaN*ones(2,1);']); | ||
35 | |||
36 | end; | ||
37 | |||
38 | end; | ||
39 | |||
40 | err_std = std(ex')'; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/compute_collineation.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/compute_collineation.m new file mode 100755 index 0000000..809c309 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/compute_collineation.m | |||
@@ -0,0 +1,66 @@ | |||
1 | function [H,Hnorm,inv_Hnorm] = compute_collineation (a00, a10, a11, a01); | ||
2 | |||
3 | % new formalism using homographies | ||
4 | |||
5 | a00 = a00 / a00(3); | ||
6 | a10 = a10 / a10(3); | ||
7 | a11 = a11 / a11(3); | ||
8 | a01 = a01 / a01(3); | ||
9 | |||
10 | |||
11 | % Prenormalization of point coordinates (very important): | ||
12 | % (Affine normalization) | ||
13 | |||
14 | ax = [a00(1);a10(1);a11(1);a01(1)]; | ||
15 | ay = [a00(2);a10(2);a11(2);a01(2)]; | ||
16 | |||
17 | mxx = mean(ax); | ||
18 | myy = mean(ay); | ||
19 | ax = ax - mxx; | ||
20 | ay = ay - myy; | ||
21 | |||
22 | scxx = mean(abs(ax)); | ||
23 | scyy = mean(abs(ay)); | ||
24 | |||
25 | |||
26 | Hnorm = [1/scxx 0 -mxx/scxx;0 1/scyy -myy/scyy;0 0 1]; | ||
27 | inv_Hnorm = [scxx 0 mxx ; 0 scyy myy; 0 0 1]; | ||
28 | |||
29 | |||
30 | a00n = Hnorm*a00; | ||
31 | a10n = Hnorm*a10; | ||
32 | a11n = Hnorm*a11; | ||
33 | a01n = Hnorm*a01; | ||
34 | |||
35 | |||
36 | % Computation of the vanishing points: | ||
37 | |||
38 | V1n = cross(cross(a00n,a10n),cross(a01n,a11n)); | ||
39 | V2n = cross(cross(a00n,a01n),cross(a10n,a11n)); | ||
40 | |||
41 | V1 = inv_Hnorm*V1n; | ||
42 | V2 = inv_Hnorm*V2n; | ||
43 | |||
44 | |||
45 | % Normalizaion of the vanishing points: | ||
46 | |||
47 | V1n = V1n/norm(V1n); | ||
48 | V2n = V2n/norm(V2n); | ||
49 | |||
50 | |||
51 | % Closed-form solution of the coefficients: | ||
52 | |||
53 | alpha_x = (a10n(2)*a00n(1) - a10n(1)*a00n(2))/(V1n(2)*a10n(1)-V1n(1)*a10n(2)); | ||
54 | |||
55 | alpha_y = (a01n(2)*a00n(1) - a01n(1)*a00n(2))/(V2n(2)*a01n(1)-V2n(1)*a01n(2)); | ||
56 | |||
57 | |||
58 | % Remaining Homography | ||
59 | |||
60 | Hrem = [alpha_x*V1n alpha_y*V2n a00n]; | ||
61 | |||
62 | |||
63 | % Final homography: | ||
64 | |||
65 | H = inv_Hnorm*Hrem; | ||
66 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/compute_extrinsic.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/compute_extrinsic.m new file mode 100755 index 0000000..4b4d7dd --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/compute_extrinsic.m | |||
@@ -0,0 +1,123 @@ | |||
1 | function [omckk,Tckk,Rckk,H,x,ex,JJ] = compute_extrinsic(x_kk,X_kk,fc,cc,kc,MaxIter,thresh_cond), | ||
2 | |||
3 | %compute_extrinsic | ||
4 | % | ||
5 | %[omckk,Tckk,Rckk,H,x,ex] = compute_extrinsic(x_kk,X_kk,fc,cc,kc,refine) | ||
6 | % | ||
7 | %Computes the extrinsic parameters attached to a 3D structure X_kk given its projection | ||
8 | %on the image plane x_kk and the intrinsic camera parameters fc, cc and kc. | ||
9 | %Works with planar and non-planar structures. | ||
10 | % | ||
11 | %INPUT: x_kk: Feature locations on the images | ||
12 | % X_kk: Corresponding grid coordinates | ||
13 | % fc: Camera focal length | ||
14 | % cc: Principal point coordinates | ||
15 | % kc: Distortion coefficients | ||
16 | % refine: set to 1 for refining the extrinsic parameters iteratively | ||
17 | % [OPTIONAL: Default value: 1] | ||
18 | % | ||
19 | %OUTPUT: omckk: 3D rotation vector attached to the grid positions in space | ||
20 | % Tckk: 3D translation vector attached to the grid positions in space | ||
21 | % Rckk: 3D rotation matrices corresponding to the omc vectors | ||
22 | % H: Homography between points on the grid and points on the image plane (in pixel) | ||
23 | % This makes sense only if the planar that is used in planar. | ||
24 | % x: Reprojections of the points on the image plane | ||
25 | % ex: Reprojection error: ex = x_kk - x; | ||
26 | % | ||
27 | %Method: Computes the normalized point coordinates, then computes the 3D pose | ||
28 | % | ||
29 | %Important functions called within that program: | ||
30 | % | ||
31 | %normalize: Computes the normalize image point coordinates. | ||
32 | % | ||
33 | %pose3D: Computes the 3D pose of the structure given the normalized image projection. | ||
34 | % | ||
35 | %project_points.m: Computes the 2D image projections of a set of 3D points | ||
36 | |||
37 | |||
38 | |||
39 | if nargin < 7, | ||
40 | thresh_cond = inf; | ||
41 | end; | ||
42 | |||
43 | |||
44 | if nargin < 6, | ||
45 | MaxIter = 20; | ||
46 | end; | ||
47 | |||
48 | |||
49 | |||
50 | if nargin < 5, | ||
51 | kc = zeros(4,1); | ||
52 | if nargin < 4, | ||
53 | cc = zeros(2,1); | ||
54 | if nargin < 3, | ||
55 | fc = ones(2,1); | ||
56 | if nargin < 2, | ||
57 | error('Need 2D projections and 3D points (in compute_extrinsic.m)'); | ||
58 | return; | ||
59 | end; | ||
60 | end; | ||
61 | end; | ||
62 | end; | ||
63 | |||
64 | |||
65 | % Initialization: | ||
66 | |||
67 | [omckk,Tckk,Rckk] = compute_extrinsic_init(x_kk,X_kk,fc,cc,kc); | ||
68 | |||
69 | % Refinement: | ||
70 | |||
71 | [omckk,Tckk,Rckk,JJ] = compute_extrinsic_refine(omckk,Tckk,x_kk,X_kk,fc,cc,kc,MaxIter,thresh_cond); | ||
72 | |||
73 | |||
74 | % computation of the homography (not useful in the end) | ||
75 | |||
76 | H = [Rckk(:,1:2) Tckk]; | ||
77 | |||
78 | % Computes the reprojection error in pixels: | ||
79 | |||
80 | x = project_points(X_kk,omckk,Tckk,fc,cc,kc); | ||
81 | |||
82 | ex = x_kk - x; | ||
83 | |||
84 | |||
85 | % Converts the homography in pixel units: | ||
86 | |||
87 | KK = [fc(1) 0 cc(1);0 fc(2) cc(2); 0 0 1]; | ||
88 | |||
89 | H = KK*H; | ||
90 | |||
91 | |||
92 | |||
93 | |||
94 | return; | ||
95 | |||
96 | |||
97 | % Test of compte extrinsic: | ||
98 | |||
99 | Np = 4; | ||
100 | sx = 10; | ||
101 | sy = 10; | ||
102 | sz = 5; | ||
103 | |||
104 | om = randn(3,1); | ||
105 | T = [0;0;100]; | ||
106 | |||
107 | noise = 2/1000; | ||
108 | |||
109 | XX = [sx*randn(1,Np);sy*randn(1,Np);sz*randn(1,Np)]; | ||
110 | xx = project_points(XX,om,T); | ||
111 | |||
112 | xxn = xx + noise * randn(2,Np); | ||
113 | |||
114 | [omckk,Tckk] = compute_extrinsic(xxn,XX); | ||
115 | |||
116 | [om omckk om-omckk] | ||
117 | [T Tckk T-Tckk] | ||
118 | |||
119 | figure(3); | ||
120 | plot(xx(1,:),xx(2,:),'r+'); | ||
121 | hold on; | ||
122 | plot(xxn(1,:),xxn(2,:),'g+'); | ||
123 | hold off; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/compute_extrinsic_init.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/compute_extrinsic_init.m new file mode 100755 index 0000000..207ea30 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/compute_extrinsic_init.m | |||
@@ -0,0 +1,149 @@ | |||
1 | function [omckk,Tckk,Rckk] = compute_extrinsic_init(x_kk,X_kk,fc,cc,kc), | ||
2 | |||
3 | %compute_extrinsic | ||
4 | % | ||
5 | %[omckk,Tckk,Rckk] = compute_extrinsic_init(x_kk,X_kk,fc,cc,kc) | ||
6 | % | ||
7 | %Computes the extrinsic parameters attached to a 3D structure X_kk given its projection | ||
8 | %on the image plane x_kk and the intrinsic camera parameters fc, cc and kc. | ||
9 | %Works with planar and non-planar structures. | ||
10 | % | ||
11 | %INPUT: x_kk: Feature locations on the images | ||
12 | % X_kk: Corresponding grid coordinates | ||
13 | % fc: Camera focal length | ||
14 | % cc: Principal point coordinates | ||
15 | % kc: Distortion coefficients | ||
16 | % | ||
17 | %OUTPUT: omckk: 3D rotation vector attached to the grid positions in space | ||
18 | % Tckk: 3D translation vector attached to the grid positions in space | ||
19 | % Rckk: 3D rotation matrices corresponding to the omc vectors | ||
20 | % | ||
21 | %Method: Computes the normalized point coordinates, then computes the 3D pose | ||
22 | % | ||
23 | %Important functions called within that program: | ||
24 | % | ||
25 | %normalize: Computes the normalize image point coordinates. | ||
26 | % | ||
27 | %pose3D: Computes the 3D pose of the structure given the normalized image projection. | ||
28 | % | ||
29 | %project_points.m: Computes the 2D image projections of a set of 3D points | ||
30 | |||
31 | |||
32 | |||
33 | |||
34 | if nargin < 5, | ||
35 | kc = zeros(4,1); | ||
36 | if nargin < 4, | ||
37 | cc = zeros(2,1); | ||
38 | if nargin < 3, | ||
39 | fc = ones(2,1); | ||
40 | if nargin < 2, | ||
41 | error('Need 2D projections and 3D points (in compute_extrinsic.m)'); | ||
42 | return; | ||
43 | end; | ||
44 | end; | ||
45 | end; | ||
46 | end; | ||
47 | |||
48 | |||
49 | |||
50 | % Compute the normalized coordinates: | ||
51 | |||
52 | xn = normalize(x_kk,fc,cc,kc); | ||
53 | |||
54 | |||
55 | |||
56 | Np = size(xn,2); | ||
57 | |||
58 | %% Check for planarity of the structure: | ||
59 | |||
60 | X_mean = mean(X_kk')'; | ||
61 | |||
62 | Y = X_kk - (X_mean*ones(1,Np)); | ||
63 | |||
64 | YY = Y*Y'; | ||
65 | |||
66 | [U,S,V] = svd(YY); | ||
67 | |||
68 | r = S(3,3)/S(2,2); | ||
69 | |||
70 | if (r < 1e-3)|(Np < 6), %1e-3, %1e-4, %norm(X_kk(3,:)) < eps, % Test of planarity | ||
71 | |||
72 | %fprintf(1,'Planar structure detected: r=%f\n',r); | ||
73 | |||
74 | % Transform the plane to bring it in the Z=0 plane: | ||
75 | |||
76 | R_transform = V'; | ||
77 | |||
78 | if det(R_transform) < 0, R_transform = -R_transform; end; | ||
79 | |||
80 | T_transform = -(R_transform)*X_mean; | ||
81 | |||
82 | X_new = R_transform*X_kk + T_transform*ones(1,Np); | ||
83 | |||
84 | |||
85 | % Compute the planar homography: | ||
86 | |||
87 | H = compute_homography (xn,X_new(1:2,:)); | ||
88 | |||
89 | % De-embed the motion parameters from the homography: | ||
90 | |||
91 | sc = mean([norm(H(:,1));norm(H(:,2))]); | ||
92 | |||
93 | H = H/sc; | ||
94 | |||
95 | omckk = rodrigues([H(:,1:2) cross(H(:,1),H(:,2))]); | ||
96 | Rckk = rodrigues(omckk); | ||
97 | Tckk = H(:,3); | ||
98 | |||
99 | %If Xc = Rckk * X_new + Tckk, then Xc = Rckk * R_transform * X_kk + Tckk + T_transform | ||
100 | |||
101 | Tckk = Tckk + Rckk* T_transform; | ||
102 | Rckk = Rckk * R_transform; | ||
103 | |||
104 | omckk = rodrigues(Rckk); | ||
105 | Rckk = rodrigues(omckk); | ||
106 | |||
107 | |||
108 | else | ||
109 | |||
110 | %fprintf(1,'Non planar structure detected: r=%f\n',r); | ||
111 | |||
112 | % Computes an initial guess for extrinsic parameters (works for general 3d structure, not planar!!!): | ||
113 | % The DLT method is applied here!! | ||
114 | |||
115 | J = zeros(2*Np,12); | ||
116 | |||
117 | xX = (ones(3,1)*xn(1,:)).*X_kk; | ||
118 | yX = (ones(3,1)*xn(2,:)).*X_kk; | ||
119 | |||
120 | J(1:2:end,[1 4 7]) = -X_kk'; | ||
121 | J(2:2:end,[2 5 8]) = X_kk'; | ||
122 | J(1:2:end,[3 6 9]) = xX'; | ||
123 | J(2:2:end,[3 6 9]) = -yX'; | ||
124 | J(1:2:end,12) = xn(1,:)'; | ||
125 | J(2:2:end,12) = -xn(2,:)'; | ||
126 | J(1:2:end,10) = -ones(Np,1); | ||
127 | J(2:2:end,11) = ones(Np,1); | ||
128 | |||
129 | JJ = J'*J; | ||
130 | [U,S,V] = svd(JJ); | ||
131 | |||
132 | RR = reshape(V(1:9,12),3,3); | ||
133 | |||
134 | if det(RR) < 0, | ||
135 | V(:,12) = -V(:,12); | ||
136 | RR = -RR; | ||
137 | end; | ||
138 | |||
139 | [Ur,Sr,Vr] = svd(RR); | ||
140 | |||
141 | Rckk = Ur*Vr'; | ||
142 | |||
143 | sc = norm(V(1:9,12)) / norm(Rckk(:)); | ||
144 | Tckk = V(10:12,12)/sc; | ||
145 | |||
146 | omckk = rodrigues(Rckk); | ||
147 | Rckk = rodrigues(omckk); | ||
148 | |||
149 | end; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/compute_extrinsic_refine.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/compute_extrinsic_refine.m new file mode 100755 index 0000000..69474c4 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/compute_extrinsic_refine.m | |||
@@ -0,0 +1,110 @@ | |||
1 | function [omckk,Tckk,Rckk,JJ] = compute_extrinsic_refine(omc_init,Tc_init,x_kk,X_kk,fc,cc,kc,MaxIter,thresh_cond), | ||
2 | |||
3 | %compute_extrinsic | ||
4 | % | ||
5 | %[omckk,Tckk,Rckk] = compute_extrinsic_refine(x_kk,X_kk,fc,cc,kc,MaxIter) | ||
6 | % | ||
7 | %Computes the extrinsic parameters attached to a 3D structure X_kk given its projection | ||
8 | %on the image plane x_kk and the intrinsic camera parameters fc, cc and kc. | ||
9 | %Works with planar and non-planar structures. | ||
10 | % | ||
11 | %INPUT: x_kk: Feature locations on the images | ||
12 | % X_kk: Corresponding grid coordinates | ||
13 | % fc: Camera focal length | ||
14 | % cc: Principal point coordinates | ||
15 | % kc: Distortion coefficients | ||
16 | % MaxIter: Maximum number of iterations | ||
17 | % | ||
18 | %OUTPUT: omckk: 3D rotation vector attached to the grid positions in space | ||
19 | % Tckk: 3D translation vector attached to the grid positions in space | ||
20 | % Rckk: 3D rotation matrices corresponding to the omc vectors | ||
21 | |||
22 | % | ||
23 | %Method: Computes the normalized point coordinates, then computes the 3D pose | ||
24 | % | ||
25 | %Important functions called within that program: | ||
26 | % | ||
27 | %normalize: Computes the normalize image point coordinates. | ||
28 | % | ||
29 | %pose3D: Computes the 3D pose of the structure given the normalized image projection. | ||
30 | % | ||
31 | %project_points.m: Computes the 2D image projections of a set of 3D points | ||
32 | |||
33 | |||
34 | if nargin < 9, | ||
35 | thresh_cond = inf; | ||
36 | end; | ||
37 | |||
38 | |||
39 | if nargin < 8, | ||
40 | MaxIter = 20; | ||
41 | end; | ||
42 | |||
43 | |||
44 | if nargin < 7, | ||
45 | kc = zeros(4,1); | ||
46 | if nargin < 6, | ||
47 | cc = zeros(2,1); | ||
48 | if nargin < 5, | ||
49 | fc = ones(2,1); | ||
50 | if nargin < 4, | ||
51 | error('Need 2D projections and 3D points (in compute_extrinsic_refine.m)'); | ||
52 | return; | ||
53 | end; | ||
54 | end; | ||
55 | end; | ||
56 | end; | ||
57 | |||
58 | |||
59 | % Initialization: | ||
60 | |||
61 | omckk = omc_init; | ||
62 | Tckk = Tc_init; | ||
63 | |||
64 | |||
65 | % Final optimization (minimize the reprojection error in pixel): | ||
66 | % through Gradient Descent: | ||
67 | |||
68 | param = [omckk;Tckk]; | ||
69 | |||
70 | change = 1; | ||
71 | |||
72 | iter = 0; | ||
73 | |||
74 | %keyboard; | ||
75 | |||
76 | %fprintf(1,'Gradient descent iterations: '); | ||
77 | |||
78 | while (change > 1e-10)&(iter < MaxIter), | ||
79 | |||
80 | %fprintf(1,'%d...',iter+1); | ||
81 | |||
82 | [x,dxdom,dxdT] = project_points(X_kk,omckk,Tckk,fc,cc,kc); | ||
83 | |||
84 | ex = x_kk - x; | ||
85 | |||
86 | %keyboard; | ||
87 | |||
88 | JJ = [dxdom dxdT]; | ||
89 | |||
90 | if cond(JJ) > thresh_cond, | ||
91 | change = 0; | ||
92 | else | ||
93 | |||
94 | JJ2 = JJ'*JJ; | ||
95 | |||
96 | param_innov = inv(JJ2)*(JJ')*ex(:); | ||
97 | param_up = param + param_innov; | ||
98 | change = norm(param_innov)/norm(param_up); | ||
99 | param = param_up; | ||
100 | iter = iter + 1; | ||
101 | |||
102 | omckk = param(1:3); | ||
103 | Tckk = param(4:6); | ||
104 | end; | ||
105 | |||
106 | end; | ||
107 | |||
108 | %fprintf(1,'\n'); | ||
109 | |||
110 | Rckk = rodrigues(omckk); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/compute_homography.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/compute_homography.m new file mode 100755 index 0000000..fcc9003 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/compute_homography.m | |||
@@ -0,0 +1,163 @@ | |||
1 | function [H,Hnorm,inv_Hnorm] = compute_homography (m,M); | ||
2 | |||
3 | %compute_homography | ||
4 | % | ||
5 | %[H,Hnorm,inv_Hnorm] = compute_homography (m,M) | ||
6 | % | ||
7 | %Computes the planar homography between the point coordinates on the plane (M) and the image | ||
8 | %point coordinates (m). | ||
9 | % | ||
10 | %INPUT: m: homogeneous coordinates in the image plane (3xN matrix) | ||
11 | % M: homogeneous coordinates in the plane in 3D (3xN matrix) | ||
12 | % | ||
13 | %OUTPUT: H: Homography matrix (3x3 homogeneous matrix) | ||
14 | % Hnorm: Normlization matrix used on the points before homography computation | ||
15 | % (useful for numerical stability is points in pixel coordinates) | ||
16 | % inv_Hnorm: The inverse of Hnorm | ||
17 | % | ||
18 | %Definition: m ~ H*M where "~" means equal up to a non zero scalar factor. | ||
19 | % | ||
20 | %Method: First computes an initial guess for the homography through quasi-linear method. | ||
21 | % Then, if the total number of points is larger than 4, optimize the solution by minimizing | ||
22 | % the reprojection error (in the least squares sense). | ||
23 | % | ||
24 | % | ||
25 | %Important functions called within that program: | ||
26 | % | ||
27 | %comp_distortion_oulu: Undistorts pixel coordinates. | ||
28 | % | ||
29 | %compute_homography.m: Computes the planar homography between points on the grid in 3D, and the image plane. | ||
30 | % | ||
31 | %project_points.m: Computes the 2D image projections of a set of 3D points, and also returns te Jacobian | ||
32 | % matrix (derivative with respect to the intrinsic and extrinsic parameters). | ||
33 | % This function is called within the minimization loop. | ||
34 | |||
35 | |||
36 | |||
37 | |||
38 | Np = size(m,2); | ||
39 | |||
40 | if size(m,1)<3, | ||
41 | m = [m;ones(1,Np)]; | ||
42 | end; | ||
43 | |||
44 | if size(M,1)<3, | ||
45 | M = [M;ones(1,Np)]; | ||
46 | end; | ||
47 | |||
48 | |||
49 | m = m ./ (ones(3,1)*m(3,:)); | ||
50 | M = M ./ (ones(3,1)*M(3,:)); | ||
51 | |||
52 | % Prenormalization of point coordinates (very important): | ||
53 | % (Affine normalization) | ||
54 | |||
55 | ax = m(1,:); | ||
56 | ay = m(2,:); | ||
57 | |||
58 | mxx = mean(ax); | ||
59 | myy = mean(ay); | ||
60 | ax = ax - mxx; | ||
61 | ay = ay - myy; | ||
62 | |||
63 | scxx = mean(abs(ax)); | ||
64 | scyy = mean(abs(ay)); | ||
65 | |||
66 | |||
67 | Hnorm = [1/scxx 0 -mxx/scxx;0 1/scyy -myy/scyy;0 0 1]; | ||
68 | inv_Hnorm = [scxx 0 mxx ; 0 scyy myy; 0 0 1]; | ||
69 | |||
70 | mn = Hnorm*m; | ||
71 | |||
72 | % Compute the homography between m and mn: | ||
73 | |||
74 | % Build the matrix: | ||
75 | |||
76 | L = zeros(2*Np,9); | ||
77 | |||
78 | L(1:2:2*Np,1:3) = M'; | ||
79 | L(2:2:2*Np,4:6) = M'; | ||
80 | L(1:2:2*Np,7:9) = -((ones(3,1)*mn(1,:)).* M)'; | ||
81 | L(2:2:2*Np,7:9) = -((ones(3,1)*mn(2,:)).* M)'; | ||
82 | |||
83 | if Np > 4, | ||
84 | L = L'*L; | ||
85 | end; | ||
86 | |||
87 | [U,S,V] = svd(L); | ||
88 | |||
89 | hh = V(:,9); | ||
90 | hh = hh/hh(9); | ||
91 | |||
92 | Hrem = reshape(hh,3,3)'; | ||
93 | %Hrem = Hrem / Hrem(3,3); | ||
94 | |||
95 | % Final homography: | ||
96 | |||
97 | H = inv_Hnorm*Hrem; | ||
98 | |||
99 | |||
100 | %%% Homography refinement if there are more than 4 points: | ||
101 | |||
102 | if Np > 4, | ||
103 | |||
104 | % Final refinement: | ||
105 | |||
106 | hhv = reshape(H',9,1); | ||
107 | hhv = hhv(1:8); | ||
108 | |||
109 | for iter=1:10, | ||
110 | |||
111 | mrep = H * M; | ||
112 | |||
113 | J = zeros(2*Np,8); | ||
114 | |||
115 | MMM = (M ./ (ones(3,1)*mrep(3,:))); | ||
116 | |||
117 | J(1:2:2*Np,1:3) = -MMM'; | ||
118 | J(2:2:2*Np,4:6) = -MMM'; | ||
119 | |||
120 | mrep = mrep ./ (ones(3,1)*mrep(3,:)); | ||
121 | |||
122 | m_err = m(1:2,:) - mrep(1:2,:); | ||
123 | m_err = m_err(:); | ||
124 | |||
125 | MMM2 = (ones(3,1)*mrep(1,:)) .* MMM; | ||
126 | MMM3 = (ones(3,1)*mrep(2,:)) .* MMM; | ||
127 | |||
128 | J(1:2:2*Np,7:8) = MMM2(1:2,:)'; | ||
129 | J(2:2:2*Np,7:8) = MMM3(1:2,:)'; | ||
130 | |||
131 | MMM = (M ./ (ones(3,1)*mrep(3,:)))'; | ||
132 | |||
133 | hh_innov = inv(J'*J)*J'*m_err; | ||
134 | |||
135 | hhv_up = hhv - hh_innov; | ||
136 | |||
137 | H_up = reshape([hhv_up;1],3,3)'; | ||
138 | |||
139 | %norm(m_err) | ||
140 | %norm(hh_innov) | ||
141 | |||
142 | hhv = hhv_up; | ||
143 | H = H_up; | ||
144 | |||
145 | end; | ||
146 | |||
147 | end; | ||
148 | |||
149 | |||
150 | |||
151 | |||
152 | |||
153 | return; | ||
154 | |||
155 | %test of Jacobian | ||
156 | |||
157 | mrep = H*M; | ||
158 | mrep = mrep ./ (ones(3,1)*mrep(3,:)); | ||
159 | |||
160 | m_err = mrep(1:2,:) - m(1:2,:); | ||
161 | figure(8); | ||
162 | plot(m_err(1,:),m_err(2,:),'r+'); | ||
163 | std(m_err') | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/convert_oulu.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/convert_oulu.m new file mode 100755 index 0000000..726806e --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/convert_oulu.m | |||
@@ -0,0 +1,35 @@ | |||
1 | %% Converts data file from oulu to mine: | ||
2 | |||
3 | load cademo, | ||
4 | n_ima = 0; | ||
5 | |||
6 | no_error = 1; | ||
7 | |||
8 | ii = 1; | ||
9 | |||
10 | while no_error, | ||
11 | |||
12 | dataname = ['data' num2str(ii)]; | ||
13 | |||
14 | if exist(dataname), | ||
15 | |||
16 | n_ima = n_ima +1; | ||
17 | |||
18 | eval(['x_' num2str(ii) '= ' dataname '(:,4:5)'';']) | ||
19 | eval(['X_' num2str(ii) '= ' dataname '(:,1:3)'';']) | ||
20 | |||
21 | else | ||
22 | no_error = 0; | ||
23 | end; | ||
24 | |||
25 | ii = ii + 1; | ||
26 | |||
27 | end; | ||
28 | |||
29 | nx = 500; | ||
30 | ny = 500; | ||
31 | |||
32 | no_image = 1; | ||
33 | no_grid = 1; | ||
34 | |||
35 | save data n_ima x_1 X_1 x_2 X_2 x_3 X_3 nx ny no_image no_grid | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/cornerfinder.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/cornerfinder.m new file mode 100755 index 0000000..9bfa51f --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/cornerfinder.m | |||
@@ -0,0 +1,215 @@ | |||
1 | function [xc,good,bad,type] = cornerfinder(xt,I,wintx,winty,wx2,wy2); | ||
2 | |||
3 | %[xc] = cornerfinder(xt,I); | ||
4 | % | ||
5 | %Finds the sub-pixel corners on the image I with initial guess xt | ||
6 | %xt and xc are 2xN matrices. The first component is the x coordinate | ||
7 | %(horizontal) and the second component is the y coordinate (vertical) | ||
8 | % | ||
9 | %Based on Harris corner finder method | ||
10 | % | ||
11 | %Finds corners to a precision below .1 pixel! | ||
12 | %Oct. 14th, 1997 - UPDATED to work with vertical and horizontal edges as well!!! | ||
13 | %Sept 1998 - UPDATED to handle diverged points: we keep the original points | ||
14 | %good is a binary vector indicating wether a feature point has been properly | ||
15 | %found. | ||
16 | % | ||
17 | %Add a zero zone of size wx2,wy2 | ||
18 | %July 15th, 1999 - Bug on the mask building... fixed + change to Gaussian mask with higher | ||
19 | %resolution and larger number of iterations. | ||
20 | |||
21 | |||
22 | % California Institute of Technology | ||
23 | % (c) Jean-Yves Bouguet -- Oct. 14th, 1997 | ||
24 | |||
25 | |||
26 | |||
27 | line_feat = 1; % set to 1 to allow for extraction of line features. | ||
28 | |||
29 | xt = xt'; | ||
30 | xt = fliplr(xt); | ||
31 | |||
32 | |||
33 | if nargin < 4, | ||
34 | winty = 5; | ||
35 | if nargin < 3, | ||
36 | wintx = 5; | ||
37 | end; | ||
38 | end; | ||
39 | |||
40 | |||
41 | if nargin < 6, | ||
42 | wx2 = -1; | ||
43 | wy2 = -1; | ||
44 | end; | ||
45 | |||
46 | |||
47 | %mask = ones(2*wintx+1,2*winty+1); | ||
48 | mask = exp(-((-wintx:wintx)'/(wintx)).^2) * exp(-((-winty:winty)/(winty)).^2); | ||
49 | |||
50 | |||
51 | if (wx2>0) & (wy2>0), | ||
52 | if ((wintx - wx2)>=2)&((winty - wy2)>=2), | ||
53 | mask(wintx+1-wx2:wintx+1+wx2,winty+1-wy2:winty+1+wy2)= zeros(2*wx2+1,2*wy2+1); | ||
54 | end; | ||
55 | end; | ||
56 | |||
57 | offx = [-wintx:wintx]'*ones(1,2*winty+1); | ||
58 | offy = ones(2*wintx+1,1)*[-winty:winty]; | ||
59 | |||
60 | resolution = 0.005; | ||
61 | |||
62 | MaxIter = 10; | ||
63 | |||
64 | [nx,ny] = size(I); | ||
65 | N = size(xt,1); | ||
66 | |||
67 | xc = xt; % first guess... they don't move !!! | ||
68 | |||
69 | type = zeros(1,N); | ||
70 | |||
71 | |||
72 | for i=1:N, | ||
73 | |||
74 | v_extra = resolution + 1; % just larger than resolution | ||
75 | |||
76 | compt = 0; % no iteration yet | ||
77 | |||
78 | while (norm(v_extra) > resolution) & (compt<MaxIter), | ||
79 | |||
80 | cIx = xc(i,1); % | ||
81 | cIy = xc(i,2); % Coords. of the point | ||
82 | crIx = round(cIx); % on the initial image | ||
83 | crIy = round(cIy); % | ||
84 | itIx = cIx - crIx; % Coefficients | ||
85 | itIy = cIy - crIy; % to compute | ||
86 | if itIx > 0, % the sub pixel | ||
87 | vIx = [itIx 1-itIx 0]'; % accuracy. | ||
88 | else | ||
89 | vIx = [0 1+itIx -itIx]'; | ||
90 | end; | ||
91 | if itIy > 0, | ||
92 | vIy = [itIy 1-itIy 0]; | ||
93 | else | ||
94 | vIy = [0 1+itIy -itIy]; | ||
95 | end; | ||
96 | |||
97 | |||
98 | % What if the sub image is not in? | ||
99 | |||
100 | if (crIx-wintx-2 < 1), xmin=1; xmax = 2*wintx+5; | ||
101 | elseif (crIx+wintx+2 > nx), xmax = nx; xmin = nx-2*wintx-4; | ||
102 | else | ||
103 | xmin = crIx-wintx-2; xmax = crIx+wintx+2; | ||
104 | end; | ||
105 | |||
106 | if (crIy-winty-2 < 1), ymin=1; ymax = 2*winty+5; | ||
107 | elseif (crIy+winty+2 > ny), ymax = ny; ymin = ny-2*winty-4; | ||
108 | else | ||
109 | ymin = crIy-winty-2; ymax = crIy+winty+2; | ||
110 | end; | ||
111 | |||
112 | |||
113 | SI = I(xmin:xmax,ymin:ymax); % The necessary neighborhood | ||
114 | SI = conv2(conv2(SI,vIx,'same'),vIy,'same'); | ||
115 | SI = SI(2:2*wintx+4,2:2*winty+4); % The subpixel interpolated neighborhood | ||
116 | [gy,gx] = gradient(SI); % The gradient image | ||
117 | gx = gx(2:2*wintx+2,2:2*winty+2); % extraction of the useful parts only | ||
118 | gy = gy(2:2*wintx+2,2:2*winty+2); % of the gradients | ||
119 | |||
120 | px = cIx + offx; | ||
121 | py = cIy + offy; | ||
122 | |||
123 | gxx = gx .* gx .* mask; | ||
124 | gyy = gy .* gy .* mask; | ||
125 | gxy = gx .* gy .* mask; | ||
126 | |||
127 | |||
128 | bb = [sum(sum(gxx .* px + gxy .* py)); sum(sum(gxy .* px + gyy .* py))]; | ||
129 | |||
130 | a = sum(sum(gxx)); | ||
131 | b = sum(sum(gxy)); | ||
132 | c = sum(sum(gyy)); | ||
133 | |||
134 | dt = a*c - b^2; | ||
135 | |||
136 | xc2 = [c*bb(1)-b*bb(2) a*bb(2)-b*bb(1)]/dt; | ||
137 | |||
138 | |||
139 | %keyboard; | ||
140 | |||
141 | if line_feat, | ||
142 | |||
143 | G = [a b;b c]; | ||
144 | [U,S,V] = svd(G); | ||
145 | |||
146 | %keyboard; | ||
147 | |||
148 | % If non-invertible, then project the point onto the edge orthogonal: | ||
149 | |||
150 | if (S(1,1)/S(2,2) > 50), | ||
151 | % projection operation: | ||
152 | xc2 = xc2 + sum((xc(i,:)-xc2).*(V(:,2)'))*V(:,2)'; | ||
153 | type(i) = 1; | ||
154 | end; | ||
155 | |||
156 | end; | ||
157 | |||
158 | |||
159 | %keyboard; | ||
160 | |||
161 | % G = [a b;b c]; | ||
162 | % [U,S,V] = svd(G); | ||
163 | |||
164 | |||
165 | % if S(1,1)/S(2,2) > 150, | ||
166 | % bb2 = U'*bb; | ||
167 | % xc2 = (V*[bb2(1)/S(1,1) ;0])'; | ||
168 | % else | ||
169 | % xc2 = [c*bb(1)-b*bb(2) a*bb(2)-b*bb(1)]/dt; | ||
170 | % end; | ||
171 | |||
172 | |||
173 | %if (abs(a)> 50*abs(c)), | ||
174 | % xc2 = [(c*bb(1)-b*bb(2))/dt xc(i,2)]; | ||
175 | % elseif (abs(c)> 50*abs(a)) | ||
176 | % xc2 = [xc(i,1) (a*bb(2)-b*bb(1))/dt]; | ||
177 | % else | ||
178 | % xc2 = [c*bb(1)-b*bb(2) a*bb(2)-b*bb(1)]/dt; | ||
179 | % end; | ||
180 | |||
181 | %keyboard; | ||
182 | |||
183 | v_extra = xc(i,:) - xc2; | ||
184 | |||
185 | xc(i,:) = xc2; | ||
186 | |||
187 | % keyboard; | ||
188 | |||
189 | compt = compt + 1; | ||
190 | |||
191 | end | ||
192 | end; | ||
193 | |||
194 | |||
195 | % check for points that diverge: | ||
196 | |||
197 | delta_x = xc(:,1) - xt(:,1); | ||
198 | delta_y = xc(:,2) - xt(:,2); | ||
199 | |||
200 | %keyboard; | ||
201 | |||
202 | |||
203 | bad = (abs(delta_x) > wintx) | (abs(delta_y) > winty); | ||
204 | good = ~bad; | ||
205 | in_bad = find(bad); | ||
206 | |||
207 | % For the diverged points, keep the original guesses: | ||
208 | |||
209 | xc(in_bad,:) = xt(in_bad,:); | ||
210 | |||
211 | xc = fliplr(xc); | ||
212 | xc = xc'; | ||
213 | |||
214 | bad = bad'; | ||
215 | good = good'; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/count_squares.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/count_squares.m new file mode 100755 index 0000000..0e226c0 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/count_squares.m | |||
@@ -0,0 +1,74 @@ | |||
1 | function ns = count_squares(I,x1,y1,x2,y2,win); | ||
2 | |||
3 | %keyboard; | ||
4 | |||
5 | [ny,nx] = size(I); | ||
6 | |||
7 | lambda = [y1 - y2;x2 - x1;x1*y2 - x2*y1]; | ||
8 | |||
9 | lambda = 1/sqrt(lambda(1)^2 + lambda(2)^2) * lambda; | ||
10 | |||
11 | l1 = lambda + [0;0;win]; | ||
12 | l2 = lambda - [0;0;win]; | ||
13 | |||
14 | |||
15 | dx = x2-x1; | ||
16 | dy = y2 - y1; | ||
17 | |||
18 | |||
19 | if abs(dx) > abs(dy), | ||
20 | |||
21 | if x2 > x1, | ||
22 | xs = x1:x2; | ||
23 | else | ||
24 | xs = x1:-1:x2; | ||
25 | end; | ||
26 | |||
27 | ys = -(lambda(3) + lambda(1)*xs)/lambda(2); | ||
28 | |||
29 | else | ||
30 | |||
31 | if y2 > y1, | ||
32 | ys = y1:y2; | ||
33 | else | ||
34 | ys = y1:-1:y2; | ||
35 | end; | ||
36 | xs = -(lambda(3) + lambda(2)*ys)/lambda(1); | ||
37 | |||
38 | end; | ||
39 | |||
40 | |||
41 | |||
42 | Np = length(xs); | ||
43 | |||
44 | xs_mat = ones(2*win + 1,1)*xs; | ||
45 | ys_mat = ones(2*win + 1,1)*ys; | ||
46 | |||
47 | win_mat = (-win:win)'*ones(1,Np); | ||
48 | |||
49 | |||
50 | xs_mat2 = round(xs_mat - win_mat * lambda(1)); | ||
51 | ys_mat2 = round(ys_mat - win_mat * lambda(2)); | ||
52 | |||
53 | ind_mat = (xs_mat2 - 1) * ny + ys_mat2; | ||
54 | |||
55 | ima_patch = zeros(2*win + 1,Np); | ||
56 | |||
57 | ima_patch(:) = I(ind_mat(:)); | ||
58 | |||
59 | %ima2 = ima_patch(:,win+1:end-win); | ||
60 | |||
61 | filtk = [ones(win,Np);zeros(1,Np);-ones(win,Np)]; | ||
62 | |||
63 | out_f = sum(filtk.*ima_patch); | ||
64 | |||
65 | out_f_f = conv2(out_f,[1/4 1/2 1/4],'same'); | ||
66 | |||
67 | out_f_f = out_f_f(win+1:end-win); | ||
68 | |||
69 | ns = length(find(((out_f_f(2:end)>=0)&(out_f_f(1:end-1)<0)) | ((out_f_f(2:end)<=0)&(out_f_f(1:end-1)>0))))+1; | ||
70 | |||
71 | |||
72 | |||
73 | |||
74 | return; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/data_calib.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/data_calib.m new file mode 100755 index 0000000..318ec15 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/data_calib.m | |||
@@ -0,0 +1,89 @@ | |||
1 | %%% This script alets the user enter the name of the images (base name, numbering scheme,... | ||
2 | |||
3 | dir; | ||
4 | |||
5 | %disp('Camera Calibration using multiple images of a planar checkerboard pattern'); | ||
6 | %disp('Model: 2 focals, 2 radial dist. coeff., 2 tangential dist. coeff. and principle point'); | ||
7 | %disp(' => 8DOF intrinsic model ([Heikkila and Silven, University of Oulu])'); | ||
8 | |||
9 | fprintf(1,'\n'); | ||
10 | calib_name = input('Basename camera calibration images (without number nor suffix): ','s'); | ||
11 | |||
12 | format_image = '0'; | ||
13 | |||
14 | while format_image == '0', | ||
15 | |||
16 | format_image = input('Image format: ([]=''r''=''ras'', ''b''=''bmp'', ''t''=''tif'', ''p''=''pgm'', ''j''=''jpg'') ','s'); | ||
17 | |||
18 | if isempty(format_image), | ||
19 | format_image = 'ras'; | ||
20 | end; | ||
21 | |||
22 | if lower(format_image(1)) == 'b', | ||
23 | format_image = 'bmp'; | ||
24 | else | ||
25 | if lower(format_image(1)) == 't', | ||
26 | format_image = 'tif'; | ||
27 | else | ||
28 | if lower(format_image(1)) == 'p', | ||
29 | format_image = 'pgm'; | ||
30 | else | ||
31 | if lower(format_image(1)) == 'j', | ||
32 | format_image = 'jpg'; | ||
33 | else | ||
34 | if lower(format_image(1)) == 'r', | ||
35 | format_image = 'ras'; | ||
36 | else | ||
37 | disp('Invalid image format'); | ||
38 | format_image = '0'; % Ask for format once again | ||
39 | end; | ||
40 | end; | ||
41 | end; | ||
42 | end; | ||
43 | end; | ||
44 | |||
45 | end; | ||
46 | |||
47 | |||
48 | n_ima = 1000; | ||
49 | while n_ima > 30, | ||
50 | n_ima = input('Number of calibration images: '); | ||
51 | n_ima = round(n_ima); | ||
52 | end; | ||
53 | |||
54 | type_numbering = input('Type of numbering (ex: []=4,other=04): '); | ||
55 | |||
56 | type_numbering = ~isempty(type_numbering); | ||
57 | |||
58 | if type_numbering, | ||
59 | |||
60 | N_slots = input('Number of spaces for numbers? (ex: 2 -> 04, 3 -> 004), ([]=3) '); | ||
61 | |||
62 | if isempty(N_slots), N_slots = 3; end; | ||
63 | |||
64 | else | ||
65 | |||
66 | N_slots = 1; % not used anyway, but useful for saving | ||
67 | |||
68 | end; | ||
69 | |||
70 | |||
71 | first_num = input('First image number? (0,1,2...) ([]=0) '); | ||
72 | |||
73 | if isempty(first_num), first_num = 0; end; | ||
74 | |||
75 | image_numbers = first_num:n_ima-1+first_num; | ||
76 | |||
77 | |||
78 | %%% By default, all the images are active for calibration: | ||
79 | |||
80 | active_images = ones(1,n_ima); | ||
81 | |||
82 | %string_save = 'save calib_data n_ima type_numbering N_slots image_numbers format_image calib_name first_num'; | ||
83 | |||
84 | %eval(string_save); | ||
85 | |||
86 | % Reading images: | ||
87 | |||
88 | ima_read_calib; | ||
89 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/error_analysis.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/error_analysis.m new file mode 100755 index 0000000..85feac5 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/error_analysis.m | |||
@@ -0,0 +1,182 @@ | |||
1 | %%% ERROR_ANALYSIS | ||
2 | %%% This simulation helps coputing the acturacies of calibration | ||
3 | %%% Run it after the main calibration | ||
4 | |||
5 | |||
6 | |||
7 | N_runs = 200; | ||
8 | |||
9 | %N_ima_active = 4; | ||
10 | |||
11 | saving = 1; | ||
12 | |||
13 | if 1, %~exist('fc_list'), % initialization | ||
14 | |||
15 | % Initialization: | ||
16 | |||
17 | load Calib_Results; | ||
18 | check_active_images; | ||
19 | |||
20 | fc_list = []; | ||
21 | cc_list = []; | ||
22 | kc_list = []; | ||
23 | active_images_list = []; | ||
24 | |||
25 | |||
26 | for kk=1:n_ima, | ||
27 | |||
28 | eval(['omc_list_' num2str(kk) ' = [];']); | ||
29 | eval(['Tc_list_' num2str(kk) ' = [];']); | ||
30 | |||
31 | end; | ||
32 | |||
33 | %sx = median(abs(ex(1,:)))*1.4836; | ||
34 | %sy = median(abs(ex(2,:)))*1.4836; | ||
35 | |||
36 | sx = std(ex(1,:)); | ||
37 | sy = std(ex(2,:)); | ||
38 | |||
39 | % Saving the feature locations: | ||
40 | |||
41 | for kk = 1:n_ima, | ||
42 | |||
43 | eval(['x_save_' num2str(kk) ' = x_' num2str(kk) ';']); | ||
44 | eval(['y_save_' num2str(kk) ' = y_' num2str(kk) ';']); | ||
45 | |||
46 | end; | ||
47 | |||
48 | active_images_save = active_images; | ||
49 | ind_active_save = ind_active; | ||
50 | |||
51 | fc_save = fc; | ||
52 | cc_save = cc; | ||
53 | kc_save = kc; | ||
54 | KK_save = KK; | ||
55 | |||
56 | |||
57 | end; | ||
58 | |||
59 | |||
60 | |||
61 | |||
62 | %%% The main loop: | ||
63 | |||
64 | |||
65 | for ntrial = 1:N_runs, | ||
66 | |||
67 | fprintf(1,'\nRun number: %d\n',ntrial); | ||
68 | fprintf(1, '----------\n'); | ||
69 | |||
70 | for kk = 1:n_ima, | ||
71 | |||
72 | eval(['y_kk = y_save_' num2str(kk) ';']) | ||
73 | |||
74 | if active_images(kk) & ~isnan(y_kk(1,1)), | ||
75 | |||
76 | Nkk = size(y_kk,2); | ||
77 | |||
78 | x_kk_new = y_kk + [sx * randn(1,Nkk);sy*randn(1,Nkk)]; | ||
79 | |||
80 | eval(['x_' num2str(kk) ' = x_kk_new;']); | ||
81 | |||
82 | end; | ||
83 | |||
84 | end; | ||
85 | |||
86 | N_active = length(ind_active_save); | ||
87 | junk = randn(1,N_active); | ||
88 | [junk,junk2] = sort(junk); | ||
89 | |||
90 | active_images = zeros(1,n_ima); | ||
91 | active_images(ind_active_save(junk2(1:N_ima_active))) = ones(1,N_ima_active); | ||
92 | |||
93 | fc = fc_save; | ||
94 | cc = cc_save; | ||
95 | kc = kc_save; | ||
96 | KK = KK_save; | ||
97 | |||
98 | go_calib_optim; | ||
99 | |||
100 | fc_list = [fc_list fc]; | ||
101 | cc_list = [cc_list cc]; | ||
102 | kc_list = [kc_list kc]; | ||
103 | active_images_list = [active_images_list active_images']; | ||
104 | |||
105 | for kk=1:n_ima, | ||
106 | |||
107 | eval(['omc_list_' num2str(kk) ' = [ omc_list_' num2str(kk) ' omc_' num2str(kk) ' ];']); | ||
108 | eval(['Tc_list_' num2str(kk) ' = [ Tc_list_' num2str(kk) ' Tc_' num2str(kk) ' ];']); | ||
109 | |||
110 | end; | ||
111 | |||
112 | end; | ||
113 | |||
114 | |||
115 | |||
116 | |||
117 | if 0, | ||
118 | |||
119 | % Restoring the feature locations: | ||
120 | |||
121 | for kk = 1:n_ima, | ||
122 | |||
123 | eval(['x_' num2str(kk) ' = x_save_' num2str(kk) ';']); | ||
124 | |||
125 | end; | ||
126 | |||
127 | fprintf(1,'\nFinal run (with the real data)\n'); | ||
128 | fprintf(1, '------------------------------\n'); | ||
129 | |||
130 | active_images = active_images_save; | ||
131 | ind_active = ind_active_save; | ||
132 | |||
133 | go_calib_optim; | ||
134 | |||
135 | fc_list = [fc_list fc]; | ||
136 | cc_list = [cc_list cc]; | ||
137 | kc_list = [kc_list kc]; | ||
138 | active_images_list = [active_images_list active_images']; | ||
139 | |||
140 | for kk=1:n_ima, | ||
141 | |||
142 | eval(['omc_list_' num2str(kk) ' = [ omc_list_' num2str(kk) ' omc_' num2str(kk) ' ];']); | ||
143 | eval(['Tc_list_' num2str(kk) ' = [ Tc_list_' num2str(kk) ' Tc_' num2str(kk) ' ];']); | ||
144 | |||
145 | end; | ||
146 | |||
147 | end; | ||
148 | |||
149 | |||
150 | |||
151 | |||
152 | |||
153 | if saving, | ||
154 | |||
155 | disp(['Save Calibration accuracy results under Calib_Accuracies_' num2str(N_ima_active) '.mat']); | ||
156 | |||
157 | string_save = ['save Calib_Accuracies_' num2str(N_ima_active) ' active_images n_ima N_ima_active N_runs active_images_list fc cc kc fc_list cc_list kc_list']; | ||
158 | |||
159 | for kk = 1:n_ima, | ||
160 | string_save = [string_save ' Tc_list_' num2str(kk) ' omc_list_' num2str(kk) ' Tc_' num2str(kk) ' omc_' num2str(kk) ]; | ||
161 | end; | ||
162 | |||
163 | eval(string_save); | ||
164 | |||
165 | end; | ||
166 | |||
167 | |||
168 | return; | ||
169 | |||
170 | std(fc_list') | ||
171 | |||
172 | std(cc_list') | ||
173 | |||
174 | std(kc_list') | ||
175 | |||
176 | for kk = 1:n_ima, | ||
177 | |||
178 | eval(['std(Tc_list_' num2str(kk) ''')']) | ||
179 | |||
180 | end; | ||
181 | |||
182 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/ext_calib.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/ext_calib.m new file mode 100755 index 0000000..d41d068 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/ext_calib.m | |||
@@ -0,0 +1,130 @@ | |||
1 | |||
2 | %%%%%%%%%%%%%%%%%%%% SHOW EXTRINSIC RESULTS %%%%%%%%%%%%%%%%%%%%%%%% | ||
3 | |||
4 | check_active_images; | ||
5 | |||
6 | if ~exist(['omc_' num2str(ind_active(1))]), | ||
7 | fprintf(1,'Need to calibrate before showing extrinsic results. Maybe need to load Calib_Results.mat file.\n'); | ||
8 | return; | ||
9 | end; | ||
10 | |||
11 | %if ~exist('no_grid'), | ||
12 | no_grid = 0; | ||
13 | %end; | ||
14 | |||
15 | if ~exist(['n_sq_x_' num2str(ind_active(1))]), | ||
16 | no_grid = 1; | ||
17 | end; | ||
18 | |||
19 | |||
20 | if 0, | ||
21 | |||
22 | err_std = std(ex'); | ||
23 | |||
24 | fprintf(1,'\n\nCalibration results without principal point estimation:\n\n'); | ||
25 | fprintf(1,'Focal Length: fc = [ %3.5f %3.5f]\n',fc); | ||
26 | fprintf(1,'Principal point: cc = [ %3.5f %3.5f]\n',cc); | ||
27 | fprintf(1,'Distortion: kc = [ %3.5f %3.5f %3.5f %3.5f]\n',kc); | ||
28 | fprintf(1,'Pixel error: err = [ %3.5f %3.5f]\n\n',err_std); | ||
29 | |||
30 | end; | ||
31 | |||
32 | |||
33 | % Color code for each image: | ||
34 | |||
35 | colors = 'brgkcm'; | ||
36 | |||
37 | |||
38 | %%% Show the extrinsic parameters | ||
39 | |||
40 | if ~exist('dX'), | ||
41 | eval(['dX = norm(Tc_' num2str(ind_active(1)) ')/10;']); | ||
42 | dY = dX; | ||
43 | end; | ||
44 | |||
45 | IP = 5*dX*([0 nx-1 nx-1 0 0 ; 0 0 ny-1 ny-1 0;1 1 1 1 1] - [cc;0]*ones(1,5)) ./ ([fc;1]*ones(1,5)); | ||
46 | BASE = 5*dX*([0 1 0 0 0 0;0 0 0 1 0 0;0 0 0 0 0 1]); | ||
47 | IP = reshape([IP;BASE(:,1)*ones(1,5);IP],3,15); | ||
48 | |||
49 | figure(4); | ||
50 | [a,b] = view; | ||
51 | |||
52 | figure(4); | ||
53 | plot3(BASE(1,:),BASE(3,:),-BASE(2,:),'b-','linewidth',2'); | ||
54 | hold on; | ||
55 | plot3(IP(1,:),IP(3,:),-IP(2,:),'r-','linewidth',2); | ||
56 | text(6*dX,0,0,'X_c'); | ||
57 | text(-dX,5*dX,0,'Z_c'); | ||
58 | text(0,0,-6*dX,'Y_c'); | ||
59 | text(-dX,-dX,dX,'O_c'); | ||
60 | |||
61 | |||
62 | for kk = 1:n_ima, | ||
63 | |||
64 | if active_images(kk); | ||
65 | |||
66 | eval(['XX_kk = X_' num2str(kk) ';']); | ||
67 | eval(['omc_kk = omc_' num2str(kk) ';']); | ||
68 | eval(['Tc_kk = Tc_' num2str(kk) ';']); | ||
69 | N_kk = size(XX_kk,2); | ||
70 | |||
71 | if ~exist(['n_sq_x_' num2str(kk)]), | ||
72 | no_grid = 1; | ||
73 | end; | ||
74 | |||
75 | if ~no_grid, | ||
76 | eval(['n_sq_x = n_sq_x_' num2str(kk) ';']); | ||
77 | eval(['n_sq_y = n_sq_y_' num2str(kk) ';']); | ||
78 | if (N_kk ~= ((n_sq_x+1)*(n_sq_y+1))), | ||
79 | no_grid = 1; | ||
80 | end; | ||
81 | end; | ||
82 | |||
83 | if ~isnan(omc_kk(1,1)), | ||
84 | |||
85 | R_kk = rodrigues(omc_kk); | ||
86 | |||
87 | YY_kk = R_kk * XX_kk + Tc_kk * ones(1,length(XX_kk)); | ||
88 | |||
89 | uu = [-dX;-dY;0]/2; | ||
90 | uu = R_kk * uu + Tc_kk; | ||
91 | |||
92 | if ~no_grid, | ||
93 | YYx = zeros(n_sq_x+1,n_sq_y+1); | ||
94 | YYy = zeros(n_sq_x+1,n_sq_y+1); | ||
95 | YYz = zeros(n_sq_x+1,n_sq_y+1); | ||
96 | |||
97 | YYx(:) = YY_kk(1,:); | ||
98 | YYy(:) = YY_kk(2,:); | ||
99 | YYz(:) = YY_kk(3,:); | ||
100 | |||
101 | %keyboard; | ||
102 | |||
103 | figure(4); | ||
104 | hhh= mesh(YYx,YYz,-YYy); | ||
105 | set(hhh,'edgecolor',colors(rem(kk-1,6)+1),'linewidth',1); %,'facecolor','none'); | ||
106 | %plot3(YY_kk(1,:),YY_kk(3,:),-YY_kk(2,:),['o' colors(rem(kk-1,6)+1)]); | ||
107 | text(uu(1),uu(3),-uu(2),num2str(kk),'fontsize',14,'color',colors(rem(kk-1,6)+1)); | ||
108 | else | ||
109 | |||
110 | figure(4); | ||
111 | plot3(YY_kk(1,:),YY_kk(3,:),-YY_kk(2,:),['.' colors(rem(kk-1,6)+1)]); | ||
112 | text(uu(1),uu(3),-uu(2),num2str(kk),'fontsize',14,'color',colors(rem(kk-1,6)+1)); | ||
113 | |||
114 | end; | ||
115 | |||
116 | end; | ||
117 | |||
118 | end; | ||
119 | |||
120 | end; | ||
121 | |||
122 | figure(4);rotate3d on; | ||
123 | axis('equal'); | ||
124 | title('Extrinsic parameters'); | ||
125 | %view(60,30); | ||
126 | view(a,b); | ||
127 | hold off; | ||
128 | |||
129 | set(4,'Name','3D','NumberTitle','off'); | ||
130 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/extract_grid.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/extract_grid.m new file mode 100755 index 0000000..1e3cbdb --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/extract_grid.m | |||
@@ -0,0 +1,227 @@ | |||
1 | function [x,X,n_sq_x,n_sq_y,ind_orig,ind_x,ind_y] = extract_grid(I,wintx,winty,fc,cc,kc); | ||
2 | |||
3 | map = gray(256); | ||
4 | |||
5 | figure(2); | ||
6 | image(I); | ||
7 | colormap(map); | ||
8 | |||
9 | |||
10 | if nargin < 2, | ||
11 | |||
12 | disp('Window size for corner finder (wintx and winty):'); | ||
13 | wintx = input('wintx ([] = 5) = '); | ||
14 | if isempty(wintx), wintx = 5; end; | ||
15 | wintx = round(wintx); | ||
16 | winty = input('winty ([] = 5) = '); | ||
17 | if isempty(winty), winty = 5; end; | ||
18 | winty = round(winty); | ||
19 | |||
20 | fprintf(1,'Window size = %dx%d\n',2*wintx+1,2*winty+1); | ||
21 | |||
22 | end; | ||
23 | |||
24 | |||
25 | |||
26 | title('Click on the four extreme corners of the rectangular pattern...'); | ||
27 | |||
28 | disp('Click on the four extreme corners of the rectangular complete pattern...'); | ||
29 | |||
30 | [x,y] = ginput3(4); | ||
31 | |||
32 | [Xc,good,bad,type] = cornerfinder([x';y'],I,winty,wintx); % the four corners | ||
33 | |||
34 | x = Xc(1,:)'; | ||
35 | y = Xc(2,:)'; | ||
36 | |||
37 | [y,indy] = sort(y); | ||
38 | x = x(indy); | ||
39 | |||
40 | if (x(2) > x(1)), | ||
41 | x4 = x(1);y4 = y(1); x3 = x(2); y3 = y(2); | ||
42 | else | ||
43 | x4 = x(2);y4 = y(2); x3 = x(1); y3 = y(1); | ||
44 | end; | ||
45 | if (x(3) > x(4)), | ||
46 | x2 = x(3);y2 = y(3); x1 = x(4); y1 = y(4); | ||
47 | else | ||
48 | x2 = x(4);y2 = y(4); x1 = x(3); y1 = y(3); | ||
49 | end; | ||
50 | |||
51 | x = [x1;x2;x3;x4]; | ||
52 | y = [y1;y2;y3;y4]; | ||
53 | |||
54 | |||
55 | figure(2); hold on; | ||
56 | plot([x;x(1)],[y;y(1)],'g-'); | ||
57 | plot(x,y,'og'); | ||
58 | hx=text((x(4)+x(3))/2,(y(4)+y(3))/2 - 20,'X'); | ||
59 | set(hx,'color','g','Fontsize',14); | ||
60 | hy=text((x(4)+x(1))/2-20,(y(4)+y(1))/2,'Y'); | ||
61 | set(hy,'color','g','Fontsize',14); | ||
62 | hold off; | ||
63 | |||
64 | |||
65 | % Try to automatically count the number of squares in the grid | ||
66 | |||
67 | n_sq_x1 = count_squares(I,x1,y1,x2,y2,wintx); | ||
68 | n_sq_x2 = count_squares(I,x3,y3,x4,y4,wintx); | ||
69 | n_sq_y1 = count_squares(I,x2,y2,x3,y3,wintx); | ||
70 | n_sq_y2 = count_squares(I,x4,y4,x1,y1,wintx); | ||
71 | |||
72 | |||
73 | |||
74 | % If could not count the number of squares, enter manually | ||
75 | |||
76 | if (n_sq_x1~=n_sq_x2)|(n_sq_y1~=n_sq_y2), | ||
77 | |||
78 | |||
79 | disp('Could not count the number of squares in the grid. Enter manually.'); | ||
80 | n_sq_x = input('Number of squares along the X direction ([]=10) = '); %6 | ||
81 | if isempty(n_sq_x), n_sq_x = 10; end; | ||
82 | n_sq_y = input('Number of squares along the Y direction ([]=10) = '); %6 | ||
83 | if isempty(n_sq_y), n_sq_y = 10; end; | ||
84 | |||
85 | else | ||
86 | |||
87 | n_sq_x = n_sq_x1; | ||
88 | n_sq_y = n_sq_y1; | ||
89 | |||
90 | end; | ||
91 | |||
92 | |||
93 | % Enter the size of each square | ||
94 | |||
95 | dX = input(['Size dX of each square along the X direction ([]=3cm) = ']); | ||
96 | dY = input(['Size dY of each square along the Y direction ([]=3cm) = ']); | ||
97 | if isempty(dX), dX = 3; end; | ||
98 | if isempty(dY), dY = 3; end; | ||
99 | |||
100 | |||
101 | |||
102 | % Compute the inside points through computation of the planar homography (collineation) | ||
103 | |||
104 | a00 = [x(1);y(1);1]; | ||
105 | a10 = [x(2);y(2);1]; | ||
106 | a11 = [x(3);y(3);1]; | ||
107 | a01 = [x(4);y(4);1]; | ||
108 | |||
109 | |||
110 | % Compute the planart collineation: (return the normalization matrice as well) | ||
111 | |||
112 | [Homo,Hnorm,inv_Hnorm] = compute_homography ([a00 a10 a11 a01],[0 1 1 0;0 0 1 1;1 1 1 1]); | ||
113 | |||
114 | |||
115 | % Build the grid using the planar collineation: | ||
116 | |||
117 | x_l = ((0:n_sq_x)'*ones(1,n_sq_y+1))/n_sq_x; | ||
118 | y_l = (ones(n_sq_x+1,1)*(0:n_sq_y))/n_sq_y; | ||
119 | pts = [x_l(:) y_l(:) ones((n_sq_x+1)*(n_sq_y+1),1)]'; | ||
120 | |||
121 | XX = Homo*pts; | ||
122 | XX = XX(1:2,:) ./ (ones(2,1)*XX(3,:)); | ||
123 | |||
124 | |||
125 | % Complete size of the rectangle | ||
126 | |||
127 | W = n_sq_x*dX; | ||
128 | L = n_sq_y*dY; | ||
129 | |||
130 | |||
131 | |||
132 | if nargin < 6, | ||
133 | |||
134 | %%%%%%%%%%%%%%%%%%%%%%%% ADDITIONAL STUFF IN THE CASE OF HIGHLY DISTORTED IMAGES %%%%%%%%%%%%% | ||
135 | figure(2); | ||
136 | hold on; | ||
137 | plot(XX(1,:),XX(2,:),'r+'); | ||
138 | title('The red crosses should be close to the image corners'); | ||
139 | hold off; | ||
140 | |||
141 | disp('If the guessed grid corners (red crosses on the image) are not close to the actual corners,'); | ||
142 | disp('it is necessary to enter an initial guess for the radial distortion factor kc (useful for subpixel detection)'); | ||
143 | quest_distort = input('Need of an initial guess for distortion? ([]=no, other=yes) '); | ||
144 | |||
145 | quest_distort = ~isempty(quest_distort); | ||
146 | |||
147 | if quest_distort, | ||
148 | % Estimation of focal length: | ||
149 | c_g = [size(I,2);size(I,1)]/2 + .5; | ||
150 | f_g = Distor2Calib(0,[[x(1) x(2) x(4) x(3)] - c_g(1);[y(1) y(2) y(4) y(3)] - c_g(2)],1,1,4,W,L,[-W/2 W/2 W/2 -W/2;L/2 L/2 -L/2 -L/2; 0 0 0 0],100,1,1); | ||
151 | f_g = mean(f_g); | ||
152 | script_fit_distortion; | ||
153 | end; | ||
154 | %%%%%%%%%%%%%%%%%%%%% END ADDITIONAL STUFF IN THE CASE OF HIGHLY DISTORTED IMAGES %%%%%%%%%%%%% | ||
155 | |||
156 | else | ||
157 | |||
158 | xy_corners_undist = comp_distortion_oulu([(x' - cc(1))/fc(1);(y'-cc(2))/fc(1)],kc); | ||
159 | |||
160 | xu = xy_corners_undist(1,:)'; | ||
161 | yu = xy_corners_undist(2,:)'; | ||
162 | |||
163 | [XXu] = projectedGrid ( [xu(1);yu(1)], [xu(2);yu(2)],[xu(3);yu(3)], [xu(4);yu(4)],n_sq_x+1,n_sq_y+1); % The full grid | ||
164 | |||
165 | r2 = sum(XXu.^2); | ||
166 | XX = (ones(2,1)*(1 + kc(1) * r2 + kc(2) * (r2.^2))) .* XXu; | ||
167 | XX(1,:) = fc(1)*XX(1,:)+cc(1); | ||
168 | XX(2,:) = fc(2)*XX(2,:)+cc(2); | ||
169 | |||
170 | end; | ||
171 | |||
172 | |||
173 | Np = (n_sq_x+1)*(n_sq_y+1); | ||
174 | |||
175 | disp('Corner extraction...'); | ||
176 | |||
177 | grid_pts = cornerfinder(XX,I,winty,wintx); %%% Finds the exact corners at every points! | ||
178 | |||
179 | grid_pts = grid_pts - 1; % subtract 1 to bring the origin to (0,0) instead of (1,1) in matlab (not necessary in C) | ||
180 | |||
181 | ind_corners = [1 n_sq_x+1 (n_sq_x+1)*n_sq_y+1 (n_sq_x+1)*(n_sq_y+1)]; % index of the 4 corners | ||
182 | ind_orig = (n_sq_x+1)*n_sq_y + 1; | ||
183 | xorig = grid_pts(1,ind_orig); | ||
184 | yorig = grid_pts(2,ind_orig); | ||
185 | dxpos = mean([grid_pts(:,ind_orig) grid_pts(:,ind_orig+1)]'); | ||
186 | dypos = mean([grid_pts(:,ind_orig) grid_pts(:,ind_orig-n_sq_x-1)]'); | ||
187 | |||
188 | |||
189 | ind_x = (n_sq_x+1)*(n_sq_y + 1); | ||
190 | ind_y = 1; | ||
191 | |||
192 | x_box_kk = [grid_pts(1,:)-(wintx+.5);grid_pts(1,:)+(wintx+.5);grid_pts(1,:)+(wintx+.5);grid_pts(1,:)-(wintx+.5);grid_pts(1,:)-(wintx+.5)]; | ||
193 | y_box_kk = [grid_pts(2,:)-(winty+.5);grid_pts(2,:)-(winty+.5);grid_pts(2,:)+(winty+.5);grid_pts(2,:)+(winty+.5);grid_pts(2,:)-(winty+.5)]; | ||
194 | |||
195 | |||
196 | figure(3); | ||
197 | image(I); colormap(map); hold on; | ||
198 | plot(grid_pts(1,:)+1,grid_pts(2,:)+1,'r+'); | ||
199 | plot(x_box_kk+1,y_box_kk+1,'-b'); | ||
200 | plot(grid_pts(1,ind_corners)+1,grid_pts(2,ind_corners)+1,'mo'); | ||
201 | plot(xorig+1,yorig+1,'*m'); | ||
202 | h = text(xorig-15,yorig-15,'O'); | ||
203 | set(h,'Color','m','FontSize',14); | ||
204 | h2 = text(dxpos(1)-10,dxpos(2)-10,'dX'); | ||
205 | set(h2,'Color','g','FontSize',14); | ||
206 | h3 = text(dypos(1)-25,dypos(2)-3,'dY'); | ||
207 | set(h3,'Color','g','FontSize',14); | ||
208 | xlabel('Xc (in camera frame)'); | ||
209 | ylabel('Yc (in camera frame)'); | ||
210 | title('Extracted corners'); | ||
211 | zoom on; | ||
212 | drawnow; | ||
213 | hold off; | ||
214 | |||
215 | |||
216 | Xi = reshape(([0:n_sq_x]*dX)'*ones(1,n_sq_y+1),Np,1)'; | ||
217 | Yi = reshape(ones(n_sq_x+1,1)*[n_sq_y:-1:0]*dY,Np,1)'; | ||
218 | Zi = zeros(1,Np); | ||
219 | |||
220 | Xgrid = [Xi;Yi;Zi]; | ||
221 | |||
222 | |||
223 | % All the point coordinates (on the image, and in 3D) - for global optimization: | ||
224 | |||
225 | x = grid_pts; | ||
226 | X = Xgrid; | ||
227 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/extract_parameters.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/extract_parameters.m new file mode 100755 index 0000000..8e0e1f1 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/extract_parameters.m | |||
@@ -0,0 +1,46 @@ | |||
1 | |||
2 | %%% Extraction of the final intrinsic and extrinsic paramaters: | ||
3 | |||
4 | check_active_images; | ||
5 | |||
6 | fc = solution(1:2); | ||
7 | kc = solution(3:6); | ||
8 | cc = solution(6*n_ima + 4 +3:6*n_ima + 5 +3); | ||
9 | |||
10 | % Calibration matrix: | ||
11 | |||
12 | KK = [fc(1) 0 cc(1);0 fc(2) cc(2); 0 0 1]; | ||
13 | inv_KK = inv(KK); | ||
14 | |||
15 | % Extract the extrinsic paramters, and recomputer the collineations | ||
16 | |||
17 | for kk = 1:n_ima, | ||
18 | |||
19 | if active_images(kk), | ||
20 | |||
21 | omckk = solution(4+6*(kk-1) + 3:6*kk + 3); | ||
22 | Tckk = solution(6*kk+1 + 3:6*kk+3 + 3); | ||
23 | |||
24 | Rckk = rodrigues(omckk); | ||
25 | |||
26 | Hkk = KK * [Rckk(:,1) Rckk(:,2) Tckk]; | ||
27 | |||
28 | Hkk = Hkk / Hkk(3,3); | ||
29 | |||
30 | else | ||
31 | |||
32 | omckk = NaN*ones(3,1); | ||
33 | Tckk = NaN*ones(3,1); | ||
34 | Rckk = NaN*ones(3,3); | ||
35 | Hkk = NaN*ones(3,3); | ||
36 | |||
37 | end; | ||
38 | |||
39 | eval(['omc_' num2str(kk) ' = omckk;']); | ||
40 | eval(['Rc_' num2str(kk) ' = Rckk;']); | ||
41 | eval(['Tc_' num2str(kk) ' = Tckk;']); | ||
42 | eval(['H_' num2str(kk) '= Hkk;']); | ||
43 | |||
44 | end; | ||
45 | |||
46 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/extract_parameters3D.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/extract_parameters3D.m new file mode 100755 index 0000000..841c6ab --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/extract_parameters3D.m | |||
@@ -0,0 +1,36 @@ | |||
1 | |||
2 | %%% Extraction of the final intrinsic and extrinsic paramaters: | ||
3 | |||
4 | |||
5 | fc = solution(1:2); | ||
6 | kc = solution(3:6); | ||
7 | cc = solution(6*n_ima + 4 +3:6*n_ima + 5 +3); | ||
8 | |||
9 | % Calibration matrix: | ||
10 | |||
11 | KK = [fc(1) 0 cc(1);0 fc(2) cc(2); 0 0 1]; | ||
12 | inv_KK = inv(KK); | ||
13 | |||
14 | % Extract the extrinsic paramters, and recomputer the collineations | ||
15 | |||
16 | for kk = 1:n_ima, | ||
17 | |||
18 | omckk = solution(4+6*(kk-1) + 3:6*kk + 3); | ||
19 | |||
20 | Tckk = solution(6*kk+1 + 3:6*kk+3 + 3); | ||
21 | |||
22 | Rckk = rodrigues(omckk); | ||
23 | |||
24 | Hlkk = KK * [Rckk(:,1) Rckk(:,2) Tckk]; | ||
25 | |||
26 | Hlkk = Hlkk / Hlkk(3,3); | ||
27 | |||
28 | eval(['omc_' num2str(kk) ' = omckk;']); | ||
29 | eval(['Rc_' num2str(kk) ' = Rckk;']); | ||
30 | eval(['Tc_' num2str(kk) ' = Tckk;']); | ||
31 | |||
32 | eval(['Hl_' num2str(kk) '=Hlkk;']); | ||
33 | |||
34 | end; | ||
35 | |||
36 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/extrinsic_computation.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/extrinsic_computation.m new file mode 100755 index 0000000..8cf10db --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/extrinsic_computation.m | |||
@@ -0,0 +1,173 @@ | |||
1 | %%% INPUT THE IMAGE FILE NAME: | ||
2 | |||
3 | dir; | ||
4 | |||
5 | fprintf(1,'\n'); | ||
6 | disp('Computation of the extrinsic parameters from an image of a pattern'); | ||
7 | disp('The intrinsic camera parameters are assumed to be known (previously computed)'); | ||
8 | |||
9 | fprintf(1,'\n'); | ||
10 | image_name = input('Image name (full name without extension): ','s'); | ||
11 | |||
12 | format_image2 = '0'; | ||
13 | |||
14 | while format_image2 == '0', | ||
15 | |||
16 | format_image2 = input('Image format: ([]=''r''=''ras'', ''b''=''bmp'', ''t''=''tif'', ''p''=''pgm'', ''j''=''jpg'') ','s'); | ||
17 | |||
18 | if isempty(format_image2), | ||
19 | format_image2 = 'ras'; | ||
20 | end; | ||
21 | |||
22 | if lower(format_image2(1)) == 'b', | ||
23 | format_image2 = 'bmp'; | ||
24 | else | ||
25 | if lower(format_image2(1)) == 't', | ||
26 | format_image2 = 'tif'; | ||
27 | else | ||
28 | if lower(format_image2(1)) == 'p', | ||
29 | format_image2 = 'pgm'; | ||
30 | else | ||
31 | if lower(format_image2(1)) == 'j', | ||
32 | format_image2 = 'jpg'; | ||
33 | else | ||
34 | if lower(format_image2(1)) == 'r', | ||
35 | format_image2 = 'ras'; | ||
36 | else | ||
37 | disp('Invalid image format'); | ||
38 | format_image2 = '0'; % Ask for format once again | ||
39 | end; | ||
40 | end; | ||
41 | end; | ||
42 | end; | ||
43 | end; | ||
44 | end; | ||
45 | |||
46 | ima_name = [image_name '.' format_image]; | ||
47 | |||
48 | |||
49 | |||
50 | %%% READ IN IMAGE: | ||
51 | |||
52 | if format_image(1) == 'p', | ||
53 | I = double(pgmread(ima_name)); | ||
54 | else | ||
55 | if format_image(1) == 'r', | ||
56 | I = readras(ima_name); | ||
57 | else | ||
58 | I = double(imread(ima_name)); | ||
59 | end; | ||
60 | end; | ||
61 | |||
62 | if size(I,3)>1, | ||
63 | I = I(:,:,2); | ||
64 | end; | ||
65 | |||
66 | |||
67 | %%% EXTRACT GRID CORNERS: | ||
68 | |||
69 | fprintf(1,'\nExtraction of the grid corners on the image\n'); | ||
70 | |||
71 | disp('Window size for corner finder (wintx and winty):'); | ||
72 | wintx = input('wintx ([] = 5) = '); | ||
73 | if isempty(wintx), wintx = 5; end; | ||
74 | wintx = round(wintx); | ||
75 | winty = input('winty ([] = 5) = '); | ||
76 | if isempty(winty), winty = 5; end; | ||
77 | winty = round(winty); | ||
78 | |||
79 | fprintf(1,'Window size = %dx%d\n',2*wintx+1,2*winty+1); | ||
80 | |||
81 | [x_ext,X_ext,n_sq_x,n_sq_y,ind_orig,ind_x,ind_y] = extract_grid(I,wintx,winty,fc,cc,kc); | ||
82 | |||
83 | |||
84 | |||
85 | %%% Computation of the Extrinsic Parameters attached to the grid: | ||
86 | |||
87 | [omc_ext,Tc_ext,Rc_ext,H_ext] = compute_extrinsic(x_ext,X_ext,fc,cc,kc); | ||
88 | |||
89 | |||
90 | %%% Reproject the points on the image: | ||
91 | |||
92 | [x_reproj] = project_points(X_ext,omc_ext,Tc_ext,fc,cc,kc); | ||
93 | |||
94 | err_reproj = x_ext - x_reproj; | ||
95 | |||
96 | err_std2 = std(err_reproj')'; | ||
97 | |||
98 | |||
99 | Basis = [X_ext(:,[ind_orig ind_x ind_orig ind_y ind_orig ])]; | ||
100 | |||
101 | VX = Basis(:,2) - Basis(:,1); | ||
102 | VY = Basis(:,4) - Basis(:,1); | ||
103 | |||
104 | nX = norm(VX); | ||
105 | nY = norm(VY); | ||
106 | |||
107 | VZ = min(nX,nY) * cross(VX/nX,VY/nY); | ||
108 | |||
109 | Basis = [Basis VZ]; | ||
110 | |||
111 | [x_basis] = project_points(Basis,omc_ext,Tc_ext,fc,cc,kc); | ||
112 | |||
113 | dxpos = (x_basis(:,2) + x_basis(:,1))/2; | ||
114 | dypos = (x_basis(:,4) + x_basis(:,3))/2; | ||
115 | dzpos = (x_basis(:,6) + x_basis(:,5))/2; | ||
116 | |||
117 | |||
118 | |||
119 | figure(2); | ||
120 | image(I); | ||
121 | colormap(gray(256)); | ||
122 | hold on; | ||
123 | plot(x_ext(1,:)+1,x_ext(2,:)+1,'r+'); | ||
124 | plot(x_reproj(1,:)+1,x_reproj(2,:)+1,'yo'); | ||
125 | h = text(x_ext(1,ind_orig)-25,x_ext(2,ind_orig)-25,'O'); | ||
126 | set(h,'Color','g','FontSize',14); | ||
127 | h2 = text(dxpos(1)+1,dxpos(2)-30,'X'); | ||
128 | set(h2,'Color','g','FontSize',14); | ||
129 | h3 = text(dypos(1)-30,dypos(2)+1,'Y'); | ||
130 | set(h3,'Color','g','FontSize',14); | ||
131 | h4 = text(dzpos(1)-10,dzpos(2)-20,'Z'); | ||
132 | set(h4,'Color','g','FontSize',14); | ||
133 | plot(x_basis(1,:)+1,x_basis(2,:)+1,'g-','linewidth',2); | ||
134 | title('Image points (+) and reprojected grid points (o)'); | ||
135 | hold off; | ||
136 | |||
137 | |||
138 | fprintf(1,'\n\nExtrinsic parameters:\n\n'); | ||
139 | fprintf(1,'Translation vector: Tc_ext = [ %3.6f \t %3.6f \t %3.6f ]\n',Tc_ext); | ||
140 | fprintf(1,'Rotation vector: omc_ext = [ %3.6f \t %3.6f \t %3.6f ]\n',omc_ext); | ||
141 | fprintf(1,'Rotation matrix: Rc_ext = [ %3.6f \t %3.6f \t %3.6f\n',Rc_ext(1,:)'); | ||
142 | fprintf(1,' %3.6f \t %3.6f \t %3.6f\n',Rc_ext(2,:)'); | ||
143 | fprintf(1,' %3.6f \t %3.6f \t %3.6f ]\n',Rc_ext(3,:)'); | ||
144 | fprintf(1,'Pixel error: err = [ %3.5f \t %3.5f ]\n\n',err_std2); | ||
145 | |||
146 | |||
147 | |||
148 | |||
149 | |||
150 | return; | ||
151 | |||
152 | |||
153 | % Stores the results: | ||
154 | |||
155 | kk = 1; | ||
156 | |||
157 | % Stores location of grid wrt camera: | ||
158 | |||
159 | eval(['omc_' num2str(kk) ' = omc_ext;']); | ||
160 | eval(['Tc_' num2str(kk) ' = Tc_ext;']); | ||
161 | |||
162 | % Stores the projected points: | ||
163 | |||
164 | eval(['y_' num2str(kk) ' = x_reproj;']); | ||
165 | eval(['X_' num2str(kk) ' = X_ext;']); | ||
166 | eval(['x_' num2str(kk) ' = x_ext;']); | ||
167 | |||
168 | |||
169 | % Organize the points in a grid: | ||
170 | |||
171 | eval(['n_sq_x_' num2str(kk) ' = n_sq_x;']); | ||
172 | eval(['n_sq_y_' num2str(kk) ' = n_sq_y;']); | ||
173 | \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/ginput3.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/ginput3.m new file mode 100755 index 0000000..56fe496 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/ginput3.m | |||
@@ -0,0 +1,216 @@ | |||
1 | function [out1,out2,out3] = ginput2(arg1) | ||
2 | %GINPUT Graphical input from mouse. | ||
3 | % [X,Y] = GINPUT(N) gets N points from the current axes and returns | ||
4 | % the X- and Y-coordinates in length N vectors X and Y. The cursor | ||
5 | % can be positioned using a mouse (or by using the Arrow Keys on some | ||
6 | % systems). Data points are entered by pressing a mouse button | ||
7 | % or any key on the keyboard except carriage return, which terminates | ||
8 | % the input before N points are entered. | ||
9 | % | ||
10 | % [X,Y] = GINPUT gathers an unlimited number of points until the | ||
11 | % return key is pressed. | ||
12 | % | ||
13 | % [X,Y,BUTTON] = GINPUT(N) returns a third result, BUTTON, that | ||
14 | % contains a vector of integers specifying which mouse button was | ||
15 | % used (1,2,3 from left) or ASCII numbers if a key on the keyboard | ||
16 | % was used. | ||
17 | |||
18 | % Copyright (c) 1984-96 by The MathWorks, Inc. | ||
19 | % $Revision: 5.18 $ $Date: 1996/11/10 17:48:08 $ | ||
20 | |||
21 | % Fixed version by Jean-Yves Bouguet to have a cross instead of 2 lines | ||
22 | % More visible for images | ||
23 | |||
24 | P = NaN*ones(16,16); | ||
25 | P(1:15,1:15) = 2*ones(15,15); | ||
26 | P(2:14,2:14) = ones(13,13); | ||
27 | P(3:13,3:13) = NaN*ones(11,11); | ||
28 | P(6:10,6:10) = 2*ones(5,5); | ||
29 | P(7:9,7:9) = 1*ones(3,3); | ||
30 | |||
31 | out1 = []; out2 = []; out3 = []; y = []; | ||
32 | c = computer; | ||
33 | if ~strcmp(c(1:2),'PC') & ~strcmp(c(1:2),'MA') | ||
34 | tp = get(0,'TerminalProtocol'); | ||
35 | else | ||
36 | tp = 'micro'; | ||
37 | end | ||
38 | |||
39 | if ~strcmp(tp,'none') & ~strcmp(tp,'x') & ~strcmp(tp,'micro'), | ||
40 | if nargout == 1, | ||
41 | if nargin == 1, | ||
42 | eval('out1 = trmginput(arg1);'); | ||
43 | else | ||
44 | eval('out1 = trmginput;'); | ||
45 | end | ||
46 | elseif nargout == 2 | nargout == 0, | ||
47 | if nargin == 1, | ||
48 | eval('[out1,out2] = trmginput(arg1);'); | ||
49 | else | ||
50 | eval('[out1,out2] = trmginput;'); | ||
51 | end | ||
52 | if nargout == 0 | ||
53 | out1 = [ out1 out2 ]; | ||
54 | end | ||
55 | elseif nargout == 3, | ||
56 | if nargin == 1, | ||
57 | eval('[out1,out2,out3] = trmginput(arg1);'); | ||
58 | else | ||
59 | eval('[out1,out2,out3] = trmginput;'); | ||
60 | end | ||
61 | end | ||
62 | else | ||
63 | |||
64 | fig = gcf; | ||
65 | figure(gcf); | ||
66 | |||
67 | if nargin == 0 | ||
68 | how_many = -1; | ||
69 | b = []; | ||
70 | else | ||
71 | how_many = arg1; | ||
72 | b = []; | ||
73 | if isstr(how_many) ... | ||
74 | | size(how_many,1) ~= 1 | size(how_many,2) ~= 1 ... | ||
75 | | ~(fix(how_many) == how_many) ... | ||
76 | | how_many < 0 | ||
77 | error('Requires a positive integer.') | ||
78 | end | ||
79 | if how_many == 0 | ||
80 | ptr_fig = 0; | ||
81 | while(ptr_fig ~= fig) | ||
82 | ptr_fig = get(0,'PointerWindow'); | ||
83 | end | ||
84 | scrn_pt = get(0,'PointerLocation'); | ||
85 | loc = get(fig,'Position'); | ||
86 | pt = [scrn_pt(1) - loc(1), scrn_pt(2) - loc(2)]; | ||
87 | out1 = pt(1); y = pt(2); | ||
88 | elseif how_many < 0 | ||
89 | error('Argument must be a positive integer.') | ||
90 | end | ||
91 | end | ||
92 | |||
93 | pointer = get(gcf,'pointer'); | ||
94 | |||
95 | set(gcf,'Pointer','custom','PointerShapeCData',P,'PointerShapeHotSpot',[8,8]); | ||
96 | %set(gcf,'pointer','crosshair'); | ||
97 | fig_units = get(fig,'units'); | ||
98 | char = 0; | ||
99 | |||
100 | while how_many ~= 0 | ||
101 | % Use no-side effect WAITFORBUTTONPRESS | ||
102 | waserr = 0; | ||
103 | eval('keydown = wfbp;', 'waserr = 1;'); | ||
104 | if(waserr == 1) | ||
105 | if(ishandle(fig)) | ||
106 | set(fig,'pointer',pointer,'units',fig_units); | ||
107 | error('Interrupted'); | ||
108 | else | ||
109 | error('Interrupted by figure deletion'); | ||
110 | end | ||
111 | end | ||
112 | |||
113 | ptr_fig = get(0,'CurrentFigure'); | ||
114 | if(ptr_fig == fig) | ||
115 | if keydown | ||
116 | char = get(fig, 'CurrentCharacter'); | ||
117 | button = abs(get(fig, 'CurrentCharacter')); | ||
118 | scrn_pt = get(0, 'PointerLocation'); | ||
119 | set(fig,'units','pixels') | ||
120 | loc = get(fig, 'Position'); | ||
121 | pt = [scrn_pt(1) - loc(1), scrn_pt(2) - loc(2)]; | ||
122 | set(fig,'CurrentPoint',pt); | ||
123 | else | ||
124 | button = get(fig, 'SelectionType'); | ||
125 | if strcmp(button,'open') | ||
126 | button = b(length(b)); | ||
127 | elseif strcmp(button,'normal') | ||
128 | button = 1; | ||
129 | elseif strcmp(button,'extend') | ||
130 | button = 2; | ||
131 | elseif strcmp(button,'alt') | ||
132 | button = 3; | ||
133 | else | ||
134 | error('Invalid mouse selection.') | ||
135 | end | ||
136 | end | ||
137 | pt = get(gca, 'CurrentPoint'); | ||
138 | |||
139 | how_many = how_many - 1; | ||
140 | |||
141 | if(char == 13) % & how_many ~= 0) | ||
142 | % if the return key was pressed, char will == 13, | ||
143 | % and that's our signal to break out of here whether | ||
144 | % or not we have collected all the requested data | ||
145 | % points. | ||
146 | % If this was an early breakout, don't include | ||
147 | % the <Return> key info in the return arrays. | ||
148 | % We will no longer count it if it's the last input. | ||
149 | break; | ||
150 | end | ||
151 | |||
152 | out1 = [out1;pt(1,1)]; | ||
153 | y = [y;pt(1,2)]; | ||
154 | b = [b;button]; | ||
155 | end | ||
156 | end | ||
157 | |||
158 | set(fig,'pointer',pointer,'units',fig_units); | ||
159 | |||
160 | if nargout > 1 | ||
161 | out2 = y; | ||
162 | if nargout > 2 | ||
163 | out3 = b; | ||
164 | end | ||
165 | else | ||
166 | out1 = [out1 y]; | ||
167 | end | ||
168 | |||
169 | end | ||
170 | |||
171 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||
172 | function key = wfbp | ||
173 | %WFBP Replacement for WAITFORBUTTONPRESS that has no side effects. | ||
174 | |||
175 | % Remove figure button functions | ||
176 | fprops = {'windowbuttonupfcn','buttondownfcn', ... | ||
177 | 'windowbuttondownfcn','windowbuttonmotionfcn'}; | ||
178 | fig = gcf; | ||
179 | fvals = get(fig,fprops); | ||
180 | set(fig,fprops,{'','','',''}) | ||
181 | |||
182 | % Remove all other buttondown functions | ||
183 | ax = findobj(fig,'type','axes'); | ||
184 | if isempty(ax) | ||
185 | ch = {}; | ||
186 | else | ||
187 | ch = get(ax,{'Children'}); | ||
188 | end | ||
189 | for i=1:length(ch), | ||
190 | ch{i} = ch{i}(:)'; | ||
191 | end | ||
192 | h = [ax(:)',ch{:}]; | ||
193 | vals = get(h,{'buttondownfcn'}); | ||
194 | mt = repmat({''},size(vals)); | ||
195 | set(h,{'buttondownfcn'},mt); | ||
196 | |||
197 | % Now wait for that buttonpress, and check for error conditions | ||
198 | waserr = 0; | ||
199 | eval(['if nargout==0,', ... | ||
200 | ' waitforbuttonpress,', ... | ||
201 | 'else,', ... | ||
202 | ' keydown = waitforbuttonpress;',... | ||
203 | 'end' ], 'waserr = 1;'); | ||
204 | |||
205 | % Put everything back | ||
206 | if(ishandle(fig)) | ||
207 | set(fig,fprops,fvals) | ||
208 | set(h,{'buttondownfcn'},vals) | ||
209 | end | ||
210 | |||
211 | if(waserr == 1) | ||
212 | error('Interrupted'); | ||
213 | end | ||
214 | |||
215 | if nargout>0, key = keydown; end | ||
216 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/go_calib_optim.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/go_calib_optim.m new file mode 100755 index 0000000..6eb1c82 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/go_calib_optim.m | |||
@@ -0,0 +1,60 @@ | |||
1 | %go_calib_optim | ||
2 | % | ||
3 | %Main calibration function. Computes the intrinsic andextrinsic parameters. | ||
4 | %Runs as a script. | ||
5 | % | ||
6 | %INPUT: x_1,x_2,x_3,...: Feature locations on the images | ||
7 | % X_1,X_2,X_3,...: Corresponding grid coordinates | ||
8 | % | ||
9 | %OUTPUT: fc: Camera focal length | ||
10 | % cc: Principal point coordinates | ||
11 | % kc: Distortion coefficients | ||
12 | % KK: The camera matrix (containing fc and cc) | ||
13 | % omc_1,omc_2,omc_3,...: 3D rotation vectors attached to the grid positions in space | ||
14 | % Tc_1,Tc_2,Tc_3,...: 3D translation vectors attached to the grid positions in space | ||
15 | % Rc_1,Rc_2,Rc_3,...: 3D rotation matrices corresponding to the omc vectors | ||
16 | % | ||
17 | %Method: Minimizes the pixel reprojection error in the least squares sense over the intrinsic | ||
18 | % camera parameters, and the extrinsic parameters (3D locations of the grids in space) | ||
19 | % | ||
20 | %Note: If the intrinsic camera parameters (fc, cc, kc) do not exist before, they are initialized through | ||
21 | % the function init_intrinsic_param.m. Otherwise, the variables in memory are used as initial guesses. | ||
22 | % | ||
23 | %Note: The row vector active_images consists of zeros and ones. To deactivate an image, set the | ||
24 | % corresponding entry in the active_images vector to zero. | ||
25 | % | ||
26 | %VERY IMPORTANT: This function works for 2D and 3D calibration rigs, except for init_intrinsic_param.m | ||
27 | %that is so far implemented to work only with 2D rigs. | ||
28 | %In the future, a more general function will be there. | ||
29 | %For now, if using a 3D calibration rig, set quick_init to 1 for an easy initialization of the focal length | ||
30 | |||
31 | |||
32 | desactivated_images = []; | ||
33 | |||
34 | |||
35 | go_calib_optim_iter; | ||
36 | |||
37 | |||
38 | if ~isempty(desactivated_images), | ||
39 | |||
40 | param_list_save = param_list; | ||
41 | |||
42 | fprintf(1,'\nNew optimization including the images that have been deactivated during the previous optimization.\n'); | ||
43 | active_images(desactivated_images) = ones(1,length(desactivated_images)); | ||
44 | desactivated_images = []; | ||
45 | |||
46 | go_calib_optim_iter; | ||
47 | |||
48 | if ~isempty(desactivated_images), | ||
49 | fprintf(1,['List of images left desactivated: ' num2str(desactivated_images) '\n' ] ); | ||
50 | end; | ||
51 | |||
52 | param_list = [param_list_save(:,1:end-1) param_list]; | ||
53 | |||
54 | end; | ||
55 | |||
56 | |||
57 | %%%%%%%%%%%%%%%%%%%% GRAPHICAL OUTPUT %%%%%%%%%%%%%%%%%%%%%%%% | ||
58 | |||
59 | %graphout_calib; | ||
60 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/go_calib_optim3D.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/go_calib_optim3D.m new file mode 100755 index 0000000..8cc5e30 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/go_calib_optim3D.m | |||
@@ -0,0 +1,264 @@ | |||
1 | % Simplified version of go_calib.m | ||
2 | |||
3 | |||
4 | if ~exist('x_1'), | ||
5 | click_calib; | ||
6 | end; | ||
7 | |||
8 | |||
9 | fprintf(1,'\nMain calibration procedure\n'); | ||
10 | |||
11 | % initial guess for principal point and distortion: | ||
12 | c_init = [nx;ny]/2 - 0.5; % initialize at the center of the image | ||
13 | k_init = [0;0;0;0]; % initialize to zero (no distortion) | ||
14 | |||
15 | |||
16 | % Compute explicitely the focal lentgh using all the (mutually orthogonal) vanishing points | ||
17 | % note: The vanihing points are hidden in the planar collineations H_kk | ||
18 | |||
19 | A = []; | ||
20 | b = []; | ||
21 | |||
22 | % matrix that subtract the principal point: | ||
23 | Sub_cc = [1 0 -c_init(1);0 1 -c_init(2);0 0 1]; | ||
24 | |||
25 | |||
26 | for kk=1:n_ima, | ||
27 | |||
28 | % left Pattern: | ||
29 | |||
30 | eval(['Hlkk = Hl_' num2str(kk) ';']); | ||
31 | |||
32 | Hlkk = Sub_cc * Hlkk; | ||
33 | |||
34 | % Extract vanishing points (direct and diagonals): | ||
35 | |||
36 | Vl_hori_pix = Hlkk(:,1); | ||
37 | Vl_vert_pix = Hlkk(:,2); | ||
38 | Vl_diag1_pix = (Hlkk(:,1)+Hlkk(:,2))/2; | ||
39 | Vl_diag2_pix = (Hlkk(:,1)-Hlkk(:,2))/2; | ||
40 | |||
41 | Vl_hori_pix = Vl_hori_pix/norm(Vl_hori_pix); | ||
42 | Vl_vert_pix = Vl_vert_pix/norm(Vl_vert_pix); | ||
43 | Vl_diag1_pix = Vl_diag1_pix/norm(Vl_diag1_pix); | ||
44 | Vl_diag2_pix = Vl_diag2_pix/norm(Vl_diag2_pix); | ||
45 | |||
46 | al1 = Vl_hori_pix(1); | ||
47 | bl1 = Vl_hori_pix(2); | ||
48 | cl1 = Vl_hori_pix(3); | ||
49 | |||
50 | al2 = Vl_vert_pix(1); | ||
51 | bl2 = Vl_vert_pix(2); | ||
52 | cl2 = Vl_vert_pix(3); | ||
53 | |||
54 | al3 = Vl_diag1_pix(1); | ||
55 | bl3 = Vl_diag1_pix(2); | ||
56 | cl3 = Vl_diag1_pix(3); | ||
57 | |||
58 | al4 = Vl_diag2_pix(1); | ||
59 | bl4 = Vl_diag2_pix(2); | ||
60 | cl4 = Vl_diag2_pix(3); | ||
61 | |||
62 | % right Pattern: | ||
63 | |||
64 | eval(['Hrkk = Hr_' num2str(kk) ';']); | ||
65 | |||
66 | Hrkk = Sub_cc * Hrkk; | ||
67 | |||
68 | % Extract vanishing points (direct and diagonals): | ||
69 | |||
70 | Vr_hori_pix = Hrkk(:,1); | ||
71 | Vr_vert_pix = Hrkk(:,2); | ||
72 | Vr_diag1_pix = (Hrkk(:,1)+Hrkk(:,2))/2; | ||
73 | Vr_diag2_pix = (Hrkk(:,1)-Hrkk(:,2))/2; | ||
74 | |||
75 | Vr_hori_pix = Vr_hori_pix/norm(Vl_hori_pix); | ||
76 | Vr_vert_pix = Vr_vert_pix/norm(Vl_vert_pix); | ||
77 | Vr_diag1_pix = Vr_diag1_pix/norm(Vr_diag1_pix); | ||
78 | Vr_diag2_pix = Vr_diag2_pix/norm(Vr_diag2_pix); | ||
79 | |||
80 | ar1 = Vr_hori_pix(1); | ||
81 | br1 = Vr_hori_pix(2); | ||
82 | cr1 = Vr_hori_pix(3); | ||
83 | |||
84 | ar2 = Vr_vert_pix(1); | ||
85 | br2 = Vr_vert_pix(2); | ||
86 | cr2 = Vr_vert_pix(3); | ||
87 | |||
88 | ar3 = Vr_diag1_pix(1); | ||
89 | br3 = Vr_diag1_pix(2); | ||
90 | cr3 = Vr_diag1_pix(3); | ||
91 | |||
92 | ar4 = Vr_diag2_pix(1); | ||
93 | br4 = Vr_diag2_pix(2); | ||
94 | cr4 = Vr_diag2_pix(3); | ||
95 | |||
96 | |||
97 | % Collect all the constraints: | ||
98 | |||
99 | A_kk = [al1*al2 bl1*bl2; | ||
100 | al3*al4 bl3*bl4; | ||
101 | ar1*ar2 br1*br2; | ||
102 | ar3*ar4 br3*br4; | ||
103 | al1*ar1 bl1*br1]; | ||
104 | |||
105 | b_kk = -[cl1*cl2;cl3*cl4;cr1*cr2;cr3*cr4;cl1*cr1]; | ||
106 | |||
107 | |||
108 | A = [A;A_kk]; | ||
109 | b = [b;b_kk]; | ||
110 | |||
111 | end; | ||
112 | |||
113 | % use all the vanishing points to estimate focal length: | ||
114 | |||
115 | f_init = sqrt(abs(1./(inv(A'*A)*A'*b))); % if using a two-focal model for initial guess | ||
116 | |||
117 | %f_init = sqrt(b'*(sum(A')') / (b'*b)) * ones(2,1); % if single focal length model is used | ||
118 | |||
119 | |||
120 | % Global calibration matrix (initial guess): | ||
121 | |||
122 | KK = [f_init(1) 0 c_init(1);0 f_init(2) c_init(2); 0 0 1]; | ||
123 | inv_KK = inv(KK); | ||
124 | |||
125 | |||
126 | % Computing of the extrinsic parameters (from the collineations) | ||
127 | |||
128 | for kk = 1:n_ima, | ||
129 | |||
130 | eval(['Hlkk = Hl_' num2str(kk) ';']); | ||
131 | |||
132 | Hl2 = inv_KK*Hlkk; | ||
133 | |||
134 | sc = mean([norm(Hl2(:,1));norm(Hl2(:,2))]); | ||
135 | |||
136 | Hl2 = Hl2/sc; | ||
137 | |||
138 | eval(['Hrkk = Hr_' num2str(kk) ';']); | ||
139 | |||
140 | Hr2 = inv_KK*Hrkk; | ||
141 | |||
142 | sc = mean([norm(Hr2(:,1));norm(Hr2(:,2))]); | ||
143 | |||
144 | Hr2 = Hr2/sc; | ||
145 | |||
146 | omcl = rodrigues([Hl2(:,1:2) cross(Hl2(:,1),Hl2(:,2))]); | ||
147 | Tcl = Hl2(:,3); | ||
148 | |||
149 | %omcr = rodrigues([Hr2(:,1:2) cross(Hr2(:,1),Hr2(:,2))]); | ||
150 | %Tcr = Hr2(:,3); | ||
151 | |||
152 | |||
153 | omckk = omcl; %rodrigues([H2(:,1:2) cross(H2(:,1),H2(:,2))]); | ||
154 | Tckk = Tcl; %H2(:,3); | ||
155 | |||
156 | eval(['omc_' num2str(kk) ' = omckk;']); | ||
157 | eval(['Tc_' num2str(kk) ' = Tckk;']); | ||
158 | |||
159 | end; | ||
160 | |||
161 | |||
162 | |||
163 | % Initialisation of the parameters for global minimization: | ||
164 | |||
165 | init_param = [f_init;k_init]; | ||
166 | |||
167 | for kk = 1:n_ima, | ||
168 | eval(['init_param = [init_param; omc_' num2str(kk) '; Tc_' num2str(kk) '];']); | ||
169 | end; | ||
170 | |||
171 | if ~exist('lsqnonlin'), | ||
172 | |||
173 | options = [1 1e-4 1e-4 1e-6 0 0 0 0 0 0 0 0 0 6000 0 1e-8 0.1 0]; | ||
174 | |||
175 | if exist('leastsq'), | ||
176 | sss = ['[param,opt] = leastsq(''multi_error_oulu'',init_param,options,[],n_ima,c_init);']; | ||
177 | else | ||
178 | sss = ['[param,opt] = leastsq2(''multi_error_oulu'',init_param,options,[],n_ima,c_init);']; | ||
179 | end; | ||
180 | |||
181 | else | ||
182 | |||
183 | options = optimset('lsqnonlin'); | ||
184 | options.MaxIter = 6000; | ||
185 | options.Display = 'iter'; | ||
186 | sss = ['[param,opt] = lsqnonlin(''multi_error_oulu'',init_param,[],[],options,n_ima,c_init);']; | ||
187 | |||
188 | end; | ||
189 | |||
190 | |||
191 | fprintf(1,'\nOptimization not including the principal point...\n') | ||
192 | eval(sss); | ||
193 | |||
194 | history = [[init_param;c_init] [param;c_init]]; | ||
195 | |||
196 | sol_no_center = [param;c_init]; | ||
197 | |||
198 | init_param = sol_no_center; | ||
199 | |||
200 | fprintf(1,'\nOptimization including the principal point...\n') | ||
201 | |||
202 | eval(sss); | ||
203 | |||
204 | history = [history param]; | ||
205 | |||
206 | |||
207 | sol_with_center = param; | ||
208 | |||
209 | |||
210 | |||
211 | |||
212 | %%% Extraction of the final intrinsic and extrinsic paramaters (in the no-center case): | ||
213 | |||
214 | solution = sol_no_center; | ||
215 | extract_parameters3D; | ||
216 | |||
217 | fprintf(1,'\n\nCalibration results without principal point estimation:\n\n'); | ||
218 | fprintf(1,'Focal Length: fc = [ %3.5f %3.5f]\n',fc); | ||
219 | fprintf(1,'Principal point: cc = [ %3.5f %3.5f]\n',cc); | ||
220 | fprintf(1,'Distortion: kc = [ %3.5f %3.5f %3.5f %3.5f]\n',kc); | ||
221 | fprintf(1,['Pixel error: [click on ''sol. without center'']\n']); | ||
222 | |||
223 | |||
224 | |||
225 | |||
226 | % Pick the solution with principal point | ||
227 | %%% NOTE: At that point, the user can choose which solution to pick: with or without | ||
228 | %%% principal point estimation. By default, we pick the solution with principal point. | ||
229 | |||
230 | solution = sol_with_center; | ||
231 | |||
232 | |||
233 | |||
234 | %%% Extraction of the final intrinsic and extrinsic paramaters: | ||
235 | |||
236 | extract_parameters3D; | ||
237 | |||
238 | |||
239 | fprintf(1,'\n\nCalibration results with principal point estimation:\n\n'); | ||
240 | fprintf(1,'Focal Length: fc = [ %3.5f %3.5f]\n',fc); | ||
241 | fprintf(1,'Principal point: cc = [ %3.5f %3.5f]\n',cc); | ||
242 | fprintf(1,'Distortion: kc = [ %3.5f %3.5f %3.5f %3.5f]\n',kc); | ||
243 | |||
244 | |||
245 | %%%%%%%%%%%%%%%%%%%% GRAPHICAL OUTPUT %%%%%%%%%%%%%%%%%%%%%%%% | ||
246 | |||
247 | graphout_calib3D; | ||
248 | |||
249 | |||
250 | |||
251 | fprintf(1,'Note: If the solution is not satisfactory, select solution without center estimation.\n\n'); | ||
252 | |||
253 | |||
254 | %%%%%%%%%%%%%% Save all the Calibration results: | ||
255 | |||
256 | disp('Save calibration results under Calib_Results.mat'); | ||
257 | |||
258 | string_save = 'save Calib_Results fc kc cc ex x y solution sol_with_center sol_no_center history wintx winty n_ima type_numbering N_slots small_calib_image first_num image_numbers format_image calib_name Hcal Wcal nx ny map dX_default dY_default KK inv_KK dX dY'; | ||
259 | |||
260 | for kk = 1:n_ima, | ||
261 | string_save = [string_save ' X_' num2str(kk) ' x_' num2str(kk) ' y_' num2str(kk) ' ex_' num2str(kk) ' omc_' num2str(kk) ' Tc_' num2str(kk) ' Hl_' num2str(kk) ' nl_sq_x_' num2str(kk) ' nl_sq_y_' num2str(kk) ' Hr_' num2str(kk) ' nr_sq_x_' num2str(kk) ' nr_sq_y_' num2str(kk)]; | ||
262 | end; | ||
263 | |||
264 | eval(string_save); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/go_calib_optim_cont.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/go_calib_optim_cont.m new file mode 100755 index 0000000..9ff3f0b --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/go_calib_optim_cont.m | |||
@@ -0,0 +1,142 @@ | |||
1 | % Simplified version of go_calib.m | ||
2 | |||
3 | if ~exist('x_1'), | ||
4 | click_calib; | ||
5 | end; | ||
6 | |||
7 | |||
8 | % Initialisation of the parameters for global minimization: | ||
9 | |||
10 | init_param = [fc;kc]; | ||
11 | |||
12 | for kk = 1:n_ima, | ||
13 | |||
14 | if ~exist(['omc_' num2str(kk)]), | ||
15 | eval(['Hkk = H_' num2str(kk) ';']); | ||
16 | H2 = inv_KK*Hkk; | ||
17 | sc = mean([norm(H2(:,1));norm(H2(:,2))]); | ||
18 | H2 = H2/sc; | ||
19 | omckk = rodrigues([H2(:,1:2) cross(H2(:,1),H2(:,2))]); | ||
20 | Tckk = H2(:,3); | ||
21 | eval(['omc_' num2str(kk) ' = omckk;']); | ||
22 | eval(['Tc_' num2str(kk) ' = Tckk;']); | ||
23 | end; | ||
24 | |||
25 | eval(['init_param = [init_param; omc_' num2str(kk) '; Tc_' num2str(kk) '];']); | ||
26 | end; | ||
27 | |||
28 | init_param = [init_param;cc]; | ||
29 | |||
30 | |||
31 | |||
32 | %-------------------- Main Optimization: | ||
33 | |||
34 | fprintf(1,'\nRe-Optimization...\n') | ||
35 | |||
36 | |||
37 | param = init_param; | ||
38 | change = 1; | ||
39 | |||
40 | iter = 0; | ||
41 | |||
42 | fprintf(1,'Iteration '); | ||
43 | |||
44 | while (change > 1e-6)&(iter < 10), | ||
45 | |||
46 | fprintf(1,'%d...',iter+1); | ||
47 | |||
48 | JJ = []; | ||
49 | ex = []; | ||
50 | |||
51 | c = param(6*n_ima + 4 + 3:6*n_ima + 5 + 3); | ||
52 | f = param(1:2); | ||
53 | k = param(3:6); | ||
54 | |||
55 | for kk = 1:n_ima, | ||
56 | |||
57 | omckk = param(4+6*(kk-1) + 3:6*kk + 3); | ||
58 | |||
59 | Tckk = param(6*kk+1 + 3:6*kk+3 + 3); | ||
60 | |||
61 | eval(['X_kk = X_' num2str(kk) ';']); | ||
62 | eval(['x_kk = x_' num2str(kk) ';']); | ||
63 | |||
64 | Np = size(X_kk,2); | ||
65 | |||
66 | JJkk = zeros(2*Np,n_ima * 6 + 8); | ||
67 | |||
68 | [x,dxdom,dxdT,dxdf,dxdc,dxdk] = project_points(X_kk,omckk,Tckk,f,c,k); | ||
69 | |||
70 | exkk = x_kk - x; | ||
71 | |||
72 | ex = [ex;exkk(:)]; | ||
73 | |||
74 | JJkk(:,1:2) = dxdf; | ||
75 | JJkk(:,3:6) = dxdk; | ||
76 | JJkk(:,4+6*(kk-1) + 3:6*kk + 3) = dxdom; | ||
77 | JJkk(:,6*kk+1 + 3:6*kk+3 + 3) = dxdT; | ||
78 | JJkk(:,6*n_ima + 4 + 3:6*n_ima + 5 + 3) = dxdc; | ||
79 | |||
80 | JJ = [JJ;JJkk]; | ||
81 | |||
82 | end; | ||
83 | |||
84 | param_innov = inv(JJ'*JJ)*(JJ')*ex; | ||
85 | param_up = param + param_innov; | ||
86 | change = norm(param_innov)/norm(param_up); | ||
87 | param = param_up; | ||
88 | iter = iter + 1; | ||
89 | |||
90 | end; | ||
91 | |||
92 | fprintf(1,'\n'); | ||
93 | |||
94 | |||
95 | sol_with_center = param; | ||
96 | |||
97 | solution = sol_with_center; | ||
98 | |||
99 | |||
100 | %%% Extraction of the final intrinsic and extrinsic paramaters: | ||
101 | |||
102 | extract_parameters; | ||
103 | comp_error_calib; | ||
104 | |||
105 | fprintf(1,'\n\nCalibration results with principal point estimation:\n\n'); | ||
106 | fprintf(1,'Focal Length: fc = [ %3.5f %3.5f]\n',fc); | ||
107 | fprintf(1,'Principal point: cc = [ %3.5f %3.5f]\n',cc); | ||
108 | fprintf(1,'Distortion: kc = [ %3.5f %3.5f %3.5f %3.5f]\n',kc); | ||
109 | fprintf(1,'Pixel error: err = [ %3.5f %3.5f]\n\n',err_std); | ||
110 | |||
111 | |||
112 | %%%%%%%%%%%%%%%%%%%% GRAPHICAL OUTPUT %%%%%%%%%%%%%%%%%%%%%%%% | ||
113 | |||
114 | graphout_calib; | ||
115 | |||
116 | |||
117 | |||
118 | fprintf(1,'Note: If the solution is not satisfactory, select solution without center estimation.\n\n'); | ||
119 | |||
120 | |||
121 | %%%%%%%%%%%%%% Save all the Calibration results: | ||
122 | |||
123 | disp('Save calibration results under Calib_Results.mat'); | ||
124 | |||
125 | string_save = 'save Calib_Results fc kc cc ex x y solution sol_with_center solution_init history wintx winty n_ima type_numbering N_slots small_calib_image first_num image_numbers format_image calib_name Hcal Wcal nx ny map dX_default dY_default KK inv_KK dX dY'; | ||
126 | |||
127 | for kk = 1:n_ima, | ||
128 | string_save = [string_save ' X_' num2str(kk) ' x_' num2str(kk) ' y_' num2str(kk) ' ex_' num2str(kk) ' omc_' num2str(kk) ' Rc_' num2str(kk) ' Tc_' num2str(kk) ' H_' num2str(kk) ' Hini_' num2str(kk) ' n_sq_x_' num2str(kk) ' n_sq_y_' num2str(kk) ' wintx_' num2str(kk) ' winty_' num2str(kk) ' dX_' num2str(kk) ' dY_' num2str(kk)]; | ||
129 | end; | ||
130 | |||
131 | eval(string_save); | ||
132 | |||
133 | return; | ||
134 | |||
135 | if exist('calib_data.mat'), | ||
136 | ccc = computer; | ||
137 | if ccc(1)=='P', | ||
138 | eval('!del calib_data.mat'); | ||
139 | else | ||
140 | eval('!rm calib_data.mat'); | ||
141 | end; | ||
142 | end; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/go_calib_optim_iter.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/go_calib_optim_iter.m new file mode 100755 index 0000000..a076214 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/go_calib_optim_iter.m | |||
@@ -0,0 +1,332 @@ | |||
1 | %go_calib_optim_iter | ||
2 | % | ||
3 | %Main calibration function. Computes the intrinsic andextrinsic parameters. | ||
4 | %Runs as a script. | ||
5 | % | ||
6 | %INPUT: x_1,x_2,x_3,...: Feature locations on the images | ||
7 | % X_1,X_2,X_3,...: Corresponding grid coordinates | ||
8 | % | ||
9 | %OUTPUT: fc: Camera focal length | ||
10 | % cc: Principal point coordinates | ||
11 | % kc: Distortion coefficients | ||
12 | % KK: The camera matrix (containing fc and cc) | ||
13 | % omc_1,omc_2,omc_3,...: 3D rotation vectors attached to the grid positions in space | ||
14 | % Tc_1,Tc_2,Tc_3,...: 3D translation vectors attached to the grid positions in space | ||
15 | % Rc_1,Rc_2,Rc_3,...: 3D rotation matrices corresponding to the omc vectors | ||
16 | % | ||
17 | %Method: Minimizes the pixel reprojection error in the least squares sense over the intrinsic | ||
18 | % camera parameters, and the extrinsic parameters (3D locations of the grids in space) | ||
19 | % | ||
20 | %Note: If the intrinsic camera parameters (fc, cc, kc) do not exist before, they are initialized through | ||
21 | % the function init_intrinsic_param.m. Otherwise, the variables in memory are used as initial guesses. | ||
22 | % | ||
23 | %Note: The row vector active_images consists of zeros and ones. To deactivate an image, set the | ||
24 | % corresponding entry in the active_images vector to zero. | ||
25 | % | ||
26 | %VERY IMPORTANT: This function works for 2D and 3D calibration rigs, except for init_intrinsic_param.m | ||
27 | %that is so far implemented to work only with 2D rigs. | ||
28 | %In the future, a more general function will be there. | ||
29 | %For now, if using a 3D calibration rig, quick_init is set to 1 for an easy initialization of the focal length | ||
30 | |||
31 | |||
32 | check_active_images; | ||
33 | |||
34 | |||
35 | |||
36 | quick_init = 0; % Set to 1 for using a quick init (necessary when using 3D rigs) | ||
37 | |||
38 | |||
39 | |||
40 | % Check 3D-ness of the calibration rig: | ||
41 | rig3D = 0; | ||
42 | for kk = ind_active, | ||
43 | eval(['X_kk = X_' num2str(kk) ';']); | ||
44 | if is3D(X_kk), | ||
45 | rig3D = 1; | ||
46 | end; | ||
47 | end; | ||
48 | |||
49 | |||
50 | |||
51 | % If the rig is 3D, then no choice: the only valid initialization is manual! | ||
52 | if rig3D, | ||
53 | quick_init = 1; | ||
54 | end; | ||
55 | |||
56 | |||
57 | |||
58 | |||
59 | alpha = 0.4; % set alpha = 1; for steepest gradient descent | ||
60 | |||
61 | |||
62 | % Conditioning threshold for view rejection | ||
63 | thresh_cond = 1e6; | ||
64 | |||
65 | |||
66 | |||
67 | |||
68 | %% Initialization of the intrinsic parameters (if necessary) | ||
69 | |||
70 | if ~exist('cc'), | ||
71 | fprintf(1,'Initialization of the principal point at the center of the image.\n'); | ||
72 | cc = [(nx-1)/2;(ny-1)/2]; | ||
73 | end; | ||
74 | |||
75 | |||
76 | if ~exist('kc'), | ||
77 | fprintf(1,'Initialization of the image distortion to zero.\n'); | ||
78 | kc = zeros(4,1); | ||
79 | end; | ||
80 | |||
81 | |||
82 | if ~exist('fc')& quick_init, | ||
83 | FOV_angle = 35; % Initial camera field of view in degrees | ||
84 | fprintf(1,['Initialization of the focal length to a FOV of ' num2str(FOV_angle) ' degrees.\n']); | ||
85 | fc = (nx/2)/tan(pi*FOV_angle/360) * ones(2,1); | ||
86 | end; | ||
87 | |||
88 | |||
89 | if ~exist('fc'), | ||
90 | % Initialization of the intrinsic parameters: | ||
91 | fprintf(1,'Initialization of the intrinsic parameters using the vanishing points of planar patterns.\n') | ||
92 | init_intrinsic_param; % The right way to go (if quick_init is not active)! | ||
93 | end; | ||
94 | |||
95 | |||
96 | |||
97 | %% Initialization of the extrinsic parameters for global minimization: | ||
98 | |||
99 | init_param = [fc;kc]; | ||
100 | |||
101 | for kk = 1:n_ima, | ||
102 | |||
103 | if exist(['x_' num2str(kk)]), | ||
104 | |||
105 | eval(['x_kk = x_' num2str(kk) ';']); | ||
106 | eval(['X_kk = X_' num2str(kk) ';']); | ||
107 | |||
108 | if (isnan(x_kk(1,1))), | ||
109 | if active_images(kk), | ||
110 | fprintf(1,'Warning: Cannot calibrate with image %d. Need to extract grid corners first.\n',kk) | ||
111 | fprintf(1,' Set active_images(%d)=1; and run Extract grid corners.\n',kk) | ||
112 | end; | ||
113 | active_images(kk) = 0; | ||
114 | end; | ||
115 | if active_images(kk), | ||
116 | [omckk,Tckk] = compute_extrinsic_init(x_kk,X_kk,fc,cc,kc); | ||
117 | [omckk,Tckk,Rckk,JJ_kk] = compute_extrinsic_refine(omckk,Tckk,x_kk,X_kk,fc,cc,kc,20,thresh_cond); | ||
118 | if cond(JJ_kk)> thresh_cond, | ||
119 | active_images(kk) = 0; | ||
120 | omckk = NaN*ones(3,1); | ||
121 | Tckk = NaN*ones(3,1); | ||
122 | fprintf(1,'\nWarning: View #%d ill-conditioned. This image is now set inactive.\n',kk) | ||
123 | desactivated_images = [desactivated_images kk]; | ||
124 | end; | ||
125 | if isnan(omckk(1,1)), | ||
126 | %fprintf(1,'\nWarning: Desactivating image %d. Re-activate it later by typing:\nactive_images(%d)=1;\nand re-run optimization\n',[kk kk]) | ||
127 | active_images(kk) = 0; | ||
128 | end; | ||
129 | else | ||
130 | omckk = NaN*ones(3,1); | ||
131 | Tckk = NaN*ones(3,1); | ||
132 | end; | ||
133 | |||
134 | else | ||
135 | |||
136 | omckk = NaN*ones(3,1); | ||
137 | Tckk = NaN*ones(3,1); | ||
138 | |||
139 | if active_images(kk), | ||
140 | fprintf(1,'Warning: Cannot calibrate with image %d. Need to extract grid corners first.\n',kk) | ||
141 | fprintf(1,' Set active_images(%d)=1; and run Extract grid corners.\n',kk) | ||
142 | end; | ||
143 | |||
144 | active_images(kk) = 0; | ||
145 | |||
146 | end; | ||
147 | |||
148 | eval(['omc_' num2str(kk) ' = omckk;']); | ||
149 | eval(['Tc_' num2str(kk) ' = Tckk;']); | ||
150 | |||
151 | eval(['init_param = [init_param; omc_' num2str(kk) '; Tc_' num2str(kk) '];']); | ||
152 | |||
153 | end; | ||
154 | |||
155 | |||
156 | check_active_images; | ||
157 | |||
158 | init_param = [init_param;cc]; | ||
159 | |||
160 | %-------------------- Main Optimization: | ||
161 | |||
162 | fprintf(1,'\nMain calibration optimization procedure - Number of images: %d\n',length(ind_active)); | ||
163 | |||
164 | |||
165 | % The following vector helps to select the variables to update: | ||
166 | ind_Jac = find([ones(6,1);reshape(ones(6,1)*active_images,6*n_ima,1);ones(2,1)])'; | ||
167 | |||
168 | param = init_param; | ||
169 | change = 1; | ||
170 | |||
171 | iter = 0; | ||
172 | |||
173 | fprintf(1,'Gradient descent iterations: '); | ||
174 | |||
175 | param_list = param; | ||
176 | |||
177 | MaxIter = 30; | ||
178 | |||
179 | |||
180 | while (change > 1e-6)&(iter < MaxIter), | ||
181 | |||
182 | fprintf(1,'%d...',iter+1); | ||
183 | |||
184 | |||
185 | %% The first step consists of updating the whole vector of knowns (intrinsic + extrinsic of active | ||
186 | %% images) through a one step steepest gradient descent. | ||
187 | |||
188 | JJ = []; | ||
189 | ex = []; | ||
190 | |||
191 | c = param(6*n_ima + 4 + 3:6*n_ima + 5 + 3); | ||
192 | f = param(1:2); | ||
193 | k = param(3:6); | ||
194 | |||
195 | for kk = 1:n_ima, | ||
196 | |||
197 | if active_images(kk), | ||
198 | |||
199 | omckk = param(4+6*(kk-1) + 3:6*kk + 3); | ||
200 | |||
201 | Tckk = param(6*kk+1 + 3:6*kk+3 + 3); | ||
202 | |||
203 | if isnan(omckk(1)), | ||
204 | fprintf(1,'Intrinsic parameters at frame %d do not exist\n',kk); | ||
205 | return; | ||
206 | end; | ||
207 | |||
208 | eval(['X_kk = X_' num2str(kk) ';']); | ||
209 | eval(['x_kk = x_' num2str(kk) ';']); | ||
210 | |||
211 | Np = size(X_kk,2); | ||
212 | |||
213 | JJkk = zeros(2*Np,n_ima * 6 + 8); | ||
214 | |||
215 | [x,dxdom,dxdT,dxdf,dxdc,dxdk] = project_points(X_kk,omckk,Tckk,f,c,k); | ||
216 | |||
217 | exkk = x_kk - x; | ||
218 | |||
219 | ex = [ex;exkk(:)]; | ||
220 | |||
221 | JJkk(:,1:2) = dxdf; | ||
222 | JJkk(:,3:6) = dxdk; | ||
223 | JJkk(:,4+6*(kk-1) + 3:6*kk + 3) = dxdom; | ||
224 | JJkk(:,6*kk+1 + 3:6*kk+3 + 3) = dxdT; | ||
225 | JJkk(:,6*n_ima + 4 + 3:6*n_ima + 5 + 3) = dxdc; | ||
226 | |||
227 | JJ = [JJ;JJkk]; | ||
228 | |||
229 | |||
230 | % Check if this view is ill-conditioned: | ||
231 | JJ_kk = [dxdom dxdT]; | ||
232 | if cond(JJ_kk)> thresh_cond, | ||
233 | active_images(kk) = 0; | ||
234 | fprintf(1,'\nWarning: View #%d ill-conditioned. This image is now set inactive.\n',kk) | ||
235 | desactivated_images = [desactivated_images kk]; | ||
236 | param(4+6*(kk-1) + 3:6*kk+3 + 3) = NaN*ones(6,1); | ||
237 | end; | ||
238 | |||
239 | |||
240 | end; | ||
241 | |||
242 | end; | ||
243 | |||
244 | |||
245 | % List of active images (necessary if changed): | ||
246 | check_active_images; | ||
247 | ind_Jac = find([ones(6,1);reshape(ones(6,1)*active_images,6*n_ima,1);ones(2,1)])'; | ||
248 | |||
249 | |||
250 | JJ = JJ(:,ind_Jac); | ||
251 | |||
252 | JJ2 = JJ'*JJ; | ||
253 | |||
254 | |||
255 | % Smoothing coefficient: | ||
256 | |||
257 | alpha2 = 1-(1-alpha)^(iter+1); %set to 1 to undo any smoothing! | ||
258 | |||
259 | |||
260 | param_innov = alpha2*inv(JJ2)*(JJ')*ex; | ||
261 | param_up = param(ind_Jac) + param_innov; | ||
262 | param(ind_Jac) = param_up; | ||
263 | |||
264 | |||
265 | % New intrinsic parameters: | ||
266 | |||
267 | fc_current = param(1:2); | ||
268 | cc_current = param(6*n_ima + 4 + 3:6*n_ima + 5 + 3); | ||
269 | kc_current = param(3:6); | ||
270 | |||
271 | |||
272 | % Change on the intrinsic parameters: | ||
273 | change = norm([fc_current;cc_current] - [f;c])/norm([fc_current;cc_current]); | ||
274 | |||
275 | |||
276 | %% Second step: (optional) - It makes convergence faster, and the region of convergence LARGER!!! | ||
277 | %% Recompute the extrinsic parameters only using compute_extrinsic.m (this may be useful sometimes) | ||
278 | %% The complete gradient descent method is useful to precisely update the intrinsic parameters. | ||
279 | |||
280 | MaxIter2 = 20; | ||
281 | |||
282 | for kk = 1:n_ima, | ||
283 | if active_images(kk), | ||
284 | omc_current = param(4+6*(kk-1) + 3:6*kk + 3); | ||
285 | Tc_current = param(6*kk+1 + 3:6*kk+3 + 3); | ||
286 | eval(['X_kk = X_' num2str(kk) ';']); | ||
287 | eval(['x_kk = x_' num2str(kk) ';']); | ||
288 | [omc_current,Tc_current] = compute_extrinsic_init(x_kk,X_kk,fc_current,cc_current,kc_current); | ||
289 | [omckk,Tckk,Rckk,JJ_kk] = compute_extrinsic_refine(omc_current,Tc_current,x_kk,X_kk,fc_current,cc_current,kc_current,MaxIter2,thresh_cond); | ||
290 | if cond(JJ_kk)> thresh_cond, | ||
291 | active_images(kk) = 0; | ||
292 | fprintf(1,'\nWarning: View #%d ill-conditioned. This image is now set inactive.\n',kk) | ||
293 | desactivated_images = [desactivated_images kk]; | ||
294 | omckk = NaN*ones(3,1); | ||
295 | Tckk = NaN*ones(3,1); | ||
296 | end; | ||
297 | param(4+6*(kk-1) + 3:6*kk + 3) = omckk; | ||
298 | param(6*kk+1 + 3:6*kk+3 + 3) = Tckk; | ||
299 | end; | ||
300 | end; | ||
301 | |||
302 | %fprintf(1,'\n\nCalibration results after optimization:\n\n'); | ||
303 | %fprintf(1,'focal = [%3.5f %3.5f]\n',fc_current); | ||
304 | %fprintf(1,'center = [%3.5f %3.5f]\n',cc_current); | ||
305 | %fprintf(1,'distortion = [%3.5f %3.5f %3.5f %3.5f]\n\n',kc_current); | ||
306 | |||
307 | |||
308 | param_list = [param_list param]; | ||
309 | |||
310 | iter = iter + 1; | ||
311 | |||
312 | end; | ||
313 | |||
314 | fprintf(1,'\n'); | ||
315 | |||
316 | |||
317 | sol_with_center = param; | ||
318 | |||
319 | solution = param; | ||
320 | |||
321 | |||
322 | %%% Extraction of the final intrinsic and extrinsic paramaters: | ||
323 | |||
324 | extract_parameters; | ||
325 | comp_error_calib; | ||
326 | |||
327 | fprintf(1,'\n\nCalibration results after optimization:\n\n'); | ||
328 | fprintf(1,'Focal Length: fc = [ %3.5f %3.5f]\n',fc); | ||
329 | fprintf(1,'Principal point: cc = [ %3.5f %3.5f]\n',cc); | ||
330 | fprintf(1,'Distortion: kc = [ %3.5f %3.5f %3.5f %3.5f]\n',kc); | ||
331 | fprintf(1,'Pixel error: err = [ %3.5f %3.5f]\n\n',err_std); | ||
332 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/graphout_calib.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/graphout_calib.m new file mode 100755 index 0000000..a3f7040 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/graphout_calib.m | |||
@@ -0,0 +1,12 @@ | |||
1 | |||
2 | |||
3 | %%%%%%%%%%%%%%%%%%%% GRAPHICAL OUTPUT %%%%%%%%%%%%%%%%%%%%%%%% | ||
4 | |||
5 | %%%%%%%%%%%%%%%%%%%% SHOW EXTRINSIC RESULTS %%%%%%%%%%%%%%%%%%%%%%%% | ||
6 | |||
7 | ext_calib; | ||
8 | |||
9 | %%%%%%%%%%%%%%%%%%%% REPROJECT ON THE IMAGES %%%%%%%%%%%%%%%%%%%%%%%% | ||
10 | |||
11 | reproject_calib; | ||
12 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/graphout_calib3D.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/graphout_calib3D.m new file mode 100755 index 0000000..b7edf43 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/graphout_calib3D.m | |||
@@ -0,0 +1,153 @@ | |||
1 | |||
2 | |||
3 | %%%%%%%%%%%%%%%%%%%% GRAPHICAL OUTPUT %%%%%%%%%%%%%%%%%%%%%%%% | ||
4 | |||
5 | |||
6 | % Color code for each image: | ||
7 | |||
8 | colors = 'brgkcm'; | ||
9 | |||
10 | |||
11 | %%% Show the extrinsic parameters | ||
12 | |||
13 | IP = 8*dX*([0 nx-1 nx-1 0 0 ; 0 0 ny-1 ny-1 0;1 1 1 1 1] - [cc;0]*ones(1,5)) ./ ([fc;1]*ones(1,5)); | ||
14 | |||
15 | |||
16 | figure(4); | ||
17 | [a,b] = view; | ||
18 | |||
19 | figure(4); | ||
20 | plot3(5*[0 dX 0 0 0 0 ],5*[0 0 0 0 0 dX],-5*[0 0 0 dX 0 0 ],'b-','linewidth',2'); | ||
21 | hold on; | ||
22 | plot3(IP(1,:),IP(3,:),-IP(2,:),'r-','linewidth',2); | ||
23 | text(6*dX,0,0,'X_c'); | ||
24 | text(-dX,5*dX,0,'Z_c'); | ||
25 | text(0,0,-6*dX,'Y_c'); | ||
26 | text(-dX,-dX,dX,'O_c'); | ||
27 | |||
28 | |||
29 | for kk = 1:n_ima, | ||
30 | |||
31 | eval(['XX_kk = X_' num2str(kk) ';']); | ||
32 | eval(['omc_kk = omc_' num2str(kk) ';']); | ||
33 | eval(['Tc_kk = Tc_' num2str(kk) ';']); | ||
34 | |||
35 | eval(['nl_sq_x = nl_sq_x_' num2str(kk) ';']); | ||
36 | eval(['nl_sq_y = nl_sq_y_' num2str(kk) ';']); | ||
37 | |||
38 | eval(['nr_sq_x = nr_sq_x_' num2str(kk) ';']); | ||
39 | eval(['nr_sq_y = nr_sq_y_' num2str(kk) ';']); | ||
40 | |||
41 | R_kk = rodrigues(omc_kk); | ||
42 | |||
43 | YY_kk = R_kk * XX_kk + Tc_kk * ones(1,length(XX_kk)); | ||
44 | |||
45 | YYl_kk = YY_kk(:,1:(nl_sq_x+1)*(nl_sq_y+1)); | ||
46 | YYr_kk = YY_kk(:,(nl_sq_x+1)*(nl_sq_y+1)+1:end); | ||
47 | |||
48 | |||
49 | eval(['YYl_' num2str(kk) ' = YYl_kk;']); | ||
50 | eval(['YYr_' num2str(kk) ' = YYr_kk;']); | ||
51 | |||
52 | uu = [-dX;-dY;0]/2; | ||
53 | uu = R_kk * uu + Tc_kk; | ||
54 | |||
55 | YYlx = zeros(nl_sq_x+1,nl_sq_y+1); | ||
56 | YYly = zeros(nl_sq_x+1,nl_sq_y+1); | ||
57 | YYlz = zeros(nl_sq_x+1,nl_sq_y+1); | ||
58 | |||
59 | YYrx = zeros(nr_sq_x+1,nr_sq_y+1); | ||
60 | YYry = zeros(nr_sq_x+1,nr_sq_y+1); | ||
61 | YYrz = zeros(nr_sq_x+1,nr_sq_y+1); | ||
62 | |||
63 | YYlx(:) = YYl_kk(1,:); | ||
64 | YYly(:) = YYl_kk(2,:); | ||
65 | YYlz(:) = YYl_kk(3,:); | ||
66 | |||
67 | YYrx(:) = YYr_kk(1,:); | ||
68 | YYry(:) = YYr_kk(2,:); | ||
69 | YYrz(:) = YYr_kk(3,:); | ||
70 | |||
71 | |||
72 | %keyboard; | ||
73 | |||
74 | figure(4); | ||
75 | hhh= mesh(YYlx,YYlz,-YYly); | ||
76 | set(hhh,'edgecolor',colors(rem(kk-1,6)+1),'linewidth',1); %,'facecolor','none'); | ||
77 | %plot3(YY_kk(1,:),YY_kk(3,:),-YY_kk(2,:),['o' colors(rem(kk-1,6)+1)]); | ||
78 | hhh= mesh(YYrx,YYrz,-YYry); | ||
79 | set(hhh,'edgecolor',colors(rem(kk-1,6)+1),'linewidth',1); | ||
80 | text(uu(1),uu(3),-uu(2),num2str(kk),'fontsize',14,'color',colors(rem(kk-1,6)+1)); | ||
81 | |||
82 | end; | ||
83 | |||
84 | figure(4);rotate3d on; | ||
85 | axis('equal'); | ||
86 | title('Extrinsic parameters'); | ||
87 | %view(60,30); | ||
88 | view(a,b); | ||
89 | hold off; | ||
90 | |||
91 | |||
92 | |||
93 | % Reproject the patterns on the images, and compute the pixel errors: | ||
94 | |||
95 | % Reload the images if necessary | ||
96 | |||
97 | if ~exist('I_1'), | ||
98 | ima_read_calib; | ||
99 | if no_image_file, | ||
100 | return; | ||
101 | end; | ||
102 | end; | ||
103 | |||
104 | |||
105 | ex = []; % Global error vector | ||
106 | x = []; % Detected corners on the image plane | ||
107 | y = []; % Reprojected points | ||
108 | |||
109 | for kk = 1:n_ima, | ||
110 | |||
111 | eval(['omckk = omc_' num2str(kk) ';']); | ||
112 | eval(['Tckk = Tc_' num2str(kk) ';']); | ||
113 | |||
114 | Rkk = rodrigues(omckk); | ||
115 | |||
116 | eval(['y_' num2str(kk) ' = project2_oulu(X_' num2str(kk) ',Rkk,Tckk,fc,cc,kc);']); | ||
117 | |||
118 | eval(['ex_' num2str(kk) ' = x_' num2str(kk) ' -y_' num2str(kk) ';']); | ||
119 | |||
120 | eval(['x_kk = x_' num2str(kk) ';']); | ||
121 | |||
122 | figure(4+kk); | ||
123 | eval(['I = I_' num2str(kk) ';']); | ||
124 | image(I); hold on; | ||
125 | colormap(gray(256)); | ||
126 | title(['Image ' num2str(kk) ' - Image points (+) and reprojected grid points (o)']); | ||
127 | eval(['plot(x_' num2str(kk) '(1,:)+1,x_' num2str(kk) '(2,:)+1,''r+'');']); | ||
128 | eval(['plot(y_' num2str(kk) '(1,:)+1,y_' num2str(kk) '(2,:)+1,''' colors(rem(kk-1,6)+1) 'o'');']); | ||
129 | zoom on; | ||
130 | hold off; | ||
131 | |||
132 | |||
133 | eval(['ex = [ex ex_' num2str(kk) '];']); | ||
134 | eval(['x = [x x_' num2str(kk) '];']); | ||
135 | eval(['y = [y y_' num2str(kk) '];']); | ||
136 | |||
137 | end; | ||
138 | |||
139 | |||
140 | figure(5+n_ima); | ||
141 | for kk = 1:n_ima, | ||
142 | eval(['plot(ex_' num2str(kk) '(1,:),ex_' num2str(kk) '(2,:),''' colors(rem(kk-1,6)+1) '+'');']); | ||
143 | hold on; | ||
144 | end; | ||
145 | hold off; | ||
146 | axis('equal'); | ||
147 | title('Reprojection error (in pixel)'); | ||
148 | xlabel('x'); | ||
149 | ylabel('y'); | ||
150 | |||
151 | err_std = std(ex')'; | ||
152 | |||
153 | fprintf(1,'Pixel error: err = [ %3.5f %3.5f]\n\n',err_std); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/ima_read_calib.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/ima_read_calib.m new file mode 100755 index 0000000..09cef59 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/ima_read_calib.m | |||
@@ -0,0 +1,107 @@ | |||
1 | |||
2 | if ~exist('calib_name'), | ||
3 | data_calib; | ||
4 | end; | ||
5 | |||
6 | check_active_images; | ||
7 | |||
8 | images_read = active_images; | ||
9 | |||
10 | image_numbers = first_num:n_ima-1+first_num; | ||
11 | |||
12 | no_image_file = 0; | ||
13 | |||
14 | i = 1; | ||
15 | |||
16 | while (i <= n_ima), % & (~no_image_file), | ||
17 | |||
18 | if active_images(i), | ||
19 | |||
20 | %fprintf(1,'Loading image %d...\n',i); | ||
21 | |||
22 | if ~type_numbering, | ||
23 | number_ext = num2str(image_numbers(i)); | ||
24 | else | ||
25 | number_ext = sprintf(['%.' num2str(N_slots) 'd'],image_numbers(i)); | ||
26 | end; | ||
27 | |||
28 | ima_name = [calib_name number_ext '.' format_image] | ||
29 | |||
30 | if i == ind_active(1), | ||
31 | fprintf(1,'Loading image '); | ||
32 | end; | ||
33 | |||
34 | if exist(ima_name), | ||
35 | |||
36 | fprintf(1,'%d...',i); | ||
37 | |||
38 | if format_image(1) == 'p', | ||
39 | Ii = double(pgmread(ima_name)); | ||
40 | else | ||
41 | if format_image(1) == 'r', | ||
42 | Ii = readras(ima_name); | ||
43 | else | ||
44 | Ii = double(imread(ima_name)); | ||
45 | end; | ||
46 | end; | ||
47 | |||
48 | if size(Ii,3)>1, | ||
49 | Ii = Ii(:,:,2); | ||
50 | end; | ||
51 | |||
52 | eval(['I_' num2str(i) ' = Ii;']); | ||
53 | |||
54 | else | ||
55 | |||
56 | fprintf(1,'%d...',i); | ||
57 | |||
58 | images_read(i) = 0; | ||
59 | |||
60 | no_image_file = 1; | ||
61 | |||
62 | end; | ||
63 | |||
64 | end; | ||
65 | |||
66 | i = i+1; | ||
67 | |||
68 | end; | ||
69 | |||
70 | |||
71 | if no_image_file, | ||
72 | |||
73 | fprintf(1,'\nWARNING! Cannot load calibration images\n'); | ||
74 | |||
75 | else | ||
76 | |||
77 | fprintf(1,'\n'); | ||
78 | |||
79 | if size(I_1,1)~=480, | ||
80 | small_calib_image = 1; | ||
81 | else | ||
82 | small_calib_image = 0; | ||
83 | end; | ||
84 | |||
85 | [Hcal,Wcal] = size(I_1); % size of the calibration image | ||
86 | |||
87 | [ny,nx] = size(I_1); | ||
88 | |||
89 | clickname = []; | ||
90 | |||
91 | map = gray(256); | ||
92 | |||
93 | %string_save = 'save calib_data n_ima type_numbering N_slots image_numbers format_image calib_name Hcal Wcal nx ny map small_calib_image'; | ||
94 | |||
95 | %eval(string_save); | ||
96 | |||
97 | disp('done'); | ||
98 | %click_calib; | ||
99 | |||
100 | end; | ||
101 | |||
102 | if ~exist('map'), map = gray(256); end; | ||
103 | |||
104 | |||
105 | |||
106 | |||
107 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/init_calib_param.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/init_calib_param.m new file mode 100755 index 0000000..92e14be --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/init_calib_param.m | |||
@@ -0,0 +1,210 @@ | |||
1 | %init_calib_param | ||
2 | % | ||
3 | %Initialization of the intrinsic and extrinsic parameters. | ||
4 | %Runs as a script. | ||
5 | % | ||
6 | %This function is obsolete with init_intrinsic_param called from go_calib_optim | ||
7 | % | ||
8 | %INPUT: x_1,x_2,x_3,...: Feature locations on the images | ||
9 | % X_1,X_2,X_3,...: Corresponding grid coordinates | ||
10 | % | ||
11 | %OUTPUT: fc: Camera focal length | ||
12 | % cc: Principal point coordinates | ||
13 | % kc: Distortion coefficients | ||
14 | % KK: The camera matrix (containing fc and cc) | ||
15 | % omc_1,omc_2,omc_3,...: 3D rotation vectors attached to the grid positions in space | ||
16 | % Tc_1,Tc_2,Tc_3,...: 3D translation vectors attached to the grid positions in space | ||
17 | % Rc_1,Rc_2,Rc_3,...: 3D rotation matrices corresponding to the omc vectors | ||
18 | % | ||
19 | %Method: Compute the planar homographies H_1, H_2, H_3, ... and computes | ||
20 | % the focal length fc from orthogonal vanishing points constraint. | ||
21 | % The principal point cc is assumed at the center of the image. | ||
22 | % Assumes no image distortion (kc = [0;0;0;0]) | ||
23 | % Once the intrinsic parameters are estimated, the extrinsic parameters | ||
24 | % are computed for each image. | ||
25 | % | ||
26 | %Note: The row vector active_images consists of zeros and ones. To deactivate an image, set the | ||
27 | % corresponding entry in the active_images vector to zero. | ||
28 | % | ||
29 | % | ||
30 | %Important functions called within that program: | ||
31 | % | ||
32 | %compute_homography.m: Computes the planar homography between points on the grid in 3D, and the image plane. | ||
33 | % | ||
34 | %compute_extrinsic.m: Computes the location of a grid assuming known intrinsic parameters. | ||
35 | % This function is called at the initialization step. | ||
36 | |||
37 | |||
38 | |||
39 | |||
40 | check_active_images; | ||
41 | |||
42 | if ~exist(['x_' num2str(ind_active(1)) ]), | ||
43 | click_calib; | ||
44 | end; | ||
45 | |||
46 | |||
47 | fprintf(1,'\nInitialization of the calibration parameters - Number of images: %d\n',length(ind_active)); | ||
48 | |||
49 | |||
50 | % Initialize the homographies: | ||
51 | |||
52 | for kk = 1:n_ima, | ||
53 | eval(['x_kk = x_' num2str(kk) ';']); | ||
54 | eval(['X_kk = X_' num2str(kk) ';']); | ||
55 | if (isnan(x_kk(1,1))), | ||
56 | if active_images(kk), | ||
57 | fprintf(1,'WARNING: Cannot calibrate with image %d. Need to extract grid corners first.\n',kk) | ||
58 | fprintf(1,' Set active_images(%d)=1; and run Extract grid corners.\n',kk) | ||
59 | end; | ||
60 | active_images(kk) = 0; | ||
61 | end; | ||
62 | if active_images(kk), | ||
63 | eval(['H_' num2str(kk) ' = compute_homography(x_kk,X_kk(1:2,:));']); | ||
64 | else | ||
65 | eval(['H_' num2str(kk) ' = NaN*ones(3,3);']); | ||
66 | end; | ||
67 | end; | ||
68 | |||
69 | check_active_images; | ||
70 | |||
71 | % initial guess for principal point and distortion: | ||
72 | |||
73 | if ~exist('nx'), [ny,nx] = size(I); end; | ||
74 | |||
75 | c_init = [nx;ny]/2 - 0.5; % initialize at the center of the image | ||
76 | k_init = [0;0;0;0]; % initialize to zero (no distortion) | ||
77 | |||
78 | |||
79 | |||
80 | % Compute explicitely the focal length using all the (mutually orthogonal) vanishing points | ||
81 | % note: The vanihing points are hidden in the planar collineations H_kk | ||
82 | |||
83 | A = []; | ||
84 | b = []; | ||
85 | |||
86 | % matrix that subtract the principal point: | ||
87 | Sub_cc = [1 0 -c_init(1);0 1 -c_init(2);0 0 1]; | ||
88 | |||
89 | for kk=1:n_ima, | ||
90 | |||
91 | if active_images(kk), | ||
92 | |||
93 | eval(['Hkk = H_' num2str(kk) ';']); | ||
94 | |||
95 | Hkk = Sub_cc * Hkk; | ||
96 | |||
97 | % Extract vanishing points (direct and diagonals): | ||
98 | |||
99 | V_hori_pix = Hkk(:,1); | ||
100 | V_vert_pix = Hkk(:,2); | ||
101 | V_diag1_pix = (Hkk(:,1)+Hkk(:,2))/2; | ||
102 | V_diag2_pix = (Hkk(:,1)-Hkk(:,2))/2; | ||
103 | |||
104 | V_hori_pix = V_hori_pix/norm(V_hori_pix); | ||
105 | V_vert_pix = V_vert_pix/norm(V_vert_pix); | ||
106 | V_diag1_pix = V_diag1_pix/norm(V_diag1_pix); | ||
107 | V_diag2_pix = V_diag2_pix/norm(V_diag2_pix); | ||
108 | |||
109 | a1 = V_hori_pix(1); | ||
110 | b1 = V_hori_pix(2); | ||
111 | c1 = V_hori_pix(3); | ||
112 | |||
113 | a2 = V_vert_pix(1); | ||
114 | b2 = V_vert_pix(2); | ||
115 | c2 = V_vert_pix(3); | ||
116 | |||
117 | a3 = V_diag1_pix(1); | ||
118 | b3 = V_diag1_pix(2); | ||
119 | c3 = V_diag1_pix(3); | ||
120 | |||
121 | a4 = V_diag2_pix(1); | ||
122 | b4 = V_diag2_pix(2); | ||
123 | c4 = V_diag2_pix(3); | ||
124 | |||
125 | A_kk = [a1*a2 b1*b2; | ||
126 | a3*a4 b3*b4]; | ||
127 | |||
128 | b_kk = -[c1*c2;c3*c4]; | ||
129 | |||
130 | |||
131 | A = [A;A_kk]; | ||
132 | b = [b;b_kk]; | ||
133 | |||
134 | end; | ||
135 | |||
136 | end; | ||
137 | |||
138 | |||
139 | % use all the vanishing points to estimate focal length: | ||
140 | |||
141 | f_init = sqrt(abs(1./(inv(A'*A)*A'*b))); % if using a two-focal model for initial guess | ||
142 | |||
143 | %f_init = sqrt(b'*(sum(A')') / (b'*b)) * ones(2,1); % if single focal length model is used | ||
144 | |||
145 | |||
146 | % Global calibration matrix (initial guess): | ||
147 | |||
148 | KK = [f_init(1) 0 c_init(1);0 f_init(2) c_init(2); 0 0 1]; | ||
149 | inv_KK = inv(KK); | ||
150 | |||
151 | |||
152 | cc = c_init; | ||
153 | fc = f_init; | ||
154 | kc = k_init; | ||
155 | |||
156 | |||
157 | % Computing of the extrinsic parameters (from the collineations) | ||
158 | |||
159 | for kk = 1:n_ima, | ||
160 | |||
161 | if active_images(kk), | ||
162 | |||
163 | |||
164 | eval(['x_kk = x_' num2str(kk) ';']); | ||
165 | eval(['X_kk = X_' num2str(kk) ';']); | ||
166 | |||
167 | [omckk,Tckk] = compute_extrinsic(x_kk,X_kk,fc,cc,kc); | ||
168 | |||
169 | Rckk = rodrigues(omc_kk); | ||
170 | |||
171 | else | ||
172 | |||
173 | omckk = NaN*ones(3,1); | ||
174 | Tckk = NaN*ones(3,1); | ||
175 | Rckk = NaN*ones(3,3); | ||
176 | |||
177 | end; | ||
178 | |||
179 | eval(['omc_' num2str(kk) ' = omckk;']); | ||
180 | eval(['Rc_' num2str(kk) ' = Rckk;']); | ||
181 | eval(['Tc_' num2str(kk) ' = Tckk;']); | ||
182 | |||
183 | end; | ||
184 | |||
185 | |||
186 | % Initialization of the parameters for global minimization: | ||
187 | |||
188 | init_param = [f_init;k_init]; | ||
189 | |||
190 | for kk = 1:n_ima, | ||
191 | eval(['init_param = [init_param; omc_' num2str(kk) '; Tc_' num2str(kk) '];']); | ||
192 | end; | ||
193 | |||
194 | solution_init = [init_param;c_init]; | ||
195 | |||
196 | solution = solution_init; | ||
197 | |||
198 | comp_error_calib; | ||
199 | |||
200 | fprintf(1,'\n\nCalibration parameters after initialization:\n\n'); | ||
201 | fprintf(1,'Focal Length: fc = [ %3.5f %3.5f]\n',fc); | ||
202 | fprintf(1,'Principal point: cc = [ %3.5f %3.5f]\n',cc); | ||
203 | fprintf(1,'Distortion: kc = [ %3.5f %3.5f %3.5f %3.5f]\n',kc); | ||
204 | fprintf(1,'Pixel error: err = [ %3.5f %3.5f]\n\n',err_std); | ||
205 | |||
206 | |||
207 | %%%%%%%%%%%%%%%%%%%% GRAPHICAL OUTPUT %%%%%%%%%%%%%%%%%%%%%%%% | ||
208 | |||
209 | %graphout_calib; | ||
210 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/init_intrinsic_param.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/init_intrinsic_param.m new file mode 100755 index 0000000..eac21ba --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/init_intrinsic_param.m | |||
@@ -0,0 +1,153 @@ | |||
1 | %init_intrinsic_param | ||
2 | % | ||
3 | %Initialization of the intrinsic parameters. | ||
4 | %Runs as a script. | ||
5 | % | ||
6 | %INPUT: x_1,x_2,x_3,...: Feature locations on the images | ||
7 | % X_1,X_2,X_3,...: Corresponding grid coordinates | ||
8 | % | ||
9 | %OUTPUT: fc: Camera focal length | ||
10 | % cc: Principal point coordinates | ||
11 | % kc: Distortion coefficients | ||
12 | % KK: The camera matrix (containing fc and cc) | ||
13 | % | ||
14 | %Method: Computes the planar homographies H_1, H_2, H_3, ... and computes | ||
15 | % the focal length fc from orthogonal vanishing points constraint. | ||
16 | % The principal point cc is assumed at the center of the image. | ||
17 | % Assumes no image distortion (kc = [0;0;0;0]) | ||
18 | % | ||
19 | %Note: The row vector active_images consists of zeros and ones. To deactivate an image, set the | ||
20 | % corresponding entry in the active_images vector to zero. | ||
21 | % | ||
22 | % | ||
23 | %Important function called within that program: | ||
24 | % | ||
25 | %compute_homography.m: Computes the planar homography between points on the grid in 3D, and the image plane. | ||
26 | % | ||
27 | % | ||
28 | %VERY IMPORTANT: This function works onyl with 2D rigs. | ||
29 | %In the future, a more general function will be there (working with 3D rigs as well). | ||
30 | |||
31 | |||
32 | |||
33 | check_active_images; | ||
34 | |||
35 | if ~exist(['x_' num2str(ind_active(1)) ]), | ||
36 | click_calib; | ||
37 | end; | ||
38 | |||
39 | |||
40 | fprintf(1,'\nInitialization of the intrinsic parameters - Number of images: %d\n',length(ind_active)); | ||
41 | |||
42 | |||
43 | % Initialize the homographies: | ||
44 | |||
45 | for kk = 1:n_ima, | ||
46 | eval(['x_kk = x_' num2str(kk) ';']); | ||
47 | eval(['X_kk = X_' num2str(kk) ';']); | ||
48 | if (isnan(x_kk(1,1))), | ||
49 | if active_images(kk), | ||
50 | fprintf(1,'WARNING: Cannot calibrate with image %d. Need to extract grid corners first.\n',kk) | ||
51 | fprintf(1,' Set active_images(%d)=1; and run Extract grid corners.\n',kk) | ||
52 | end; | ||
53 | active_images(kk) = 0; | ||
54 | end; | ||
55 | if active_images(kk), | ||
56 | eval(['H_' num2str(kk) ' = compute_homography(x_kk,X_kk(1:2,:));']); | ||
57 | else | ||
58 | eval(['H_' num2str(kk) ' = NaN*ones(3,3);']); | ||
59 | end; | ||
60 | end; | ||
61 | |||
62 | check_active_images; | ||
63 | |||
64 | % initial guess for principal point and distortion: | ||
65 | |||
66 | if ~exist('nx'), [ny,nx] = size(I); end; | ||
67 | |||
68 | c_init = [nx;ny]/2 - 0.5; % initialize at the center of the image | ||
69 | k_init = [0;0;0;0]; % initialize to zero (no distortion) | ||
70 | |||
71 | |||
72 | |||
73 | % Compute explicitely the focal length using all the (mutually orthogonal) vanishing points | ||
74 | % note: The vanihing points are hidden in the planar collineations H_kk | ||
75 | |||
76 | A = []; | ||
77 | b = []; | ||
78 | |||
79 | % matrix that subtract the principal point: | ||
80 | Sub_cc = [1 0 -c_init(1);0 1 -c_init(2);0 0 1]; | ||
81 | |||
82 | for kk=1:n_ima, | ||
83 | |||
84 | if active_images(kk), | ||
85 | |||
86 | eval(['Hkk = H_' num2str(kk) ';']); | ||
87 | |||
88 | Hkk = Sub_cc * Hkk; | ||
89 | |||
90 | % Extract vanishing points (direct and diagonals): | ||
91 | |||
92 | V_hori_pix = Hkk(:,1); | ||
93 | V_vert_pix = Hkk(:,2); | ||
94 | V_diag1_pix = (Hkk(:,1)+Hkk(:,2))/2; | ||
95 | V_diag2_pix = (Hkk(:,1)-Hkk(:,2))/2; | ||
96 | |||
97 | V_hori_pix = V_hori_pix/norm(V_hori_pix); | ||
98 | V_vert_pix = V_vert_pix/norm(V_vert_pix); | ||
99 | V_diag1_pix = V_diag1_pix/norm(V_diag1_pix); | ||
100 | V_diag2_pix = V_diag2_pix/norm(V_diag2_pix); | ||
101 | |||
102 | a1 = V_hori_pix(1); | ||
103 | b1 = V_hori_pix(2); | ||
104 | c1 = V_hori_pix(3); | ||
105 | |||
106 | a2 = V_vert_pix(1); | ||
107 | b2 = V_vert_pix(2); | ||
108 | c2 = V_vert_pix(3); | ||
109 | |||
110 | a3 = V_diag1_pix(1); | ||
111 | b3 = V_diag1_pix(2); | ||
112 | c3 = V_diag1_pix(3); | ||
113 | |||
114 | a4 = V_diag2_pix(1); | ||
115 | b4 = V_diag2_pix(2); | ||
116 | c4 = V_diag2_pix(3); | ||
117 | |||
118 | A_kk = [a1*a2 b1*b2; | ||
119 | a3*a4 b3*b4]; | ||
120 | |||
121 | b_kk = -[c1*c2;c3*c4]; | ||
122 | |||
123 | |||
124 | A = [A;A_kk]; | ||
125 | b = [b;b_kk]; | ||
126 | |||
127 | end; | ||
128 | |||
129 | end; | ||
130 | |||
131 | |||
132 | % use all the vanishing points to estimate focal length: | ||
133 | |||
134 | f_init = sqrt(abs(1./(inv(A'*A)*A'*b))); % if using a two-focal model for initial guess | ||
135 | |||
136 | %f_init = sqrt(b'*(sum(A')') / (b'*b)) * ones(2,1); % if single focal length model is used | ||
137 | |||
138 | |||
139 | % Global calibration matrix (initial guess): | ||
140 | |||
141 | KK = [f_init(1) 0 c_init(1);0 f_init(2) c_init(2); 0 0 1]; | ||
142 | inv_KK = inv(KK); | ||
143 | |||
144 | |||
145 | cc = c_init; | ||
146 | fc = f_init; | ||
147 | kc = k_init; | ||
148 | |||
149 | |||
150 | fprintf(1,'\n\nCalibration parameters after initialization:\n\n'); | ||
151 | fprintf(1,'Focal Length: fc = [ %3.5f %3.5f]\n',fc); | ||
152 | fprintf(1,'Principal point: cc = [ %3.5f %3.5f]\n',cc); | ||
153 | fprintf(1,'Distortion: kc = [ %3.5f %3.5f %3.5f %3.5f]\n\n',kc); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/is3D.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/is3D.m new file mode 100755 index 0000000..ab00b3d --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/is3D.m | |||
@@ -0,0 +1,19 @@ | |||
1 | function test = is3D(X), | ||
2 | |||
3 | |||
4 | Np = size(X,2); | ||
5 | |||
6 | %% Check for planarity of the structure: | ||
7 | |||
8 | X_mean = mean(X')'; | ||
9 | |||
10 | Y = X - (X_mean*ones(1,Np)); | ||
11 | |||
12 | YY = Y*Y'; | ||
13 | |||
14 | [U,S,V] = svd(YY); | ||
15 | |||
16 | r = S(3,3)/S(2,2); | ||
17 | |||
18 | test = (r > 1e-3); | ||
19 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/loading_calib.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/loading_calib.m new file mode 100755 index 0000000..a0f50d2 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/loading_calib.m | |||
@@ -0,0 +1,10 @@ | |||
1 | if ~exist('Calib_Results.mat'), | ||
2 | fprintf(1,'\nCalibration file Calib_Results.mat not found!\n'); | ||
3 | return; | ||
4 | end; | ||
5 | |||
6 | fprintf(1,'\nLoading calibration results from Calib_Results.mat\n'); | ||
7 | |||
8 | load Calib_Results | ||
9 | |||
10 | fprintf(1,'done\n'); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/loadinr.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/loadinr.m new file mode 100755 index 0000000..91b6f89 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/loadinr.m | |||
@@ -0,0 +1,52 @@ | |||
1 | %LOADINR Load an INRIMAGE format file | ||
2 | % | ||
3 | % LOADINR(filename, im) | ||
4 | % | ||
5 | % Load an INRIA image format file and return it as a matrix | ||
6 | % | ||
7 | % SEE ALSO: saveinr | ||
8 | % | ||
9 | % Copyright (c) Peter Corke, 1999 Machine Vision Toolbox for Matlab | ||
10 | |||
11 | |||
12 | % Peter Corke 1996 | ||
13 | |||
14 | function im = loadinr(fname, im) | ||
15 | |||
16 | fid = fopen(fname, 'r'); | ||
17 | |||
18 | s = fgets(fid); | ||
19 | if strcmp(s(1:12), '#INRIMAGE-4#') == 0, | ||
20 | error('not INRIMAGE format'); | ||
21 | end | ||
22 | |||
23 | % not very complete, only looks for the X/YDIM keys | ||
24 | while 1, | ||
25 | s = fgets(fid); | ||
26 | n = length(s) - 1; | ||
27 | if s(1) == '#', | ||
28 | break | ||
29 | end | ||
30 | if strcmp(s(1:5), 'XDIM='), | ||
31 | cols = str2num(s(6:n)); | ||
32 | end | ||
33 | if strcmp(s(1:5), 'YDIM='), | ||
34 | rows = str2num(s(6:n)); | ||
35 | end | ||
36 | if strcmp(s(1:4), 'CPU='), | ||
37 | if strcmp(s(5:n), 'sun') == 0, | ||
38 | error('not sun data ordering'); | ||
39 | end | ||
40 | end | ||
41 | |||
42 | end | ||
43 | disp(['INRIMAGE format file ' num2str(rows) ' x ' num2str(cols)]) | ||
44 | |||
45 | % now the binary data | ||
46 | fseek(fid, 256, 'bof'); | ||
47 | [im count] = fread(fid, [cols rows], 'float32'); | ||
48 | im = im'; | ||
49 | if count ~= (rows*cols), | ||
50 | error('file too short'); | ||
51 | end | ||
52 | fclose(fid); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/loadpgm.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/loadpgm.m new file mode 100755 index 0000000..9386111 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/loadpgm.m | |||
@@ -0,0 +1,89 @@ | |||
1 | %LOADPGM Load a PGM image | ||
2 | % | ||
3 | % I = loadpgm(filename) | ||
4 | % | ||
5 | % Returns a matrix containing the image loaded from the PGM format | ||
6 | % file filename. Handles ASCII (P2) and binary (P5) PGM file formats. | ||
7 | % | ||
8 | % If the filename has no extension, and open fails, a '.pgm' will | ||
9 | % be appended. | ||
10 | % | ||
11 | % | ||
12 | % Copyright (c) Peter Corke, 1999 Machine Vision Toolbox for Matlab | ||
13 | |||
14 | |||
15 | % Peter Corke 1994 | ||
16 | |||
17 | function I = loadpgm(file) | ||
18 | white = [' ' 9 10 13]; % space, tab, lf, cr | ||
19 | white = setstr(white); | ||
20 | |||
21 | fid = fopen(file, 'r'); | ||
22 | if fid < 0, | ||
23 | fid = fopen([file '.pgm'], 'r'); | ||
24 | end | ||
25 | if fid < 0, | ||
26 | error('Couldn''t open file'); | ||
27 | end | ||
28 | |||
29 | magic = fread(fid, 2, 'char'); | ||
30 | while 1 | ||
31 | c = fread(fid,1,'char'); | ||
32 | if c == '#', | ||
33 | fgetl(fid); | ||
34 | elseif ~any(c == white) | ||
35 | fseek(fid, -1, 'cof'); % unputc() | ||
36 | break; | ||
37 | end | ||
38 | end | ||
39 | cols = fscanf(fid, '%d', 1); | ||
40 | while 1 | ||
41 | c = fread(fid,1,'char'); | ||
42 | if c == '#', | ||
43 | fgetl(fid); | ||
44 | elseif ~any(c == white) | ||
45 | fseek(fid, -1, 'cof'); % unputc() | ||
46 | break; | ||
47 | end | ||
48 | end | ||
49 | rows = fscanf(fid, '%d', 1); | ||
50 | while 1 | ||
51 | c = fread(fid,1,'char'); | ||
52 | if c == '#', | ||
53 | fgetl(fid); | ||
54 | elseif ~any(c == white) | ||
55 | fseek(fid, -1, 'cof'); % unputc() | ||
56 | break; | ||
57 | end | ||
58 | end | ||
59 | maxval = fscanf(fid, '%d', 1); | ||
60 | while 1 | ||
61 | c = fread(fid,1,'char'); | ||
62 | if c == '#', | ||
63 | fgetl(fid); | ||
64 | elseif ~any(c == white) | ||
65 | fseek(fid, -1, 'cof'); % unputc() | ||
66 | break; | ||
67 | end | ||
68 | end | ||
69 | if magic(1) == 'P', | ||
70 | if magic(2) == '2', | ||
71 | disp(['ASCII PGM file ' num2str(rows) ' x ' num2str(cols)]) | ||
72 | I = fscanf(fid, '%d', [cols rows])'; | ||
73 | elseif magic(2) == '5', | ||
74 | disp(['Binary PGM file ' num2str(rows) ' x ' num2str(cols)]) | ||
75 | if maxval == 1, | ||
76 | fmt = 'unint1'; | ||
77 | elseif maxval == 15, | ||
78 | fmt = 'uint4'; | ||
79 | elseif maxval == 255, | ||
80 | fmt = 'uint8'; | ||
81 | elseif maxval == 2^32-1, | ||
82 | fmt = 'uint32'; | ||
83 | end | ||
84 | I = fread(fid, [cols rows], fmt)'; | ||
85 | else | ||
86 | disp('Not a PGM file'); | ||
87 | end | ||
88 | end | ||
89 | fclose(fid); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/loadppm.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/loadppm.m new file mode 100755 index 0000000..6dd7ca4 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/loadppm.m | |||
@@ -0,0 +1,101 @@ | |||
1 | %LOADPPM Load a PPM image | ||
2 | % | ||
3 | % [R,G,B] = loadppm(filename) | ||
4 | % | ||
5 | % Returns a matrix containing the image loaded from the PPM format | ||
6 | % file filename. Handles ASCII (P3) and binary (P6) PPM file formats. | ||
7 | % | ||
8 | % If the filename has no extension, and open fails, a '.ppm' and | ||
9 | % '.pnm' extension will be tried. | ||
10 | % | ||
11 | % SEE ALSO: saveppm loadpgm | ||
12 | % | ||
13 | % Copyright (c) Peter Corke, 1999 Machine Vision Toolbox for Matlab | ||
14 | |||
15 | |||
16 | % Peter Corke 1994 | ||
17 | |||
18 | function [R,G,B] = loadppm(file) | ||
19 | white = [' ' 9 10 13]; % space, tab, lf, cr | ||
20 | white = setstr(white); | ||
21 | |||
22 | fid = fopen(file, 'r'); | ||
23 | if fid < 0, | ||
24 | fid = fopen([file '.ppm'], 'r'); | ||
25 | end | ||
26 | if fid < 0, | ||
27 | fid = fopen([file '.pnm'], 'r'); | ||
28 | end | ||
29 | if fid < 0, | ||
30 | error('Couldn''t open file'); | ||
31 | end | ||
32 | |||
33 | magic = fread(fid, 2, 'char'); | ||
34 | while 1 | ||
35 | c = fread(fid,1,'char'); | ||
36 | if c == '#', | ||
37 | fgetl(fid); | ||
38 | elseif ~any(c == white) | ||
39 | fseek(fid, -1, 'cof'); % unputc() | ||
40 | break; | ||
41 | end | ||
42 | end | ||
43 | cols = fscanf(fid, '%d', 1); | ||
44 | while 1 | ||
45 | c = fread(fid,1,'char'); | ||
46 | if c == '#', | ||
47 | fgetl(fid); | ||
48 | elseif ~any(c == white) | ||
49 | fseek(fid, -1, 'cof'); % unputc() | ||
50 | break; | ||
51 | end | ||
52 | end | ||
53 | rows = fscanf(fid, '%d', 1); | ||
54 | while 1 | ||
55 | c = fread(fid,1,'char'); | ||
56 | if c == '#', | ||
57 | fgetl(fid); | ||
58 | elseif ~any(c == white) | ||
59 | fseek(fid, -1, 'cof'); % unputc() | ||
60 | break; | ||
61 | end | ||
62 | end | ||
63 | maxval = fscanf(fid, '%d', 1); | ||
64 | while 1 | ||
65 | c = fread(fid,1,'char'); | ||
66 | if c == '#', | ||
67 | fgetl(fid); | ||
68 | elseif ~any(c == white) | ||
69 | fseek(fid, -1, 'cof'); % unputc() | ||
70 | break; | ||
71 | end | ||
72 | end | ||
73 | if magic(1) == 'P', | ||
74 | if magic(2) == '3', | ||
75 | disp(['ASCII PPM file ' num2str(rows) ' x ' num2str(cols)]) | ||
76 | I = fscanf(fid, '%d', [cols*3 rows]); | ||
77 | elseif magic(2) == '6', | ||
78 | disp(['Binary PPM file ' num2str(rows) ' x ' num2str(cols)]) | ||
79 | if maxval == 1, | ||
80 | fmt = 'unint1'; | ||
81 | elseif maxval == 15, | ||
82 | fmt = 'uint4'; | ||
83 | elseif maxval == 255, | ||
84 | fmt = 'uint8'; | ||
85 | elseif maxval == 2^32-1, | ||
86 | fmt = 'uint32'; | ||
87 | end | ||
88 | I = fread(fid, [cols*3 rows], fmt); | ||
89 | else | ||
90 | disp('Not a PPM file'); | ||
91 | end | ||
92 | end | ||
93 | % | ||
94 | % now the matrix has interleaved columns of R, G, B | ||
95 | % | ||
96 | I = I'; | ||
97 | size(I) | ||
98 | R = I(:,1:3:(cols*3)); | ||
99 | G = I(:,2:3:(cols*3)); | ||
100 | B = I(:,3:3:(cols*3)); | ||
101 | fclose(fid); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/mean_std_robust.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/mean_std_robust.m new file mode 100755 index 0000000..0d18a62 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/mean_std_robust.m | |||
@@ -0,0 +1,7 @@ | |||
1 | function [m,s] = mean_std_robust(x); | ||
2 | |||
3 | x = x(:); | ||
4 | |||
5 | m = median(x); | ||
6 | |||
7 | s = median(abs(x - m))*1.4836; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/multi_error_oulu.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/multi_error_oulu.m new file mode 100755 index 0000000..8657158 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/multi_error_oulu.m | |||
@@ -0,0 +1,49 @@ | |||
1 | function ex = multi_error_oulu(param,n_ima,cc); | ||
2 | |||
3 | global X_1 x_1 X_2 x_2 X_3 x_3 X_4 x_4 X_5 x_5 X_6 x_6 X_7 x_7 X_8 x_8 X_9 x_9 X_10 x_10 X_11 x_11 X_12 x_12 X_13 x_13 X_14 x_14 X_15 x_15 X_16 x_16 X_17 x_17 X_18 x_18 X_19 x_19 X_20 x_20 X_21 x_21 X_22 x_22 X_23 x_23 X_24 x_24 X_25 x_25 X_26 x_26 X_27 x_27 X_28 x_28 X_29 x_29 X_30 x_30 | ||
4 | |||
5 | fc = param(1:2); | ||
6 | kc = param(3:6); | ||
7 | %ppc = param(5:6); | ||
8 | |||
9 | if length(param) > 6*n_ima + 3 + 3, | ||
10 | |||
11 | cc = param(6*n_ima + 4 + 3:6*n_ima + 5 + 3); | ||
12 | |||
13 | if length(param) > 6*n_ima + 5 + 3, | ||
14 | |||
15 | c_d = param(6*n_ima + 6 + 3 :6*n_ima + 7 + 3); | ||
16 | |||
17 | else | ||
18 | |||
19 | c_d = [0;0]; | ||
20 | |||
21 | end; | ||
22 | |||
23 | else | ||
24 | |||
25 | c_d = [0;0]; | ||
26 | |||
27 | end; | ||
28 | |||
29 | |||
30 | |||
31 | ex = []; | ||
32 | |||
33 | %keyboard; | ||
34 | |||
35 | for kk = 1:n_ima, | ||
36 | |||
37 | omckk = param(4+6*(kk-1) + 3:6*kk + 3); | ||
38 | |||
39 | Tckk = param(6*kk+1 + 3:6*kk+3 + 3); | ||
40 | |||
41 | Rkk = rodrigues(omckk); | ||
42 | |||
43 | eval(['ykk = project2_oulu(X_' num2str(kk) ',Rkk,Tckk,fc,cc,kc);']); | ||
44 | |||
45 | eval(['exkk = x_' num2str(kk) ' -ykk;']); | ||
46 | |||
47 | ex = [ex;exkk(:)]; | ||
48 | |||
49 | end; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/normalize.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/normalize.m new file mode 100755 index 0000000..0a37378 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/normalize.m | |||
@@ -0,0 +1,32 @@ | |||
1 | function [xn] = normalize(x_kk,fc,cc,kc), | ||
2 | |||
3 | %normalize | ||
4 | % | ||
5 | %[xn] = normalize(x_kk,fc,cc,kc) | ||
6 | % | ||
7 | %Computes the normalized coordinates xn given the pixel coordinates x_kk | ||
8 | %and the intrinsic camera parameters fc, cc and kc. | ||
9 | % | ||
10 | %INPUT: x_kk: Feature locations on the images | ||
11 | % fc: Camera focal length | ||
12 | % cc: Principal point coordinates | ||
13 | % kc: Distortion coefficients | ||
14 | % | ||
15 | %OUTPUT: xn: Normalized feature locations on the image plane (a 2XN matrix) | ||
16 | % | ||
17 | %Important functions called within that program: | ||
18 | % | ||
19 | %comp_distortion_oulu: undistort pixel coordinates. | ||
20 | |||
21 | |||
22 | |||
23 | % First subtract principal point, and divide by the focal length: | ||
24 | |||
25 | x_distort = [(x_kk(1,:) - cc(1))/fc(1);(x_kk(2,:) - cc(2))/fc(2)]; | ||
26 | |||
27 | |||
28 | %Compensate for lens distortion: | ||
29 | |||
30 | xn = comp_distortion_oulu(x_distort,kc); | ||
31 | |||
32 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/pgmread.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/pgmread.m new file mode 100755 index 0000000..c96ccb7 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/pgmread.m | |||
@@ -0,0 +1,26 @@ | |||
1 | function img = pgmread(filename) | ||
2 | % function img = pgmread(filename) | ||
3 | % this is my version of pgmread for the pgm file created by XV. | ||
4 | % | ||
5 | % this program also corrects for the shifts in the image from pm file. | ||
6 | |||
7 | fid = fopen(filename,'r'); | ||
8 | fscanf(fid, 'P5\n'); | ||
9 | cmt = '#'; | ||
10 | while findstr(cmt, '#'), | ||
11 | cmt = fgets(fid); | ||
12 | if length(findstr(cmt, '#')) ~= 1, | ||
13 | YX = sscanf(cmt, '%d %d'); | ||
14 | y = YX(1); x = YX(2); | ||
15 | end | ||
16 | end | ||
17 | |||
18 | %fgets(fid); | ||
19 | |||
20 | %img = fscanf(fid,'%d',size); | ||
21 | %img = img'; | ||
22 | |||
23 | img = fread(fid,[y,x],'uint8'); | ||
24 | img = img'; | ||
25 | fclose(fid); | ||
26 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/project2_oulu.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/project2_oulu.m new file mode 100755 index 0000000..c5c4a34 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/project2_oulu.m | |||
@@ -0,0 +1,53 @@ | |||
1 | function [x] = project2_oulu(X,R,T,f,t,k) | ||
2 | %PROJECT Subsidiary to calib | ||
3 | |||
4 | % (c) Pietro Perona -- March 24, 1994 | ||
5 | % California Institute of Technology | ||
6 | % Pasadena, CA | ||
7 | % | ||
8 | % Renamed because project exists in matlab 5.2!!! | ||
9 | % Now uses the more elaborate intrinsic model from Oulu | ||
10 | |||
11 | |||
12 | |||
13 | [m,n] = size(X); | ||
14 | |||
15 | Y = R*X + T*ones(1,n); | ||
16 | Z = Y(3,:); | ||
17 | |||
18 | f = f(:); %% make a column vector | ||
19 | if length(f)==1, | ||
20 | f = [f f]'; | ||
21 | end; | ||
22 | |||
23 | x = (Y(1:2,:) ./ (ones(2,1) * Z)) ; | ||
24 | |||
25 | |||
26 | radius_2 = x(1,:).^2 + x(2,:).^2; | ||
27 | |||
28 | if length(k) > 1, | ||
29 | |||
30 | radial_distortion = 1 + ones(2,1) * ((k(1) * radius_2) + (k(2) * radius_2.^2)); | ||
31 | |||
32 | if length(k) < 4, | ||
33 | |||
34 | delta_x = zeros(2,n); | ||
35 | |||
36 | else | ||
37 | |||
38 | delta_x = [2*k(3)*x(1,:).*x(2,:) + k(4)*(radius_2 + 2*x(1,:).^2) ; | ||
39 | k(3) * (radius_2 + 2*x(2,:).^2)+2*k(4)*x(1,:).*x(2,:)]; | ||
40 | |||
41 | end; | ||
42 | |||
43 | |||
44 | else | ||
45 | |||
46 | radial_distortion = 1 + ones(2,1) * ((k(1) * radius_2)); | ||
47 | |||
48 | delta_x = zeros(2,n); | ||
49 | |||
50 | end; | ||
51 | |||
52 | |||
53 | x = (x .* radial_distortion + delta_x).* (f * ones(1,n)) + t*ones(1,n); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/project_points.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/project_points.m new file mode 100755 index 0000000..1823490 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/project_points.m | |||
@@ -0,0 +1,276 @@ | |||
1 | function [xp,dxpdom,dxpdT,dxpdf,dxpdc,dxpdk] = project_points(X,om,T,f,c,k) | ||
2 | |||
3 | %project_points.m | ||
4 | % | ||
5 | %[xp,dxpdom,dxpdT,dxpdf,dxpdc,dxpdk] = project_points(X,om,T,f,c,k) | ||
6 | % | ||
7 | %Projects a 3D structure onto the image plane. | ||
8 | % | ||
9 | %INPUT: X: 3D structure in the world coordinate frame (3xN matrix for N points) | ||
10 | % (om,T): Rigid motion parameters between world coordinate frame and camera reference frame | ||
11 | % om: rotation vector (3x1 vector); T: translation vector (3x1 vector) | ||
12 | % f: camera focal length in units of horizontal and vertical pixel units (2x1 vector) | ||
13 | % c: principal point location in pixel units (2x1 vector) | ||
14 | % k: Distortion coefficients (radial and tangential) (4x1 vector) | ||
15 | % | ||
16 | %OUTPUT: xp: Projected pixel coordinates (2xN matrix for N points) | ||
17 | % dxpdom: Derivative of xp with respect to om ((2N)x3 matrix) | ||
18 | % dxpdT: Derivative of xp with respect to T ((2N)x3 matrix) | ||
19 | % dxpdf: Derivative of xp with respect to f ((2N)x2 matrix) | ||
20 | % dxpdc: Derivative of xp with respect to c ((2N)x2 matrix) | ||
21 | % dxpdk: Derivative of xp with respect to k ((2N)x4 matrix) | ||
22 | % | ||
23 | %Definitions: | ||
24 | %Let P be a point in 3D of coordinates X in the world reference frame (stored in the matrix X) | ||
25 | %The coordinate vector of P in the camera reference frame is: Xc = R*X + T | ||
26 | %where R is the rotation matrix corresponding to the rotation vector om: R = rodrigues(om); | ||
27 | %call x, y and z the 3 coordinates of Xc: x = Xc(1); y = Xc(2); z = Xc(3); | ||
28 | %The pinehole projection coordinates of P is [a;b] where a=x/z and b=y/z. | ||
29 | %call r^2 = a^2 + b^2. | ||
30 | %The distorted point coordinates are: xd = [xx;yy] where: | ||
31 | % | ||
32 | %xx = a * (1 + kc(1)*r^2 + kc(2)*r^4) + 2*kc(3)*a*b + kc(4)*(r^2 + 2*a^2); | ||
33 | %yy = b * (1 + kc(1)*r^2 + kc(2)*r^4) + kc(3)*(r^2 + 2*b^2) + 2*kc(4)*a*b; | ||
34 | % | ||
35 | %The left terms correspond to radial distortion, the right terms correspond to tangential distortion | ||
36 | % | ||
37 | %Fianlly, convertion into pixel coordinates: The final pixel coordinates vector xp=[xxp;yyp] where: | ||
38 | % | ||
39 | %xxp = f(1)*xx + c(1) | ||
40 | %yyp = f(2)*yy + c(2) | ||
41 | % | ||
42 | % | ||
43 | %NOTE: About 90 percent of the code takes care fo computing the Jacobian matrices | ||
44 | % | ||
45 | % | ||
46 | %Important function called within that program: | ||
47 | % | ||
48 | %rodrigues.m: Computes the rotation matrix corresponding to a rotation vector | ||
49 | % | ||
50 | %rigid_motion.m: Computes the rigid motion transformation of a given structure | ||
51 | |||
52 | |||
53 | |||
54 | if nargin < 6, | ||
55 | k = zeros(4,1); | ||
56 | if nargin < 5, | ||
57 | c = zeros(2,1); | ||
58 | if nargin < 4, | ||
59 | f = ones(2,1); | ||
60 | if nargin < 3, | ||
61 | T = zeros(3,1); | ||
62 | if nargin < 2, | ||
63 | om = zeros(3,1); | ||
64 | if nargin < 1, | ||
65 | error('Need at least a 3D structure to project (in project_points.m)'); | ||
66 | return; | ||
67 | end; | ||
68 | end; | ||
69 | end; | ||
70 | end; | ||
71 | end; | ||
72 | end; | ||
73 | |||
74 | |||
75 | [m,n] = size(X); | ||
76 | |||
77 | [Y,dYdom,dYdT] = rigid_motion(X,om,T); | ||
78 | |||
79 | |||
80 | inv_Z = 1./Y(3,:); | ||
81 | |||
82 | x = (Y(1:2,:) .* (ones(2,1) * inv_Z)) ; | ||
83 | |||
84 | |||
85 | bb = (-x(1,:) .* inv_Z)'*ones(1,3); | ||
86 | cc = (-x(2,:) .* inv_Z)'*ones(1,3); | ||
87 | |||
88 | |||
89 | dxdom = zeros(2*n,3); | ||
90 | dxdom(1:2:end,:) = ((inv_Z')*ones(1,3)) .* dYdom(1:3:end,:) + bb .* dYdom(3:3:end,:); | ||
91 | dxdom(2:2:end,:) = ((inv_Z')*ones(1,3)) .* dYdom(2:3:end,:) + cc .* dYdom(3:3:end,:); | ||
92 | |||
93 | dxdT = zeros(2*n,3); | ||
94 | dxdT(1:2:end,:) = ((inv_Z')*ones(1,3)) .* dYdT(1:3:end,:) + bb .* dYdT(3:3:end,:); | ||
95 | dxdT(2:2:end,:) = ((inv_Z')*ones(1,3)) .* dYdT(2:3:end,:) + cc .* dYdT(3:3:end,:); | ||
96 | |||
97 | |||
98 | % Add distortion: | ||
99 | |||
100 | r2 = x(1,:).^2 + x(2,:).^2; | ||
101 | |||
102 | |||
103 | |||
104 | dr2dom = 2*((x(1,:)')*ones(1,3)) .* dxdom(1:2:end,:) + 2*((x(2,:)')*ones(1,3)) .* dxdom(2:2:end,:); | ||
105 | dr2dT = 2*((x(1,:)')*ones(1,3)) .* dxdT(1:2:end,:) + 2*((x(2,:)')*ones(1,3)) .* dxdT(2:2:end,:); | ||
106 | |||
107 | |||
108 | r4 = r2.^2; | ||
109 | |||
110 | dr4dom = 2*((r2')*ones(1,3)) .* dr2dom; | ||
111 | dr4dT = 2*((r2')*ones(1,3)) .* dr2dT; | ||
112 | |||
113 | |||
114 | % Radial distortion: | ||
115 | |||
116 | cdist = 1 + k(1) * r2 + k(2) * r4; | ||
117 | |||
118 | dcdistdom = k(1) * dr2dom + k(2) * dr4dom; | ||
119 | dcdistdT = k(1) * dr2dT+ k(2) * dr4dT; | ||
120 | dcdistdk = [ r2' r4' zeros(n,2)]; | ||
121 | |||
122 | |||
123 | xd1 = x .* (ones(2,1)*cdist); | ||
124 | |||
125 | dxd1dom = zeros(2*n,3); | ||
126 | dxd1dom(1:2:end,:) = (x(1,:)'*ones(1,3)) .* dcdistdom; | ||
127 | dxd1dom(2:2:end,:) = (x(2,:)'*ones(1,3)) .* dcdistdom; | ||
128 | coeff = (reshape([cdist;cdist],2*n,1)*ones(1,3)); | ||
129 | dxd1dom = dxd1dom + coeff.* dxdom; | ||
130 | |||
131 | dxd1dT = zeros(2*n,3); | ||
132 | dxd1dT(1:2:end,:) = (x(1,:)'*ones(1,3)) .* dcdistdT; | ||
133 | dxd1dT(2:2:end,:) = (x(2,:)'*ones(1,3)) .* dcdistdT; | ||
134 | dxd1dT = dxd1dT + coeff.* dxdT; | ||
135 | |||
136 | dxd1dk = zeros(2*n,4); | ||
137 | dxd1dk(1:2:end,:) = (x(1,:)'*ones(1,4)) .* dcdistdk; | ||
138 | dxd1dk(2:2:end,:) = (x(2,:)'*ones(1,4)) .* dcdistdk; | ||
139 | |||
140 | |||
141 | |||
142 | % tangential distortion: | ||
143 | |||
144 | a1 = 2.*x(1,:).*x(2,:); | ||
145 | a2 = r2 + 2*x(1,:).^2; | ||
146 | a3 = r2 + 2*x(2,:).^2; | ||
147 | |||
148 | delta_x = [k(3)*a1 + k(4)*a2 ; | ||
149 | k(3) * a3 + k(4)*a1]; | ||
150 | |||
151 | |||
152 | ddelta_xdx = zeros(2*n,2*n); | ||
153 | aa = (2*k(3)*x(2,:)+6*k(4)*x(1,:))'*ones(1,3); | ||
154 | bb = (2*k(3)*x(1,:)+2*k(4)*x(2,:))'*ones(1,3); | ||
155 | cc = (6*k(3)*x(2,:)+2*k(4)*x(1,:))'*ones(1,3); | ||
156 | |||
157 | ddelta_xdom = zeros(2*n,3); | ||
158 | ddelta_xdom(1:2:end,:) = aa .* dxdom(1:2:end,:) + bb .* dxdom(2:2:end,:); | ||
159 | ddelta_xdom(2:2:end,:) = bb .* dxdom(1:2:end,:) + cc .* dxdom(2:2:end,:); | ||
160 | |||
161 | ddelta_xdT = zeros(2*n,3); | ||
162 | ddelta_xdT(1:2:end,:) = aa .* dxdT(1:2:end,:) + bb .* dxdT(2:2:end,:); | ||
163 | ddelta_xdT(2:2:end,:) = bb .* dxdT(1:2:end,:) + cc .* dxdT(2:2:end,:); | ||
164 | |||
165 | ddelta_xdk = zeros(2*n,4); | ||
166 | ddelta_xdk(1:2:end,3) = a1'; | ||
167 | ddelta_xdk(1:2:end,4) = a2'; | ||
168 | ddelta_xdk(2:2:end,3) = a3'; | ||
169 | ddelta_xdk(2:2:end,4) = a1'; | ||
170 | |||
171 | |||
172 | |||
173 | xd2 = xd1 + delta_x; | ||
174 | |||
175 | dxd2dom = dxd1dom + ddelta_xdom ; | ||
176 | dxd2dT = dxd1dT + ddelta_xdT; | ||
177 | dxd2dk = dxd1dk + ddelta_xdk ; | ||
178 | |||
179 | |||
180 | % Pixel coordinates: | ||
181 | |||
182 | xp = xd2 .* (f * ones(1,n)) + c*ones(1,n); | ||
183 | |||
184 | coeff = reshape(f*ones(1,n),2*n,1); | ||
185 | |||
186 | dxpdom = (coeff*ones(1,3)) .* dxd2dom; | ||
187 | dxpdT = (coeff*ones(1,3)) .* dxd2dT; | ||
188 | dxpdk = (coeff*ones(1,4)) .* dxd2dk; | ||
189 | |||
190 | dxpdf = zeros(2*n,2); | ||
191 | dxpdf(1:2:end,1) = xd2(1,:)'; | ||
192 | dxpdf(2:2:end,2) = xd2(2,:)'; | ||
193 | |||
194 | dxpdc = zeros(2*n,2); | ||
195 | dxpdc(1:2:end,1) = ones(n,1); | ||
196 | dxpdc(2:2:end,2) = ones(n,1); | ||
197 | |||
198 | |||
199 | return; | ||
200 | |||
201 | % Test of the Jacobians: | ||
202 | |||
203 | n = 10; | ||
204 | |||
205 | X = 10*randn(3,n); | ||
206 | om = randn(3,1); | ||
207 | T = [10*randn(2,1);40]; | ||
208 | f = 1000*rand(2,1); | ||
209 | c = 1000*randn(2,1); | ||
210 | k = 0.5*randn(4,1); | ||
211 | |||
212 | |||
213 | [x,dxdom,dxdT,dxdf,dxdc,dxdk] = project_points(X,om,T,f,c,k); | ||
214 | |||
215 | |||
216 | % Test on om: NOT OK | ||
217 | |||
218 | dom = 0.000000001 * norm(om)*randn(3,1); | ||
219 | om2 = om + dom; | ||
220 | |||
221 | [x2] = project_points(X,om2,T,f,c,k); | ||
222 | |||
223 | x_pred = x + reshape(dxdom * dom,2,n); | ||
224 | |||
225 | |||
226 | norm(x2-x)/norm(x2 - x_pred) | ||
227 | |||
228 | |||
229 | % Test on T: OK!! | ||
230 | |||
231 | dT = 0.0001 * norm(T)*randn(3,1); | ||
232 | T2 = T + dT; | ||
233 | |||
234 | [x2] = project_points(X,om,T2,f,c,k); | ||
235 | |||
236 | x_pred = x + reshape(dxdT * dT,2,n); | ||
237 | |||
238 | |||
239 | norm(x2-x)/norm(x2 - x_pred) | ||
240 | |||
241 | |||
242 | |||
243 | % Test on f: OK!! | ||
244 | |||
245 | df = 0.001 * norm(f)*randn(2,1); | ||
246 | f2 = f + df; | ||
247 | |||
248 | [x2] = project_points(X,om,T,f2,c,k); | ||
249 | |||
250 | x_pred = x + reshape(dxdf * df,2,n); | ||
251 | |||
252 | |||
253 | norm(x2-x)/norm(x2 - x_pred) | ||
254 | |||
255 | |||
256 | % Test on c: OK!! | ||
257 | |||
258 | dc = 0.01 * norm(c)*randn(2,1); | ||
259 | c2 = c + dc; | ||
260 | |||
261 | [x2] = project_points(X,om,T,f,c2,k); | ||
262 | |||
263 | x_pred = x + reshape(dxdc * dc,2,n); | ||
264 | |||
265 | norm(x2-x)/norm(x2 - x_pred) | ||
266 | |||
267 | % Test on k: OK!! | ||
268 | |||
269 | dk = 0.001 * norm(4)*randn(4,1); | ||
270 | k2 = k + dk; | ||
271 | |||
272 | [x2] = project_points(X,om,T,f,c,k2); | ||
273 | |||
274 | x_pred = x + reshape(dxdk * dk,2,n); | ||
275 | |||
276 | norm(x2-x)/norm(x2 - x_pred) | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/projectedGrid.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/projectedGrid.m new file mode 100755 index 0000000..561a7d0 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/projectedGrid.m | |||
@@ -0,0 +1,24 @@ | |||
1 | function [XX,H] = projectedGrid ( P1, P2, P3, P4 , nx, ny); | ||
2 | |||
3 | % new formalism using homographies | ||
4 | |||
5 | a00 = [P1;1]; | ||
6 | a10 = [P2;1]; | ||
7 | a11 = [P3;1]; | ||
8 | a01 = [P4;1]; | ||
9 | |||
10 | % Compute the planart collineation: | ||
11 | |||
12 | [H] = compute_collineation (a00, a10, a11, a01); | ||
13 | |||
14 | |||
15 | % Build the grid using the planar collineation: | ||
16 | |||
17 | x_l = ((0:(nx-1))'*ones(1,ny))/(nx-1); | ||
18 | y_l = (ones(nx,1)*(0:(ny-1)))/(ny-1); | ||
19 | |||
20 | pts = [x_l(:) y_l(:) ones(nx*ny,1)]'; | ||
21 | |||
22 | XX = H*pts; | ||
23 | |||
24 | XX = XX(1:2,:) ./ (ones(2,1)*XX(3,:)); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/readras.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/readras.m new file mode 100755 index 0000000..fc1820b --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/readras.m | |||
@@ -0,0 +1,87 @@ | |||
1 | function [X, map] = readras(filename, ys, ye, xs, xe); | ||
2 | %READRAS Read an image file in sun raster format. | ||
3 | % READRAS('imagefile.ras') reads a "sun.raster" image file. | ||
4 | % [X, map] = READRAS('imagefile.ras') returns both the image and a | ||
5 | % color map, so that | ||
6 | % [X, map] = readras('imagefile.ras'); | ||
7 | % image(X) | ||
8 | % colormap(map) | ||
9 | % axis('equal') | ||
10 | % will display the result with the proper colors. | ||
11 | % NOTE: readras cannot deal with complicated color maps. | ||
12 | % In fact, Matlab doesn't quite allow to work with colormaps | ||
13 | % with more than 64 entries. | ||
14 | % | ||
15 | |||
16 | %% | ||
17 | %% (C) Thomas K. Leung 3/30/93. | ||
18 | %% California Institute of Technology. | ||
19 | %% Modified by Andrea Mennucci to deal with color images | ||
20 | %% | ||
21 | |||
22 | % PC and UNIX version of readras - Jean-Yves Bouguet - Dec. 1998 | ||
23 | |||
24 | dot = max(find(filename == '.')); | ||
25 | suffix = filename(dot+1:dot+3); | ||
26 | |||
27 | if(strcmp(suffix, 'ras')) % raster file format % | ||
28 | fp = fopen(filename, 'rb'); | ||
29 | if(fp<0) error(['Cannot open ' filename '.']), end | ||
30 | |||
31 | %Read and crack the 32-byte header | ||
32 | fseek(fp, 4, -1); | ||
33 | |||
34 | width = 2^24 * fread(fp, 1, 'uchar') + 2^16 * fread(fp, 1, 'uchar') + 2^8 * fread(fp, 1, 'uchar') + fread(fp, 1, 'uchar'); | ||
35 | |||
36 | height = 2^24 * fread(fp, 1, 'uchar') + 2^16 * fread(fp, 1, 'uchar') + 2^8 * fread(fp, 1, 'uchar') + fread(fp, 1, 'uchar'); | ||
37 | |||
38 | depth = 2^24 * fread(fp, 1, 'uchar') + 2^16 * fread(fp, 1, 'uchar') + 2^8 * fread(fp, 1, 'uchar') + fread(fp, 1, 'uchar'); | ||
39 | |||
40 | length = 2^24 * fread(fp, 1, 'uchar') + 2^16 * fread(fp, 1, 'uchar') + 2^8 * fread(fp, 1, 'uchar') + fread(fp, 1, 'uchar'); | ||
41 | |||
42 | type = 2^24 * fread(fp, 1, 'uchar') + 2^16 * fread(fp, 1, 'uchar') + 2^8 * fread(fp, 1, 'uchar') + fread(fp, 1, 'uchar'); | ||
43 | |||
44 | maptype = 2^24 * fread(fp, 1, 'uchar') + 2^16 * fread(fp, 1, 'uchar') + 2^8 * fread(fp, 1, 'uchar') + fread(fp, 1, 'uchar'); | ||
45 | |||
46 | maplen = 2^24 * fread(fp, 1, 'uchar') + 2^16 * fread(fp, 1, 'uchar') + 2^8 * fread(fp, 1, 'uchar') + fread(fp, 1, 'uchar'); | ||
47 | |||
48 | maplen = maplen / 3; | ||
49 | |||
50 | if maptype == 2 % RMT_RAW | ||
51 | map = fread(fp, [maplen, 3], 'uchar')/255; | ||
52 | % if maplen<64, map=[map',zeros(3,64-maplen)]';maplen=64; end; | ||
53 | elseif maptype == 1 % RMT_EQUAL_RGB | ||
54 | map(:,1) = fread(fp, [maplen], 'uchar'); | ||
55 | map(:,2) = fread(fp, [maplen], 'uchar'); | ||
56 | map(:,3) = fread(fp, [maplen], 'uchar'); | ||
57 | %maxmap = max(max(map)); | ||
58 | map = map/255; | ||
59 | if maplen<64, map=[map',zeros(3,64-maplen)]'; maplen=64; end; | ||
60 | else % RMT_NONE | ||
61 | map = []; | ||
62 | end | ||
63 | % if maplen>64, | ||
64 | % map=[map',zeros(3,256-maplen)]'; | ||
65 | % end; | ||
66 | |||
67 | % Read the image | ||
68 | |||
69 | if rem(width,2) == 1 | ||
70 | Xt = fread(fp, [width+1, height], 'uchar'); | ||
71 | X = Xt(1:width, :)'; | ||
72 | else | ||
73 | Xt = fread(fp, [width, height], 'uchar'); | ||
74 | X = Xt'; | ||
75 | end | ||
76 | X = X + 1; | ||
77 | fclose(fp); | ||
78 | else | ||
79 | error('Image file name must end in either ''ras'' or ''rast''.'); | ||
80 | end | ||
81 | |||
82 | |||
83 | if nargin == 5 | ||
84 | |||
85 | X = X(ys:ye, xs:xe); | ||
86 | |||
87 | end \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/recomp_corner_calib.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/recomp_corner_calib.m new file mode 100755 index 0000000..e0af501 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/recomp_corner_calib.m | |||
@@ -0,0 +1,96 @@ | |||
1 | % Re-select te corners after calibration | ||
2 | |||
3 | check_active_images; | ||
4 | |||
5 | if ~exist(['y_' num2str(ind_active(1))]), | ||
6 | fprintf(1,'Need to calibrate once before before recomputing image corners. Maybe need to load Calib_Results.mat file.\n'); | ||
7 | return; | ||
8 | end; | ||
9 | |||
10 | if ~exist(['I_' num2str(ind_active(1))]), | ||
11 | ima_read_calib; | ||
12 | if no_image_file, | ||
13 | disp('Cannot extract corners without images'); | ||
14 | return; | ||
15 | end; | ||
16 | end; | ||
17 | |||
18 | fprintf(1,'\nRe-extraction of the grid corners on the images (after first calibration)\n'); | ||
19 | |||
20 | disp('Window size for corner finder (wintx and winty):'); | ||
21 | wintx = input('wintx ([] = 5) = '); | ||
22 | if isempty(wintx), wintx = 5; end; | ||
23 | wintx = round(wintx); | ||
24 | winty = input('winty ([] = 5) = '); | ||
25 | if isempty(winty), winty = 5; end; | ||
26 | winty = round(winty); | ||
27 | |||
28 | fprintf(1,'Window size = %dx%d\n',2*wintx+1,2*winty+1); | ||
29 | |||
30 | ima_numbers = input('Number(s) of image(s) to process ([] = all images) = '); | ||
31 | |||
32 | if isempty(ima_numbers), | ||
33 | ima_proc = 1:n_ima; | ||
34 | else | ||
35 | ima_proc = ima_numbers; | ||
36 | end; | ||
37 | |||
38 | q_auto = input('Use the projection of 3D grid or manual click ([]=auto, other=manual): '); | ||
39 | |||
40 | fprintf(1,'Processing image '); | ||
41 | |||
42 | for kk = ima_proc; | ||
43 | |||
44 | if active_images(kk), | ||
45 | |||
46 | fprintf(1,'%d...',kk); | ||
47 | |||
48 | if isempty(q_auto), | ||
49 | |||
50 | eval(['I = I_' num2str(kk) ';']); | ||
51 | |||
52 | eval(['y = y_' num2str(kk) ';']); | ||
53 | |||
54 | xc = cornerfinder(y+1,I,winty,wintx); % the four corners | ||
55 | |||
56 | eval(['wintx_' num2str(kk) ' = wintx;']); | ||
57 | eval(['winty_' num2str(kk) ' = winty;']); | ||
58 | |||
59 | eval(['x_' num2str(kk) '= xc - 1;']); | ||
60 | |||
61 | else | ||
62 | |||
63 | fprintf(1,'\n'); | ||
64 | |||
65 | click_ima_calib; | ||
66 | |||
67 | end; | ||
68 | |||
69 | else | ||
70 | |||
71 | if ~exist(['omc_' num2str(kk)]), | ||
72 | |||
73 | eval(['dX_' num2str(kk) ' = NaN;']); | ||
74 | eval(['dY_' num2str(kk) ' = NaN;']); | ||
75 | |||
76 | eval(['wintx_' num2str(kk) ' = NaN;']); | ||
77 | eval(['winty_' num2str(kk) ' = NaN;']); | ||
78 | |||
79 | eval(['x_' num2str(kk) ' = NaN*ones(2,1);']); | ||
80 | eval(['X_' num2str(kk) ' = NaN*ones(3,1);']); | ||
81 | |||
82 | eval(['n_sq_x_' num2str(kk) ' = NaN;']); | ||
83 | eval(['n_sq_y_' num2str(kk) ' = NaN;']); | ||
84 | |||
85 | end; | ||
86 | |||
87 | end; | ||
88 | |||
89 | |||
90 | end; | ||
91 | |||
92 | % Recompute the error: | ||
93 | |||
94 | comp_error_calib; | ||
95 | |||
96 | fprintf(1,'\ndone\n'); \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/rect.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/rect.m new file mode 100755 index 0000000..d8b6366 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/rect.m | |||
@@ -0,0 +1,93 @@ | |||
1 | function [Irec] = rect(I,R,f,c,k,KK_new); | ||
2 | |||
3 | |||
4 | % Note: R is the motion of the points in space | ||
5 | % So: X2 = R*X where X: coord in the old reference frame, X2: coord in the new ref frame. | ||
6 | |||
7 | [nr,nc] = size(I); | ||
8 | |||
9 | Irec = 255*ones(nr,nc); | ||
10 | |||
11 | [mx,my] = meshgrid(1:nc, 1:nr); | ||
12 | px = reshape(mx',nc*nr,1); | ||
13 | py = reshape(my',nc*nr,1); | ||
14 | |||
15 | rays = inv(KK_new)*[(px - 1)';(py - 1)';ones(1,length(px))]; | ||
16 | |||
17 | |||
18 | % Rotation: (or affine transformation): | ||
19 | |||
20 | rays2 = R'*rays; | ||
21 | |||
22 | |||
23 | x = [rays2(1,:)./rays2(3,:);rays2(2,:)./rays2(3,:)]; | ||
24 | |||
25 | % Add distortion: | ||
26 | |||
27 | k1 = k(1); | ||
28 | k2 = k(2); | ||
29 | |||
30 | p1 = k(3); | ||
31 | p2 = k(4); | ||
32 | |||
33 | r_2 = sum(x.^2); | ||
34 | |||
35 | delta_x = [2*p1*x(1,:).*x(2,:) + p2*(r_2 + 2*x(1,:).^2) ; | ||
36 | p1 * (r_2 + 2*x(2,:).^2)+2*p2*x(1,:).*x(2,:)]; | ||
37 | |||
38 | xd = (ones(2,1)*( 1 + k1 * r_2 + k2 * r_2.^2)) .* x + delta_x; | ||
39 | |||
40 | |||
41 | % Reconvert in pixels: | ||
42 | |||
43 | px2 = f(1)*xd(1,:)+c(1); | ||
44 | py2 = f(2)*xd(2,:)+c(2); | ||
45 | |||
46 | |||
47 | % Interpolate between the closest pixels: | ||
48 | |||
49 | |||
50 | px_0 = floor(px2); | ||
51 | px_1 = px_0 + 1; | ||
52 | alpha_x = px2 - px_0; | ||
53 | |||
54 | py_0 = floor(py2); | ||
55 | py_1 = py_0 + 1; | ||
56 | alpha_y = py2 - py_0; | ||
57 | |||
58 | good_points = find((px_0 >= 0) & (px_1 <= (nc-1)) & (py_0 >= 0) & (py_1 <= (nr-1))); | ||
59 | |||
60 | I_lu = I(px_0(good_points) * nr + py_0(good_points) + 1); | ||
61 | I_ru = I(px_1(good_points) * nr + py_0(good_points) + 1); | ||
62 | I_ld = I(px_0(good_points) * nr + py_1(good_points) + 1); | ||
63 | I_rd = I(px_1(good_points) * nr + py_1(good_points) + 1); | ||
64 | |||
65 | |||
66 | I_interp = (1 - alpha_y(good_points)).*((1 - alpha_x(good_points)).* I_lu + alpha_x(good_points) .* I_ru) + alpha_y(good_points) .* ((1 - alpha_x(good_points)).* I_ld + alpha_x(good_points) .* I_rd); | ||
67 | |||
68 | |||
69 | Irec((px(good_points)-1)*nr + py(good_points)) = I_interp; | ||
70 | |||
71 | |||
72 | |||
73 | return; | ||
74 | |||
75 | |||
76 | % Convert in indices: | ||
77 | |||
78 | fact = 3; | ||
79 | |||
80 | [XX,YY]= meshgrid(1:nc,1:nr); | ||
81 | [XXi,YYi]= meshgrid(1:1/fact:nc,1:1/fact:nr); | ||
82 | |||
83 | %tic; | ||
84 | Iinterp = interp2(XX,YY,I,XXi,YYi); | ||
85 | %toc | ||
86 | |||
87 | [nri,nci] = size(Iinterp); | ||
88 | |||
89 | |||
90 | ind_col = round(fact*(f(1)*xd(1,:)+c(1)))+1; | ||
91 | ind_row = round(fact*(f(2)*xd(2,:)+c(2)))+1; | ||
92 | |||
93 | good_points = find((ind_col >=1)&(ind_col<=nci)&(ind_row >=1)& (ind_row <=nri)); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/reproject_calib.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/reproject_calib.m new file mode 100755 index 0000000..86b13f5 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/reproject_calib.m | |||
@@ -0,0 +1,92 @@ | |||
1 | %%%%%%%%%%%%%%%%%%%% REPROJECT ON THE IMAGES %%%%%%%%%%%%%%%%%%%%%%%% | ||
2 | |||
3 | if ~exist('no_image'), | ||
4 | no_image = 0; | ||
5 | end; | ||
6 | |||
7 | check_active_images; | ||
8 | |||
9 | |||
10 | % Color code for each image: | ||
11 | |||
12 | colors = 'brgkcm'; | ||
13 | |||
14 | % Reproject the patterns on the images, and compute the pixel errors: | ||
15 | |||
16 | % Reload the images if necessary | ||
17 | |||
18 | if ~exist(['omc_' num2str(ind_active(1)) ]), | ||
19 | fprintf(1,'Need to calibrate before showing image reprojection. Maybe need to load Calib_Results.mat file.\n'); | ||
20 | return; | ||
21 | end; | ||
22 | |||
23 | if ~no_image, | ||
24 | if ~exist(['I_' num2str(ind_active(1)) ]'), | ||
25 | ima_read_calib; | ||
26 | if no_image_file, | ||
27 | fprintf(1,'WARNING: Do not show the original images\n'); %return; | ||
28 | end; | ||
29 | end; | ||
30 | else | ||
31 | no_image_file = 1; | ||
32 | end; | ||
33 | |||
34 | |||
35 | |||
36 | ima_numbers = input('Number(s) of image(s) to show ([] = all images) = '); | ||
37 | |||
38 | if isempty(ima_numbers), | ||
39 | ima_proc = 1:n_ima; | ||
40 | else | ||
41 | ima_proc = ima_numbers; | ||
42 | end; | ||
43 | |||
44 | |||
45 | figure(5); | ||
46 | for kk = ima_proc, %1:n_ima, | ||
47 | if active_images(kk) & eval(['~isnan(y_' num2str(kk) '(1,1))']), | ||
48 | eval(['plot(ex_' num2str(kk) '(1,:),ex_' num2str(kk) '(2,:),''' colors(rem(kk-1,6)+1) '+'');']); | ||
49 | hold on; | ||
50 | end; | ||
51 | end; | ||
52 | hold off; | ||
53 | axis('equal'); | ||
54 | title('Reprojection error (in pixel)'); | ||
55 | xlabel('x'); | ||
56 | ylabel('y'); | ||
57 | drawnow; | ||
58 | |||
59 | set(5,'Name','error','NumberTitle','off'); | ||
60 | |||
61 | |||
62 | |||
63 | for kk = ima_proc, | ||
64 | |||
65 | if active_images(kk) & eval(['~isnan(y_' num2str(kk) '(1,1))']), | ||
66 | |||
67 | if exist(['I_' num2str(kk)]), | ||
68 | eval(['I = I_' num2str(kk) ';']); | ||
69 | else | ||
70 | I = 255*ones(ny,nx); | ||
71 | end; | ||
72 | |||
73 | figure(5+kk); | ||
74 | image(I); hold on; | ||
75 | colormap(gray(256)); | ||
76 | title(['Image ' num2str(kk) ' - Image points (+) and reprojected grid points (o)']); | ||
77 | eval(['plot(x_' num2str(kk) '(1,:)+1,x_' num2str(kk) '(2,:)+1,''r+'');']); | ||
78 | eval(['plot(y_' num2str(kk) '(1,:)+1,y_' num2str(kk) '(2,:)+1,''' colors(rem(kk-1,6)+1) 'o'');']); | ||
79 | zoom on; | ||
80 | hold off; | ||
81 | drawnow; | ||
82 | |||
83 | set(5+kk,'Name',num2str(kk),'NumberTitle','off'); | ||
84 | |||
85 | end; | ||
86 | |||
87 | end; | ||
88 | |||
89 | |||
90 | err_std = std(ex')'; | ||
91 | |||
92 | fprintf(1,'Pixel error: err = [ %3.5f %3.5f]\n\n',err_std); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/rigid_motion.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/rigid_motion.m new file mode 100755 index 0000000..473405c --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/rigid_motion.m | |||
@@ -0,0 +1,66 @@ | |||
1 | function [Y,dYdom,dYdT] = rigid_motion(X,om,T); | ||
2 | |||
3 | %rigid_motion.m | ||
4 | % | ||
5 | %[Y,dYdom,dYdT] = rigid_motion(X,om,T) | ||
6 | % | ||
7 | %Computes the rigid motion transformation Y = R*X+T, where R = rodrigues(om). | ||
8 | % | ||
9 | %INPUT: X: 3D structure in the world coordinate frame (3xN matrix for N points) | ||
10 | % (om,T): Rigid motion parameters between world coordinate frame and camera reference frame | ||
11 | % om: rotation vector (3x1 vector); T: translation vector (3x1 vector) | ||
12 | % | ||
13 | %OUTPUT: Y: 3D coordinates of the structure points in the camera reference frame (3xN matrix for N points) | ||
14 | % dYdom: Derivative of Y with respect to om ((3N)x3 matrix) | ||
15 | % dYdT: Derivative of Y with respect to T ((3N)x3 matrix) | ||
16 | % | ||
17 | %Definitions: | ||
18 | %Let P be a point in 3D of coordinates X in the world reference frame (stored in the matrix X) | ||
19 | %The coordinate vector of P in the camera reference frame is: Y = R*X + T | ||
20 | %where R is the rotation matrix corresponding to the rotation vector om: R = rodrigues(om); | ||
21 | % | ||
22 | %Important function called within that program: | ||
23 | % | ||
24 | %rodrigues.m: Computes the rotation matrix corresponding to a rotation vector | ||
25 | |||
26 | |||
27 | |||
28 | if nargin < 3, | ||
29 | T = zeros(3,1); | ||
30 | if nargin < 2, | ||
31 | om = zeros(3,1); | ||
32 | if nargin < 1, | ||
33 | error('Need at least a 3D structure as input (in rigid_motion.m)'); | ||
34 | return; | ||
35 | end; | ||
36 | end; | ||
37 | end; | ||
38 | |||
39 | |||
40 | [R,dRdom] = rodrigues(om); | ||
41 | |||
42 | [m,n] = size(X); | ||
43 | |||
44 | Y = R*X + T*ones(1,n); | ||
45 | |||
46 | if nargout > 1, | ||
47 | |||
48 | |||
49 | dYdR = zeros(3*n,9); | ||
50 | dYdT = zeros(3*n,3); | ||
51 | |||
52 | dYdR(1:3:end,1:3:end) = X'; | ||
53 | dYdR(2:3:end,2:3:end) = X'; | ||
54 | dYdR(3:3:end,3:3:end) = X'; | ||
55 | |||
56 | dYdT(1:3:end,1) = ones(n,1); | ||
57 | dYdT(2:3:end,2) = ones(n,1); | ||
58 | dYdT(3:3:end,3) = ones(n,1); | ||
59 | |||
60 | dYdom = dYdR * dRdom; | ||
61 | |||
62 | end; | ||
63 | |||
64 | |||
65 | |||
66 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/rodrigues.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/rodrigues.m new file mode 100755 index 0000000..9d55337 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/rodrigues.m | |||
@@ -0,0 +1,217 @@ | |||
1 | function [out,dout]=rodrigues(in) | ||
2 | |||
3 | % RODRIGUES Transform rotation matrix into rotation vector and viceversa. | ||
4 | % | ||
5 | % Sintax: [OUT]=RODRIGUES(IN) | ||
6 | % If IN is a 3x3 rotation matrix then OUT is the | ||
7 | % corresponding 3x1 rotation vector | ||
8 | % if IN is a rotation 3-vector then OUT is the | ||
9 | % corresponding 3x3 rotation matrix | ||
10 | % | ||
11 | |||
12 | %% | ||
13 | %% Copyright (c) March 1993 -- Pietro Perona | ||
14 | %% California Institute of Technology | ||
15 | %% | ||
16 | |||
17 | %% ALL CHECKED BY JEAN-YVES BOUGUET, October 1995. | ||
18 | %% FOR ALL JACOBIAN MATRICES !!! LOOK AT THE TEST AT THE END !! | ||
19 | |||
20 | %% BUG when norm(om)=pi fixed -- April 6th, 1997; | ||
21 | %% Jean-Yves Bouguet | ||
22 | |||
23 | |||
24 | [m,n] = size(in); | ||
25 | %bigeps = 10e+4*eps; | ||
26 | bigeps = 10e+20*eps; | ||
27 | |||
28 | if ((m==1) & (n==3)) | ((m==3) & (n==1)) %% it is a rotation vector | ||
29 | theta = norm(in); | ||
30 | if theta < eps | ||
31 | R = eye(3); | ||
32 | |||
33 | %if nargout > 1, | ||
34 | |||
35 | dRdin = [0 0 0; | ||
36 | 0 0 1; | ||
37 | 0 -1 0; | ||
38 | 0 0 -1; | ||
39 | 0 0 0; | ||
40 | 1 0 0; | ||
41 | 0 1 0; | ||
42 | -1 0 0; | ||
43 | 0 0 0]; | ||
44 | |||
45 | %end; | ||
46 | |||
47 | else | ||
48 | if n==length(in) in=in'; end; %% make it a column vec. if necess. | ||
49 | |||
50 | %m3 = [in,theta] | ||
51 | |||
52 | dm3din = [eye(3);in'/theta]; | ||
53 | |||
54 | omega = in/theta; | ||
55 | |||
56 | %m2 = [omega;theta] | ||
57 | |||
58 | dm2dm3 = [eye(3)/theta -in/theta^2; zeros(1,3) 1]; | ||
59 | |||
60 | alpha = cos(theta); | ||
61 | beta = sin(theta); | ||
62 | gamma = 1-cos(theta); | ||
63 | omegav=[[0 -omega(3) omega(2)];[omega(3) 0 -omega(1)];[-omega(2) omega(1) 0 ]]; | ||
64 | A = omega*omega'; | ||
65 | |||
66 | %m1 = [alpha;beta;gamma;omegav;A]; | ||
67 | |||
68 | dm1dm2 = zeros(21,4); | ||
69 | dm1dm2(1,4) = -sin(theta); | ||
70 | dm1dm2(2,4) = cos(theta); | ||
71 | dm1dm2(3,4) = sin(theta); | ||
72 | dm1dm2(4:12,1:3) = [0 0 0 0 0 1 0 -1 0; | ||
73 | 0 0 -1 0 0 0 1 0 0; | ||
74 | 0 1 0 -1 0 0 0 0 0]'; | ||
75 | |||
76 | w1 = omega(1); | ||
77 | w2 = omega(2); | ||
78 | w3 = omega(3); | ||
79 | |||
80 | dm1dm2(13:21,1) = [2*w1;w2;w3;w2;0;0;w3;0;0]; | ||
81 | dm1dm2(13: 21,2) = [0;w1;0;w1;2*w2;w3;0;w3;0]; | ||
82 | dm1dm2(13:21,3) = [0;0;w1;0;0;w2;w1;w2;2*w3]; | ||
83 | |||
84 | R = eye(3)*alpha + omegav*beta + A*gamma; | ||
85 | |||
86 | dRdm1 = zeros(9,21); | ||
87 | |||
88 | dRdm1([1 5 9],1) = ones(3,1); | ||
89 | dRdm1(:,2) = omegav(:); | ||
90 | dRdm1(:,4:12) = beta*eye(9); | ||
91 | dRdm1(:,3) = A(:); | ||
92 | dRdm1(:,13:21) = gamma*eye(9); | ||
93 | |||
94 | dRdin = dRdm1 * dm1dm2 * dm2dm3 * dm3din; | ||
95 | |||
96 | |||
97 | end; | ||
98 | out = R; | ||
99 | dout = dRdin; | ||
100 | |||
101 | %% it is prob. a rot matr. | ||
102 | elseif ((m==n) & (m==3) & (norm(in' * in - eye(3)) < bigeps)... | ||
103 | & (abs(det(in)-1) < bigeps)) | ||
104 | R = in; | ||
105 | |||
106 | |||
107 | |||
108 | tr = (trace(R)-1)/2; | ||
109 | dtrdR = [1 0 0 0 1 0 0 0 1]/2; | ||
110 | theta = real(acos(tr)); | ||
111 | |||
112 | |||
113 | if sin(theta) >= 1e-5, | ||
114 | |||
115 | dthetadtr = -1/sqrt(1-tr^2); | ||
116 | |||
117 | dthetadR = dthetadtr * dtrdR; | ||
118 | % var1 = [vth;theta]; | ||
119 | vth = 1/(2*sin(theta)); | ||
120 | dvthdtheta = -vth*cos(theta)/sin(theta); | ||
121 | dvar1dtheta = [dvthdtheta;1]; | ||
122 | |||
123 | dvar1dR = dvar1dtheta * dthetadR; | ||
124 | |||
125 | |||
126 | om1 = [R(3,2)-R(2,3), R(1,3)-R(3,1), R(2,1)-R(1,2)]'; | ||
127 | |||
128 | dom1dR = [0 0 0 0 0 1 0 -1 0; | ||
129 | 0 0 -1 0 0 0 1 0 0; | ||
130 | 0 1 0 -1 0 0 0 0 0]; | ||
131 | |||
132 | % var = [om1;vth;theta]; | ||
133 | dvardR = [dom1dR;dvar1dR]; | ||
134 | |||
135 | % var2 = [om;theta]; | ||
136 | om = vth*om1; | ||
137 | domdvar = [vth*eye(3) om1 zeros(3,1)]; | ||
138 | dthetadvar = [0 0 0 0 1]; | ||
139 | dvar2dvar = [domdvar;dthetadvar]; | ||
140 | |||
141 | |||
142 | out = om*theta; | ||
143 | domegadvar2 = [theta*eye(3) om]; | ||
144 | |||
145 | dout = domegadvar2 * dvar2dvar * dvardR; | ||
146 | |||
147 | |||
148 | else | ||
149 | if tr > 0; % case norm(om)=0; | ||
150 | |||
151 | out = [0 0 0]'; | ||
152 | |||
153 | dout = [0 0 0 0 0 1/2 0 -1/2 0; | ||
154 | 0 0 -1/2 0 0 0 1/2 0 0; | ||
155 | 0 1/2 0 -1/2 0 0 0 0 0]; | ||
156 | else % case norm(om)=pi; %% fixed April 6th | ||
157 | |||
158 | |||
159 | out = theta * (sqrt((diag(R)+1)/2).*[1;2*(R(1,2:3)>=0)'-1]); | ||
160 | %keyboard; | ||
161 | |||
162 | if nargout > 1, | ||
163 | fprintf(1,'WARNING!!!! Jacobian domdR undefined!!!\n'); | ||
164 | dout = NaN*ones(3,9); | ||
165 | end; | ||
166 | end; | ||
167 | end; | ||
168 | |||
169 | else | ||
170 | error('Neither a rotation matrix nor a rotation vector were provided'); | ||
171 | end; | ||
172 | |||
173 | return; | ||
174 | |||
175 | %% test of the Jacobians: | ||
176 | |||
177 | %%%% TEST OF dRdom: | ||
178 | om = randn(3,1); | ||
179 | dom = randn(3,1)/1000000; | ||
180 | |||
181 | [R1,dR1] = rodrigues(om); | ||
182 | R2 = rodrigues(om+dom); | ||
183 | |||
184 | R2a = R1 + reshape(dR1 * dom,3,3); | ||
185 | |||
186 | gain = norm(R2 - R1)/norm(R2 - R2a) | ||
187 | |||
188 | %%% TEST OF dOmdR: | ||
189 | om = randn(3,1); | ||
190 | R = rodrigues(om); | ||
191 | dom = randn(3,1)/10000; | ||
192 | dR = rodrigues(om+dom) - R; | ||
193 | |||
194 | [omc,domdR] = rodrigues(R); | ||
195 | [om2] = rodrigues(R+dR); | ||
196 | |||
197 | om_app = omc + domdR*dR(:); | ||
198 | |||
199 | gain = norm(om2 - omc)/norm(om2 - om_app) | ||
200 | |||
201 | |||
202 | %%% OTHER BUG: (FIXED NOW!!!) | ||
203 | |||
204 | omu = randn(3,1); | ||
205 | omu = omu/norm(omu) | ||
206 | om = pi*omu; | ||
207 | [R,dR]= rodrigues(om); | ||
208 | [om2] = rodrigues(R); | ||
209 | [om om2] | ||
210 | |||
211 | %%% NORMAL OPERATION | ||
212 | |||
213 | om = randn(3,1); | ||
214 | [R,dR]= rodrigues(om); | ||
215 | [om2] = rodrigues(R); | ||
216 | [om om2] | ||
217 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/rotation.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/rotation.m new file mode 100755 index 0000000..87ee2fe --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/rotation.m | |||
@@ -0,0 +1,23 @@ | |||
1 | function [] = rotation(st); | ||
2 | |||
3 | if nargin < 1, | ||
4 | st= 1; | ||
5 | end; | ||
6 | |||
7 | |||
8 | fig = gcf; | ||
9 | |||
10 | ax = gca; | ||
11 | |||
12 | vv = get(ax,'view'); | ||
13 | |||
14 | az = vv(1); | ||
15 | el = vv(2); | ||
16 | |||
17 | for azi = az:-abs(st):az-360, | ||
18 | |||
19 | set(ax,'view',[azi el]); | ||
20 | figure(fig); | ||
21 | drawnow; | ||
22 | |||
23 | end; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/run_error_analysis.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/run_error_analysis.m new file mode 100755 index 0000000..095e17e --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/run_error_analysis.m | |||
@@ -0,0 +1,65 @@ | |||
1 | %%% Program that launchs the complete | ||
2 | |||
3 | for N_ima_active = 1:30, | ||
4 | |||
5 | error_analysis; | ||
6 | |||
7 | end; | ||
8 | |||
9 | |||
10 | |||
11 | return; | ||
12 | |||
13 | |||
14 | f = []; | ||
15 | f_std = []; | ||
16 | |||
17 | c = []; | ||
18 | c_std = []; | ||
19 | |||
20 | k = []; | ||
21 | k_std = []; | ||
22 | |||
23 | NN = 30; | ||
24 | |||
25 | for rr = 1:NN, | ||
26 | |||
27 | load(['Calib_Accuracies_' num2str(rr)]); | ||
28 | |||
29 | [m1,s1] = mean_std_robust(fc_list(1,:)); | ||
30 | [m2,s2] = mean_std_robust(fc_list(2,:)); | ||
31 | |||
32 | f = [f [m1;m2]]; | ||
33 | f_std = [f_std [s1;s2]]; | ||
34 | |||
35 | [m1,s1] = mean_std_robust(cc_list(1,:)); | ||
36 | [m2,s2] = mean_std_robust(cc_list(2,:)); | ||
37 | |||
38 | c = [c [m1;m2]]; | ||
39 | c_std = [c_std [s1;s2]]; | ||
40 | |||
41 | [m1,s1] = mean_std_robust(kc_list(1,:)); | ||
42 | [m2,s2] = mean_std_robust(kc_list(2,:)); | ||
43 | [m3,s3] = mean_std_robust(kc_list(3,:)); | ||
44 | [m4,s4] = mean_std_robust(kc_list(4,:)); | ||
45 | |||
46 | k = [k [m1;m2;m3;m4]]; | ||
47 | k_std = [k_std [s1;s2;s3;s4]]; | ||
48 | |||
49 | end; | ||
50 | |||
51 | figure(1); | ||
52 | errorbar([1:NN;1:NN]',f',f_std'); | ||
53 | figure(2); | ||
54 | errorbar([1:NN;1:NN]',c',c_std'); | ||
55 | figure(3); | ||
56 | errorbar([1:NN;1:NN;1:NN;1:NN]',k',k_std'); | ||
57 | |||
58 | figure(4); | ||
59 | semilogy(f_std'); | ||
60 | |||
61 | figure(5); | ||
62 | semilogy(c_std'); | ||
63 | |||
64 | figure(6); | ||
65 | semilogy(k_std'); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/saveinr.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/saveinr.m new file mode 100755 index 0000000..a176e39 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/saveinr.m | |||
@@ -0,0 +1,46 @@ | |||
1 | %SAVEINR Write an INRIMAGE format file | ||
2 | % | ||
3 | % SAVEINR(filename, im) | ||
4 | % | ||
5 | % Saves the specified image array in a INRIA image format file. | ||
6 | % | ||
7 | % SEE ALSO: loadinr | ||
8 | % | ||
9 | % Copyright (c) Peter Corke, 1999 Machine Vision Toolbox for Matlab | ||
10 | |||
11 | % Peter Corke 1996 | ||
12 | |||
13 | function saveinr(fname, im) | ||
14 | |||
15 | fid = fopen(fname, 'w'); | ||
16 | [r,c] = size(im'); | ||
17 | |||
18 | % build the header | ||
19 | hdr = []; | ||
20 | s = sprintf('#INRIMAGE-4#{\n'); | ||
21 | hdr = [hdr s]; | ||
22 | s = sprintf('XDIM=%d\n',c); | ||
23 | hdr = [hdr s]; | ||
24 | s = sprintf('YDIM=%d\n',r); | ||
25 | hdr = [hdr s]; | ||
26 | s = sprintf('ZDIM=1\n'); | ||
27 | hdr = [hdr s]; | ||
28 | s = sprintf('VDIM=1\n'); | ||
29 | hdr = [hdr s]; | ||
30 | s = sprintf('TYPE=float\n'); | ||
31 | hdr = [hdr s]; | ||
32 | s = sprintf('PIXSIZE=32\n'); | ||
33 | hdr = [hdr s]; | ||
34 | s = sprintf('SCALE=2**0\n'); | ||
35 | hdr = [hdr s]; | ||
36 | s = sprintf('CPU=sun\n#'); | ||
37 | hdr = [hdr s]; | ||
38 | |||
39 | % make it 256 bytes long and write it | ||
40 | hdr256 = zeros(1,256); | ||
41 | hdr256(1:length(hdr)) = hdr; | ||
42 | fwrite(fid, hdr256, 'uchar'); | ||
43 | |||
44 | % now the binary data | ||
45 | fwrite(fid, im', 'float32'); | ||
46 | fclose(fid) | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/savepgm.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/savepgm.m new file mode 100755 index 0000000..397f028 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/savepgm.m | |||
@@ -0,0 +1,22 @@ | |||
1 | %SAVEPGM Write a PGM format file | ||
2 | % | ||
3 | % SAVEPGM(filename, im) | ||
4 | % | ||
5 | % Saves the specified image array in a binary (P5) format PGM image file. | ||
6 | % | ||
7 | % SEE ALSO: loadpgm | ||
8 | % | ||
9 | % Copyright (c) Peter Corke, 1999 Machine Vision Toolbox for Matlab | ||
10 | |||
11 | |||
12 | % Peter Corke 1994 | ||
13 | |||
14 | function savepgm(fname, im) | ||
15 | |||
16 | fid = fopen(fname, 'w'); | ||
17 | [r,c] = size(im'); | ||
18 | fprintf(fid, 'P5\n'); | ||
19 | fprintf(fid, '%d %d\n', r, c); | ||
20 | fprintf(fid, '255\n'); | ||
21 | fwrite(fid, im', 'uchar'); | ||
22 | fclose(fid) | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/saveppm.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/saveppm.m new file mode 100755 index 0000000..0062ee0 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/saveppm.m | |||
@@ -0,0 +1,25 @@ | |||
1 | %SAVEPPM Write a PPM format file | ||
2 | % | ||
3 | % SAVEPPM(filename, r, g, b) | ||
4 | % | ||
5 | % Saves the specified red, green and blue planes in a binary (P6) | ||
6 | % format PPM image file. | ||
7 | % | ||
8 | % SEE ALSO: loadppm | ||
9 | % | ||
10 | % Copyright (c) Peter Corke, 1999 Machine Vision Toolbox for Matlab | ||
11 | |||
12 | |||
13 | % Peter Corke 1994 | ||
14 | |||
15 | function saveppm(fname, R, G, B) | ||
16 | |||
17 | fid = fopen(fname, 'w'); | ||
18 | [r,c] = size(R'); | ||
19 | fprintf(fid, 'P6\n'); | ||
20 | fprintf(fid, '%d %d\n', r, c); | ||
21 | fprintf(fid, '255\n'); | ||
22 | im = [R(:) G(:) B(:)]; | ||
23 | im = reshape(c,r); | ||
24 | fwrite(fid, im, 'uchar'); | ||
25 | fclose(fid) | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/saving_calib.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/saving_calib.m new file mode 100755 index 0000000..e0575e0 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/saving_calib.m | |||
@@ -0,0 +1,27 @@ | |||
1 | fprintf(1,'\nSaving calibration results under Calib_Results.mat\n'); | ||
2 | |||
3 | check_active_images; | ||
4 | |||
5 | if ~exist('solution_init'), solution_init = []; end; | ||
6 | |||
7 | for kk = 1:n_ima, | ||
8 | if ~exist(['dX_' num2str(kk)]), eval(['dX_' num2str(kk) '= dX;']); end; | ||
9 | if ~exist(['dY_' num2str(kk)]), eval(['dY_' num2str(kk) '= dY;']); end; | ||
10 | end; | ||
11 | |||
12 | if ~exist('param_list'), | ||
13 | param_list = solution; | ||
14 | end; | ||
15 | |||
16 | |||
17 | string_save = 'save Calib_Results param_list active_images ind_active fc kc cc ex x y solution sol_with_center solution_init wintx winty n_ima type_numbering N_slots small_calib_image first_num image_numbers format_image calib_name Hcal Wcal nx ny map dX_default dY_default KK inv_KK dX dY'; | ||
18 | |||
19 | for kk = 1:n_ima, | ||
20 | string_save = [string_save ' X_' num2str(kk) ' x_' num2str(kk) ' y_' num2str(kk) ' ex_' num2str(kk) ' omc_' num2str(kk) ' Rc_' num2str(kk) ' Tc_' num2str(kk) ' H_' num2str(kk) ' n_sq_x_' num2str(kk) ' n_sq_y_' num2str(kk) ' wintx_' num2str(kk) ' winty_' num2str(kk) ' dX_' num2str(kk) ' dY_' num2str(kk)]; | ||
21 | end; | ||
22 | |||
23 | %fprintf(1,'To load later click on Load\n'); | ||
24 | |||
25 | fprintf(1,'done\n'); | ||
26 | |||
27 | eval(string_save); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/script_fit_distortion.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/script_fit_distortion.m new file mode 100755 index 0000000..c5e5430 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/script_fit_distortion.m | |||
@@ -0,0 +1,39 @@ | |||
1 | |||
2 | satis_distort = 0; | ||
3 | |||
4 | disp(['Estimated focal: ' num2str(f_g) ' pixels']); | ||
5 | |||
6 | while ~satis_distort, | ||
7 | |||
8 | k_g = input('Guess for distortion factor kc ([]=0): '); | ||
9 | |||
10 | if isempty(k_g), k_g = 0; end; | ||
11 | |||
12 | xy_corners_undist = comp_distortion2([x' - c_g(1);y'-c_g(2)]/f_g,k_g); | ||
13 | |||
14 | xu = xy_corners_undist(1,:)'; | ||
15 | yu = xy_corners_undist(2,:)'; | ||
16 | |||
17 | [XXu] = projectedGrid ( [xu(1);yu(1)], [xu(2);yu(2)],[xu(3);yu(3)], [xu(4);yu(4)],n_sq_x+1,n_sq_y+1); % The full grid | ||
18 | |||
19 | XX = (ones(2,1)*(1 + k_g * sum(XXu.^2))) .* XXu; | ||
20 | XX(1,:) = f_g*XX(1,:)+c_g(1); | ||
21 | XX(2,:) = f_g*XX(2,:)+c_g(2); | ||
22 | |||
23 | figure(2); | ||
24 | image(I); | ||
25 | colormap(map); | ||
26 | zoom on; | ||
27 | hold on; | ||
28 | %plot(f_g*XXu(1,:)+c_g(1),f_g*XXu(2,:)+c_g(2),'ro'); | ||
29 | plot(XX(1,:),XX(2,:),'r+'); | ||
30 | title('The red crosses should be on the grid corners...'); | ||
31 | hold off; | ||
32 | |||
33 | satis_distort = input('Satisfied with distortion? ([]=no, other=yes) '); | ||
34 | |||
35 | satis_distort = ~isempty(satis_distort); | ||
36 | |||
37 | |||
38 | end; | ||
39 | \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/select_sol_no_center.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/select_sol_no_center.m new file mode 100755 index 0000000..15508e5 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/select_sol_no_center.m | |||
@@ -0,0 +1,19 @@ | |||
1 | %%% Selection of the calibration solution with center estimation | ||
2 | |||
3 | if ~exist('sol_no_center'), | ||
4 | fprintf(1,'Need to calibrate before selecting solution without center. Maybe need to load Calib_Results.mat file.\n'); | ||
5 | return; | ||
6 | end; | ||
7 | |||
8 | solution = sol_no_center; | ||
9 | |||
10 | %%% Extraction of the final intrinsic and extrinsic paramaters: | ||
11 | |||
12 | extract_parameters; | ||
13 | comp_error_calib; | ||
14 | |||
15 | fprintf(1,'\n\nCalibration results without principal point estimation:\n\n'); | ||
16 | fprintf(1,'Focal Length: fc = [ %3.5f %3.5f]\n',fc); | ||
17 | fprintf(1,'Principal point: cc = [ %3.5f %3.5f]\n',cc); | ||
18 | fprintf(1,'Distortion: kc = [ %3.5f %3.5f %3.5f %3.5f]\n',kc); | ||
19 | fprintf(1,'Pixel error: err = [ %3.5f %3.5f]\n\n',err_std); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/select_sol_no_center3D.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/select_sol_no_center3D.m new file mode 100755 index 0000000..070d81c --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/select_sol_no_center3D.m | |||
@@ -0,0 +1,20 @@ | |||
1 | %%% Selection of the calibration solution with center estimation | ||
2 | |||
3 | solution = sol_no_center; | ||
4 | |||
5 | %%% Extraction of the final intrinsic and extrinsic paramaters: | ||
6 | |||
7 | extract_parameters3D; | ||
8 | |||
9 | |||
10 | fprintf(1,'\n\nCalibration results without principal point estimation:\n\n'); | ||
11 | fprintf(1,'Focal Length: fc = [ %3.5f %3.5f]\n',fc); | ||
12 | fprintf(1,'Principal point: cc = [ %3.5f %3.5f]\n',cc); | ||
13 | fprintf(1,'Distortion: kc = [ %3.5f %3.5f %3.5f %3.5f]\n',kc); | ||
14 | |||
15 | |||
16 | %%%%%%%%%%%%%%%%%%%% GRAPHICAL OUTPUT %%%%%%%%%%%%%%%%%%%%%%%% | ||
17 | |||
18 | graphout_calib3D; | ||
19 | |||
20 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/select_sol_with_center.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/select_sol_with_center.m new file mode 100755 index 0000000..2df9ba8 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/select_sol_with_center.m | |||
@@ -0,0 +1,19 @@ | |||
1 | %%% Selection of the calibration solution with center estimation | ||
2 | |||
3 | if ~exist('sol_with_center'), | ||
4 | fprintf(1,'Need to calibrate before selecting solution with center. Maybe need to load Calib_Results.mat file.\n'); | ||
5 | return; | ||
6 | end; | ||
7 | |||
8 | solution = sol_with_center; | ||
9 | |||
10 | %%% Extraction of the final intrinsic and extrinsic paramaters: | ||
11 | |||
12 | extract_parameters; | ||
13 | comp_error_calib; | ||
14 | |||
15 | fprintf(1,'\n\nCalibration results with principal point estimation:\n\n'); | ||
16 | fprintf(1,'Focal Length: fc = [ %3.5f %3.5f]\n',fc); | ||
17 | fprintf(1,'Principal point: cc = [ %3.5f %3.5f]\n',cc); | ||
18 | fprintf(1,'Distortion: kc = [ %3.5f %3.5f %3.5f %3.5f]\n',kc); | ||
19 | fprintf(1,'Pixel error: err = [ %3.5f %3.5f]\n\n',err_std); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/select_sol_with_center3D.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/select_sol_with_center3D.m new file mode 100755 index 0000000..eb6f4bf --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/select_sol_with_center3D.m | |||
@@ -0,0 +1,20 @@ | |||
1 | %%% Selection of the calibration solution with center estimation | ||
2 | |||
3 | solution = sol_with_center; | ||
4 | |||
5 | %%% Extraction of the final intrinsic and extrinsic paramaters: | ||
6 | |||
7 | extract_parameters3D; | ||
8 | |||
9 | |||
10 | fprintf(1,'\n\nCalibration results with principal point estimation:\n\n'); | ||
11 | fprintf(1,'Focal Length: fc = [ %3.5f %3.5f]\n',fc); | ||
12 | fprintf(1,'Principal point: cc = [ %3.5f %3.5f]\n',cc); | ||
13 | fprintf(1,'Distortion: kc = [ %3.5f %3.5f %3.5f %3.5f]\n',kc); | ||
14 | |||
15 | |||
16 | %%%%%%%%%%%%%%%%%%%% GRAPHICAL OUTPUT %%%%%%%%%%%%%%%%%%%%%%%% | ||
17 | |||
18 | graphout_calib3D; | ||
19 | |||
20 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/startup.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/startup.m new file mode 100755 index 0000000..aad0fa4 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/startup.m | |||
@@ -0,0 +1,9 @@ | |||
1 | % Main camera calibration toolbox: | ||
2 | |||
3 | calib_gui; | ||
4 | |||
5 | %calib_gui; | ||
6 | |||
7 | path(pwd,path); | ||
8 | |||
9 | format compact | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/test_3d.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/test_3d.m new file mode 100755 index 0000000..9f442f4 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/test_3d.m | |||
@@ -0,0 +1,80 @@ | |||
1 | Rc_1 = rodrigues(omc_1); | ||
2 | Rc_2 = rodrigues(omc_2); | ||
3 | Rc_3 = rodrigues(omc_3); | ||
4 | Rc_4 = rodrigues(omc_4); | ||
5 | Rc_5 = rodrigues(omc_5); | ||
6 | Rc_6 = rodrigues(omc_6); | ||
7 | Rc_7 = rodrigues(omc_7); | ||
8 | Rc_8 = rodrigues(omc_8); | ||
9 | Rc_9 = rodrigues(omc_9); | ||
10 | |||
11 | Rc_10 = rodrigues(omc_10); | ||
12 | Rc_11 = rodrigues(omc_11); | ||
13 | Rc_12 = rodrigues(omc_12); | ||
14 | Rc_13 = rodrigues(omc_13); | ||
15 | Rc_14 = rodrigues(omc_14); | ||
16 | Rc_15 = rodrigues(omc_15); | ||
17 | Rc_16 = rodrigues(omc_16); | ||
18 | Rc_17 = rodrigues(omc_17); | ||
19 | Rc_18 = rodrigues(omc_18); | ||
20 | |||
21 | |||
22 | |||
23 | RR1 = Rc_1'*Rc_10; % should be rodrigues([0;pi/2;0]) | ||
24 | TT1 = Rc_1'*(Tc_10-Tc_1); % should be [dX*n_sq_x_1;0;0] | ||
25 | |||
26 | Xr_1 = RR1 * X_10 + TT1*ones(1,length(X_10)); | ||
27 | |||
28 | figure(1); | ||
29 | plot3(X_1(1,:),X_1(2,:),X_1(3,:),'r+'); hold on; | ||
30 | plot3(Xr_1(1,:),Xr_1(2,:),Xr_1(3,:),'g+'); | ||
31 | hold off; | ||
32 | axis('equal'); | ||
33 | rotate3d on; | ||
34 | view(0,0); | ||
35 | xlabel('x'); | ||
36 | ylabel('y'); | ||
37 | zlabel('z'); | ||
38 | |||
39 | aaa = []; | ||
40 | |||
41 | RR1 = Rc_1'*Rc_10; % should be rodrigues([0;pi/2;0]) | ||
42 | TT1 = Rc_1'*(Tc_10-Tc_1); % should be [dX*n_sq_x_1;0;0] | ||
43 | err = rodrigues(RR1) - [0;pi/2;0] | ||
44 | aaa = [aaa 2*sin(err(2)/2)*.33*1000]; | ||
45 | |||
46 | RR2 = Rc_2'*Rc_11; % should be rodrigues([0;pi/2;0]) | ||
47 | TT2 = Rc_2'*(Tc_11-Tc_2); % should be [dX*n_sq_x_1;0;0] | ||
48 | err = rodrigues(RR2) - [0;pi/2;0] | ||
49 | aaa = [aaa 2*sin(err(2)/2)*.33*1000]; | ||
50 | |||
51 | RR3 = Rc_3'*Rc_12; % should be rodrigues([0;pi/2;0]) | ||
52 | TT3 = Rc_3'*(Tc_12-Tc_3); % should be [dX*n_sq_x_1;0;0] | ||
53 | err = rodrigues(RR3) - [0;pi/2;0] | ||
54 | aaa = [aaa 2*sin(err(2)/2)*.33*1000]; | ||
55 | |||
56 | RR4 = Rc_4'*Rc_13; % should be rodrigues([0;pi/2;0]) | ||
57 | TT4 = Rc_4'*(Tc_13-Tc_4); % should be [dX*n_sq_x_1;0;0] | ||
58 | err = rodrigues(RR4) - [0;pi/2;0] | ||
59 | aaa = [aaa 2*sin(err(2)/2)*.33*1000]; | ||
60 | |||
61 | RR5 = Rc_5'*Rc_14; % should be rodrigues([0;pi/2;0]) | ||
62 | TT5 = Rc_5'*(Tc_14-Tc_5); % should be [dX*n_sq_x_1;0;0] | ||
63 | err = rodrigues(RR5) - [0;pi/2;0] | ||
64 | aaa = [aaa 2*sin(err(2)/2)*.33*1000]; | ||
65 | |||
66 | RR6 = Rc_6'*Rc_15; % should be rodrigues([0;pi/2;0]) | ||
67 | TT6 = Rc_6'*(Tc_15-Tc_6); % should be [dX*n_sq_x_1;0;0] | ||
68 | err = rodrigues(RR6) - [0;pi/2;0] | ||
69 | aaa = [aaa 2*sin(err(2)/2)*.33*1000]; | ||
70 | |||
71 | RR7 = Rc_7'*Rc_16; % should be rodrigues([0;pi/2;0]) | ||
72 | TT7 = Rc_7'*(Tc_16-Tc_7); % should be [dX*n_sq_x_1;0;0] | ||
73 | err = rodrigues(RR7) - [0;pi/2;0] | ||
74 | aaa = [aaa 2*sin(err(2)/2)*.33*1000]; | ||
75 | |||
76 | RR8 = Rc_8'*Rc_17; % should be rodrigues([0;pi/2;0]) | ||
77 | TT8 = Rc_8'*(Tc_17-Tc_8); % should be [dX*n_sq_x_1;0;0] | ||
78 | err = rodrigues(RR8) - [0;pi/2;0] | ||
79 | aaa = [aaa 2*sin(err(2)/2)*.33*1000]; | ||
80 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/undistort_image.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/undistort_image.m new file mode 100755 index 0000000..6393d78 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/undistort_image.m | |||
@@ -0,0 +1,88 @@ | |||
1 | %%% INPUT THE IMAGE FILE NAME: | ||
2 | |||
3 | dir; | ||
4 | |||
5 | fprintf(1,'\n'); | ||
6 | disp('Program that undistort an image'); | ||
7 | disp('The intrinsic camera parameters are assumed to be known (previously computed)'); | ||
8 | |||
9 | fprintf(1,'\n'); | ||
10 | image_name = input('Image name (full name without extension): ','s'); | ||
11 | |||
12 | format_image2 = '0'; | ||
13 | |||
14 | while format_image2 == '0', | ||
15 | |||
16 | format_image2 = input('Image format: ([]=''r''=''ras'', ''b''=''bmp'', ''t''=''tif'', ''p''=''pgm'', ''j''=''jpg'') ','s'); | ||
17 | |||
18 | if isempty(format_image2), | ||
19 | format_image2 = 'ras'; | ||
20 | end; | ||
21 | |||
22 | if lower(format_image2(1)) == 'b', | ||
23 | format_image2 = 'bmp'; | ||
24 | else | ||
25 | if lower(format_image2(1)) == 't', | ||
26 | format_image2 = 'tif'; | ||
27 | else | ||
28 | if lower(format_image2(1)) == 'p', | ||
29 | format_image2 = 'pgm'; | ||
30 | else | ||
31 | if lower(format_image2(1)) == 'j', | ||
32 | format_image2 = 'jpg'; | ||
33 | else | ||
34 | if lower(format_image2(1)) == 'r', | ||
35 | format_image2 = 'ras'; | ||
36 | else | ||
37 | disp('Invalid image format'); | ||
38 | format_image2 = '0'; % Ask for format once again | ||
39 | end; | ||
40 | end; | ||
41 | end; | ||
42 | end; | ||
43 | end; | ||
44 | end; | ||
45 | |||
46 | ima_name = [image_name '.' format_image]; | ||
47 | |||
48 | |||
49 | |||
50 | %%% READ IN IMAGE: | ||
51 | |||
52 | if format_image(1) == 'p', | ||
53 | I = double(pgmread(ima_name)); | ||
54 | else | ||
55 | if format_image(1) == 'r', | ||
56 | I = readras(ima_name); | ||
57 | else | ||
58 | I = double(imread(ima_name)); | ||
59 | end; | ||
60 | end; | ||
61 | |||
62 | if size(I,3)>1, | ||
63 | I = I(:,:,2); | ||
64 | end; | ||
65 | |||
66 | |||
67 | %% SHOW THE ORIGINAL IMAGE: | ||
68 | |||
69 | figure(2); | ||
70 | image(I); | ||
71 | colormap(gray(256)); | ||
72 | title('Original image (with distortion) - Stored in array I'); | ||
73 | drawnow; | ||
74 | |||
75 | |||
76 | %% UNDISTORT THE IMAGE: | ||
77 | |||
78 | fprintf(1,'Compututing the undistorted image...\n') | ||
79 | |||
80 | [I2] = rect(I,eye(3),fc,cc,kc,KK); | ||
81 | |||
82 | |||
83 | figure(3); | ||
84 | image(I2); | ||
85 | colormap(gray(256)); | ||
86 | title('Undistorted image - Stored in array I2'); | ||
87 | drawnow; | ||
88 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/writeras.m b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/writeras.m new file mode 100755 index 0000000..c7eb7bc --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj/writeras.m | |||
@@ -0,0 +1,105 @@ | |||
1 | function writeras(filename, image, map); | ||
2 | %WRITERAS Write an image file in sun raster format. | ||
3 | % WRITERAS('imagefile.ras', image_matrix, map) writes a | ||
4 | % "sun.raster" image file. | ||
5 | |||
6 | % Written by Thomas K. Leung 3/30/93. | ||
7 | % @ California Institute of Technology. | ||
8 | |||
9 | |||
10 | % PC and UNIX version of writeras - Jean-Yves Bouguet - Dec. 1998 | ||
11 | |||
12 | dot = max(find(filename == '.')); | ||
13 | suffix = filename(dot+1:dot+3); | ||
14 | |||
15 | if nargin < 3, | ||
16 | map = []; | ||
17 | end; | ||
18 | |||
19 | if(strcmp(suffix, 'ras')) | ||
20 | %Write header | ||
21 | |||
22 | fp = fopen(filename, 'wb'); | ||
23 | if(fp < 0) error(['Cannot open ' filename '.']), end | ||
24 | |||
25 | [height, width] = size(image); | ||
26 | image = image - 1; | ||
27 | mapsize = size(map, 1)*size(map,2); | ||
28 | %fwrite(fp, ... | ||
29 | % [1504078485, width, height, 8, height*width, 1, 1, mapsize], ... | ||
30 | % 'long'); | ||
31 | |||
32 | |||
33 | zero_str = '00000000'; | ||
34 | |||
35 | % MAGIC NUMBER: | ||
36 | |||
37 | |||
38 | fwrite(fp,89,'uchar'); | ||
39 | fwrite(fp,166,'uchar'); | ||
40 | fwrite(fp,106,'uchar'); | ||
41 | fwrite(fp,149,'uchar'); | ||
42 | |||
43 | width_str = dec2hex(width); | ||
44 | width_str = [zero_str(1:8-length(width_str)) width_str]; | ||
45 | |||
46 | for ii = 1:2:7, | ||
47 | fwrite(fp,hex2dec(width_str(ii:ii+1)),'uchar'); | ||
48 | end; | ||
49 | |||
50 | |||
51 | height_str = dec2hex(height); | ||
52 | height_str = [zero_str(1:8-length(height_str)) height_str]; | ||
53 | |||
54 | for ii = 1:2:7, | ||
55 | fwrite(fp,hex2dec(height_str(ii:ii+1)),'uchar'); | ||
56 | end; | ||
57 | |||
58 | fwrite(fp,0,'uchar'); | ||
59 | fwrite(fp,0,'uchar'); | ||
60 | fwrite(fp,0,'uchar'); | ||
61 | fwrite(fp,8,'uchar'); | ||
62 | |||
63 | ll = height*width; | ||
64 | ll_str = dec2hex(ll); | ||
65 | ll_str = [zero_str(1:8-length(ll_str)) ll_str]; | ||
66 | |||
67 | for ii = 1:2:7, | ||
68 | fwrite(fp,hex2dec(ll_str(ii:ii+1)),'uchar'); | ||
69 | end; | ||
70 | |||
71 | fwrite(fp,0,'uchar'); | ||
72 | fwrite(fp,0,'uchar'); | ||
73 | fwrite(fp,0,'uchar'); | ||
74 | fwrite(fp,1,'uchar'); | ||
75 | fwrite(fp,0,'uchar'); | ||
76 | fwrite(fp,0,'uchar'); | ||
77 | fwrite(fp,0,'uchar'); | ||
78 | fwrite(fp,~~mapsize,'uchar'); | ||
79 | |||
80 | mapsize_str = dec2hex(mapsize); | ||
81 | mapsize_str = [zero_str(1:8-length(mapsize_str)) mapsize_str]; | ||
82 | |||
83 | %keyboard; | ||
84 | |||
85 | for ii = 1:2:7, | ||
86 | fwrite(fp,hex2dec(mapsize_str(ii:ii+1)),'uchar'); | ||
87 | end; | ||
88 | |||
89 | |||
90 | if mapsize ~= 0 | ||
91 | map = min(255, fix(255*map)); | ||
92 | fwrite(fp, map, 'uchar'); | ||
93 | end | ||
94 | if rem(width,2) == 1 | ||
95 | image = [image'; zeros(1, height)]'; | ||
96 | top = 255 * ones(size(image)); | ||
97 | fwrite(fp, min(top,image)', 'uchar'); | ||
98 | else | ||
99 | top = 255 * ones(size(image)); | ||
100 | fwrite(fp, min(top,image)', 'uchar'); | ||
101 | end | ||
102 | fclose(fp); | ||
103 | else | ||
104 | error('Image file name must end in either ''ras'' or ''rast''.'); | ||
105 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj2/TOOLBOX_calib.tar b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj2/TOOLBOX_calib.tar new file mode 100755 index 0000000..36d5de9 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/calib_bouguetj2/TOOLBOX_calib.tar | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/Ncut_IC.m b/SD-VBS/common/toolbox/toolbox_basic/common/Ncut_IC.m new file mode 100755 index 0000000..d612780 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/Ncut_IC.m | |||
@@ -0,0 +1,26 @@ | |||
1 | function [v,d] = Ncut_IC(I,nb_radius_IC); | ||
2 | % | ||
3 | % [v,d] = Ncut_IC(I,nb_radius_IC); | ||
4 | % | ||
5 | |||
6 | if nargin<2, | ||
7 | nb_radius_IC = 5; | ||
8 | end | ||
9 | |||
10 | I = I/max(I(:)); | ||
11 | |||
12 | eg_par = [16,2, 21,3]; eg_th = 0; | ||
13 | |||
14 | nv = 11; reg_fac = 0.01; | ||
15 | |||
16 | [ex,ey,egx,egy,eg_par,eg_th,emag,ephase] = quadedgep(I,eg_par,eg_th); | ||
17 | |||
18 | |||
19 | nb_radius_IC= 10; | ||
20 | sample_rate = 0.2; | ||
21 | disp('setupW\n'); | ||
22 | [w_i,w_j] = cimgnbmap(size(I),nb_radius_IC,sample_rate); | ||
23 | w = affinityic(emag,ephase,w_i,w_j); | ||
24 | disp('computeNcut'); | ||
25 | [v,d] = ncut(w,nv,[],reg_fac); | ||
26 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/Ncut_IC_m.m b/SD-VBS/common/toolbox/toolbox_basic/common/Ncut_IC_m.m new file mode 100755 index 0000000..146acf9 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/Ncut_IC_m.m | |||
@@ -0,0 +1,42 @@ | |||
1 | function [v,d] = Ncut_IC_m(I,mask,nb_radius_IC,sig_IC); | ||
2 | % | ||
3 | % [v,d] = Ncut_IC_m(I,mask,nb_radius_IC,sig_IC); | ||
4 | % | ||
5 | |||
6 | if nargin<2, | ||
7 | mask = ones(size(I)); | ||
8 | end | ||
9 | |||
10 | if nargin<3, | ||
11 | nb_radius_IC = 10; | ||
12 | end | ||
13 | |||
14 | if nargin<4, | ||
15 | sig_IC = 0.03; | ||
16 | end | ||
17 | |||
18 | %%% normalize the image | ||
19 | I = I/max(I(:)); | ||
20 | |||
21 | %%% edge detecting parameter, [num_ori, sig, win_size, enlongation factor] | ||
22 | eg_par = [6,2, 21,3]; eg_th = 0.01; | ||
23 | |||
24 | %% number of eigenvectors+ regulization factors | ||
25 | nv = 10; reg_fac = 0.0; | ||
26 | |||
27 | %% compute the edge response | ||
28 | [ex,ey,egx,egy,eg_par,eg_th,emag,ephase] = quadedgep(I,eg_par,eg_th); | ||
29 | |||
30 | %%% setup Wij connection pattern | ||
31 | sample_rate = 0.1; | ||
32 | [w_i,w_j] = cimgnbmap(size(I),nb_radius_IC,sample_rate); | ||
33 | |||
34 | %%% compute Wij with IC | ||
35 | emag = mask.*emag; | ||
36 | w = affinityic(emag,ephase,w_i,w_j,sig_IC); | ||
37 | |||
38 | %show_dist_w(I,w); | ||
39 | %%% running Ncut | ||
40 | [v,d] = ncut(w,nv); | ||
41 | |||
42 | v = reshape(v,size(I,1),size(I,2),size(v,2)); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/Ncut_IC_m2.m b/SD-VBS/common/toolbox/toolbox_basic/common/Ncut_IC_m2.m new file mode 100755 index 0000000..9668b19 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/Ncut_IC_m2.m | |||
@@ -0,0 +1,51 @@ | |||
1 | function [v,d] = Ncut_IC_m(I,mask,nb_radius_IC,sig_IC); | ||
2 | % | ||
3 | % [v,d] = Ncut_IC_m(I,mask,nb_radius_IC,sig_IC); | ||
4 | % | ||
5 | |||
6 | if nargin<2, | ||
7 | mask = ones(size(I)); | ||
8 | end | ||
9 | |||
10 | if nargin<3, | ||
11 | nb_radius_IC = 10; | ||
12 | end | ||
13 | |||
14 | if nargin<4, | ||
15 | sig_IC = 0.03; | ||
16 | end | ||
17 | |||
18 | %%% normalize the image | ||
19 | I = I/max(I(:)); | ||
20 | |||
21 | %%% edge detecting parameter, [num_ori, sig, win_size, enlongation factor] | ||
22 | eg_par = [6,2, 21,3]; eg_th = 0.01; | ||
23 | |||
24 | %% number of eigenvectors+ regulization factors | ||
25 | nv = 10; reg_fac = 0.0; | ||
26 | |||
27 | %% compute the edge response | ||
28 | [nr,nc,nb] = size(I); | ||
29 | emag = zeros(nr,nc); | ||
30 | ephase = zeros(nr,nc); | ||
31 | for j=1:nb, | ||
32 | [ex,ey,egx,egy,eg_par,eg_th,emag1,ephase1] = quadedgep(I(:,:,j),eg_par,eg_th); | ||
33 | mask = emag1>emag; | ||
34 | ephase = ephase+ mask.*ephase1; | ||
35 | emag = emag + mask.*emag1; | ||
36 | end | ||
37 | |||
38 | |||
39 | %%% setup Wij connection pattern | ||
40 | sample_rate = 0.1; | ||
41 | [w_i,w_j] = cimgnbmap(size(I),nb_radius_IC,sample_rate); | ||
42 | |||
43 | %%% compute Wij with IC | ||
44 | emag = mask.*emag; | ||
45 | w = affinityic(emag,ephase,w_i,w_j,sig_IC); | ||
46 | |||
47 | %show_dist_w(I,w); | ||
48 | %%% running Ncut | ||
49 | [v,d] = ncut(w,nv); | ||
50 | |||
51 | v = reshape(v,size(I,1),size(I,2),size(v,2)); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/affinityic.c b/SD-VBS/common/toolbox/toolbox_basic/common/affinityic.c new file mode 100755 index 0000000..e48762a --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/affinityic.c | |||
@@ -0,0 +1,186 @@ | |||
1 | /*================================================================ | ||
2 | * function w = affinityic(emag,ephase,pi,pj,sigma) | ||
3 | * Input: | ||
4 | * emag = edge strength at each pixel | ||
5 | * ephase = edge phase at each pixel | ||
6 | * [pi,pj] = index pair representation for MALTAB sparse matrices | ||
7 | * sigma = sigma for IC energy | ||
8 | * Output: | ||
9 | * w = affinity with IC at [pi,pj] | ||
10 | * | ||
11 | |||
12 | % test sequence | ||
13 | f = synimg(10); | ||
14 | [i,j] = cimgnbmap(size(f),2); | ||
15 | [ex,ey,egx,egy] = quadedgep(f); | ||
16 | a = affinityic(ex,ey,egx,egy,i,j) | ||
17 | show_dist_w(f,a); | ||
18 | |||
19 | * Jianbo Shi, Stella X. Yu, Nov 19, 2001. | ||
20 | *=================================================================*/ | ||
21 | |||
22 | # include "mex.h" | ||
23 | # include "math.h" | ||
24 | |||
25 | void mexFunction( | ||
26 | int nargout, | ||
27 | mxArray *out[], | ||
28 | int nargin, | ||
29 | const mxArray *in[] | ||
30 | ) | ||
31 | { | ||
32 | /* declare variables */ | ||
33 | int nr, nc, np, total; | ||
34 | int i, j, k, ix, iy, jx, jy, ii, jj, iip1, jjp1, iip2, jjp2, step; | ||
35 | double sigma, di, dj, a, z, maxori, phase1, phase2, slope; | ||
36 | int *ir, *jc; | ||
37 | unsigned long *pi, *pj; | ||
38 | double *emag, *ephase, *w; | ||
39 | |||
40 | /* check argument */ | ||
41 | if (nargin<4) { | ||
42 | mexErrMsgTxt("Four input arguments required"); | ||
43 | } | ||
44 | if (nargout>1) { | ||
45 | mexErrMsgTxt("Too many output arguments"); | ||
46 | } | ||
47 | |||
48 | /* get edgel information */ | ||
49 | nr = mxGetM(in[0]); | ||
50 | nc = mxGetN(in[0]); | ||
51 | if ( nr*nc ==0 || nr != mxGetM(in[1]) || nc != mxGetN(in[1]) ) { | ||
52 | mexErrMsgTxt("Edge magnitude and phase shall be of the same image size"); | ||
53 | } | ||
54 | emag = mxGetPr(in[0]); | ||
55 | ephase = mxGetPr(in[1]); | ||
56 | np = nr * nc; | ||
57 | |||
58 | /* get new index pair */ | ||
59 | if (!mxIsUint32(in[2]) | !mxIsUint32(in[3])) { | ||
60 | mexErrMsgTxt("Index pair shall be of type UINT32"); | ||
61 | } | ||
62 | if (mxGetM(in[3]) * mxGetN(in[3]) != np + 1) { | ||
63 | mexErrMsgTxt("Wrong index representation"); | ||
64 | } | ||
65 | pi = mxGetData(in[2]); | ||
66 | pj = mxGetData(in[3]); | ||
67 | |||
68 | /* create output */ | ||
69 | out[0] = mxCreateSparse(np,np,pj[np],mxREAL); | ||
70 | if (out[0]==NULL) { | ||
71 | mexErrMsgTxt("Not enough memory for the output matrix"); | ||
72 | } | ||
73 | w = mxGetPr(out[0]); | ||
74 | ir = mxGetIr(out[0]); | ||
75 | jc = mxGetJc(out[0]); | ||
76 | |||
77 | /* find my sigma */ | ||
78 | if (nargin<5) { | ||
79 | sigma = 0; | ||
80 | for (k=0; k<np; k++) { | ||
81 | if (emag[k]>sigma) { sigma = emag[k]; } | ||
82 | } | ||
83 | sigma = sigma / 10; | ||
84 | printf("sigma = %6.5f",sigma); | ||
85 | } else { | ||
86 | sigma = mxGetScalar(in[4]); | ||
87 | } | ||
88 | a = 1.0/ (sigma); | ||
89 | |||
90 | /* computation */ | ||
91 | total = 0; | ||
92 | for (j=0; j<np; j++) { | ||
93 | |||
94 | jc[j] = total; | ||
95 | jx = j / nr; /* col */ | ||
96 | jy = j % nr; /* row */ | ||
97 | |||
98 | for (k=pj[j]; k<pj[j+1]; k++) { | ||
99 | |||
100 | i = pi[k]; | ||
101 | |||
102 | if (i==j) { | ||
103 | maxori = 1; | ||
104 | |||
105 | } else { | ||
106 | |||
107 | ix = i / nr; | ||
108 | iy = i % nr; | ||
109 | |||
110 | /* scan */ | ||
111 | di = (double) (iy - jy); | ||
112 | dj = (double) (ix - jx); | ||
113 | |||
114 | maxori = 0.; | ||
115 | phase1 = ephase[j]; | ||
116 | |||
117 | |||
118 | /* sample in i direction */ | ||
119 | if (abs(di) >= abs(dj)) { | ||
120 | slope = dj / di; | ||
121 | step = (iy>=jy) ? 1 : -1; | ||
122 | |||
123 | iip1 = jy; | ||
124 | jjp1 = jx; | ||
125 | |||
126 | |||
127 | for (ii=0;ii<abs(di);ii++){ | ||
128 | iip2 = iip1 + step; | ||
129 | jjp2 = (int)(0.5 + slope*(iip2-jy) + jx); | ||
130 | |||
131 | phase2 = ephase[iip2+jjp2*nr]; | ||
132 | |||
133 | if (phase1 != phase2) { | ||
134 | z = (emag[iip1+jjp1*nr] + emag[iip2+jjp2*nr]); | ||
135 | if (z > maxori){ | ||
136 | maxori = z; | ||
137 | } | ||
138 | } | ||
139 | |||
140 | iip1 = iip2; | ||
141 | jjp1 = jjp2; | ||
142 | phase1 = phase2; | ||
143 | } | ||
144 | |||
145 | /* sample in j direction */ | ||
146 | } else { | ||
147 | slope = di / dj; | ||
148 | step = (ix>=jx) ? 1: -1; | ||
149 | |||
150 | jjp1 = jx; | ||
151 | iip1 = jy; | ||
152 | |||
153 | |||
154 | for (jj=0;jj<abs(dj);jj++){ | ||
155 | jjp2 = jjp1 + step; | ||
156 | iip2 = (int)(0.5+ slope*(jjp2-jx) + jy); | ||
157 | |||
158 | phase2 = ephase[iip2+jjp2*nr]; | ||
159 | |||
160 | if (phase1 != phase2){ | ||
161 | z = (emag[iip1+jjp1*nr] + emag[iip2+jjp2*nr]); | ||
162 | if (z > maxori){ | ||
163 | maxori = z; | ||
164 | } | ||
165 | |||
166 | } | ||
167 | |||
168 | iip1 = iip2; | ||
169 | jjp1 = jjp2; | ||
170 | phase1 = phase2; | ||
171 | } | ||
172 | } | ||
173 | |||
174 | maxori = 0.5 * maxori*a; | ||
175 | maxori = exp(-maxori*maxori); | ||
176 | } | ||
177 | ir[total] = i; | ||
178 | |||
179 | w[total] = maxori + 0.005; | ||
180 | total = total + 1; | ||
181 | |||
182 | } /* i */ | ||
183 | } /* j */ | ||
184 | |||
185 | jc[np] = total; | ||
186 | } | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/affinityic.mexa64 b/SD-VBS/common/toolbox/toolbox_basic/common/affinityic.mexa64 new file mode 100755 index 0000000..e60b4d1 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/affinityic.mexa64 | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/affinityic.mexglx b/SD-VBS/common/toolbox/toolbox_basic/common/affinityic.mexglx new file mode 100755 index 0000000..5edb5d8 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/affinityic.mexglx | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/anisodiff.m b/SD-VBS/common/toolbox/toolbox_basic/common/anisodiff.m new file mode 100755 index 0000000..b576d8f --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/anisodiff.m | |||
@@ -0,0 +1,20 @@ | |||
1 | function [outimage] = anisodiff(inimage,iterations,K) | ||
2 | % [outimage] = anisodiff(inimage,iterations,K) | ||
3 | % Pietro's anisotropic diffusion routine | ||
4 | |||
5 | lambda = 0.25; | ||
6 | outimage = inimage; [m,n] = size(inimage); | ||
7 | |||
8 | rowC = [1:m]; rowN = [1 1:m-1]; rowS = [2:m m]; | ||
9 | colC = [1:n]; colE = [1 1:n-1]; colW = [2:n n]; | ||
10 | |||
11 | for i=1:iterations, | ||
12 | deltaN = outimage(rowN,colC) - outimage(rowC,colC); | ||
13 | deltaE = outimage(rowC,colE) - outimage(rowC,colC); | ||
14 | |||
15 | fluxN = deltaN .* exp( - ((1/K) * abs(deltaN)).^2 ); | ||
16 | fluxE = deltaE .* exp( - ((1/K) * abs(deltaE)).^2 ); | ||
17 | |||
18 | outimage = outimage + lambda * (fluxN - fluxN(rowS,colC) + fluxE - fluxE(rowC,colW)); | ||
19 | end | ||
20 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/bin.m b/SD-VBS/common/toolbox/toolbox_basic/common/bin.m new file mode 100755 index 0000000..e2c3c90 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/bin.m | |||
@@ -0,0 +1,39 @@ | |||
1 | function [i, nnbins] = bin(x, dx, x0, x1); | ||
2 | % | ||
3 | % [i, nbins] = bin(x, dx, x0, x1); | ||
4 | % | ||
5 | % Returns the vector of indices, starting from 1, | ||
6 | % corresponding to the chosen bin size, dx, | ||
7 | % start x0 and end x1. If x1 is omitted, x1 = max(x) - dx/2. | ||
8 | % If x0 is omitted, x0 = min(x) + dx/2. If dx is omitted, the data | ||
9 | % are divided into 10 classes. Note that outliers are not removed. | ||
10 | % | ||
11 | % Tested under MatLab 4.2, 5.0, and 5.1. | ||
12 | % | ||
13 | |||
14 | % 17.1.97, Oyvind.Breivik@gfi.uib.no. | ||
15 | % | ||
16 | % Oyvind Breivik | ||
17 | % Department of Geophysics | ||
18 | % University of Bergen | ||
19 | % NORWAY | ||
20 | |||
21 | N = 10; % Default is 10 classes | ||
22 | |||
23 | if nargin < 2 | ||
24 | dx = (max(x) - min(x))/N; | ||
25 | end | ||
26 | if nargin < 3 | ||
27 | x0 = min(x) + dx/2; | ||
28 | end | ||
29 | if nargin < 4 | ||
30 | x1 = max(x) - dx/2; | ||
31 | end | ||
32 | nbins = round((x1 - x0)/dx) + 1; | ||
33 | i = round((x - x0)/dx) + 1; | ||
34 | %in = (i >= 1) & (i <= nbins); % Indices are within range [1, nbins]. | ||
35 | %i = i(in); | ||
36 | |||
37 | if nargout > 1 | ||
38 | nnbins = nbins; | ||
39 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/cimgnbmap.c b/SD-VBS/common/toolbox/toolbox_basic/common/cimgnbmap.c new file mode 100755 index 0000000..1595b68 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/cimgnbmap.c | |||
@@ -0,0 +1,189 @@ | |||
1 | /*================================================================ | ||
2 | * function [i,j] = cimgnbmap([nr,nc], nb_r, sample_rate) | ||
3 | * computes the neighbourhood index matrix of an image, | ||
4 | * with each neighbourhood sampled. | ||
5 | * Input: | ||
6 | * [nr,nc] = image size | ||
7 | * nb_r = neighbourhood radius, could be [r_i,r_j] for i,j | ||
8 | * sample_rate = sampling rate, default = 1 | ||
9 | * Output: | ||
10 | * [i,j] = each is a column vector, give indices of neighbour pairs | ||
11 | * UINT32 type | ||
12 | * i is of total length of valid elements, 0 for first row | ||
13 | * j is of length nr * nc + 1 | ||
14 | * | ||
15 | * See also: imgnbmap.c, id2cind.m | ||
16 | * | ||
17 | * Examples: | ||
18 | * [i,j] = imgnbmap(10, 20); % [10,10] are assumed | ||
19 | * | ||
20 | * Stella X. Yu, Nov 12, 2001. | ||
21 | |||
22 | % test sequence: | ||
23 | nr = 15; | ||
24 | nc = 15; | ||
25 | nbr = 1; | ||
26 | [i,j] = cimgnbmap([nr,nc], nbr); | ||
27 | mask = csparse(i,j,ones(length(i),1),nr*nc); | ||
28 | show_dist_w(rand(nr,nc),mask) | ||
29 | |||
30 | *=================================================================*/ | ||
31 | |||
32 | # include "mex.h" | ||
33 | # include "math.h" | ||
34 | |||
35 | void mexFunction( | ||
36 | int nargout, | ||
37 | mxArray *out[], | ||
38 | int nargin, | ||
39 | const mxArray *in[] | ||
40 | ) | ||
41 | { | ||
42 | /* declare variables */ | ||
43 | int nr, nc, np, nb, total; | ||
44 | double *dim, sample_rate; | ||
45 | int r_i, r_j, a1, a2, b1, b2, self, neighbor; | ||
46 | int i, j, k, s, t, nsamp, th_rand, no_sample; | ||
47 | unsigned long *p, *qi, *qj; | ||
48 | |||
49 | /* check argument */ | ||
50 | if (nargin < 2) { | ||
51 | mexErrMsgTxt("Two input arguments required"); | ||
52 | } | ||
53 | if (nargout> 2) { | ||
54 | mexErrMsgTxt("Too many output arguments."); | ||
55 | } | ||
56 | |||
57 | /* get image size */ | ||
58 | i = mxGetM(in[0]); | ||
59 | j = mxGetN(in[0]); | ||
60 | dim = mxGetData(in[0]); | ||
61 | nr = (int)dim[0]; | ||
62 | if (j>1 || i>1) { | ||
63 | nc = (int)dim[1]; | ||
64 | } else { | ||
65 | nc = nr; | ||
66 | } | ||
67 | np = nr * nc; | ||
68 | |||
69 | /* get neighbourhood size */ | ||
70 | i = mxGetM(in[1]); | ||
71 | j = mxGetN(in[1]); | ||
72 | dim = mxGetData(in[1]); | ||
73 | r_i = (int)dim[0]; | ||
74 | if (j>1 || i>1) { | ||
75 | r_j = (int)dim[1]; | ||
76 | } else { | ||
77 | r_j = r_i; | ||
78 | } | ||
79 | if (r_i<0) { r_i = 0; } | ||
80 | if (r_j<0) { r_j = 0; } | ||
81 | |||
82 | /* get sample rate */ | ||
83 | if (nargin==3) { | ||
84 | sample_rate = (mxGetM(in[2])==0) ? 1: mxGetScalar(in[2]); | ||
85 | } else { | ||
86 | sample_rate = 1; | ||
87 | } | ||
88 | /* prepare for random number generator */ | ||
89 | if (sample_rate<1) { | ||
90 | srand( (unsigned)time( NULL ) ); | ||
91 | th_rand = (int)ceil((double)RAND_MAX * sample_rate); | ||
92 | no_sample = 0; | ||
93 | } else { | ||
94 | sample_rate = 1; | ||
95 | th_rand = RAND_MAX; | ||
96 | no_sample = 1; | ||
97 | } | ||
98 | |||
99 | /* figure out neighbourhood size */ | ||
100 | |||
101 | nb = (r_i + r_i + 1) * (r_j + r_j + 1); | ||
102 | if (nb>np) { | ||
103 | nb = np; | ||
104 | } | ||
105 | nb = (int)ceil((double)nb * sample_rate); | ||
106 | |||
107 | /* intermediate data structure */ | ||
108 | p = mxCalloc(np * (nb+1), sizeof(unsigned long)); | ||
109 | if (p==NULL) { | ||
110 | mexErrMsgTxt("Not enough space for my computation."); | ||
111 | } | ||
112 | |||
113 | /* computation */ | ||
114 | total = 0; | ||
115 | for (j=0; j<nc; j++) { | ||
116 | for (i=0; i<nr; i++) { | ||
117 | |||
118 | self = i + j * nr; | ||
119 | |||
120 | /* put self in, otherwise the index is not ordered */ | ||
121 | p[self] = p[self] + 1; | ||
122 | p[self+p[self]*np] = self; | ||
123 | |||
124 | /* j range */ | ||
125 | b1 = j; | ||
126 | b2 = j + r_j; | ||
127 | if (b2>=nc) { b2 = nc-1; } | ||
128 | |||
129 | /* i range */ | ||
130 | a1 = i - r_i; | ||
131 | if (a1<0) { a1 = 0; } | ||
132 | a2 = i + r_i; | ||
133 | if (a2>=nr) { a2 = nr-1; } | ||
134 | |||
135 | /* number of more samples needed */ | ||
136 | nsamp = nb - p[self]; | ||
137 | |||
138 | k = 0; | ||
139 | t = b1; | ||
140 | s = i + 1; | ||
141 | if (s>a2) { | ||
142 | s = a1; | ||
143 | t = t + 1; | ||
144 | } | ||
145 | while (k<nsamp && t<=b2) { | ||
146 | if (no_sample || (rand()<th_rand)) { | ||
147 | k = k + 1; | ||
148 | neighbor = s + t * nr; | ||
149 | |||
150 | p[self] = p[self] + 1; | ||
151 | p[self+p[self]*np] = neighbor; | ||
152 | |||
153 | p[neighbor] = p[neighbor] + 1; | ||
154 | p[neighbor+p[neighbor]*np] = self; | ||
155 | } | ||
156 | s = s + 1; | ||
157 | if (s>a2) { | ||
158 | s = a1; | ||
159 | t = t + 1; | ||
160 | } | ||
161 | } /* k */ | ||
162 | |||
163 | total = total + p[self]; | ||
164 | } /* i */ | ||
165 | } /* j */ | ||
166 | |||
167 | /* i, j */ | ||
168 | out[0] = mxCreateNumericMatrix(total, 1, mxUINT32_CLASS, mxREAL); | ||
169 | out[1] = mxCreateNumericMatrix(np+1, 1, mxUINT32_CLASS, mxREAL); | ||
170 | qi = mxGetData(out[0]); | ||
171 | qj = mxGetData(out[1]); | ||
172 | if (out[0]==NULL || out[1]==NULL) { | ||
173 | mexErrMsgTxt("Not enough space for the output matrix."); | ||
174 | } | ||
175 | |||
176 | total = 0; | ||
177 | for (j=0; j<np; j++) { | ||
178 | qj[j] = total; | ||
179 | s = j + np; | ||
180 | for (t=0; t<p[j]; t++) { | ||
181 | qi[total] = p[s]; | ||
182 | total = total + 1; | ||
183 | s = s + np; | ||
184 | } | ||
185 | } | ||
186 | qj[np] = total; | ||
187 | |||
188 | mxFree(p); | ||
189 | } | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/cimgnbmap.mexa64 b/SD-VBS/common/toolbox/toolbox_basic/common/cimgnbmap.mexa64 new file mode 100755 index 0000000..19eabe1 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/cimgnbmap.mexa64 | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/cimgnbmap.mexglx b/SD-VBS/common/toolbox/toolbox_basic/common/cimgnbmap.mexglx new file mode 100755 index 0000000..6f3bb32 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/cimgnbmap.mexglx | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/density.m b/SD-VBS/common/toolbox/toolbox_basic/common/density.m new file mode 100755 index 0000000..23d88cc --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/density.m | |||
@@ -0,0 +1,133 @@ | |||
1 | function [rrho, xxvec, yyvec] = density(x, y, dx, dy, xy0); | ||
2 | % [rho, xvec, yvec] = density(x, y, dx, dy, [x0 x1 y0 y1]); | ||
3 | % | ||
4 | % 2-D probability density plot. | ||
5 | % | ||
6 | % Input: Vectors x and y of equal length. If dx and/or dy are omitted, the | ||
7 | % default is 75 bins in each direction. | ||
8 | % | ||
9 | % If dx or dy is negative, then the variable is taken as the number of | ||
10 | % bins rather than a grid resolution. | ||
11 | % | ||
12 | % The vector containing the limits can be padded with NaNs if only | ||
13 | % certain limits are desired, e g if x0 and y1 are wanted: | ||
14 | % | ||
15 | % density(x, y, [.5 nan nan 45]) | ||
16 | % | ||
17 | % Output: The density matrix RHO together with vectors XVEC and YVEC. | ||
18 | % If no output arguments are specified, DENSITY will plot the density | ||
19 | % function with the prescribed axes using PCOLOR. | ||
20 | % | ||
21 | % Requires bin.m. Tested under MatLab 4.2, 5.0, and 5.1. | ||
22 | % | ||
23 | % See also bin.m for further details about dx, x0, etc, and ffgrid.m. | ||
24 | % | ||
25 | |||
26 | % 1.9.97 Oyvind.Breivik@gfi.uib.no. | ||
27 | % | ||
28 | % Oyvind Breivik | ||
29 | % Department of Geophysics | ||
30 | % University of Bergen | ||
31 | % NORWAY | ||
32 | |||
33 | DX = -75; % Default grid size | ||
34 | |||
35 | x = x(:); | ||
36 | |||
37 | if nargin < 2 | ||
38 | y = x; | ||
39 | end | ||
40 | |||
41 | y = y(:); | ||
42 | |||
43 | xy = NaN*ones(1,4); | ||
44 | |||
45 | if (nargin < 4) | ||
46 | xy0 = min(x); | ||
47 | end | ||
48 | |||
49 | if (nargin == 3 & length(dx) > 1) | ||
50 | xy0 = dx; | ||
51 | dx = DX; | ||
52 | end | ||
53 | |||
54 | if nargin < 3 | ||
55 | dx = DX; | ||
56 | end | ||
57 | |||
58 | if (nargin == 4 & length(dy) > 1) | ||
59 | xy0 = dy; | ||
60 | dy = dx; | ||
61 | end | ||
62 | if nargin < 4 | ||
63 | dy = dx; | ||
64 | end | ||
65 | |||
66 | nxy = length(xy0); | ||
67 | xy(1:nxy) = xy0; | ||
68 | |||
69 | if (isnan(xy(4))) | ||
70 | xy(4) = max(y); | ||
71 | end | ||
72 | if (isnan(xy(3))) | ||
73 | xy(3) = min(y); | ||
74 | end | ||
75 | if (isnan(xy(2))) | ||
76 | xy(2) = max(x); | ||
77 | end | ||
78 | if (isnan(xy(1))) | ||
79 | xy(1) = min(x); | ||
80 | end | ||
81 | x0 = xy(1); x1 = xy(2); y0 = xy(3); y1 = xy(4); | ||
82 | |||
83 | if (dx < 0) | ||
84 | dx = (x1 - x0)/abs(dx); | ||
85 | end | ||
86 | if (dy < 0) | ||
87 | dy = (y1 - y0)/abs(dy); | ||
88 | end | ||
89 | |||
90 | ix = bin(x, dx, x0, x1); | ||
91 | iy = bin(y, dy, y0, y1); % bin data in (x,y)-space | ||
92 | |||
93 | xvec = x0:dx:x1; | ||
94 | yvec = y0:dy:y1; | ||
95 | |||
96 | nx = length(xvec); | ||
97 | ny = length(yvec); | ||
98 | |||
99 | inx = (ix >= 1) & (ix <= nx); | ||
100 | iny = (iy >= 1) & (iy <= ny); | ||
101 | in = (inx & iny); | ||
102 | ix = ix(in); iy = iy(in); | ||
103 | N = length(ix); % how many datapoints are left now? | ||
104 | |||
105 | rho = zeros(length(xvec), length(yvec)) + eps; | ||
106 | |||
107 | for i = 1:N | ||
108 | rho(ix(i), iy(i)) = rho(ix(i), iy(i)) + 1; | ||
109 | end | ||
110 | |||
111 | rho = rho/(N*dx*dy); % Density is n per dx per dy | ||
112 | |||
113 | rho = rho'; % Get in shape | ||
114 | |||
115 | if nargout == 0 | ||
116 | pcolor(xvec, yvec, sqrt(rho)); shading interp; axis image; | ||
117 | colorbar | ||
118 | colormap jet | ||
119 | xlabel(inputname(1)) | ||
120 | ylabel(inputname(2)) | ||
121 | dum = size(rho'); | ||
122 | str = sprintf('%d data points, grid: %dx%d', N, dum(1)-1, dum(2)-1); | ||
123 | title(str); | ||
124 | end | ||
125 | |||
126 | if nargout > 0 | ||
127 | rrho = rho; | ||
128 | end | ||
129 | |||
130 | if nargout > 1 | ||
131 | xxvec = xvec; | ||
132 | yyvec = yvec; | ||
133 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/find_edge.m b/SD-VBS/common/toolbox/toolbox_basic/common/find_edge.m new file mode 100755 index 0000000..4299c29 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/find_edge.m | |||
@@ -0,0 +1,24 @@ | |||
1 | function [edgemap,mag,th] = find_edge(I,sig,mag_thld) | ||
2 | % | ||
3 | % [edgemap,mag,th] = find_edge(I,sig,mag_thld) | ||
4 | % | ||
5 | |||
6 | if nargin<2, | ||
7 | sig = 1; | ||
8 | end | ||
9 | |||
10 | if nargin<3, | ||
11 | mag_thld = 1/30; | ||
12 | end | ||
13 | |||
14 | I = I/max(I(:)); | ||
15 | |||
16 | ismax = 1;r = 1; | ||
17 | |||
18 | [gx,gy] = grad(I,sig); | ||
19 | [th,mag] = cart2pol(gy,gx); | ||
20 | |||
21 | g = cat(3,gy,gx); | ||
22 | edgemap = nonmaxsup(g,ismax,r); | ||
23 | edgemap = edgemap.*(mag>mag_thld); | ||
24 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/grad.m b/SD-VBS/common/toolbox/toolbox_basic/common/grad.m new file mode 100755 index 0000000..05fce39 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/grad.m | |||
@@ -0,0 +1,28 @@ | |||
1 | % gradient of an image | ||
2 | % coordinates (r, c) follow matrix convention; | ||
3 | % the gaussian is truncated at x = +- tail, and there are samples samples | ||
4 | % inbetween, where samples = hsamples * 2 + 1 | ||
5 | |||
6 | function[gr,gc] = gradient(image, hsamples,cm) | ||
7 | |||
8 | if nargin <3, | ||
9 | cm = 'same'; | ||
10 | end | ||
11 | |||
12 | tail=4; | ||
13 | samples = hsamples * 2 + 1; | ||
14 | |||
15 | x = linspace(-tail, tail, samples); | ||
16 | gauss = exp(-x.^2); | ||
17 | n = gauss * ones(samples,1); | ||
18 | gauss = gauss/n; | ||
19 | |||
20 | gaussderiv = -x.*gauss; | ||
21 | n = -gaussderiv*linspace(1,samples,samples)'; | ||
22 | gaussderiv = gaussderiv/n; | ||
23 | |||
24 | %gr = conv2(conv2(image, gaussderiv','valid'), gauss,'valid'); | ||
25 | %gc = conv2(conv2(image, gaussderiv,'valid'), gauss','valid'); | ||
26 | |||
27 | gr = conv2(conv2(image, gaussderiv',cm), gauss,cm); | ||
28 | gc = conv2(conv2(image, gaussderiv,cm), gauss',cm); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/make_filterbank_even2.m b/SD-VBS/common/toolbox/toolbox_basic/common/make_filterbank_even2.m new file mode 100755 index 0000000..937f9bd --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/make_filterbank_even2.m | |||
@@ -0,0 +1,45 @@ | |||
1 | function FB = make_filterbank(num_ori,filter_scales,wsz,enlong) | ||
2 | % | ||
3 | % F = make_filterbank(num_ori,num_scale,wsz) | ||
4 | % | ||
5 | |||
6 | if nargin<4, | ||
7 | enlong = 3; | ||
8 | end | ||
9 | |||
10 | enlong = 2*enlong | ||
11 | |||
12 | % definine filterbank | ||
13 | %num_ori=6; | ||
14 | %num_scale=3; | ||
15 | |||
16 | num_scale = length(filter_scales); | ||
17 | |||
18 | M1=wsz; % size in pixels | ||
19 | M2=M1; | ||
20 | |||
21 | ori_incr=180/num_ori; | ||
22 | ori_offset=ori_incr/2; % helps with equalizing quantiz. error across filter set | ||
23 | |||
24 | FB=zeros(M1,M2,num_ori,num_scale); | ||
25 | |||
26 | % elongated filter set | ||
27 | counter = 1; | ||
28 | |||
29 | for m=1:num_scale | ||
30 | for n=1:num_ori | ||
31 | % r=12 here is equivalent to Malik's r=3; | ||
32 | f=doog2(filter_scales(m),enlong,ori_offset+(n-1)*ori_incr,M1); | ||
33 | FB(:,:,n,m)=f; | ||
34 | end | ||
35 | end | ||
36 | |||
37 | FB=reshape(FB,M1,M2,num_scale*num_ori); | ||
38 | total_num_filt=size(FB,3); | ||
39 | |||
40 | for j=1:total_num_filt, | ||
41 | F = FB(:,:,j); | ||
42 | a = sum(sum(abs(F))); | ||
43 | FB(:,:,j) = FB(:,:,j)/a; | ||
44 | end | ||
45 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/make_filterbank_odd2.m b/SD-VBS/common/toolbox/toolbox_basic/common/make_filterbank_odd2.m new file mode 100755 index 0000000..0059dca --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/make_filterbank_odd2.m | |||
@@ -0,0 +1,46 @@ | |||
1 | function FB = make_filterbank(num_ori,filter_scales,wsz,enlong) | ||
2 | % | ||
3 | % F = make_filterbank(num_ori,num_scale,wsz) | ||
4 | % | ||
5 | |||
6 | if nargin<4, | ||
7 | enlong = 3; | ||
8 | end | ||
9 | |||
10 | enlong = enlong*2; | ||
11 | |||
12 | % definine filterbank | ||
13 | %num_ori=6; | ||
14 | %num_scale=3; | ||
15 | |||
16 | num_scale = length(filter_scales); | ||
17 | |||
18 | M1=wsz; % size in pixels | ||
19 | M2=M1; | ||
20 | |||
21 | ori_incr=180/num_ori; | ||
22 | ori_offset=ori_incr/2; % helps with equalizing quantiz. error across filter set | ||
23 | |||
24 | FB=zeros(M1,M2,num_ori,num_scale); | ||
25 | |||
26 | |||
27 | % elongated filter set | ||
28 | counter = 1; | ||
29 | |||
30 | for m=1:num_scale | ||
31 | for n=1:num_ori | ||
32 | % r=12 here is equivalent to Malik's r=3; | ||
33 | f=doog1(filter_scales(m),enlong,ori_offset+(n-1)*ori_incr,M1); | ||
34 | FB(:,:,n,m)=f; | ||
35 | end | ||
36 | end | ||
37 | |||
38 | FB=reshape(FB,M1,M2,num_scale*num_ori); | ||
39 | total_num_filt=size(FB,3); | ||
40 | |||
41 | for j=1:total_num_filt, | ||
42 | F = FB(:,:,j); | ||
43 | a = sum(sum(abs(F))); | ||
44 | FB(:,:,j) = FB(:,:,j)/a; | ||
45 | end | ||
46 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/max_supress2.m b/SD-VBS/common/toolbox/toolbox_basic/common/max_supress2.m new file mode 100755 index 0000000..05b5f11 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/max_supress2.m | |||
@@ -0,0 +1,59 @@ | |||
1 | function NMS = max_supress2(data,ismax); | ||
2 | % | ||
3 | % NMS = max_supress(data,ismax); | ||
4 | % | ||
5 | % data: [nr,nc,nfilter,nscale] | ||
6 | % of filter mag. map | ||
7 | % ismax: 1 local max, 0 local min | ||
8 | % | ||
9 | |||
10 | [nr,nc,nfilter,nscale] = size(data); | ||
11 | |||
12 | % set up the orthognal neighbourhood for each oriented filter | ||
13 | if nfilter == 6, | ||
14 | nbr_template=[1 1 1 0 -1 -1 | ||
15 | 0 1 1 1 1 1]; | ||
16 | else | ||
17 | nbr_template=[1 0 ; | ||
18 | 0 1]; | ||
19 | end | ||
20 | |||
21 | %% for each scale, compute the dominate filter response | ||
22 | canny_dir_I = zeros(nr,nc,nscale); | ||
23 | |||
24 | for m = 1:nscale, | ||
25 | [max_Ori_resp_I,Ori_sca_I] = max(data(:,:,:,m),[],3); | ||
26 | canny_dir_I(:,:,m) = Ori_sca_I; | ||
27 | end | ||
28 | |||
29 | max_Ori_resp_small = max_Ori_resp_I(2:end-1,2:end-1); | ||
30 | canny_dir = canny_dir_I(2:end-1,2:end-1); | ||
31 | |||
32 | %% | ||
33 | |||
34 | NMS = zeros(nr,nc,nscale); | ||
35 | |||
36 | |||
37 | for m = 1:nscale, | ||
38 | |||
39 | [x,y] = meshgrid(2:nc-1,2:nr-1); | ||
40 | xid = x(:)+nbr_template(2,canny_dir(:))'; | ||
41 | yid = y(:)+nbr_template(1,canny_dir(:))'; | ||
42 | id1 = (xid-1)*nr+yid; | ||
43 | |||
44 | xid = x(:)-nbr_template(2,canny_dir(:))'; | ||
45 | yid = y(:)-nbr_template(1,canny_dir(:))'; | ||
46 | id2 = (xid-1)*nr+yid; | ||
47 | if ismax, | ||
48 | a = (max_Ori_resp_small(:)>max_Ori_resp_I(id1(:))) .* (max_Ori_resp_small(:)>max_Ori_resp_I(id2(:))); | ||
49 | NMS(2:end-1,2:end-1,m) = reshape(a,nr-2,nc-2); | ||
50 | NMS(:,:,m) = NMS(:,:,m).*max_Ori_resp_I; | ||
51 | else | ||
52 | a = (max_Ori_resp_small(:)<max_Ori_resp_I(id1(:))) .* (max_Ori_resp_small(:)<max_Ori_resp_I(id2(:))); | ||
53 | NMS(2:end-1,2:end-1,m) = reshape(a,nr-2,nc-2); | ||
54 | end | ||
55 | |||
56 | end | ||
57 | |||
58 | |||
59 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/mgrad.m b/SD-VBS/common/toolbox/toolbox_basic/common/mgrad.m new file mode 100755 index 0000000..1d89c87 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/mgrad.m | |||
@@ -0,0 +1,11 @@ | |||
1 | function [dx,dy] = mgrad(I,w) | ||
2 | % | ||
3 | % [dx,dy] = mgrad(I,w) | ||
4 | % | ||
5 | |||
6 | [nr,nc] = size(I); | ||
7 | |||
8 | dx = zeros(nr,nc);dy = zeros(nr,nc); | ||
9 | |||
10 | dx(:,1:nc-w) = I(:,1:nc-w) - I(:,w+1:nc); | ||
11 | dy(1:nr-w,:) = I(1:nr-w,:) - I(w+1:nr,:); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/mpgread.m b/SD-VBS/common/toolbox/toolbox_basic/common/mpgread.m new file mode 100755 index 0000000..7f964ab --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/mpgread.m | |||
@@ -0,0 +1,25 @@ | |||
1 | %MPGREAD Read an MPEG encoded movie file. | ||
2 | % [M, map] = mpgread('filename', frames) reads the specifed | ||
3 | % MPEG file and translates it into the movie M, and colormap map. | ||
4 | % If a vector frames is specified, then only the frames specified | ||
5 | % in this vector will be placed in M. Otherwise, all frames will | ||
6 | % be placed in M. | ||
7 | % | ||
8 | % M = mpgread('filename', frames, 'indexed') | ||
9 | % Reads an MPEG file into the MATLAB 5.3+ format movie which | ||
10 | % is a structure array. Each element has a cdata field | ||
11 | % containing a uint8 image matrix and a colormap field | ||
12 | % containing the colormap. The frames parameter can be [] to | ||
13 | % indicate that all frames should be read. | ||
14 | % | ||
15 | % M = mpgread('filename', frames, 'truecolor') | ||
16 | % Reads an MPEG file into the MATLAB 5.3+ format movie. Each | ||
17 | % frame in the movie has a truecolor MxNx3 cdata field and | ||
18 | % an empty colormap field. | ||
19 | % | ||
20 | % [R, G, B] = mpgread('filename', frames) will perform the same | ||
21 | % operation as above, except that the decoded MPEG frames will | ||
22 | % be placed into the matrices R, G, B, where R contains the red | ||
23 | % component for each frame, G, the green component, and B, the | ||
24 | % blue component. | ||
25 | % | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/mpgread.mexlx b/SD-VBS/common/toolbox/toolbox_basic/common/mpgread.mexlx new file mode 100755 index 0000000..1190192 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/mpgread.mexlx | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/mpgwrite.m b/SD-VBS/common/toolbox/toolbox_basic/common/mpgwrite.m new file mode 100755 index 0000000..b1cb773 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/mpgwrite.m | |||
@@ -0,0 +1,29 @@ | |||
1 | %MPGWRITE Write an MPEG file. | ||
2 | % MPGWRITE(M, map, 'filename', options) Encodes M in MPEG | ||
3 | % format using the specified colormap and writes the result to the | ||
4 | % specified file. The options argument is an optional vector of | ||
5 | % 8 or fewer options where each value has the following meaning: | ||
6 | % 1. REPEAT: | ||
7 | % An integer number of times to repeat the movie | ||
8 | % (default is 1). | ||
9 | % 2. P-SEARCH ALGORITHM: | ||
10 | % 0 = logarithmic (fastest, default value) | ||
11 | % 1 = subsample | ||
12 | % 2 = exhaustive (better, but slow) | ||
13 | % 3. B-SEARCH ALGORITHM: | ||
14 | % 0 = simple (fastest) | ||
15 | % 1 = cross2 (slightly slower, default value) | ||
16 | % 2 = exhaustive (very slow) | ||
17 | % 4. REFERENCE FRAME: | ||
18 | % 0 = original (faster, default) | ||
19 | % 1 = decoded (slower, but results in better quality) | ||
20 | % 5. RANGE IN PIXELS: | ||
21 | % An integer search radius. Default is 10. | ||
22 | % 6. I-FRAME Q-SCALE: | ||
23 | % An integer between 1 and 31. Default is 8. | ||
24 | % 7. P-FRAME Q-SCALE: | ||
25 | % An integer between 1 and 31. Default is 10. | ||
26 | % 8. B-FRAME Q-SCALE: | ||
27 | % An integer between 1 and 31. Default is 25. | ||
28 | % | ||
29 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/mpgwrite.mexlx b/SD-VBS/common/toolbox/toolbox_basic/common/mpgwrite.mexlx new file mode 100755 index 0000000..770bad1 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/mpgwrite.mexlx | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/ncut.m b/SD-VBS/common/toolbox/toolbox_basic/common/ncut.m new file mode 100755 index 0000000..81fb52f --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/ncut.m | |||
@@ -0,0 +1,108 @@ | |||
1 | % function [v,s,na,d] = ncut(a,nv,sigma,offset) | ||
2 | % Input: | ||
3 | % a = affinity matrix, hermitian, could be 3D, or a cell | ||
4 | % nv = number of eigenvectors v | ||
5 | % sigma = refer to EIGS.M, 0 for smallest, default = 'LR' | ||
6 | % offset = vector, each for an affinity matrix, offset for nondirectional repulsion | ||
7 | % W = A - R = (A + offset) - (R + offset) | ||
8 | % Expected value = offset in affinity value * # of neighboors | ||
9 | % Output: | ||
10 | % v = generalized eigenvectors of A and D | ||
11 | % s = eigenvalues | ||
12 | % na = normalized affinity matrix | ||
13 | % d = normalization matrix 1/sqrt(rowsum(a)) | ||
14 | % This version now accepts multiple weight matrices | ||
15 | % the format of cells are good for sparse affinity matrices | ||
16 | |||
17 | % Jianbo Shi | ||
18 | |||
19 | function [v,s,na,d] = ncut(a,nv,sigma,offset) | ||
20 | |||
21 | is_cell = iscell(a); | ||
22 | if is_cell, | ||
23 | nw = length(a); | ||
24 | [nr,nc] = size(a{1}); | ||
25 | else | ||
26 | [nr,nc,nw] = size(a); | ||
27 | end | ||
28 | |||
29 | if nargin<2 | isempty(nv), | ||
30 | nv = min(nr,6); | ||
31 | end | ||
32 | |||
33 | if nargin<3 | isempty(sigma), | ||
34 | sigma = 'LR'; | ||
35 | end | ||
36 | |||
37 | if nargin<4 | isempty(offset), | ||
38 | offset = 0; | ||
39 | end; | ||
40 | offset=offset(:); | ||
41 | j = length(offset); | ||
42 | offset(j+1:nw) = offset(j); | ||
43 | |||
44 | d = 0; | ||
45 | na = sparse(nr,nc); | ||
46 | for j=1:nw, % simultaneous partitioning with multiple weight matrices. | ||
47 | if is_cell, | ||
48 | w = a{j}; | ||
49 | elseif issparse(a), % only supports 2D indexing | ||
50 | w = a; | ||
51 | else | ||
52 | w = a(:,:,j); | ||
53 | end | ||
54 | if j==nw, % to save space | ||
55 | clear a; | ||
56 | end | ||
57 | |||
58 | d = d + sum(abs(w),2) + 2*offset(j); % single equivalent D | ||
59 | |||
60 | % modify matrix a to deal with nondirectional repulsion | ||
61 | wr = real(w); | ||
62 | wr = (sum(abs(wr),2)-sum(wr,2))*0.5 + offset(j); | ||
63 | w = w + spdiags(wr,0,nr,nr); | ||
64 | |||
65 | na = na + w; % single equivalent A | ||
66 | |||
67 | % if you want the rectified individual weight matrix | ||
68 | %if is_cell, | ||
69 | % a{j} = w; | ||
70 | %else | ||
71 | % a(:,:,j) = w; | ||
72 | %end | ||
73 | end | ||
74 | clear w wr | ||
75 | |||
76 | % normalize | ||
77 | d = 1./sqrt(d+eps); | ||
78 | if 1, | ||
79 | na = spmtimesd(na,d,d); | ||
80 | else | ||
81 | d = spdiags(d,0,nr,nr); | ||
82 | na = d * na * d; | ||
83 | end | ||
84 | |||
85 | options.disp = 0; | ||
86 | %options.tol = 1e-10; | ||
87 | %options.maxit = 15; | ||
88 | |||
89 | warning off | ||
90 | [v,s] = eigs(na,nv,sigma,options); | ||
91 | s = real(diag(s)); | ||
92 | warning on | ||
93 | |||
94 | % to make sure positive eigs always come first | ||
95 | % [x,y] = sort(-s); | ||
96 | % s = -x; | ||
97 | % v = v(:,y); | ||
98 | |||
99 | % project back to get the eigenvectors for the pair (a,d) | ||
100 | % a x = lambda d x | ||
101 | % na y = lambda y | ||
102 | % x = d^(-1/2) y | ||
103 | |||
104 | if 1, | ||
105 | v = spdiags(d,0,nr,nr) * v; | ||
106 | else | ||
107 | v = d * v; | ||
108 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/ncut_b.m b/SD-VBS/common/toolbox/toolbox_basic/common/ncut_b.m new file mode 100755 index 0000000..d686981 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/ncut_b.m | |||
@@ -0,0 +1,46 @@ | |||
1 | function [v,d] = ncut(A,nv) | ||
2 | % | ||
3 | % [v,d] = ncut(A,nv) | ||
4 | % | ||
5 | % | ||
6 | % computes 'nv' of the normalized cut vectors 'v' from | ||
7 | % matrix 'A' | ||
8 | % | ||
9 | % it computes the largest eigenvectors of | ||
10 | % A*v = \lambda D * v; D = diag(sum(A)); | ||
11 | % | ||
12 | % this is same as solving the smallest eigenvectors of | ||
13 | % (D-A)*v = \lambda D *v; | ||
14 | % | ||
15 | |||
16 | % | ||
17 | % Jianbo Shi | ||
18 | % | ||
19 | |||
20 | ds = sum(A); | ||
21 | ds = ones(size(ds))./sqrt(ds); | ||
22 | |||
23 | for j=1:size(A,1), | ||
24 | A(j,:) = A(j,:).*ds; | ||
25 | end | ||
26 | |||
27 | for j=1:size(A,2); | ||
28 | A(:,j) = A(:,j).*ds'; | ||
29 | end | ||
30 | |||
31 | |||
32 | %disp(sprintf('computing eig values')); | ||
33 | OPTIONS.tol=1e-10; | ||
34 | OPTIONS.maxit=15; | ||
35 | OPTIONS.disp=0; | ||
36 | %tic;toc; | ||
37 | |||
38 | [v,d] = eigs(A,nv,'LM',OPTIONS); | ||
39 | |||
40 | d = abs(diag(d)); | ||
41 | |||
42 | for j=1:nv, | ||
43 | v(:,j) = v(:,j).*ds'; | ||
44 | end | ||
45 | |||
46 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/ncut_bb.m b/SD-VBS/common/toolbox/toolbox_basic/common/ncut_bb.m new file mode 100755 index 0000000..c9b7394 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/ncut_bb.m | |||
@@ -0,0 +1,39 @@ | |||
1 | function [v,d] = ncut(A,nv) | ||
2 | % | ||
3 | % [v,d] = ncut(A,nv) | ||
4 | % | ||
5 | % | ||
6 | % computes 'nv' of the normalized cut vectors 'v' from | ||
7 | % matrix 'A' | ||
8 | % | ||
9 | % it computes the largest eigenvectors of | ||
10 | % A*v = \lambda D * v; D = diag(sum(A)); | ||
11 | % | ||
12 | % this is same as solving the smallest eigenvectors of | ||
13 | % (D-A)*v = \lambda D *v; | ||
14 | % | ||
15 | |||
16 | % | ||
17 | % Jianbo Shi | ||
18 | % | ||
19 | |||
20 | ds = sum(A); | ||
21 | ds = ones(size(ds))./sqrt(ds); | ||
22 | |||
23 | D_inv_half = spdiags(ds',0,size(A,1),size(A,2)); | ||
24 | A = D_inv_half*A*D_inv_half; | ||
25 | |||
26 | disp(sprintf('computing eig values')); | ||
27 | OPTIONS.tol=1e-10; | ||
28 | OPTIONS.maxit=15; | ||
29 | OPTIONS.disp=0; | ||
30 | %tic;toc; | ||
31 | |||
32 | [v,d] = eigs(A,nv,OPTIONS); | ||
33 | |||
34 | d = abs(diag(d)); | ||
35 | |||
36 | for j=1:nv, | ||
37 | v(:,j) = v(:,j).*ds'; | ||
38 | end | ||
39 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/ncut_e.m b/SD-VBS/common/toolbox/toolbox_basic/common/ncut_e.m new file mode 100755 index 0000000..e06c8a6 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/ncut_e.m | |||
@@ -0,0 +1,36 @@ | |||
1 | function [v,d] = ncut(A,nv) | ||
2 | % | ||
3 | % [v,d] = ncut(A,nv) | ||
4 | % | ||
5 | % computes 'nv' of the normalized cut vectors 'v' from | ||
6 | % matrix 'A' | ||
7 | % | ||
8 | |||
9 | % | ||
10 | % Jianbo Shi | ||
11 | % | ||
12 | |||
13 | ds = sum(A); | ||
14 | D = diag(ds); | ||
15 | |||
16 | ds = ones(size(ds))./sqrt(ds); | ||
17 | |||
18 | B = D-A; | ||
19 | |||
20 | for j=1:size(A,1), | ||
21 | B(j,:) = B(j,:).*ds; | ||
22 | end | ||
23 | |||
24 | for j=1:size(A,2); | ||
25 | B(:,j) = B(:,j).*ds'; | ||
26 | end | ||
27 | |||
28 | disp(sprintf('computing eig values')); | ||
29 | tic;[v,d] = eigs(B,nv,'sm');toc; | ||
30 | |||
31 | d = abs(diag(d)); | ||
32 | |||
33 | for j=1:nv, | ||
34 | v(:,j) = v(:,j).*ds'; | ||
35 | end | ||
36 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/ncut_neg.m b/SD-VBS/common/toolbox/toolbox_basic/common/ncut_neg.m new file mode 100755 index 0000000..89a1caa --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/ncut_neg.m | |||
@@ -0,0 +1,45 @@ | |||
1 | function [v,d] = ncut(A,nv) | ||
2 | % | ||
3 | % [v,d] = ncut(A,nv) | ||
4 | % | ||
5 | % | ||
6 | % computes 'nv' of the normalized cut vectors 'v' from | ||
7 | % matrix 'A' | ||
8 | % | ||
9 | % it computes the largest eigenvectors of | ||
10 | % A*v = \lambda D * v; D = diag(sum(A)); | ||
11 | % | ||
12 | % this is same as solving the smallest eigenvectors of | ||
13 | % (D-A)*v = \lambda D *v; | ||
14 | % | ||
15 | |||
16 | % | ||
17 | % Jianbo Shi | ||
18 | % | ||
19 | |||
20 | ds = sum(abs(A)); | ||
21 | ds = ones(size(ds))./sqrt(ds); | ||
22 | |||
23 | for j=1:size(A,1), | ||
24 | A(j,:) = A(j,:).*ds; | ||
25 | end | ||
26 | |||
27 | for j=1:size(A,2); | ||
28 | A(:,j) = A(:,j).*ds'; | ||
29 | end | ||
30 | |||
31 | |||
32 | %disp(sprintf('computing eig values')); | ||
33 | OPTIONS.tol=1e-10; | ||
34 | OPTIONS.maxit=15; | ||
35 | OPTIONS.disp=0; | ||
36 | %tic;toc; | ||
37 | |||
38 | [v,d] = eigs(A,nv,OPTIONS); | ||
39 | |||
40 | d = abs(diag(d)); | ||
41 | |||
42 | for j=1:nv, | ||
43 | v(:,j) = v(:,j).*ds'; | ||
44 | end | ||
45 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/ncut_sparse.m b/SD-VBS/common/toolbox/toolbox_basic/common/ncut_sparse.m new file mode 100755 index 0000000..dc6d076 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/ncut_sparse.m | |||
@@ -0,0 +1,45 @@ | |||
1 | function [v,d] = ncut(A,nv) | ||
2 | % | ||
3 | % [v,d] = ncut(A,nv) | ||
4 | % | ||
5 | % Assume A is sparse, | ||
6 | % | ||
7 | % computes 'nv' of the normalized cut vectors 'v' from | ||
8 | % matrix 'A' | ||
9 | % | ||
10 | % it computes the largest eigenvectors of | ||
11 | % A*v = \lambda D * v; D = diag(sum(A)); | ||
12 | % | ||
13 | % this is same as solving the smallest eigenvectors of | ||
14 | % (D-A)*v = \lambda D *v; | ||
15 | % | ||
16 | |||
17 | % | ||
18 | % Jianbo Shi | ||
19 | % | ||
20 | |||
21 | ds = sum(abs(A)); | ||
22 | ds = 1./sqrt(ds); | ||
23 | |||
24 | [id_i,id_j,W] = find(A); | ||
25 | A = sparse(id_i,id_j,ds(id_i)'.*ds(id_j)'.*(W)); | ||
26 | |||
27 | %disp(sprintf('computing eig values')); | ||
28 | SIGMA = 'LM'; | ||
29 | %OPTIONS.issym = 0; | ||
30 | OPTIONs.isreal = 1; | ||
31 | OPTIONS.tol=1e-12; | ||
32 | OPTIONS.maxit=25; | ||
33 | OPTIONS.disp=0; | ||
34 | %tic;toc; | ||
35 | |||
36 | tic | ||
37 | [v,d] = eigs(A,nv,SIGMA,OPTIONS); | ||
38 | %,OPTIONS); | ||
39 | toc | ||
40 | d = abs(diag(d)); | ||
41 | |||
42 | for j=1:nv, | ||
43 | v(:,j) = v(:,j).*ds'; | ||
44 | end | ||
45 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/ncut_tmp.m b/SD-VBS/common/toolbox/toolbox_basic/common/ncut_tmp.m new file mode 100755 index 0000000..b623ee4 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/ncut_tmp.m | |||
@@ -0,0 +1,45 @@ | |||
1 | function [v,d] = ncut(A,nv) | ||
2 | % | ||
3 | % [v,d] = ncut(A,nv) | ||
4 | % | ||
5 | % | ||
6 | % computes 'nv' of the normalized cut vectors 'v' from | ||
7 | % matrix 'A' | ||
8 | % | ||
9 | % it computes the largest eigenvectors of | ||
10 | % A*v = \lambda D * v; D = diag(sum(A)); | ||
11 | % | ||
12 | % this is same as solving the smallest eigenvectors of | ||
13 | % (D-A)*v = \lambda D *v; | ||
14 | % | ||
15 | |||
16 | % | ||
17 | % Jianbo Shi | ||
18 | % | ||
19 | |||
20 | ds = sum(A); | ||
21 | ds = ones(size(ds))./sqrt(ds); | ||
22 | |||
23 | for j=1:size(A,1), | ||
24 | A(j,:) = A(j,:).*ds; | ||
25 | end | ||
26 | |||
27 | for j=1:size(A,2); | ||
28 | A(:,j) = A(:,j).*ds'; | ||
29 | end | ||
30 | |||
31 | |||
32 | %disp(sprintf('computing eig values')); | ||
33 | OPTIONS.tol=1e-10; | ||
34 | OPTIONS.maxit=15; | ||
35 | OPTIONS.disp=0; | ||
36 | %tic;toc; | ||
37 | |||
38 | [v,d] = eigs(A,nv,OPTIONS); | ||
39 | |||
40 | d = abs(diag(d)); | ||
41 | |||
42 | for j=1:nv, | ||
43 | v(:,j) = v(:,j).*ds'; | ||
44 | end | ||
45 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/ncutd.m b/SD-VBS/common/toolbox/toolbox_basic/common/ncutd.m new file mode 100755 index 0000000..cd5e8a4 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/ncutd.m | |||
@@ -0,0 +1,108 @@ | |||
1 | % function [v,s,na,d] = ncutd(a,nv,beta,sigma,offset) | ||
2 | % Input: | ||
3 | % a = (attraction + i*repulsion), both nonnegative but could be asymmetrical | ||
4 | % nv = number of eigenvectors v | ||
5 | % beta = weighting between undirected graph and directed graph | ||
6 | % beta = 1, undirected; beta = 0, directed. Default = 0.5 | ||
7 | % sigma = refer to EIGS.M, 0 for smallest, default = 'LR' | ||
8 | % offset = vector, each for an affinity matrix, | ||
9 | % per_edge offset for nondirectional attraction and repulsion | ||
10 | % Output: | ||
11 | % v = generalized eigenvectors of A and D | ||
12 | % s = eigenvalues | ||
13 | % na = normalized affinity matrix | ||
14 | % d = normalization matrix 1/sqrt(rowsum(a)) | ||
15 | % This version now accepts multiple weight matrices | ||
16 | % the format of cells are good for sparse affinity matrices | ||
17 | |||
18 | % Stella X. Yu, 2001. | ||
19 | |||
20 | function [v,s,na,d] = ncutd(a,nv,beta,sigma,offset) | ||
21 | |||
22 | is_cell = iscell(a); | ||
23 | if is_cell, | ||
24 | nw = length(a); | ||
25 | [nr,nc] = size(a{1}); | ||
26 | else | ||
27 | [nr,nc,nw] = size(a); | ||
28 | end | ||
29 | |||
30 | if nargin<2 | isempty(nv), | ||
31 | nv = min(nr,6); | ||
32 | end | ||
33 | |||
34 | if nargin<3 | isempty(beta), | ||
35 | beta = 0.5; | ||
36 | end | ||
37 | beta = beta *2; | ||
38 | |||
39 | if nargin<4 | isempty(sigma), | ||
40 | sigma = 'LR'; | ||
41 | end | ||
42 | |||
43 | if nargin<5 | isempty(offset), | ||
44 | offset = 0; | ||
45 | end; | ||
46 | offset=offset(:); | ||
47 | j = length(offset); | ||
48 | offset(j+1:nw) = offset(j); | ||
49 | |||
50 | % modify per-edge offset delta to 2 D_{\delta} = offset to D_R | ||
51 | offset = offset * (2*nc); | ||
52 | |||
53 | z = zeros(nr,nw); | ||
54 | na = 0; | ||
55 | for j=1:nw, % simultaneous partitioning with multiple weight matrices. | ||
56 | if is_cell, | ||
57 | w = a{j}; | ||
58 | elseif issparse(a), % only supports 2D indexing | ||
59 | w = a; | ||
60 | else | ||
61 | w = a(:,:,j); | ||
62 | end | ||
63 | |||
64 | wr = real(w); % attraction | ||
65 | wi = imag(w); % repulsion | ||
66 | |||
67 | % if wr has negative numbers, treat as repulsion | ||
68 | % while negative numbers in wi is ignored | ||
69 | aa = wr.*(wr>0); | ||
70 | rr = wi.*(wi>0)-wr.*(wr<0); | ||
71 | |||
72 | % decomposition | ||
73 | au = aa + aa'; | ||
74 | ad = aa - aa'; | ||
75 | ru = rr + rr'; | ||
76 | rd = rr - rr'; | ||
77 | |||
78 | % construct equivalent matrices | ||
79 | x = sum(ru,2); | ||
80 | wr = au - ru + diag(x); | ||
81 | wi = ad + rd; | ||
82 | x = x + sum(au,2); | ||
83 | |||
84 | % re-organize, add in offset and beta | ||
85 | z(:,j) = x + 2 * offset; | ||
86 | na = na + ( beta * (wr + offset) + sqrt(-1)* (2-beta) * wi ); | ||
87 | |||
88 | end | ||
89 | z = sum(z,2); % diag(z) = single equivalent D | ||
90 | |||
91 | % normalize | ||
92 | d = repmat(1./sqrt(z+eps),1,nc); | ||
93 | na = d.*na; | ||
94 | na = na.*d'; | ||
95 | |||
96 | options.disp = 0; | ||
97 | %options.tol = 1e-10; | ||
98 | %options.maxit = 15; | ||
99 | |||
100 | [v,s] = eigs(na,nv,sigma,options); | ||
101 | s = real(diag(s)); | ||
102 | |||
103 | % project back to get the eigenvectors for the pair (a,d) | ||
104 | % a x = lambda d x | ||
105 | % na y = lambda y | ||
106 | % x = d^(-1/2) y | ||
107 | |||
108 | v = v .* d(:,ones(nv,1)); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/nonmaxsup.m b/SD-VBS/common/toolbox/toolbox_basic/common/nonmaxsup.m new file mode 100755 index 0000000..d12301c --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/nonmaxsup.m | |||
@@ -0,0 +1,81 @@ | |||
1 | % function f = nonmaxsup(g,ismax,r) return extrema boolean map. | ||
2 | % Input: g = image, gradient image pair [x,y], or [x,y,g] in 3D matrix | ||
3 | % ismax (=1)/0 is for non maximum/minimum suppression | ||
4 | % r (=1) is the neighbourhood radius. | ||
5 | % Output: | ||
6 | % f = thinned extrema boolean map, where | ||
7 | % d (||gradient||) / d gradient = 0 | ||
8 | |||
9 | % Stella X. Yu, 2000. | ||
10 | |||
11 | function f = nonmaxsup(g,ismax,r) | ||
12 | |||
13 | if nargin<2, | ||
14 | ismax = 1; | ||
15 | end | ||
16 | |||
17 | if nargin<3, | ||
18 | r = 1; | ||
19 | end | ||
20 | |||
21 | i = size(g,3); | ||
22 | if i==3, | ||
23 | x = g(:,:,1); | ||
24 | y = g(:,:,2); | ||
25 | g = g(:,:,3); | ||
26 | elseif i==2, | ||
27 | x = g(:,:,1); | ||
28 | y = g(:,:,2); | ||
29 | g = x.*x + y.*y; | ||
30 | else | ||
31 | [x,y] = gradient(g); | ||
32 | end | ||
33 | |||
34 | % label angles into 4 directions | ||
35 | a = angle(x - sqrt(-1).*y); % [-pi,pi) | ||
36 | s = ceil((abs(a)+pi/8)./(pi/4)); | ||
37 | s(find(s==5)) = 1; | ||
38 | s(find(isnan(s))) = 1; | ||
39 | |||
40 | % augment the image | ||
41 | [m,n] = size(g); | ||
42 | newm = m + r + r; | ||
43 | i = [g(:,1);g(:,end);g(1,:)';g(end,:)']; % image boundary | ||
44 | if ismax, | ||
45 | v = min(i) - 1; | ||
46 | else | ||
47 | v = max(i) + 1; | ||
48 | end | ||
49 | i = zeros(newm,r) + v; | ||
50 | j = zeros(r,n) + v; | ||
51 | newg = [i, [j; g; j;], i]; | ||
52 | |||
53 | % k = index as the interior of the new image | ||
54 | i = [r+1:newm-r]'+ r*newm; | ||
55 | j = [0:n-1].*newm; | ||
56 | k = i(:,ones(1,n)) + j(ones(1,m),:); | ||
57 | k = k(:); | ||
58 | |||
59 | % unit displacement vectors along gradient directions | ||
60 | d = [newm,newm-1,-1,-1-newm]'; % for 4 directions | ||
61 | d = d(s(:)); | ||
62 | |||
63 | % non maximum suppression | ||
64 | f = ones(m*n,1); | ||
65 | g = g(:); | ||
66 | newd = 0; | ||
67 | |||
68 | if ismax, | ||
69 | for i=1:r, | ||
70 | newd = newd + d; | ||
71 | f = f & (g>newg(k+newd)) & (g>newg(k-newd)); | ||
72 | end | ||
73 | else | ||
74 | for i=1:r, | ||
75 | newd = newd + d; | ||
76 | f = f & (g<newg(k+newd)) & (g<newg(k-newd)); | ||
77 | end | ||
78 | end | ||
79 | |||
80 | f = reshape(f,[m,n]); | ||
81 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/pair_dist.m b/SD-VBS/common/toolbox/toolbox_basic/common/pair_dist.m new file mode 100755 index 0000000..3ea970a --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/pair_dist.m | |||
@@ -0,0 +1,14 @@ | |||
1 | function W = pari_hist_dist_fast(data) | ||
2 | % | ||
3 | % W = pari_hist_dist(data) | ||
4 | % | ||
5 | % data: num_im by num_feature | ||
6 | % W : num_im by num_im hist diff | ||
7 | % | ||
8 | |||
9 | [num_im,num_feature] = size(data); | ||
10 | mag = sum(data.*data,2); | ||
11 | |||
12 | W = mag(:,ones(1,num_im)) - 2*data*data'; | ||
13 | mag = mag'; | ||
14 | W = W+mag(ones(num_im,1),:); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/quadedgep.m b/SD-VBS/common/toolbox/toolbox_basic/common/quadedgep.m new file mode 100755 index 0000000..eda33f9 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/quadedgep.m | |||
@@ -0,0 +1,106 @@ | |||
1 | % function [x,y,gx,gy,par,threshold,mag,mage,g,FIe,FIo,mago] = quadedgep(I,par,threshold); | ||
2 | % Input: | ||
3 | % I = image | ||
4 | % par = vector for 4 parameters | ||
5 | % [number of filter orientations, number of scales, filter size, elongation] | ||
6 | % To use default values, put 0. | ||
7 | % threshold = threshold on edge strength | ||
8 | % Output: | ||
9 | % [x,y,gx,gy] = locations and gradients of an ordered list of edgels | ||
10 | % x,y could be horizontal or vertical or 45 between pixel sites | ||
11 | % but it is guaranteed that there [floor(y) + (floor(x)-1)*nr] | ||
12 | % is ordered and unique. In other words, each edgel has a unique pixel id. | ||
13 | % par = actual par used | ||
14 | % threshold = actual threshold used | ||
15 | % mag = edge magnitude | ||
16 | % mage = phase map | ||
17 | % g = gradient map at each pixel | ||
18 | % [FIe,FIo] = odd and even filter outputs | ||
19 | % mago = odd filter output of optimum orientation | ||
20 | |||
21 | % Stella X. Yu, 2001 | ||
22 | |||
23 | function [x,y,gx,gy,par,threshold,mag,mage,g,FIe,FIo,mago] = quadedgep(I,par,threshold); | ||
24 | |||
25 | if nargin<3 | isempty(threshold), | ||
26 | threshold = 0.2; | ||
27 | end | ||
28 | |||
29 | [r,c] = size(I); | ||
30 | def_par = [8,1,20,3]; | ||
31 | |||
32 | % take care of parameters, any missing value is substituted by a default value | ||
33 | if nargin<2 | isempty(par), | ||
34 | par = def_par; | ||
35 | end | ||
36 | par(end+1:4)=0; | ||
37 | par = par(:); | ||
38 | j = (par>0); | ||
39 | have_value = [ j, 1-j ]; | ||
40 | j = 1; n_filter = have_value(j,:) * [par(j); def_par(j)]; | ||
41 | j = 2; n_scale = have_value(j,:) * [par(j); def_par(j)]; | ||
42 | j = 3; winsz = have_value(j,:) * [par(j); def_par(j)]; | ||
43 | j = 4; enlong = have_value(j,:) * [par(j); def_par(j)]; | ||
44 | |||
45 | % always make filter size an odd number so that the results will not be skewed | ||
46 | j = winsz/2; | ||
47 | if not(j > fix(j) + 0.1), | ||
48 | winsz = winsz + 1; | ||
49 | end | ||
50 | |||
51 | % filter the image with quadrature filters | ||
52 | FBo = make_filterbank_odd2(n_filter,n_scale,winsz,enlong); | ||
53 | FBe = make_filterbank_even2(n_filter,n_scale,winsz,enlong); | ||
54 | n = ceil(winsz/2); | ||
55 | f = [fliplr(I(:,2:n+1)), I, fliplr(I(:,c-n:c-1))]; | ||
56 | f = [flipud(f(2:n+1,:)); f; flipud(f(r-n:r-1,:))]; | ||
57 | FIo = fft_filt_2(f,FBo,1); | ||
58 | FIo = FIo(n+[1:r],n+[1:c],:); | ||
59 | FIe = fft_filt_2(f,FBe,1); | ||
60 | FIe = FIe(n+[1:r],n+[1:c],:); | ||
61 | |||
62 | % compute the orientation energy and recover a smooth edge map | ||
63 | % pick up the maximum energy across scale and orientation | ||
64 | % even filter's output: as it is the second derivative, zero cross localize the edge | ||
65 | % odd filter's output: orientation | ||
66 | mag = sqrt(sum(FIo.^2,3)+sum(FIe.^2,3)); | ||
67 | mag_a = sqrt(FIo.^2+FIe.^2); | ||
68 | [tmp,max_id] = max(mag_a,[],3); | ||
69 | base_size = r * c; | ||
70 | id = [1:base_size]'; | ||
71 | mage = reshape(FIe(id+(max_id(:)-1)*base_size),[r,c]); | ||
72 | mage = (mage>0) - (mage<0); | ||
73 | |||
74 | ori_incr=pi/n_filter; % to convert jshi's coords to conventional image xy | ||
75 | ori_offset=ori_incr/2; | ||
76 | theta = ori_offset+([1:n_filter]-1)*ori_incr; % orientation detectors | ||
77 | % [gx,gy] are image gradient in image xy coords, winner take all | ||
78 | mago = reshape(FIo(id+(max_id(:)-1)*base_size),[r,c]); | ||
79 | ori = theta(max_id); | ||
80 | ori = ori .* (mago>0) + (ori + pi).*(mago<0); | ||
81 | gy = mag .* cos(ori); | ||
82 | gx = -mag .* sin(ori); | ||
83 | g = cat(3,gx,gy); | ||
84 | |||
85 | % phase map: edges are where the phase changes | ||
86 | mag_th = max(mag(:)) * threshold; | ||
87 | eg = (mag>mag_th); | ||
88 | h = eg & [(mage(2:r,:) ~= mage(1:r-1,:)); zeros(1,c)]; | ||
89 | v = eg & [(mage(:,2:c) ~= mage(:,1:c-1)), zeros(r,1)]; | ||
90 | [y,x] = find(h | v); | ||
91 | k = y + (x-1) * r; | ||
92 | h = h(k); | ||
93 | v = v(k); | ||
94 | y = y + h * 0.5; % i | ||
95 | x = x + v * 0.5; % j | ||
96 | t = h + v * r; | ||
97 | gx = g(k) + g(k+t); | ||
98 | k = k + (r * c); | ||
99 | gy = g(k) + g(k+t); | ||
100 | |||
101 | % display | ||
102 | if 1, | ||
103 | %figure; showmask(I,mage<0); | ||
104 | figure(2); clf;showim(I,1); hold on; quiver(x,y,gx,gy); | ||
105 | %figure; showim(-I,1); hold on; quiver(i,j,ex,ey); | ||
106 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/readpcm.m b/SD-VBS/common/toolbox/toolbox_basic/common/readpcm.m new file mode 100755 index 0000000..ca736da --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/readpcm.m | |||
@@ -0,0 +1,12 @@ | |||
1 | function I = readpcm(filename) | ||
2 | |||
3 | fid = fopen(filename,'r'); | ||
4 | |||
5 | A = fscanf(fid,'%d\n',2); | ||
6 | I = fscanf(fid,'%c',A(2)*A(1)); | ||
7 | I = I'; | ||
8 | I = str2num(I); | ||
9 | I = reshape(I,A(2),A(1))'; | ||
10 | |||
11 | |||
12 | fclose(fid); \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/readpdm.m b/SD-VBS/common/toolbox/toolbox_basic/common/readpdm.m new file mode 100755 index 0000000..9a1068e --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/readpdm.m | |||
@@ -0,0 +1,8 @@ | |||
1 | function I = readpfm(filename) | ||
2 | |||
3 | fid = fopen(filename,'r'); | ||
4 | |||
5 | A = fscanf(fid,'%d',2); | ||
6 | I = fscanf(fid,'%d',[A(1),A(2)]); | ||
7 | |||
8 | fclose(fid); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/readpfm.m b/SD-VBS/common/toolbox/toolbox_basic/common/readpfm.m new file mode 100755 index 0000000..48ecd78 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/readpfm.m | |||
@@ -0,0 +1,10 @@ | |||
1 | function I = readpfm(filename) | ||
2 | |||
3 | fid = fopen(filename,'r'); | ||
4 | |||
5 | A = fscanf(fid,'%d',2); | ||
6 | I = fscanf(fid,'%f',[A(1),A(2)]); | ||
7 | |||
8 | %I = fscanf(fid,'%f',A(2)*A(1));I = reshape(I,A(1),A(2)); | ||
9 | |||
10 | fclose(fid); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/renormalize.m b/SD-VBS/common/toolbox/toolbox_basic/common/renormalize.m new file mode 100755 index 0000000..5d84724 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/renormalize.m | |||
@@ -0,0 +1,32 @@ | |||
1 | function W2 = renormalize(W,nstep) | ||
2 | % | ||
3 | % keep renormalizing until W is almost double | ||
4 | % stocastic | ||
5 | % | ||
6 | |||
7 | if nargin<2, | ||
8 | nstep = 5; | ||
9 | end | ||
10 | |||
11 | n_node = size(W,1); | ||
12 | |||
13 | for j=1:nstep, | ||
14 | fprintf(','); | ||
15 | % normalize row | ||
16 | D = sum(W,2); | ||
17 | D = 1./(D+eps); | ||
18 | W = W.*D(:,ones(1,n_node)); | ||
19 | |||
20 | % normlize column | ||
21 | D = sum(W,1); | ||
22 | D = 1./(D+eps); | ||
23 | W = W.*D(ones(n_node,1),:); | ||
24 | end | ||
25 | fprintf('\n'); | ||
26 | |||
27 | D = sum(W,2); | ||
28 | D = 1./(D+eps); | ||
29 | W2 = W.*D(:,ones(1,n_node)); | ||
30 | |||
31 | |||
32 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/show_edge.m b/SD-VBS/common/toolbox/toolbox_basic/common/show_edge.m new file mode 100755 index 0000000..63b2f98 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/show_edge.m | |||
@@ -0,0 +1,11 @@ | |||
1 | function [id_i,id_j,ids] = show_edge(I,MI,thI); | ||
2 | % | ||
3 | % show_edge(I,MI,thI); | ||
4 | % | ||
5 | |||
6 | [id_i,id_j,tmp] = find(MI); | ||
7 | ids = sub2ind(size(I),id_i,id_j); | ||
8 | clf;im(I);colormap(gray);hold on; | ||
9 | quiver(id_j,id_i,-sin(thI(ids)),cos(thI(ids)),0.5);hold off; | ||
10 | |||
11 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/spmtimesd.c b/SD-VBS/common/toolbox/toolbox_basic/common/spmtimesd.c new file mode 100755 index 0000000..a98dc0a --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/spmtimesd.c | |||
@@ -0,0 +1,141 @@ | |||
1 | /*================================================================ | ||
2 | * spmtimesd.c | ||
3 | * This routine computes a sparse matrix times a diagonal matrix | ||
4 | * whose diagonal entries are stored in a full vector. | ||
5 | * | ||
6 | * Examples: | ||
7 | * spmtimesd(m,d,[]) = diag(d) * m, | ||
8 | * spmtimesd(m,[],d) = m * diag(d) | ||
9 | * spmtimesd(m,d1,d2) = diag(d1) * m * diag(d2) | ||
10 | * m could be complex, but d is assumed real | ||
11 | * | ||
12 | * Stella X. Yu's first MEX function, Nov 9, 2001. | ||
13 | |||
14 | % test sequence: | ||
15 | |||
16 | m = 1000; | ||
17 | n = 2000; | ||
18 | a=sparse(rand(m,n)); | ||
19 | d1 = rand(m,1); | ||
20 | d2 = rand(n,1); | ||
21 | tic; b=spmtimesd(a,d1,d2); toc | ||
22 | tic; bb = spdiags(d1,0,m,m) * a * spdiags(d2,0,n,n); toc | ||
23 | e = (bb-b); | ||
24 | max(abs(e(:))) | ||
25 | |||
26 | *=================================================================*/ | ||
27 | |||
28 | # include "mex.h" | ||
29 | |||
30 | void mexFunction( | ||
31 | int nargout, | ||
32 | mxArray *out[], | ||
33 | int nargin, | ||
34 | const mxArray *in[] | ||
35 | ) | ||
36 | { | ||
37 | /* declare variables */ | ||
38 | int i, j, k, m, n, nzmax, cmplx, xm, yn; | ||
39 | int *pir, *pjc, *qir, *qjc; | ||
40 | double *x, *y, *pr, *pi, *qr, *qi; | ||
41 | |||
42 | /* check argument */ | ||
43 | if (nargin != 3) { | ||
44 | mexErrMsgTxt("Three input arguments required"); | ||
45 | } | ||
46 | if (nargout>1) { | ||
47 | mexErrMsgTxt("Too many output arguments."); | ||
48 | } | ||
49 | if (!(mxIsSparse(in[0]))) { | ||
50 | mexErrMsgTxt("Input argument #1 must be of type sparse"); | ||
51 | } | ||
52 | if ( mxIsSparse(in[1]) || mxIsSparse(in[2]) ) { | ||
53 | mexErrMsgTxt("Input argument #2 & #3 must be of type full"); | ||
54 | } | ||
55 | |||
56 | /* computation starts */ | ||
57 | m = mxGetM(in[0]); | ||
58 | n = mxGetN(in[0]); | ||
59 | pr = mxGetPr(in[0]); | ||
60 | pi = mxGetPi(in[0]); | ||
61 | pir = mxGetIr(in[0]); | ||
62 | pjc = mxGetJc(in[0]); | ||
63 | |||
64 | i = mxGetM(in[1]); | ||
65 | j = mxGetN(in[1]); | ||
66 | xm = ((i>j)? i: j); | ||
67 | |||
68 | i = mxGetM(in[2]); | ||
69 | j = mxGetN(in[2]); | ||
70 | yn = ((i>j)? i: j); | ||
71 | |||
72 | if ( xm>0 && xm != m) { | ||
73 | mexErrMsgTxt("Row multiplication dimension mismatch."); | ||
74 | } | ||
75 | if ( yn>0 && yn != n) { | ||
76 | mexErrMsgTxt("Column multiplication dimension mismatch."); | ||
77 | } | ||
78 | |||
79 | |||
80 | nzmax = mxGetNzmax(in[0]); | ||
81 | cmplx = (pi==NULL ? 0 : 1); | ||
82 | out[0] = mxCreateSparse(m,n,nzmax,cmplx); | ||
83 | if (out[0]==NULL) { | ||
84 | mexErrMsgTxt("Not enough space for the output matrix."); | ||
85 | } | ||
86 | |||
87 | qr = mxGetPr(out[0]); | ||
88 | qi = mxGetPi(out[0]); | ||
89 | qir = mxGetIr(out[0]); | ||
90 | qjc = mxGetJc(out[0]); | ||
91 | |||
92 | /* left multiplication */ | ||
93 | x = mxGetPr(in[1]); | ||
94 | if (yn==0) { | ||
95 | for (j=0; j<n; j++) { | ||
96 | qjc[j] = pjc[j]; | ||
97 | for (k=pjc[j]; k<pjc[j+1]; k++) { | ||
98 | i = pir[k]; | ||
99 | qir[k] = i; | ||
100 | qr[k] = x[i] * pr[k]; | ||
101 | if (cmplx) { | ||
102 | qi[k] = x[i] * pi[k]; | ||
103 | } | ||
104 | } | ||
105 | } | ||
106 | qjc[n] = k; | ||
107 | return; | ||
108 | } | ||
109 | |||
110 | /* right multiplication */ | ||
111 | y = mxGetPr(in[2]); | ||
112 | if (xm==0) { | ||
113 | for (j=0; j<n; j++) { | ||
114 | qjc[j] = pjc[j]; | ||
115 | for (k=pjc[j]; k<pjc[j+1]; k++) { | ||
116 | qir[k] = pir[k]; | ||
117 | qr[k] = pr[k] * y[j]; | ||
118 | if (cmplx) { | ||
119 | qi[k] = qi[k] * y[j]; | ||
120 | } | ||
121 | } | ||
122 | } | ||
123 | qjc[n] = k; | ||
124 | return; | ||
125 | } | ||
126 | |||
127 | /* both sides */ | ||
128 | for (j=0; j<n; j++) { | ||
129 | qjc[j] = pjc[j]; | ||
130 | for (k=pjc[j]; k<pjc[j+1]; k++) { | ||
131 | i = pir[k]; | ||
132 | qir[k]= i; | ||
133 | qr[k] = x[i] * pr[k] * y[j]; | ||
134 | if (cmplx) { | ||
135 | qi[k] = x[i] * qi[k] * y[j]; | ||
136 | } | ||
137 | } | ||
138 | qjc[n] = k; | ||
139 | } | ||
140 | |||
141 | } | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/spmtimesd.mexa64 b/SD-VBS/common/toolbox/toolbox_basic/common/spmtimesd.mexa64 new file mode 100755 index 0000000..15fa9d2 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/spmtimesd.mexa64 | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/spmtimesd.mexglx b/SD-VBS/common/toolbox/toolbox_basic/common/spmtimesd.mexglx new file mode 100755 index 0000000..7478fb0 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/spmtimesd.mexglx | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/tmp.tex b/SD-VBS/common/toolbox/toolbox_basic/common/tmp.tex new file mode 100755 index 0000000..0458ef3 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/tmp.tex | |||
@@ -0,0 +1,16 @@ | |||
1 | Hi Prof. Geiger, | ||
2 | |||
3 | My name is Jianbo Shi. I am a graduate student working | ||
4 | with Jitendra Malik at UC Berkeley. My current research interest is | ||
5 | on the topic of grouping and perceptual organization. I have read | ||
6 | many of your works in this area. | ||
7 | |||
8 | I will be giving a talk at NECI and David Sarnoff Lab on Dec. 8 | ||
9 | and 9 on ``Normalized cuts and its application to motion segmentation''. | ||
10 | I am wondering if I could visit you and your lab on Dec. 10. I would | ||
11 | very much like the opportunity to talk to you on varies topics related | ||
12 | to the problem of grouping. Let me know if that is possible. | ||
13 | |||
14 | -thanks! | ||
15 | |||
16 | -Jianbo | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/vmquant.m b/SD-VBS/common/toolbox/toolbox_basic/common/vmquant.m new file mode 100755 index 0000000..ab4eb28 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/vmquant.m | |||
@@ -0,0 +1,112 @@ | |||
1 | function [im, map] = vmquant(arg1,arg2,arg3,arg4,arg5,arg6,arg7) | ||
2 | %VMQUANT Variance Minimization Color Quantization. | ||
3 | % [X, MAP] = VMQUANT(R,G,B,K,[Qr Qg Qb],DITHER,Qe) or | ||
4 | % VMQUANT(RGB,K,[Qr Qg Qb],DITHER,Qe), where RGB is a 3-D array, | ||
5 | % converts an arbitrary image comprised of RGB triples into an | ||
6 | % indexed image X with color map MAP. K specifies the number | ||
7 | % of desired entries in the target color map, and [Qr Qg Qb] | ||
8 | % specifies the number of quantization bits to assign each color | ||
9 | % axis during color interpolation. DITHER is a string ('dither' or | ||
10 | % 'nodither') that indicates whether or not to perform error propagation | ||
11 | % dither on the output image. Qe specifies the number of bits of | ||
12 | % quantization used in the error calculations. | ||
13 | % | ||
14 | % K is optional and defaults to 256. | ||
15 | % [Qr Qg Qb] is optional and defaults to [5 5 5]. | ||
16 | % DITHER is optional and defaults to 'nodither'. | ||
17 | % Qe is optional and defaults to 8. | ||
18 | % | ||
19 | % See also: RGB2IND, RGB2GRAY, DITHER, IND2RGB, CMUNIQUE, IMAPPROX. | ||
20 | |||
21 | % This is the wrapper function for the MEX file VMQUANTC.C | ||
22 | |||
23 | % Joseph M. Winograd 6-93 | ||
24 | % Copyright (c) 1993 by The MathWorks, Inc. | ||
25 | % $Revision: 5.3 $ $Date: 1996/08/22 22:09:03 $ | ||
26 | |||
27 | % Reference: Xiaolin Wu, "Efficient Statistical Computation for | ||
28 | % Optimal Color Quantization," Graphics Gems II, (ed. James | ||
29 | % Arvo). Academic Press: Boston. 1991. | ||
30 | |||
31 | if nargin < 1, | ||
32 | error('Not enough input arguments.'); | ||
33 | end | ||
34 | |||
35 | threeD = (ndims(arg1)==3); % Determine if input includes a 3-D array | ||
36 | |||
37 | if threeD, | ||
38 | error( nargchk( 1, 5, nargin ) ); | ||
39 | |||
40 | % NOTE: If you change defaults, change them also | ||
41 | % in VMQUANTC.C and recompile the MEX function. | ||
42 | if nargin < 5 | ||
43 | arg5 = 8; % DEFAULT_QE = 8 | ||
44 | end | ||
45 | |||
46 | if nargin < 4 | ||
47 | arg4 = 'n'; % DEFAULT_DITHER = 0 | ||
48 | end | ||
49 | |||
50 | if nargin < 3 | ||
51 | arg3 = [5 5 5]; % DEFAULT_Q = [5 5 5] | ||
52 | end | ||
53 | |||
54 | if nargin < 2 | ||
55 | arg2 = 256; % DEFAULT_K = 256 | ||
56 | end | ||
57 | |||
58 | rout = arg1(:,:,1); | ||
59 | g = arg1(:,:,2); | ||
60 | b = arg1(:,:,3); | ||
61 | |||
62 | if strcmp(lower(arg4(1)),'d') | ||
63 | dith = 1; | ||
64 | else | ||
65 | dith = 0; | ||
66 | end | ||
67 | |||
68 | arg7 = arg5; | ||
69 | arg5 = arg3; | ||
70 | arg4 = arg2; | ||
71 | |||
72 | else | ||
73 | error( nargchk( 3, 7, nargin ) ); | ||
74 | |||
75 | if nargin < 7 | ||
76 | arg7 = 8; % DEFAULT_QE = 8 | ||
77 | end | ||
78 | |||
79 | if nargin < 6 | ||
80 | arg6 = 'n'; % DEFAULT_DITHER = 0 | ||
81 | end | ||
82 | |||
83 | if nargin < 5 | ||
84 | arg5 = [5 5 5]; % DEFAULT_Q = [5 5 5] | ||
85 | end | ||
86 | |||
87 | if nargin < 4 | ||
88 | arg4 = 256; % DEFAULT_K = 256 | ||
89 | end | ||
90 | |||
91 | rout = arg1; | ||
92 | g = arg2; | ||
93 | b = arg3; | ||
94 | |||
95 | if strcmp(lower(arg6(1)),'d') | ||
96 | dith = 1; | ||
97 | else | ||
98 | dith = 0; | ||
99 | end | ||
100 | |||
101 | end | ||
102 | |||
103 | if (~isa(rout,'uint8')) | ||
104 | rout = uint8(round(255*rout)); | ||
105 | end | ||
106 | if (~isa(g,'uint8')) | ||
107 | g = uint8(round(255*g)); | ||
108 | end | ||
109 | if (~isa(b,'uint8')) | ||
110 | b = uint8(round(255*b)); | ||
111 | end | ||
112 | [im,map] = vmquantc( rout, g, b, arg4, arg5, dith, arg7 ); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/vmquantc.mexhp7 b/SD-VBS/common/toolbox/toolbox_basic/common/vmquantc.mexhp7 new file mode 100755 index 0000000..c0e35c4 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/vmquantc.mexhp7 | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/vmquantc.mexlx b/SD-VBS/common/toolbox/toolbox_basic/common/vmquantc.mexlx new file mode 100755 index 0000000..f79c1d3 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/vmquantc.mexlx | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/vmquantc.mexsol b/SD-VBS/common/toolbox/toolbox_basic/common/vmquantc.mexsol new file mode 100755 index 0000000..f711a98 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/vmquantc.mexsol | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/writepdm.m b/SD-VBS/common/toolbox/toolbox_basic/common/writepdm.m new file mode 100755 index 0000000..a8cba11 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/writepdm.m | |||
@@ -0,0 +1,11 @@ | |||
1 | function writepfm(name,I) | ||
2 | % | ||
3 | % writepfm(name,I) | ||
4 | % | ||
5 | [nr,nc] = size(I); | ||
6 | |||
7 | fid = fopen(name, 'w'); | ||
8 | fprintf(fid, '%d %d\n', nr,nc); | ||
9 | fprintf(fid,'%d ',I'); | ||
10 | fclose(fid); | ||
11 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/common/writepfm.m b/SD-VBS/common/toolbox/toolbox_basic/common/writepfm.m new file mode 100755 index 0000000..ee25fdc --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/common/writepfm.m | |||
@@ -0,0 +1,11 @@ | |||
1 | function writepfm(name,I) | ||
2 | % | ||
3 | % writepfm(name,I) | ||
4 | % | ||
5 | [nr,nc] = size(I); | ||
6 | |||
7 | fid = fopen(name, 'w'); | ||
8 | fprintf(fid, '%d %d\n', nr,nc); | ||
9 | fprintf(fid,'%f ',I'); | ||
10 | fclose(fid); | ||
11 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/disp/disp_image.m b/SD-VBS/common/toolbox/toolbox_basic/disp/disp_image.m new file mode 100755 index 0000000..4745d8d --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/disp/disp_image.m | |||
@@ -0,0 +1,19 @@ | |||
1 | function disp_image(img,sze,index,mask) | ||
2 | |||
3 | %figure(2) | ||
4 | subplot(sze(1),sze(2),index); | ||
5 | |||
6 | if (size(mask) ~= size(mask)), | ||
7 | error(['size of image is ',int2str(size(mask)),' size of mask is ',... | ||
8 | int2str(size(mask))]); | ||
9 | end | ||
10 | |||
11 | img = img-min(min(img)); | ||
12 | I = 0*(img.*(~mask)) + img.*mask; | ||
13 | I = img.*mask; | ||
14 | colormap(gray) | ||
15 | imagesc(I); | ||
16 | %axis('off') | ||
17 | axis('equal'); | ||
18 | axis('square'); | ||
19 | drawnow; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/disp/draw_box.m b/SD-VBS/common/toolbox/toolbox_basic/disp/draw_box.m new file mode 100755 index 0000000..556afdc --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/disp/draw_box.m | |||
@@ -0,0 +1,9 @@ | |||
1 | function draw_box(left,right,top,down) | ||
2 | |||
3 | plot([left,right],[top,top]); | ||
4 | hold on | ||
5 | plot([left,right],[down,down]); | ||
6 | hold on | ||
7 | plot([left,left],[top,down]); | ||
8 | hold on | ||
9 | plot([right,right],[top,down]); \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/disp/draw_box2.m b/SD-VBS/common/toolbox/toolbox_basic/disp/draw_box2.m new file mode 100755 index 0000000..adec284 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/disp/draw_box2.m | |||
@@ -0,0 +1,17 @@ | |||
1 | function draw_box(center,w_h,j) | ||
2 | |||
3 | |||
4 | center_x = center(1); | ||
5 | center_y = center(2); | ||
6 | |||
7 | %plot(center_x,center_y,'r*'); | ||
8 | %text(center_x,center_y,int2str(j)); | ||
9 | |||
10 | l_x = center_x-w_h(1); | ||
11 | r_x = center_x+w_h(1); | ||
12 | u_y = center_y-w_h(2); | ||
13 | l_y = center_y+w_h(2); | ||
14 | |||
15 | plot([l_x,r_x,r_x,l_x,l_x],[u_y,u_y,l_y,l_y,u_y],'c'); | ||
16 | |||
17 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/disp/im.m b/SD-VBS/common/toolbox/toolbox_basic/disp/im.m new file mode 100755 index 0000000..a707916 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/disp/im.m | |||
@@ -0,0 +1,8 @@ | |||
1 | function im(I) | ||
2 | |||
3 | imagesc(I);drawnow; | ||
4 | pixval on | ||
5 | title(inputname(1)) | ||
6 | %colormap(gray) | ||
7 | %colorbar | ||
8 | axis('image') | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/disp/ims.m b/SD-VBS/common/toolbox/toolbox_basic/disp/ims.m new file mode 100755 index 0000000..2fb5f25 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/disp/ims.m | |||
@@ -0,0 +1,3 @@ | |||
1 | function ims(I,nr,nc) | ||
2 | |||
3 | im(reshape(I,nr,nc)); \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/disp/montage2.m b/SD-VBS/common/toolbox/toolbox_basic/disp/montage2.m new file mode 100755 index 0000000..fb04b0b --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/disp/montage2.m | |||
@@ -0,0 +1,17 @@ | |||
1 | function montage2(FI) | ||
2 | % montage2(FI) | ||
3 | % display 3D stack of images in a montage | ||
4 | |||
5 | [N1,N2,N3]=size(FI); | ||
6 | Q=zeros(N1,N2,1,N3); | ||
7 | for n=1:N3 | ||
8 | Q(:,:,1,n)=FI(:,:,n); | ||
9 | end | ||
10 | |||
11 | a=min(Q(:)); | ||
12 | b=max(Q(:)); | ||
13 | |||
14 | Q=Q-a; | ||
15 | Q=Q/(b-a); | ||
16 | |||
17 | montage(Q); \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/disp/showmask.m b/SD-VBS/common/toolbox/toolbox_basic/disp/showmask.m new file mode 100755 index 0000000..f301638 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/disp/showmask.m | |||
@@ -0,0 +1,20 @@ | |||
1 | function showmask(V,M,display_flag); | ||
2 | % showmask(V,M); | ||
3 | % | ||
4 | % M is a nonneg. mask | ||
5 | |||
6 | V=V-min(V(:)); | ||
7 | V=V/max(V(:)); | ||
8 | V=.25+0.75*V; %brighten things up a bit | ||
9 | |||
10 | M=M-min(M(:)); | ||
11 | M=M/max(M(:)); | ||
12 | |||
13 | H=0.0+zeros(size(V)); | ||
14 | S=M; | ||
15 | RGB=hsv2rgb(H,S,V); | ||
16 | |||
17 | %if nargin>2 | ||
18 | image(RGB) | ||
19 | axis('image') | ||
20 | %end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/disp/showmaskb.m b/SD-VBS/common/toolbox/toolbox_basic/disp/showmaskb.m new file mode 100755 index 0000000..1f67ba2 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/disp/showmaskb.m | |||
@@ -0,0 +1,20 @@ | |||
1 | function RGB = showmask(V,M,M2,display_flag); | ||
2 | % showmask(V,M); | ||
3 | % | ||
4 | % M is a nonneg. mask | ||
5 | |||
6 | V=V-min(V(:)); | ||
7 | V=V/max(V(:)); | ||
8 | V=.25+0.75*V; %brighten things up a bit | ||
9 | |||
10 | M=M-min(M(:)); | ||
11 | M=M/max(M(:)); | ||
12 | |||
13 | H=0.6*M2+0*M; | ||
14 | S=min(1,M2+M); | ||
15 | RGB=hsv2rgb(H,S,V); | ||
16 | |||
17 | %if nargin>2 | ||
18 | image(RGB) | ||
19 | axis('image') | ||
20 | %end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/fact/construct_w.m b/SD-VBS/common/toolbox/toolbox_basic/fact/construct_w.m new file mode 100755 index 0000000..372b4b6 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/fact/construct_w.m | |||
@@ -0,0 +1,25 @@ | |||
1 | function W = construct_w(centers,Ds,img_center,indexes,frames) | ||
2 | % | ||
3 | % function W = construct_w(centers,Ds,img_center,indexes,frames) | ||
4 | % optional: frames | ||
5 | % | ||
6 | |||
7 | |||
8 | points = length(indexes); | ||
9 | if (nargin == 4), | ||
10 | frames = 0.5*size(centers,2); | ||
11 | end | ||
12 | |||
13 | W = zeros(2*frames,points); | ||
14 | |||
15 | center_x = img_center(1); | ||
16 | center_y = img_center(2); | ||
17 | |||
18 | for j=1:frames, | ||
19 | % x is centers(:,2*j-1) | ||
20 | % y is centers(:,2*j) | ||
21 | % d is Ds(:,2*j-1) | ||
22 | W(j,:) = (centers(indexes,2*j-1) -center_x)'./Ds(indexes,2*j-1)'; | ||
23 | W(j+frames,:) = (centers(indexes,2*j) -center_y)'./Ds(indexes,2*j-1)'; | ||
24 | % W(j+2*frames,:) = ones(1,points)./Ds(indexes,2*j-1)'; | ||
25 | end \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/fact/construct_w2.m b/SD-VBS/common/toolbox/toolbox_basic/fact/construct_w2.m new file mode 100755 index 0000000..b2939b7 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/fact/construct_w2.m | |||
@@ -0,0 +1,25 @@ | |||
1 | function W = construct_w2(centers,Ds,img_center,indexes,frames) | ||
2 | % | ||
3 | % function W = construct_w2(centers,Ds,img_center,indexes,frames) | ||
4 | % optional: frames | ||
5 | % | ||
6 | |||
7 | |||
8 | points = length(indexes); | ||
9 | if (nargin == 4), | ||
10 | frames = 0.5*size(centers,2); | ||
11 | end | ||
12 | |||
13 | W = zeros(3*frames,points); | ||
14 | |||
15 | center_x = img_center(1); | ||
16 | center_y = img_center(2); | ||
17 | |||
18 | for j=1:frames, | ||
19 | % x is centers(:,2*j-1) | ||
20 | % y is centers(:,2*j) | ||
21 | % d is Ds(:,2*j-1) | ||
22 | W(j,:) = (centers(indexes,2*j-1) -center_x)'./Ds(indexes,2*j-1)'; | ||
23 | W(j+frames,:) = (centers(indexes,2*j) -center_y)'./Ds(indexes,2*j-1)'; | ||
24 | W(j+2*frames,:) = ones(1,points)./Ds(indexes,2*j-1)'; | ||
25 | end \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/fact/factor.m b/SD-VBS/common/toolbox/toolbox_basic/fact/factor.m new file mode 100755 index 0000000..635c29a --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/fact/factor.m | |||
@@ -0,0 +1,50 @@ | |||
1 | % | ||
2 | % Usage: | ||
3 | % | ||
4 | % [R,t,S] = factor(W) | ||
5 | % | ||
6 | % Function to factor a matrix of input data (W) into the camera | ||
7 | % rotation matrix (R), translation (t), and the shape matrix (S). | ||
8 | % Three-dimensional version. Failure of normalization results in | ||
9 | % empty R and S. | ||
10 | |||
11 | function [R,t,S] = factor(W) | ||
12 | |||
13 | pts = size(W,2); | ||
14 | t = W*ones(pts,1)/pts; | ||
15 | W = W - t*ones(1,pts); | ||
16 | |||
17 | % Use SVD to factor W. | ||
18 | [a,b,c] = svd(W,0); | ||
19 | |||
20 | smallb = b(1:3,1:3); % Since W is rank 3, b has only three meaningful values | ||
21 | sqrtb = sqrt(smallb); | ||
22 | Rhat = a(:,1:3) * sqrtb; | ||
23 | Shat = sqrtb * c(:,1:3)'; | ||
24 | |||
25 | G = findG(Rhat); | ||
26 | |||
27 | if size(G,1) == 0, | ||
28 | R = []; | ||
29 | S = []; | ||
30 | else | ||
31 | R = Rhat*G; | ||
32 | S = inv(G)*Shat; | ||
33 | |||
34 | % rotation matrix that aligns the reference frame with the first camera | ||
35 | F = size(R,1)/2; | ||
36 | R1 = R(1,:); | ||
37 | R1 = R1/norm(R1); | ||
38 | R2 = R(F+1,:); | ||
39 | R2 = R2/norm(R2); | ||
40 | R3 = cross(R1,R2); | ||
41 | R3 = R3/norm(R3); | ||
42 | P = [R1; R2; R3]; | ||
43 | P = P'; | ||
44 | |||
45 | R = R*P; | ||
46 | S = inv(P)*S; | ||
47 | end | ||
48 | |||
49 | |||
50 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/fact/factor_test.m b/SD-VBS/common/toolbox/toolbox_basic/fact/factor_test.m new file mode 100755 index 0000000..12ceb95 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/fact/factor_test.m | |||
@@ -0,0 +1,52 @@ | |||
1 | % | ||
2 | % Usage: | ||
3 | % | ||
4 | % [R,t,S] = factor(W) | ||
5 | % | ||
6 | % Function to factor a matrix of input data (W) into the camera | ||
7 | % rotation matrix (R), translation (t), and the shape matrix (S). | ||
8 | % Three-dimensional version. Failure of normalization results in | ||
9 | % empty R and S. | ||
10 | |||
11 | function [R,t,S,C,b] = factor(W) | ||
12 | |||
13 | pts = size(W,2); | ||
14 | t = W*ones(pts,1)/pts; | ||
15 | W = W - t*ones(1,pts); | ||
16 | |||
17 | % Use SVD to factor W. | ||
18 | [a,b,c] = svd(W,0); | ||
19 | |||
20 | figure(3);plot(diag(b)) | ||
21 | |||
22 | smallb = b(1:3,1:3); % Since W is rank 3, b has only three meaningful values | ||
23 | sqrtb = sqrt(smallb); | ||
24 | Rhat = a(:,1:3) * sqrtb; | ||
25 | Shat = sqrtb * c(:,1:3)'; | ||
26 | |||
27 | [G,C] = findg1(Rhat); | ||
28 | |||
29 | if size(G,1) == 0, | ||
30 | R = []; | ||
31 | S = []; | ||
32 | else | ||
33 | R = Rhat*G; | ||
34 | S = inv(G)*Shat; | ||
35 | |||
36 | % rotation matrix that aligns the reference frame with the first camera | ||
37 | F = size(R,1)/2; | ||
38 | R1 = R(1,:); | ||
39 | R1 = R1/norm(R1); | ||
40 | R2 = R(F+1,:); | ||
41 | R2 = R2/norm(R2); | ||
42 | R3 = cross(R1,R2); | ||
43 | R3 = R3/norm(R3); | ||
44 | P = [R1; R2; R3]; | ||
45 | P = P'; | ||
46 | |||
47 | R = R*P; | ||
48 | S = inv(P)*S; | ||
49 | end | ||
50 | |||
51 | |||
52 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/fact/factor_test2.m b/SD-VBS/common/toolbox/toolbox_basic/fact/factor_test2.m new file mode 100755 index 0000000..3520122 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/fact/factor_test2.m | |||
@@ -0,0 +1,52 @@ | |||
1 | % | ||
2 | % Usage: | ||
3 | % | ||
4 | % [R,t,S] = factor(W) | ||
5 | % | ||
6 | % Function to factor a matrix of input data (W) into the camera | ||
7 | % rotation matrix (R), translation (t), and the shape matrix (S). | ||
8 | % Three-dimensional version. Failure of normalization results in | ||
9 | % empty R and S. | ||
10 | |||
11 | function [R,t,S,C,b] = factor(W) | ||
12 | |||
13 | pts = size(W,2); | ||
14 | t = W*ones(pts,1)/pts; | ||
15 | W = W - t*ones(1,pts); | ||
16 | |||
17 | % Use SVD to factor W. | ||
18 | [a,b,c] = svd(W,0); | ||
19 | |||
20 | figure(3);plot(diag(b)) | ||
21 | |||
22 | smallb = b(1:3,1:3); % Since W is rank 3, b has only three meaningful values | ||
23 | sqrtb = sqrt(smallb); | ||
24 | Rhat = a(:,1:3) * sqrtb; | ||
25 | Shat = sqrtb * c(:,1:3)'; | ||
26 | |||
27 | [G,C] = findg2(Rhat); | ||
28 | |||
29 | if size(G,1) == 0, | ||
30 | R = []; | ||
31 | S = []; | ||
32 | else | ||
33 | R = Rhat*G; | ||
34 | S = inv(G)*Shat; | ||
35 | |||
36 | % rotation matrix that aligns the reference frame with the first camera | ||
37 | F = size(R,1)/2; | ||
38 | R1 = R(1,:); | ||
39 | R1 = R1/norm(R1); | ||
40 | R2 = R(F+1,:); | ||
41 | R2 = R2/norm(R2); | ||
42 | R3 = cross(R1,R2); | ||
43 | R3 = R3/norm(R3); | ||
44 | P = [R1; R2; R3]; | ||
45 | P = P'; | ||
46 | |||
47 | R = R*P; | ||
48 | S = inv(P)*S; | ||
49 | end | ||
50 | |||
51 | |||
52 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/fact/factorizaion.tar b/SD-VBS/common/toolbox/toolbox_basic/fact/factorizaion.tar new file mode 100755 index 0000000..133cdff --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/fact/factorizaion.tar | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/fact/findG.m b/SD-VBS/common/toolbox/toolbox_basic/fact/findG.m new file mode 100755 index 0000000..9a6bd73 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/fact/findG.m | |||
@@ -0,0 +1,48 @@ | |||
1 | function G = find3G(Rhat) | ||
2 | |||
3 | % number of frames | ||
4 | F = size(Rhat,1)/2; | ||
5 | |||
6 | % Build matrix Q such that Q * v = [1,...,1,0,...,0] where v is a six | ||
7 | % element vector containg all six distinct elements of the Matrix C | ||
8 | |||
9 | clear Q | ||
10 | for f = 1:F, | ||
11 | g = f + F; | ||
12 | h = g + F; | ||
13 | Q(f,:) = zt(Rhat(f,:), Rhat(f,:)); | ||
14 | Q(g,:) = zt(Rhat(g,:), Rhat(g,:)); | ||
15 | Q(h,:) = zt(Rhat(f,:), Rhat(g,:)); | ||
16 | end | ||
17 | |||
18 | % Solve for v | ||
19 | rhs = [ones(2*F,1); zeros(F,1)]; | ||
20 | v = Q \ rhs; | ||
21 | |||
22 | % C is a symmetric 3x3 matrix such that C = G * transpose(G) | ||
23 | C(1,1) = v(1); | ||
24 | C(1,2) = v(2); | ||
25 | C(1,3) = v(3); | ||
26 | C(2,2) = v(4); | ||
27 | C(2,3) = v(5); | ||
28 | C(3,3) = v(6); | ||
29 | C(2,1) = C(1,2); | ||
30 | C(3,1) = C(1,3); | ||
31 | C(3,2) = C(2,3); | ||
32 | |||
33 | e = eig(C); | ||
34 | disp(e) | ||
35 | |||
36 | if (any(e<= 0)), | ||
37 | G = []; | ||
38 | else | ||
39 | G = sqrtm(C); | ||
40 | end | ||
41 | |||
42 | %neg = 0; | ||
43 | %if e(1) <= 0, neg = 1; end | ||
44 | %if e(2) <= 0, neg = 1; end | ||
45 | %if e(3) <= 0, neg = 1; end | ||
46 | %if neg == 1, G = []; | ||
47 | %else G = sqrtm(C); | ||
48 | %end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/fact/findg1.m b/SD-VBS/common/toolbox/toolbox_basic/fact/findg1.m new file mode 100755 index 0000000..f14ecc6 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/fact/findg1.m | |||
@@ -0,0 +1,49 @@ | |||
1 | function [G,C] = find3G(Rhat) | ||
2 | |||
3 | % number of frames | ||
4 | F = size(Rhat,1)/2; | ||
5 | |||
6 | % Build matrix Q such that Q * v = [1,...,1,0,...,0] where v is a six | ||
7 | % element vector containg all six distinct elements of the Matrix C | ||
8 | |||
9 | clear Q | ||
10 | for f = 1:F, | ||
11 | g = f + F; | ||
12 | h = g + F; | ||
13 | Q(f,:) = zt(Rhat(f,:), Rhat(f,:)); | ||
14 | Q(g,:) = zt(Rhat(g,:), Rhat(g,:)); | ||
15 | Q(h,:) = zt(Rhat(f,:), Rhat(g,:)); | ||
16 | end | ||
17 | |||
18 | % Solve for v | ||
19 | rhs = [ones(2*F,1); zeros(F,1)]; | ||
20 | v = Q \ rhs; | ||
21 | |||
22 | % C is a symmetric 3x3 matrix such that C = G * transpose(G) | ||
23 | C(1,1) = v(1); | ||
24 | C(1,2) = v(2); | ||
25 | C(1,3) = v(3); | ||
26 | C(2,2) = v(4); | ||
27 | C(2,3) = v(5); | ||
28 | C(3,3) = v(6); | ||
29 | C(2,1) = C(1,2); | ||
30 | C(3,1) = C(1,3); | ||
31 | C(3,2) = C(2,3); | ||
32 | |||
33 | e = eig(C); | ||
34 | disp(e) | ||
35 | |||
36 | if (any(e<= 0)), | ||
37 | C = C -2*min(e)*eye(3); | ||
38 | G = sqrtm(C); | ||
39 | else | ||
40 | G = sqrtm(C); | ||
41 | end | ||
42 | |||
43 | %neg = 0; | ||
44 | %if e(1) <= 0, neg = 1; end | ||
45 | %if e(2) <= 0, neg = 1; end | ||
46 | %if e(3) <= 0, neg = 1; end | ||
47 | %if neg == 1, G = []; | ||
48 | %else G = sqrtm(C); | ||
49 | %end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/fact/findg2.m b/SD-VBS/common/toolbox/toolbox_basic/fact/findg2.m new file mode 100755 index 0000000..5a84b86 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/fact/findg2.m | |||
@@ -0,0 +1,56 @@ | |||
1 | function [G,C] = find3G(Rhat) | ||
2 | |||
3 | % number of frames | ||
4 | F = size(Rhat,1)/3; | ||
5 | |||
6 | % Build matrix Q such that Q * v = [1,...,1,0,...,0] where v is a six | ||
7 | % element vector containg all six distinct elements of the Matrix C | ||
8 | |||
9 | clear Q | ||
10 | for f = 1:F, | ||
11 | g = f + F; | ||
12 | h = g + F; | ||
13 | j = h + F; | ||
14 | k = j + F; | ||
15 | l = k + F; | ||
16 | Q(f,:) = zt(Rhat(f,:), Rhat(f,:)); | ||
17 | Q(g,:) = zt(Rhat(g,:), Rhat(g,:)); | ||
18 | Q(h,:) = zt(Rhat(h,:), Rhat(h,:)); | ||
19 | Q(j,:) = zt(Rhat(f,:), Rhat(g,:)); | ||
20 | Q(k,:) = zt(Rhat(f,:), Rhat(h,:)); | ||
21 | Q(l,:) = zt(Rhat(g,:), Rhat(h,:)); | ||
22 | end | ||
23 | |||
24 | % Solve for v | ||
25 | rhs = [ones(3*F,1); zeros(3*F,1)]; | ||
26 | v = Q \ rhs; | ||
27 | |||
28 | % C is a symmetric 3x3 matrix such that C = G * transpose(G) | ||
29 | C(1,1) = v(1); | ||
30 | C(1,2) = v(2); | ||
31 | C(1,3) = v(3); | ||
32 | C(2,2) = v(4); | ||
33 | C(2,3) = v(5); | ||
34 | C(3,3) = v(6); | ||
35 | C(2,1) = C(1,2); | ||
36 | C(3,1) = C(1,3); | ||
37 | C(3,2) = C(2,3); | ||
38 | |||
39 | e = eig(C); | ||
40 | disp(e) | ||
41 | |||
42 | |||
43 | if (any(e<= 0)), | ||
44 | C = C -2*min(e)*eye(3); | ||
45 | G = sqrtm(C); | ||
46 | else | ||
47 | G = sqrtm(C); | ||
48 | end | ||
49 | |||
50 | %neg = 0; | ||
51 | %if e(1) <= 0, neg = 1; end | ||
52 | %if e(2) <= 0, neg = 1; end | ||
53 | %if e(3) <= 0, neg = 1; end | ||
54 | %if neg == 1, G = []; | ||
55 | %else G = sqrtm(C); | ||
56 | %end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/fact/hotel.mat b/SD-VBS/common/toolbox/toolbox_basic/fact/hotel.mat new file mode 100755 index 0000000..61ea6c8 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/fact/hotel.mat | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/fact/show_3dpoints.m b/SD-VBS/common/toolbox/toolbox_basic/fact/show_3dpoints.m new file mode 100755 index 0000000..b6edfd5 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/fact/show_3dpoints.m | |||
@@ -0,0 +1,22 @@ | |||
1 | function show_3dpoints(S) | ||
2 | |||
3 | |||
4 | for j=1:size(S,2), | ||
5 | x = S(1,j); | ||
6 | y = S(2,j); | ||
7 | z = S(3,j); | ||
8 | plot3(x,y,z,'*'); | ||
9 | hold on; | ||
10 | plot3([x,0],[y,0],[z,0],'r'); | ||
11 | % plot3([x,x],[y,y],[z,0],'r'); | ||
12 | % plot3([x,0],[y,y],[z,z],'r'); plot3([x,x],[y,0],[z,z],'r'); | ||
13 | text(x,y,z,int2str(j)) | ||
14 | % plot3(x,y,0,'co'); | ||
15 | end | ||
16 | |||
17 | grid on | ||
18 | xlabel('x'); | ||
19 | ylabel('y'); | ||
20 | zlabel('z'); | ||
21 | |||
22 | hold off \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/fact/show_S.m b/SD-VBS/common/toolbox/toolbox_basic/fact/show_S.m new file mode 100755 index 0000000..5828696 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/fact/show_S.m | |||
@@ -0,0 +1,17 @@ | |||
1 | function show_S(S,fig) | ||
2 | |||
3 | if (nargin == 1), | ||
4 | figure(1); | ||
5 | else | ||
6 | figure(fig); | ||
7 | end | ||
8 | |||
9 | num_points = size(S,2); | ||
10 | |||
11 | subplot(1,2,1); plot(S(1,:),S(3,:),'cx'); axis('equal');axis('square');hold on | ||
12 | subplot(1,2,2); plot(S(2,:),S(3,:),'cx'); axis('equal');axis('square');hold on | ||
13 | |||
14 | for j=1:num_points, | ||
15 | subplot(1,2,1);text(S(1,j),S(3,j),int2str(j));hold off | ||
16 | subplot(1,2,2);text(S(2,j),S(3,j),int2str(j));hold off | ||
17 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/fact/show_t.m b/SD-VBS/common/toolbox/toolbox_basic/fact/show_t.m new file mode 100755 index 0000000..b475c76 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/fact/show_t.m | |||
@@ -0,0 +1,10 @@ | |||
1 | function show_t(t) | ||
2 | |||
3 | frames = 0.5*length(t); | ||
4 | |||
5 | ts = reshape(t,frames,2); | ||
6 | |||
7 | plot(ts(:,1),ts(:,2)); | ||
8 | hold on | ||
9 | plot(ts(:,1),ts(:,2),'rx'); | ||
10 | hold off; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/fact/show_t3.m b/SD-VBS/common/toolbox/toolbox_basic/fact/show_t3.m new file mode 100755 index 0000000..2766061 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/fact/show_t3.m | |||
@@ -0,0 +1,10 @@ | |||
1 | function show_t(t) | ||
2 | |||
3 | frames = length(t)/3; | ||
4 | |||
5 | ts = reshape(t,frames,3); | ||
6 | |||
7 | plot3(ts(:,1),ts(:,2),ts(:,3)); | ||
8 | hold on | ||
9 | plot3(ts(:,1),ts(:,2),ts(:,3),'rx'); | ||
10 | hold off; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/fact/zt.m b/SD-VBS/common/toolbox/toolbox_basic/fact/zt.m new file mode 100755 index 0000000..3f88d21 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/fact/zt.m | |||
@@ -0,0 +1,6 @@ | |||
1 | % the z' operator described in the paper (returns a row vector) | ||
2 | |||
3 | function v = zt(a, b) | ||
4 | |||
5 | v = [ a(1)*b(1), a(1)*b(2)+a(2)*b(1), a(1)*b(3)+a(3)*b(1), ... | ||
6 | a(2)*b(2), a(2)*b(3)+a(3)*b(2), a(3)*b(3) ]; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/91048.jpg b/SD-VBS/common/toolbox/toolbox_basic/filter/91048.jpg new file mode 100755 index 0000000..6b2313b --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/91048.jpg | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/bar2d.m b/SD-VBS/common/toolbox/toolbox_basic/filter/bar2d.m new file mode 100755 index 0000000..76fa819 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/bar2d.m | |||
@@ -0,0 +1,16 @@ | |||
1 | function kernel = bar2d(sigx,sigy,siz,angle) | ||
2 | |||
3 | X = -siz:.1:siz; | ||
4 | G = exp(-0.5*X.^2/sigx^2); | ||
5 | |||
6 | DGG = (1/sigy^2) * ((X/sigy).^2-1) .* exp(- (X/sigy).^2/2); | ||
7 | %DGG = (X.^2/(sqrt(2*pi)*sigy^5) - 1/(sqrt(2*pi)*sigy^2)) .* ... | ||
8 | % exp(-0.5*X.^2/sigy^2); | ||
9 | |||
10 | K = G'*DGG; | ||
11 | K = rotate_J(angle,K); | ||
12 | |||
13 | K = imresize(K,0.1); | ||
14 | K = K-mean(mean(K)); | ||
15 | |||
16 | kernel = K; \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/barrot.m b/SD-VBS/common/toolbox/toolbox_basic/filter/barrot.m new file mode 100755 index 0000000..bd7676e --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/barrot.m | |||
@@ -0,0 +1,22 @@ | |||
1 | img1 = gifread('color010.gif'); | ||
2 | img1 = img1(220:350,1:200); | ||
3 | img2 = gifread('color-avg.gif'); | ||
4 | img2 = img2(220:350,1:200); | ||
5 | |||
6 | sigx = 3; | ||
7 | sigy = 3; | ||
8 | siz = 8; | ||
9 | angles = 0:19:179; | ||
10 | |||
11 | [Imag1,Iangle1] = brute_force_angle(img1,sigx,sigy,siz,angles); | ||
12 | [Imag2,Iangle2] = brute_force_angle(img2,sigx,sigy,siz,angles); | ||
13 | |||
14 | tresh = max(max(Imag1))*0.1 | ||
15 | D = angle_diff(Imag1,Iangle1,Imag2,Iangle2,tresh); | ||
16 | subplot(2,2,1); imagesc(Iangle1*180/pi); colorbar; | ||
17 | subplot(2,2,2); imagesc(Iangle2*180/pi); colorbar; | ||
18 | subplot(2,2,3); imagesc(D*180/pi); colorbar; | ||
19 | subplot(2,2,4); imagesc(Imag1); colorbar; | ||
20 | colormap(jet) | ||
21 | |||
22 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/bars.m b/SD-VBS/common/toolbox/toolbox_basic/filter/bars.m new file mode 100755 index 0000000..77eccea --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/bars.m | |||
@@ -0,0 +1,39 @@ | |||
1 | function [filt] = bars(X,Y,ks); | ||
2 | %FIL1 the first filter to use has the following specifications: | ||
3 | % | ||
4 | % real part: 2nd derivative of gaussian along Y | ||
5 | % normal gaussian along X | ||
6 | % This filter is elongated along the X direction | ||
7 | % imag part: hilbert transform of the real part | ||
8 | % | ||
9 | % [filt] = fil1(X,Y,ks); | ||
10 | % X,Y : index matrix obtained by meshgrid | ||
11 | % ks : kernel size | ||
12 | % filt : the output kernel | ||
13 | % | ||
14 | |||
15 | %% | ||
16 | %% (c) Thomas Leung | ||
17 | %% California Institute of Technology | ||
18 | %% Feb 27, 1994. | ||
19 | %% | ||
20 | |||
21 | if(nargin == 2) | ||
22 | ks = 17; | ||
23 | end | ||
24 | |||
25 | sigmay = 2.4 * ks / 17; | ||
26 | sigmax = 3 * sigmay; | ||
27 | |||
28 | fxr = exp(-(X/sigmax).^2/2); | ||
29 | fyr = (1/sigmay^2) * ((Y/sigmay).^2-1) .* exp(- (Y/sigmay).^2/2); | ||
30 | nrm = 1/(sigmax*sigmay*2*pi); | ||
31 | |||
32 | % real part of filter | ||
33 | fr = nrm * fxr .* fyr; | ||
34 | |||
35 | % imag part of filter | ||
36 | filt = hilbert(fr); | ||
37 | |||
38 | |||
39 | return; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/clip_image.m b/SD-VBS/common/toolbox/toolbox_basic/filter/clip_image.m new file mode 100755 index 0000000..bf7b50c --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/clip_image.m | |||
@@ -0,0 +1,6 @@ | |||
1 | function J = clip_image(I,w) | ||
2 | |||
3 | [size_y,size_x] = size(I); | ||
4 | |||
5 | J = I(w+1:size_y-w,w+1:size_x-w); | ||
6 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/compute_J_simple.m b/SD-VBS/common/toolbox/toolbox_basic/filter/compute_J_simple.m new file mode 100755 index 0000000..e790601 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/compute_J_simple.m | |||
@@ -0,0 +1,50 @@ | |||
1 | function J = compute_J(I,A,D,base) | ||
2 | %% function J = compute_J(I,A,D) | ||
3 | % | ||
4 | |||
5 | if nargin == 3, | ||
6 | base = -1; | ||
7 | end | ||
8 | |||
9 | [size_y,size_x] = size(I); | ||
10 | [center_x,center_y] = find_center(size_x,size_y); | ||
11 | |||
12 | add_x = round(size_x*0.45); | ||
13 | add_y = round(size_y*0.45); | ||
14 | big_I = base*ones(size_y+2*add_y,size_x+2*add_x); | ||
15 | |||
16 | big_I(add_y+1:add_y+size_y,add_x+1:add_x+size_x) = I; | ||
17 | |||
18 | center_x = add_x+ center_x; | ||
19 | center_y = add_y+ center_y; | ||
20 | [size_y,size_x] = size(big_I); | ||
21 | |||
22 | %a = angle * pi/180; | ||
23 | %A = [cos(a),-sin(a);sin(a),cos(a)]; | ||
24 | |||
25 | [XX,YY] = meshgrid(1:size_x,1:size_y); | ||
26 | |||
27 | x = reshape(XX,size_x*size_y,1); | ||
28 | y = reshape(YY,size_x*size_y,1); | ||
29 | index(:,1) = x-center_x; | ||
30 | |||
31 | %index(:,2) = (size_y+1) - y; | ||
32 | index(:,2) = y-center_y; | ||
33 | |||
34 | position_new = A*index'; | ||
35 | position_new(1,:) = position_new(1,:)+D(1)+center_x; | ||
36 | position_new(2,:) = position_new(2,:)+D(2)+center_y; | ||
37 | %position_new(2,:) = (size_y+1) - position_new(2,:); | ||
38 | |||
39 | position_new_x = reshape(position_new(1,:),size_y,size_x); | ||
40 | position_new_y = reshape(position_new(2,:),size_y,size_x); | ||
41 | |||
42 | J = m_interp4(big_I,position_new_x,position_new_y); | ||
43 | |||
44 | |||
45 | [size_y,size_x] = size(I); | ||
46 | J = J(add_y+1:add_y+size_y,add_x+1:add_x+size_x); | ||
47 | |||
48 | |||
49 | |||
50 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/compute_angle.m b/SD-VBS/common/toolbox/toolbox_basic/filter/compute_angle.m new file mode 100755 index 0000000..7a995af --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/compute_angle.m | |||
@@ -0,0 +1,18 @@ | |||
1 | function [angle,mag,c2,c3] = compute_angle(I) | ||
2 | |||
3 | [g,ga,gb,gc] = compute_g2(I,0); | ||
4 | [h,ha,hb,hc,hd] = compute_h2(I,0); | ||
5 | |||
6 | c2 = 0.5*(ga.^2 - gc.^2) + 0.46875*(ha.^2 - hd.^2) +... | ||
7 | 0.28125*(hb.^2 - hc.^2) + 0.1875*(ha.*hc - hb.*hd); | ||
8 | |||
9 | c3 = -ga.*gb - gb.*gc - 0.9375*(hc.*hd + ha.*hb) -... | ||
10 | 1.6875*hb.*hc - 0.1875*ha.*hd; | ||
11 | |||
12 | [angle,mag] = cart2pol(-c2,-c3); | ||
13 | |||
14 | %angle = angle/2+pi/2; | ||
15 | %angle = (angle>pi).*(angle-2*pi) + (angle<=pi).*angle; | ||
16 | |||
17 | angle = angle/2; | ||
18 | mag = sqrt(mag); \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/compute_filter_fft.m b/SD-VBS/common/toolbox/toolbox_basic/filter/compute_filter_fft.m new file mode 100755 index 0000000..359c6ba --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/compute_filter_fft.m | |||
@@ -0,0 +1,84 @@ | |||
1 | function [filter_output,filters] = compute_filter_fft(I,sig,r,sz,num_ori); | ||
2 | % | ||
3 | % | ||
4 | % | ||
5 | |||
6 | ori_incr=180/num_ori; | ||
7 | ori_offset=ori_incr/2; % helps with equalizing quantiz. error across filter set | ||
8 | |||
9 | as = ori_offset:ori_incr:180+ori_offset-ori_incr; | ||
10 | |||
11 | filter_output = []; | ||
12 | filters = []; | ||
13 | |||
14 | wsz = 2*round(sz(end)) + 1; | ||
15 | M1 = wsz;M2 = wsz; | ||
16 | |||
17 | %%%%% prepare FFT of image %%%%%%%%%%%%% | ||
18 | |||
19 | [N1,N2]=size(I); | ||
20 | tmp=zeros(size(I)+[M1-1 M2-1]); | ||
21 | tmp(1:N1,1:N2)=I; | ||
22 | IF=fft2(tmp); | ||
23 | |||
24 | |||
25 | %%%%%%%%%% filtering stage %%%%%%%%%%% | ||
26 | if size(sig,2)== 1, | ||
27 | |||
28 | for j = 1:length(as), | ||
29 | fprintf('.'); | ||
30 | angle = as(j); | ||
31 | |||
32 | g = mdoog2(sig,r,angle,round(sz)); | ||
33 | |||
34 | g = g - mean(reshape(g,prod(size(g)),1)); | ||
35 | |||
36 | g = g/sum(sum(abs(g))); | ||
37 | |||
38 | filters(:,:,j) = g; | ||
39 | |||
40 | gF = fft2(g,N1+M1-1,N2+M2-1); | ||
41 | IgF = IF.*gF; | ||
42 | Ig = real(ifft2(IgF)); | ||
43 | Ig = Ig(ceil((M1+1)/2):ceil((M1+1)/2)+N1-1,ceil((M2+1)/2):ceil((M2+1)/2)+N2-1); | ||
44 | |||
45 | %c = conv2(I,g,'valid'); | ||
46 | |||
47 | filter_output(:,:,j) = Ig; | ||
48 | end | ||
49 | else | ||
50 | |||
51 | % there are multiple scales | ||
52 | sigs = sig; | ||
53 | szs = sz; | ||
54 | for k = 1:size(sigs,2), | ||
55 | sig = sigs(k); | ||
56 | sz = szs(end); | ||
57 | fprintf('%d',k); | ||
58 | for j = 1:length(as), | ||
59 | fprintf('.'); | ||
60 | angle = as(j); | ||
61 | |||
62 | g = mdoog2(sig,r,angle,round(sz)); | ||
63 | g = g - mean(reshape(g,prod(size(g)),1)); | ||
64 | g = g/sum(sum(abs(g))); | ||
65 | |||
66 | gF = fft2(g,N1+M1-1,N2+M2-1); | ||
67 | IgF = IF.*gF; | ||
68 | Ig = real(ifft2(IgF)); | ||
69 | Ig = Ig(ceil((M1+1)/2):ceil((M1+1)/2)+N1-1,ceil((M2+1)/2):ceil((M2+1)/2)+N2-1); | ||
70 | |||
71 | %c = conv2(I,g,'valid'); | ||
72 | %c = conv2(I,g,'same'); | ||
73 | |||
74 | filter_output(:,:,j,k) = Ig; | ||
75 | filters(:,:,j,k) = g; | ||
76 | end | ||
77 | |||
78 | |||
79 | end | ||
80 | |||
81 | end | ||
82 | |||
83 | fprintf('\n'); | ||
84 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/compute_g2.m b/SD-VBS/common/toolbox/toolbox_basic/filter/compute_g2.m new file mode 100755 index 0000000..ac27d00 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/compute_g2.m | |||
@@ -0,0 +1,23 @@ | |||
1 | function [g,ga,gb,gc] = compute_g2(I,angle) | ||
2 | |||
3 | if (nargin == 1), | ||
4 | angle = 0; | ||
5 | end | ||
6 | |||
7 | f1 = [0.0094 0.1148 0.3964 -0.0601 -0.9213 -0.0601 0.3964 0.1148 0.0094]; | ||
8 | f2 = [0.0008 0.0176 0.166 0.6383 1.0 0.6383 0.166 0.0176 0.0008]; | ||
9 | f3 = [-0.0028 -0.048 -0.302 -0.5806 0 0.5806 0.302 0.048 0.0028]; | ||
10 | |||
11 | %ga = conv2(conv2(I,f2,'same'),f1','same'); | ||
12 | %gb = conv2(conv2(I,f3,'same'),f3','same'); | ||
13 | %gc = conv2(conv2(I,f1,'same'),f2','same'); | ||
14 | |||
15 | ga = conv2(conv2(I,f1,'same'),f2','same'); | ||
16 | gb = conv2(conv2(I,f3,'same'),f3','same'); | ||
17 | gc = conv2(conv2(I,f2,'same'),f1','same'); | ||
18 | |||
19 | ka = cos(angle)^2; | ||
20 | kb = -2*cos(angle)*sin(angle); | ||
21 | kc = sin(angle)^2; | ||
22 | |||
23 | g = ka*ga + kb*gb + kc*gc; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/compute_h2.m b/SD-VBS/common/toolbox/toolbox_basic/filter/compute_h2.m new file mode 100755 index 0000000..e4cdcfb --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/compute_h2.m | |||
@@ -0,0 +1,27 @@ | |||
1 | function [h,ha,hb,hc,hd] = compute_h2(I,angle) | ||
2 | |||
3 | if (nargin == 1), | ||
4 | angle = 0; | ||
5 | end | ||
6 | |||
7 | f1 = [0.0098 0.0618 -0.0998 -0.7551 0 0.7551 0.0998 -0.0618 -0.0098]; | ||
8 | f2 = [ 0.0008 0.0176 0.166 0.6383 1 0.6383 0.166 0.0176 0.0008]; | ||
9 | f3 = -[-0.002 -0.0354 -0.2225 -0.4277 0 0.4277 0.2225 0.0354 0.002]; | ||
10 | f4 = [0.0048 0.0566 0.1695 -0.1889 -0.7349 -0.1889 0.1695 0.0566 0.0048]; | ||
11 | |||
12 | %ha = conv2(conv2(I,f2,'same'),f1','same'); | ||
13 | %hb = conv2(conv2(I,f3,'same'),f4','same'); | ||
14 | %hc = conv2(conv2(I,f4,'same'),f3','same'); | ||
15 | %hd = conv2(conv2(I,f1,'same'),f2','same'); | ||
16 | |||
17 | ha = conv2(conv2(I,f1,'same'),f2','same'); | ||
18 | hb = conv2(conv2(I,f4,'same'),f3','same'); | ||
19 | hc = conv2(conv2(I,f3,'same'),f4','same'); | ||
20 | hd = conv2(conv2(I,f2,'same'),f1','same'); | ||
21 | |||
22 | ka = cos(angle)^3; | ||
23 | kb = -3*cos(angle)^2*sin(angle); | ||
24 | kc = 3*cos(angle)*sin(angle)^2; | ||
25 | kd = -sin(angle)^3; | ||
26 | |||
27 | h = ka*ha + kb*hb + kc*hc + kd*hd; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/compute_ofilter_fft.m b/SD-VBS/common/toolbox/toolbox_basic/filter/compute_ofilter_fft.m new file mode 100755 index 0000000..41989ed --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/compute_ofilter_fft.m | |||
@@ -0,0 +1,88 @@ | |||
1 | function [filter_output,filters] = compute_odd_filter_fft(I,sig,r,sz,num_ori); | ||
2 | % | ||
3 | % computes the filter response of I to the set of odd symmetric filters | ||
4 | % | ||
5 | % sig = scale(sigma) for the filters | ||
6 | % r = enlongation factor | ||
7 | % sz = the radius of the filters | ||
8 | % num_ori = number of orientations | ||
9 | % | ||
10 | |||
11 | ori_incr=180/num_ori; | ||
12 | ori_offset=ori_incr/2; % helps with equalizing quantiz. error across filter set | ||
13 | |||
14 | as = ori_offset:ori_incr:180+ori_offset-ori_incr; | ||
15 | |||
16 | filter_output = zeros(size(I,1),size(I,2),num_ori,length(sig)); | ||
17 | filters = []; | ||
18 | |||
19 | wsz = 2*round(sz(end)) + 1; | ||
20 | M1 = wsz;M2 = wsz; | ||
21 | |||
22 | %%%%% prepare FFT of image %%%%%%%%%%%%% | ||
23 | |||
24 | [N1,N2]=size(I); | ||
25 | tmp=zeros(size(I)+[M1-1 M2-1]); | ||
26 | tmp(1:N1,1:N2)=I; | ||
27 | IF=fft2(tmp); | ||
28 | |||
29 | |||
30 | %%%%%%%%%% filtering stage %%%%%%%%%%% | ||
31 | if size(sig,2)== 1, | ||
32 | |||
33 | for j = 1:length(as), | ||
34 | fprintf('.'); | ||
35 | angle = as(j); | ||
36 | |||
37 | g = mk_odd_filter(sig,r,angle,round(sz)); | ||
38 | |||
39 | g = g - mean(reshape(g,prod(size(g)),1)); | ||
40 | |||
41 | g = g/sum(sum(abs(g))); | ||
42 | |||
43 | filters(:,:,j,1) = g; | ||
44 | |||
45 | gF = fft2(g,N1+M1-1,N2+M2-1); | ||
46 | IgF = IF.*gF; | ||
47 | Ig = real(ifft2(IgF)); | ||
48 | Ig = Ig(ceil((M1+1)/2):ceil((M1+1)/2)+N1-1,ceil((M2+1)/2):ceil((M2+1)/2)+N2-1); | ||
49 | |||
50 | %c = conv2(I,g,'valid'); | ||
51 | |||
52 | filter_output(:,:,j,1) = Ig; | ||
53 | end | ||
54 | else | ||
55 | |||
56 | % there are multiple scales | ||
57 | sigs = sig; | ||
58 | szs = sz; | ||
59 | for k = 1:size(sigs,2), | ||
60 | sig = sigs(k); | ||
61 | sz = szs(end); | ||
62 | fprintf('%d',k); | ||
63 | |||
64 | for j = 1:length(as), | ||
65 | fprintf('.'); | ||
66 | angle = as(j); | ||
67 | |||
68 | g = mk_odd_filter(sig,r,angle,round(sz)); | ||
69 | g = g - mean(reshape(g,prod(size(g)),1)); | ||
70 | g = g/sum(sum(abs(g))); | ||
71 | |||
72 | gF = fft2(g,N1+M1-1,N2+M2-1); | ||
73 | IgF = IF.*gF; | ||
74 | Ig = real(ifft2(IgF)); | ||
75 | Ig = Ig(ceil((M1+1)/2):ceil((M1+1)/2)+N1-1,ceil((M2+1)/2):ceil((M2+1)/2)+N2-1); | ||
76 | |||
77 | %c = conv2(I,g,'valid'); | ||
78 | %c = conv2(I,g,'same'); | ||
79 | |||
80 | filter_output(:,:,j,k) = Ig; | ||
81 | filters(:,:,j,k) = g; | ||
82 | end | ||
83 | end | ||
84 | |||
85 | end | ||
86 | |||
87 | fprintf('\n'); | ||
88 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/dgauss.m b/SD-VBS/common/toolbox/toolbox_basic/filter/dgauss.m new file mode 100755 index 0000000..207e781 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/dgauss.m | |||
@@ -0,0 +1,16 @@ | |||
1 | function dg = dgauss(sig) | ||
2 | % first derivative of N(sig) | ||
3 | % cutoff after 1% of max | ||
4 | |||
5 | i = 1; | ||
6 | max = 0; | ||
7 | dgi = max; | ||
8 | dg = [dgi]; | ||
9 | while dgi >= 0.01*max | ||
10 | dgi = i / (sqrt(2*pi) * sig^3) * exp(-0.5*i^2/sig^2); | ||
11 | dg = [dgi dg -dgi]; | ||
12 | i = i + 1; | ||
13 | if dgi > max | ||
14 | max = dgi; | ||
15 | end | ||
16 | end; \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/dog1.m b/SD-VBS/common/toolbox/toolbox_basic/filter/dog1.m new file mode 100755 index 0000000..e9f64e6 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/dog1.m | |||
@@ -0,0 +1,28 @@ | |||
1 | function G=dog1(sig,N); | ||
2 | % G=dog1(sig,N); | ||
3 | |||
4 | % by Serge Belongie | ||
5 | |||
6 | no_pts=N; % no. of points in x,y grid | ||
7 | |||
8 | [x,y]=meshgrid(-(N/2)+1/2:(N/2)-1/2,-(N/2)+1/2:(N/2)-1/2); | ||
9 | |||
10 | sigi=0.71*sig; | ||
11 | sigo=1.14*sig; | ||
12 | Ci=diag([sigi,sigi]); | ||
13 | Co=diag([sigo,sigo]); | ||
14 | |||
15 | X=[x(:) y(:)]; | ||
16 | |||
17 | Ga=gaussian(X,[0 0]',Ci); | ||
18 | Ga=reshape(Ga,N,N); | ||
19 | Gb=gaussian(X,[0 0]',Co); | ||
20 | Gb=reshape(Gb,N,N); | ||
21 | |||
22 | a=1; | ||
23 | b=-1; | ||
24 | |||
25 | G = a*Ga + b*Gb; | ||
26 | |||
27 | G=G-mean(G(:)); | ||
28 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/dog2.m b/SD-VBS/common/toolbox/toolbox_basic/filter/dog2.m new file mode 100755 index 0000000..8446198 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/dog2.m | |||
@@ -0,0 +1,31 @@ | |||
1 | function G=dog2(sig,N); | ||
2 | % G=dog2(sig,N); | ||
3 | |||
4 | % by Serge Belongie | ||
5 | |||
6 | no_pts=N; % no. of points in x,y grid | ||
7 | |||
8 | [x,y]=meshgrid(-(N/2)+1/2:(N/2)-1/2,-(N/2)+1/2:(N/2)-1/2); | ||
9 | |||
10 | sigi=0.62*sig; | ||
11 | sigo=1.6*sig; | ||
12 | C=diag([sig,sig]); | ||
13 | Ci=diag([sigi,sigi]); | ||
14 | Co=diag([sigo,sigo]); | ||
15 | |||
16 | X=[x(:) y(:)]; | ||
17 | |||
18 | Ga=gaussian(X,[0 0]',Ci); | ||
19 | Ga=reshape(Ga,N,N); | ||
20 | Gb=gaussian(X,[0 0]',C); | ||
21 | Gb=reshape(Gb,N,N); | ||
22 | Gc=gaussian(X,[0 0]',Co); | ||
23 | Gc=reshape(Gc,N,N); | ||
24 | |||
25 | a=-1; | ||
26 | b=2; | ||
27 | c=-1; | ||
28 | |||
29 | G = a*Ga + b*Gb + c*Gc; | ||
30 | |||
31 | G=G-mean(G(:)); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/doog1.m b/SD-VBS/common/toolbox/toolbox_basic/filter/doog1.m new file mode 100755 index 0000000..dd8e87b --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/doog1.m | |||
@@ -0,0 +1,32 @@ | |||
1 | function H=doog1(sig,r,th,N); | ||
2 | % H=doog1(sig,r,th,N); | ||
3 | |||
4 | |||
5 | % by Serge Belongie | ||
6 | |||
7 | no_pts=N; % no. of points in x,y grid | ||
8 | |||
9 | [x,y]=meshgrid(-(N/2)+1/2:(N/2)-1/2,-(N/2)+1/2:(N/2)-1/2); | ||
10 | |||
11 | phi=pi*th/180; | ||
12 | sigy=sig; | ||
13 | sigx=r*sig; | ||
14 | R=[cos(phi) -sin(phi); sin(phi) cos(phi)]; | ||
15 | C=R*diag([sigx,sigy])*R'; | ||
16 | |||
17 | X=[x(:) y(:)]; | ||
18 | |||
19 | Gb=gaussian(X,[0 0]',C); | ||
20 | Gb=reshape(Gb,N,N); | ||
21 | |||
22 | m=R*[0 sig]'; | ||
23 | |||
24 | a=1; | ||
25 | b=-1; | ||
26 | |||
27 | % make odd-symmetric filter | ||
28 | Ga=gaussian(X,m/2,C); | ||
29 | Ga=reshape(Ga,N,N); | ||
30 | Gb=rot90(Ga,2); | ||
31 | H=a*Ga+b*Gb; | ||
32 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/doog2.m b/SD-VBS/common/toolbox/toolbox_basic/filter/doog2.m new file mode 100755 index 0000000..a0511cb --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/doog2.m | |||
@@ -0,0 +1,38 @@ | |||
1 | function G=doog2(sig,r,th,N); | ||
2 | % G=doog2(sig,r,th,N); | ||
3 | % Make difference of offset gaussians kernel | ||
4 | % theta is in degrees | ||
5 | % (see Malik & Perona, J. Opt. Soc. Amer., 1990) | ||
6 | % | ||
7 | % Example: | ||
8 | % >> imagesc(doog2(1,12,0,64,1)) | ||
9 | % >> colormap(gray) | ||
10 | |||
11 | % by Serge Belongie | ||
12 | |||
13 | no_pts=N; % no. of points in x,y grid | ||
14 | |||
15 | [x,y]=meshgrid(-(N/2)+1/2:(N/2)-1/2,-(N/2)+1/2:(N/2)-1/2); | ||
16 | |||
17 | phi=pi*th/180; | ||
18 | sigy=sig; | ||
19 | sigx=r*sig; | ||
20 | R=[cos(phi) -sin(phi); sin(phi) cos(phi)]; | ||
21 | C=R*diag([sigx,sigy])*R'; | ||
22 | |||
23 | X=[x(:) y(:)]; | ||
24 | |||
25 | Gb=gaussian(X,[0 0]',C); | ||
26 | Gb=reshape(Gb,N,N); | ||
27 | |||
28 | m=R*[0 sig]'; | ||
29 | Ga=gaussian(X,m,C); | ||
30 | Ga=reshape(Ga,N,N); | ||
31 | Gc=rot90(Ga,2); | ||
32 | |||
33 | a=-1; | ||
34 | b=2; | ||
35 | c=-1; | ||
36 | |||
37 | G = a*Ga + b*Gb + c*Gc; | ||
38 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/fft_filt.m b/SD-VBS/common/toolbox/toolbox_basic/filter/fft_filt.m new file mode 100755 index 0000000..25fa5f9 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/fft_filt.m | |||
@@ -0,0 +1,82 @@ | |||
1 | % script for fft-based filtering | ||
2 | |||
3 | % set up filterbank | ||
4 | make_filterbank | ||
5 | |||
6 | % prepare FFT of image for filtering | ||
7 | [N1,N2]=size(V); | ||
8 | I=zeros(size(V)+[M1-1 M2-1]); | ||
9 | I(1:N1,1:N2)=V; | ||
10 | IF=fft2(I); | ||
11 | FI=zeros(N1,N2,total_num_filt); | ||
12 | |||
13 | % apply filters | ||
14 | for n=1:total_num_filt | ||
15 | disp(n) | ||
16 | f=rot90(FB(:,:,n),2); | ||
17 | fF=fft2(f,N1+M1-1,N2+M2-1); | ||
18 | IfF=IF.*fF; | ||
19 | If=real(ifft2(IfF)); | ||
20 | If=If(ceil((M1+1)/2):ceil((M1+1)/2)+N1-1,ceil((M2+1)/2):ceil((M2+1)/2)+N2-1); | ||
21 | FI(:,:,n)=If; | ||
22 | % im(If) | ||
23 | % drawnow | ||
24 | end | ||
25 | |||
26 | %%%% end of filtering part; the remainder is for reconstruction & analysis | ||
27 | break | ||
28 | |||
29 | |||
30 | % use pseudoinverse to reconstruct image from filter projections | ||
31 | fbv=reshape(FB,M1*M2,total_num_filt)'; | ||
32 | fbi=pinv(fbv); | ||
33 | |||
34 | % find principal components | ||
35 | T=reshape(FI,N1*N2,total_num_filt)'; | ||
36 | C=T*T'; | ||
37 | [U,S,junk]=svd(C); | ||
38 | s=diag(S); | ||
39 | |||
40 | % synthesize using some eigenvectors | ||
41 | synth=fbi*U; | ||
42 | k=ceil(sqrt(total_num_filt)); | ||
43 | for n=1:total_num_filt | ||
44 | subplot(k,k,n) | ||
45 | im(reshape(synth(:,n),M1,M2)); | ||
46 | title(num2str(s(n))) | ||
47 | drawnow | ||
48 | end | ||
49 | |||
50 | % synthesize at a point by clicking on coordinates | ||
51 | figure(1) | ||
52 | im(V) | ||
53 | [x,y]=ginput(1); | ||
54 | x=round(x); | ||
55 | y=round(y); | ||
56 | u=squeeze(FI(y,x,:)); | ||
57 | synth=fbi*u; | ||
58 | synth=reshape(synth,M1,M2); | ||
59 | figure(2) | ||
60 | subplot(1,2,1) | ||
61 | im(V) | ||
62 | axis([x-M2/2 x+M2/2 y-M1/2 y+M1/2]) | ||
63 | subplot(1,2,2) | ||
64 | im(synth) | ||
65 | title(num2str(max(synth(:)))); | ||
66 | |||
67 | figure(3) | ||
68 | plot(u,'o-') | ||
69 | |||
70 | % show pseudoinverse filterbank | ||
71 | if 0 | ||
72 | k=ceil(sqrt(total_num_filt)); | ||
73 | for n=1:total_num_filt | ||
74 | subplot(k,k,n) | ||
75 | im(reshape(fbi(:,n),M1,M2)); | ||
76 | axis('off') | ||
77 | drawnow | ||
78 | end | ||
79 | end | ||
80 | |||
81 | |||
82 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/fft_filt_2.m b/SD-VBS/common/toolbox/toolbox_basic/filter/fft_filt_2.m new file mode 100755 index 0000000..9c84e96 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/fft_filt_2.m | |||
@@ -0,0 +1,29 @@ | |||
1 | function FI=fft_filt_2(V,FB,sf); | ||
2 | % FI=fft_filt_2(V,FB,sf); | ||
3 | % fft-based filtering | ||
4 | % requires image to be called "V" | ||
5 | % and filters to be in FB | ||
6 | % sf is the subsampling factor | ||
7 | % | ||
8 | % FI is the result | ||
9 | |||
10 | [M1,M2,N3]=size(FB); | ||
11 | % prepare FFT of image for filtering | ||
12 | [N1,N2]=size(V); | ||
13 | I=zeros(size(V)+[M1-1 M2-1]); | ||
14 | I(1:N1,1:N2)=V; | ||
15 | N1s=length(1:sf:N1); | ||
16 | N2s=length(1:sf:N2); | ||
17 | IF=fft2(I); | ||
18 | FI=zeros(N1s,N2s,N3); | ||
19 | |||
20 | % apply filters | ||
21 | for n=1:N3; | ||
22 | f=rot90(FB(:,:,n),2); | ||
23 | fF=fft2(f,N1+M1-1,N2+M2-1); | ||
24 | IfF=IF.*fF; | ||
25 | If=real(ifft2(IfF)); | ||
26 | If=If(ceil((M1+1)/2):ceil((M1+1)/2)+N1-1,ceil((M2+1)/2):ceil((M2+1)/2)+N2-1); | ||
27 | FI(:,:,n)=If(1:sf:N1,1:sf:N2); | ||
28 | end | ||
29 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/filter_bank_jshi.tar b/SD-VBS/common/toolbox/toolbox_basic/filter/filter_bank_jshi.tar new file mode 100755 index 0000000..b43b49c --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/filter_bank_jshi.tar | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/gauss.m b/SD-VBS/common/toolbox/toolbox_basic/filter/gauss.m new file mode 100755 index 0000000..f0403ed --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/gauss.m | |||
@@ -0,0 +1,16 @@ | |||
1 | function dg = gauss(sig) | ||
2 | % first derivative of N(sig) | ||
3 | % cutoff after 1% of max | ||
4 | |||
5 | i = 1; | ||
6 | max = 0; | ||
7 | dgi = max; | ||
8 | dg = [1/ (sqrt(2*pi) * sig) ]; | ||
9 | while dgi >= 0.01*max | ||
10 | dgi = 1/ (sqrt(2*pi) * sig) * exp(-0.5*i^2/sig^2); | ||
11 | dg = [dgi dg dgi]; | ||
12 | i = i + 1; | ||
13 | if dgi > max | ||
14 | max = dgi; | ||
15 | end | ||
16 | end; \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/gaussian.m b/SD-VBS/common/toolbox/toolbox_basic/filter/gaussian.m new file mode 100755 index 0000000..509b129 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/gaussian.m | |||
@@ -0,0 +1,31 @@ | |||
1 | function p=gaussian(x,m,C); | ||
2 | % p=gaussian(x,m,C); | ||
3 | % | ||
4 | % Evaluate the multi-variate density with mean vector m and covariance | ||
5 | % matrix C for the input vector x. | ||
6 | % | ||
7 | % p=gaussian(X,m,C); | ||
8 | % | ||
9 | % Vectorized version: Here X is a matrix of column vectors, and p is | ||
10 | % a vector of probabilities for each vector. | ||
11 | |||
12 | d=length(m); | ||
13 | |||
14 | if size(x,1)~=d | ||
15 | x=x'; | ||
16 | end | ||
17 | N=size(x,2); | ||
18 | |||
19 | detC = det(C); | ||
20 | if rcond(C)<eps | ||
21 | % fprintf(1,'Covariance matrix close to singular. (gaussian.m)\n'); | ||
22 | p = zeros(N,1); | ||
23 | else | ||
24 | m=m(:); | ||
25 | M=m*ones(1,N); | ||
26 | denom=(2*pi)^(d/2)*sqrt(abs(detC)); | ||
27 | mahal=sum(((x-M)'*inv(C)).*(x-M)',2); % Chris Bregler's trick | ||
28 | numer=exp(-0.5*mahal); | ||
29 | p=numer/denom; | ||
30 | end | ||
31 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/get_diff2.m b/SD-VBS/common/toolbox/toolbox_basic/filter/get_diff2.m new file mode 100755 index 0000000..31f3ac5 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/get_diff2.m | |||
@@ -0,0 +1,43 @@ | |||
1 | function [diffI,corr,mag,theta] = get_diff2(I,J,w) | ||
2 | % car: I | ||
3 | % background: J | ||
4 | |||
5 | % half window size | ||
6 | if (nargin == 2) | ||
7 | w = 1; | ||
8 | end | ||
9 | |||
10 | [gIx,gIy] = grad2(I,w); | ||
11 | [gJx,gJy] = grad2(J,w); | ||
12 | gx = gIx; | ||
13 | gy = gIy; | ||
14 | |||
15 | % normalize | ||
16 | sI= sqrt(gIx.*gIx+gIy.*gIy); | ||
17 | sJ= sqrt(gJx.*gJx+gJy.*gJy); | ||
18 | gIx = gIx./sI; | ||
19 | gIy = gIy./sI; | ||
20 | gJx = gJx./sJ; | ||
21 | gJy = gJy./sJ; | ||
22 | |||
23 | theta = cart2pol(gIy,gIx); | ||
24 | corr = gIx.*gJx + gIy.*gJy; | ||
25 | |||
26 | %[gx,gy]= grad((I-J),w);mag = sqrt(gx.*gx+gy.*gy); | ||
27 | %mag = sI; | ||
28 | |||
29 | |||
30 | mag = sqrt((cos(theta).^2).*gy.^2 + (sin(theta).^2).*gx.^2 +... | ||
31 | 2*cos(theta).*sin(theta).*gx.*gy); | ||
32 | |||
33 | % want to look at the grad. mag greater than 10, and corr less than 0.9 | ||
34 | threshold = max(3.5,0.1*max(max(mag(5:size(mag,1)-5,5:size(mag,2)-5)))) | ||
35 | diffI = (abs(corr)<0.85).*(mag>threshold); | ||
36 | |||
37 | |||
38 | |||
39 | |||
40 | |||
41 | |||
42 | |||
43 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/get_diff_free.m b/SD-VBS/common/toolbox/toolbox_basic/filter/get_diff_free.m new file mode 100755 index 0000000..f020fab --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/get_diff_free.m | |||
@@ -0,0 +1,8 @@ | |||
1 | function [diff,corr,mag,angle] = get_diff_free(I,J) | ||
2 | |||
3 | [angle,mag,c2,c3] = compute_angle(I); | ||
4 | [angleJ,magJ] = compute_angle(J); | ||
5 | |||
6 | corr = cos(angle).*cos(angleJ) + sin(angle).*sin(angleJ); | ||
7 | threshold = 0.075*max(max(mag(5:size(mag,1)-5,5:size(mag,2)-5))); | ||
8 | diff = (abs(corr)<0.9).*(mag>threshold); \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/grad1.m b/SD-VBS/common/toolbox/toolbox_basic/filter/grad1.m new file mode 100755 index 0000000..eca34db --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/grad1.m | |||
@@ -0,0 +1,11 @@ | |||
1 | function [gx,gy] = grad2(I,ratio) | ||
2 | % | ||
3 | % | ||
4 | |||
5 | kern = dgauss(ratio);kern = kern/sum(abs(kern)); | ||
6 | gkern = gauss(ratio);gkern = gkern/sum(abs(kern)); | ||
7 | |||
8 | gx = conv2(I,kern,'same'); | ||
9 | gx = conv2(gx,gkern','same'); | ||
10 | |||
11 | gy = conv2(conv2(I,kern','same'),gkern,'same'); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/grad2.m b/SD-VBS/common/toolbox/toolbox_basic/filter/grad2.m new file mode 100755 index 0000000..ea4ec0e --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/grad2.m | |||
@@ -0,0 +1,11 @@ | |||
1 | function [gx,gy] = grad2(I,ratio) | ||
2 | % | ||
3 | % | ||
4 | |||
5 | ddgauss = gradient(dgauss(ratio));ddgauss = ddgauss/sum(abs(ddgauss)); | ||
6 | gkern = gauss(ratio); gkern = gkern/sum(abs(gkern)); | ||
7 | |||
8 | gx = conv2(I,ddgauss,'same'); | ||
9 | gx = conv2(gx,gkern','same'); | ||
10 | |||
11 | gy = conv2(conv2(I,ddgauss','same'),gkern,'same'); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/m_interp4.m b/SD-VBS/common/toolbox/toolbox_basic/filter/m_interp4.m new file mode 100755 index 0000000..314f140 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/m_interp4.m | |||
@@ -0,0 +1,49 @@ | |||
1 | function [F,mask] = m_interp4(z,s,t) | ||
2 | %INTERP4 2-D bilinear data interpolation. | ||
3 | % ZI = INTERP4(Z,XI,YI) assumes X = 1:N and Y = 1:M, where | ||
4 | % [M,N] = SIZE(Z). | ||
5 | % | ||
6 | % Copyright (c) 1984-93 by The MathWorks, Inc. | ||
7 | % Clay M. Thompson 4-26-91, revised 7-3-91, 3-22-93 by CMT. | ||
8 | % | ||
9 | % modified to | ||
10 | |||
11 | |||
12 | [nrows,ncols] = size(z); | ||
13 | |||
14 | |||
15 | if any(size(z)<[3 3]), error('Z must be at least 3-by-3.'); end | ||
16 | if size(s)~=size(t), error('XI and YI must be the same size.'); end | ||
17 | |||
18 | % Check for out of range values of s and set to 1 | ||
19 | sout = find((s<1)|(s>ncols)); | ||
20 | if length(sout)>0, s(sout) = ones(size(sout)); end | ||
21 | |||
22 | % Check for out of range values of t and set to 1 | ||
23 | tout = find((t<1)|(t>nrows)); | ||
24 | if length(tout)>0, t(tout) = ones(size(tout)); end | ||
25 | |||
26 | % Matrix element indexing | ||
27 | ndx = floor(t)+floor(s-1)*nrows; | ||
28 | |||
29 | % Compute intepolation parameters, check for boundary value. | ||
30 | d = find(s==ncols); | ||
31 | s(:) = (s - floor(s)); | ||
32 | if length(d)>0, s(d) = s(d)+1; ndx(d) = ndx(d)-nrows; end | ||
33 | |||
34 | % Compute intepolation parameters, check for boundary value. | ||
35 | d = find(t==nrows); | ||
36 | t(:) = (t - floor(t)); | ||
37 | if length(d)>0, t(d) = t(d)+1; ndx(d) = ndx(d)-1; end | ||
38 | d = []; | ||
39 | |||
40 | % Now interpolate, reuse u and v to save memory. | ||
41 | F = ( z(ndx).*(1-t) + z(ndx+1).*t ).*(1-s) + ... | ||
42 | ( z(ndx+nrows).*(1-t) + z(ndx+(nrows+1)).*t ).*s; | ||
43 | |||
44 | mask = ones(size(z)); | ||
45 | |||
46 | % Now set out of range values to zeros. | ||
47 | if length(sout)>0, F(sout) = zeros(size(sout));mask(sout)=zeros(size(sout));end | ||
48 | if length(tout)>0, F(tout) = zeros(size(tout));mask(tout)=zeros(size(tout));end | ||
49 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/make_filterbank.m b/SD-VBS/common/toolbox/toolbox_basic/filter/make_filterbank.m new file mode 100755 index 0000000..2ff15d2 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/make_filterbank.m | |||
@@ -0,0 +1,63 @@ | |||
1 | function FB = make_filterbank(num_ori,num_scale,wsz) | ||
2 | % | ||
3 | % F = make_filterbank(num_ori,num_scale,wsz) | ||
4 | % | ||
5 | |||
6 | |||
7 | % definine filterbank | ||
8 | %num_ori=6; | ||
9 | %num_scale=3; | ||
10 | |||
11 | M1=wsz; % size in pixels | ||
12 | M2=M1; | ||
13 | |||
14 | ori_incr=180/num_ori; | ||
15 | ori_offset=ori_incr/2; % helps with equalizing quantiz. error across filter set | ||
16 | |||
17 | FBdoog1=zeros(M1,M2,num_scale,num_ori); | ||
18 | FBdoog2=zeros(M1,M2,num_scale,num_ori); | ||
19 | FBdog1=zeros(M1,M2,num_scale); | ||
20 | FBdog2=zeros(M1,M2,num_scale); | ||
21 | |||
22 | % elongated filter set | ||
23 | counter = 1; | ||
24 | filter_scale = 1.0; | ||
25 | filter_scale_step = sqrt(2); | ||
26 | |||
27 | for m=1:num_scale | ||
28 | f=dog1(filter_scale,M1); | ||
29 | FBdog1(:,:,m)=f; | ||
30 | f=dog2(filter_scale,M1); | ||
31 | FBdog2(:,:,m)=f; | ||
32 | counter=counter+1; | ||
33 | for n=1:num_ori | ||
34 | % r=12 here is equivalent to Malik's r=3; | ||
35 | f=doog2(filter_scale,6,ori_offset+(n-1)*ori_incr,M1); | ||
36 | FBdoog2(:,:,m,n)=f; | ||
37 | f=doog1(filter_scale,6,ori_offset+(n-1)*ori_incr,M1); | ||
38 | FBdoog1(:,:,m,n)=f; | ||
39 | end | ||
40 | filter_scale = filter_scale * filter_scale_step; | ||
41 | end | ||
42 | |||
43 | FB=cat(3,3*FBdog1,4.15*FBdog2,2*reshape(FBdoog1,M1,M2,num_scale*num_ori),2*reshape(FBdoog2,M1,M2,num_scale*num_ori)); | ||
44 | total_num_filt=size(FB,3); | ||
45 | |||
46 | nb = size(FB,3); | ||
47 | for j=1:nb, | ||
48 | F = FB(:,:,j); | ||
49 | a = sum(sum(abs(F))); | ||
50 | FB(:,:,j) = FB(:,:,j)/a; | ||
51 | end | ||
52 | |||
53 | |||
54 | if 0 | ||
55 | k=ceil(sqrt(total_num_filt)); | ||
56 | for n=1:total_num_filt | ||
57 | subplot(k,k,n) | ||
58 | im(FB(:,:,n)); | ||
59 | axis('off') | ||
60 | drawnow | ||
61 | end | ||
62 | end | ||
63 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/make_filterbank_23.m b/SD-VBS/common/toolbox/toolbox_basic/filter/make_filterbank_23.m new file mode 100755 index 0000000..f9fcaa9 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/make_filterbank_23.m | |||
@@ -0,0 +1,40 @@ | |||
1 | function [FB,M1,M2,N3]=make_filterbank_23; | ||
2 | % multi-scale even and odd filters | ||
3 | |||
4 | M1=31; % size in pixels | ||
5 | M2=M1; | ||
6 | num_ori=6; | ||
7 | num_scales=3; | ||
8 | num_phases=2; | ||
9 | N3=num_ori*num_scales*num_phases; | ||
10 | FB=zeros(M1,M2,N3); | ||
11 | |||
12 | counter=1; | ||
13 | |||
14 | for m=1:num_scales | ||
15 | for n=1:num_ori | ||
16 | [F1,F2]=quadpair(sqrt(2)^m,3,180*(n-1)/num_ori,M1); | ||
17 | FB(:,:,counter)=F1; | ||
18 | counter=counter+1; | ||
19 | FB(:,:,counter)=F2; | ||
20 | counter=counter+1; | ||
21 | end | ||
22 | end | ||
23 | |||
24 | FB=cat(3,FB,dog2(1,M1),dog2(sqrt(2),M1),dog2(2,M1),dog2(2*sqrt(2),M1)); | ||
25 | |||
26 | N3=size(FB,3); | ||
27 | |||
28 | % stuff for visualizing spectra of filters: | ||
29 | if 0 | ||
30 | FBF=zeros(size(FB)); | ||
31 | |||
32 | for n=1:36 | ||
33 | FBF(:,:,n)=abs(fftshift(fft2(FB(:,:,n)))); | ||
34 | end | ||
35 | |||
36 | montage2(FBF) | ||
37 | |||
38 | im(sum(FBF,3)) | ||
39 | |||
40 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/make_filterbank_even.m b/SD-VBS/common/toolbox/toolbox_basic/filter/make_filterbank_even.m new file mode 100755 index 0000000..8c8d802 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/make_filterbank_even.m | |||
@@ -0,0 +1,40 @@ | |||
1 | function FB = make_filterbank(num_ori,filter_scales,wsz) | ||
2 | % | ||
3 | % F = make_filterbank(num_ori,num_scale,wsz) | ||
4 | % | ||
5 | |||
6 | |||
7 | % definine filterbank | ||
8 | %num_ori=6; | ||
9 | %num_scale=3; | ||
10 | |||
11 | num_scale = length(filter_scales); | ||
12 | |||
13 | M1=wsz; % size in pixels | ||
14 | M2=M1; | ||
15 | |||
16 | ori_incr=180/num_ori; | ||
17 | ori_offset=ori_incr/2; % helps with equalizing quantiz. error across filter set | ||
18 | |||
19 | FB=zeros(M1,M2,num_ori,num_scale); | ||
20 | |||
21 | % elongated filter set | ||
22 | counter = 1; | ||
23 | |||
24 | for m=1:num_scale | ||
25 | for n=1:num_ori | ||
26 | % r=12 here is equivalent to Malik's r=3; | ||
27 | f=doog2(filter_scales(m),6,ori_offset+(n-1)*ori_incr,M1); | ||
28 | FB(:,:,n,m)=f; | ||
29 | end | ||
30 | end | ||
31 | |||
32 | FB=reshape(FB,M1,M2,num_scale*num_ori); | ||
33 | total_num_filt=size(FB,3); | ||
34 | |||
35 | for j=1:total_num_filt, | ||
36 | F = FB(:,:,j); | ||
37 | a = sum(sum(abs(F))); | ||
38 | FB(:,:,j) = FB(:,:,j)/a; | ||
39 | end | ||
40 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/make_filterbank_odd.m b/SD-VBS/common/toolbox/toolbox_basic/filter/make_filterbank_odd.m new file mode 100755 index 0000000..8103598 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/make_filterbank_odd.m | |||
@@ -0,0 +1,41 @@ | |||
1 | function FB = make_filterbank(num_ori,filter_scales,wsz) | ||
2 | % | ||
3 | % F = make_filterbank(num_ori,num_scale,wsz) | ||
4 | % | ||
5 | |||
6 | |||
7 | % definine filterbank | ||
8 | %num_ori=6; | ||
9 | %num_scale=3; | ||
10 | |||
11 | num_scale = length(filter_scales); | ||
12 | |||
13 | M1=wsz; % size in pixels | ||
14 | M2=M1; | ||
15 | |||
16 | ori_incr=180/num_ori; | ||
17 | ori_offset=ori_incr/2; % helps with equalizing quantiz. error across filter set | ||
18 | |||
19 | FB=zeros(M1,M2,num_ori,num_scale); | ||
20 | |||
21 | |||
22 | % elongated filter set | ||
23 | counter = 1; | ||
24 | |||
25 | for m=1:num_scale | ||
26 | for n=1:num_ori | ||
27 | % r=12 here is equivalent to Malik's r=3; | ||
28 | f=doog1(filter_scales(m),6,ori_offset+(n-1)*ori_incr,M1); | ||
29 | FB(:,:,n,m)=f; | ||
30 | end | ||
31 | end | ||
32 | |||
33 | FB=reshape(FB,M1,M2,num_scale*num_ori); | ||
34 | total_num_filt=size(FB,3); | ||
35 | |||
36 | for j=1:total_num_filt, | ||
37 | F = FB(:,:,j); | ||
38 | a = sum(sum(abs(F))); | ||
39 | FB(:,:,j) = FB(:,:,j)/a; | ||
40 | end | ||
41 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/mdoog2.m b/SD-VBS/common/toolbox/toolbox_basic/filter/mdoog2.m new file mode 100755 index 0000000..25bc2f9 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/mdoog2.m | |||
@@ -0,0 +1,36 @@ | |||
1 | function G=doog2(sig,r,th,N); | ||
2 | % [G,H]=doog2(sig,r,th,N); | ||
3 | % Make difference of offset gaussians kernel | ||
4 | % theta is in degrees | ||
5 | % (see Malik & Perona, J. Opt. Soc. Amer., 1990) | ||
6 | % | ||
7 | |||
8 | |||
9 | [x,y]=meshgrid(-N:N,-N:N); | ||
10 | |||
11 | a=-1; | ||
12 | b=2; | ||
13 | c=-1; | ||
14 | |||
15 | ya=sig; | ||
16 | yc=-ya; | ||
17 | yb=0; | ||
18 | sigy=sig; | ||
19 | sigx=r*sig; | ||
20 | |||
21 | Ga=(1/(2*pi*sigx*sigy))*exp(-(((x-0)/sigx).^2+((y-ya)/sigy).^2)); | ||
22 | Gb=(1/(2*pi*sigx*sigy))*exp(-(((x-0)/sigx).^2+((y-yb)/sigy).^2)); | ||
23 | Gc=(1/(2*pi*sigx*sigy))*exp(-(((x-0)/sigx).^2+((y-yc)/sigy).^2)); | ||
24 | |||
25 | Go = a*Ga + b*Gb + c*Gc; | ||
26 | %Ho = imag(hilbert(Go)); | ||
27 | G = Go; | ||
28 | |||
29 | G = mimrotate(Go,th,'bilinear','crop'); | ||
30 | |||
31 | G = G-mean(reshape(G,prod(size(G)),1)); | ||
32 | |||
33 | G = G/sum(sum(abs(G))); | ||
34 | |||
35 | |||
36 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/mimrotate.m b/SD-VBS/common/toolbox/toolbox_basic/filter/mimrotate.m new file mode 100755 index 0000000..7dd31a2 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/mimrotate.m | |||
@@ -0,0 +1,119 @@ | |||
1 | function bout = imrotate(arg1,arg2,arg3,arg4) | ||
2 | %IMROTATE Rotate image. | ||
3 | % B = IMROTATE(A,ANGLE,'method') rotates the image A by ANGLE | ||
4 | % degrees. The image returned B will, in general, be larger | ||
5 | % than A. Invalid values on the periphery are set to one | ||
6 | % for indexed images or zero for all other image types. Possible | ||
7 | % interpolation methods are 'nearest','bilinear' or 'bicubic'. | ||
8 | % 'bilinear' is the default for intensity images, otherwise | ||
9 | % 'nearest' is used if no method is given. | ||
10 | % | ||
11 | % B = IMROTATE(A,ANGLE,'crop') or IMROTATE(A,ANGLE,'method','crop') | ||
12 | % crops B to be the same size as A. | ||
13 | % | ||
14 | % Without output arguments, IMROTATE(...) displays the rotated | ||
15 | % image in the current axis. | ||
16 | % | ||
17 | % See also IMRESIZE, IMCROP, ROT90. | ||
18 | |||
19 | % Clay M. Thompson 8-4-92 | ||
20 | % Copyright (c) 1992 by The MathWorks, Inc. | ||
21 | % $Revision: 1.14 $ $Date: 1993/09/01 21:27:38 $ | ||
22 | |||
23 | if nargin<2, error('Requires at least two input parameters.'); end | ||
24 | if nargin<3, | ||
25 | if isgray(arg1), caseid = 'bil'; else caseid = 'nea'; end | ||
26 | docrop = 0; | ||
27 | elseif nargin==3, | ||
28 | if isstr(arg3), | ||
29 | method = [lower(arg3),' ']; % Protect against short method | ||
30 | caseid = method(1:3); | ||
31 | if caseid(1)=='c', % Crop string | ||
32 | if isgray(arg1), caseid = 'bil'; else caseid = 'nea'; end | ||
33 | docrop = 1; | ||
34 | else | ||
35 | docrop = 0; | ||
36 | end | ||
37 | else | ||
38 | error('''METHOD'' must be a string of at least three characters.'); | ||
39 | end | ||
40 | else | ||
41 | if isstr(arg3), | ||
42 | method = [lower(arg3),' ']; % Protect against short method | ||
43 | caseid = method(1:3); | ||
44 | else | ||
45 | error('''METHOD'' must be a string of at least three characters.'); | ||
46 | end | ||
47 | docrop = 1; | ||
48 | end | ||
49 | |||
50 | % Catch and speed up 90 degree rotations | ||
51 | if rem(arg2,90)==0 & nargin<4, | ||
52 | phi = rem(arg2,360); | ||
53 | if phi==90, | ||
54 | b = rot90(arg1); | ||
55 | elseif phi==180, | ||
56 | b = rot90(arg1,2); | ||
57 | elseif phi==270, | ||
58 | b = rot90(arg1,-1); | ||
59 | else | ||
60 | b = arg1; | ||
61 | end | ||
62 | if nargout==0, imshow(b), else bout = b; end | ||
63 | return | ||
64 | end | ||
65 | |||
66 | phi = arg2*pi/180; % Convert to radians | ||
67 | |||
68 | % Rotation matrix | ||
69 | T = [cos(phi) -sin(phi); sin(phi) cos(phi)]; | ||
70 | |||
71 | % Coordinates from center of A | ||
72 | [m,n] = size(arg1); | ||
73 | if ~docrop, % Determine limits for rotated image | ||
74 | siz = ceil(max(abs([(n-1)/2 -(m-1)/2;(n-1)/2 (m-1)/2]*T))/2)*2; | ||
75 | uu = -siz(1):siz(1); vv = -siz(2):siz(2); | ||
76 | else % Cropped image | ||
77 | uu = (1:n)-(n+1)/2; vv = (1:m)-(m+1)/2; | ||
78 | end | ||
79 | nu = length(uu); nv = length(vv); | ||
80 | |||
81 | blk = bestblk([nv nu]); | ||
82 | nblks = floor([nv nu]./blk); nrem = [nv nu] - nblks.*blk; | ||
83 | mblocks = nblks(1); nblocks = nblks(2); | ||
84 | mb = blk(1); nb = blk(2); | ||
85 | |||
86 | rows = 1:blk(1); b = zeros(nv,nu); | ||
87 | for i=0:mblocks, | ||
88 | if i==mblocks, rows = (1:nrem(1)); end | ||
89 | for j=0:nblocks, | ||
90 | if j==0, cols = 1:blk(2); elseif j==nblocks, cols=(1:nrem(2)); end | ||
91 | if ~isempty(rows) & ~isempty(cols) | ||
92 | [u,v] = meshgrid(uu(j*nb+cols),vv(i*mb+rows)); | ||
93 | % Rotate points | ||
94 | uv = [u(:) v(:)]*T'; % Rotate points | ||
95 | u(:) = uv(:,1)+(n+1)/2; v(:) = uv(:,2)+(m+1)/2; | ||
96 | if caseid(1)=='n', % Nearest neighbor interpolation | ||
97 | b(i*mb+rows,j*nb+cols) = interp6(arg1,u,v); | ||
98 | elseif all(caseid=='bil'), % Bilinear interpolation | ||
99 | b(i*mb+rows,j*nb+cols) = interp2(arg1,u,v,'linear'); | ||
100 | elseif all(caseid=='bic'), % Bicubic interpolation | ||
101 | b(i*mb+rows,j*nb+cols) = interp5(arg1,u,v); | ||
102 | else | ||
103 | error(['Unknown interpolation method: ',method]); | ||
104 | end | ||
105 | end | ||
106 | end | ||
107 | end | ||
108 | |||
109 | d = find(isnan(b)); | ||
110 | if length(d)>0, | ||
111 | if isind(arg1), b(d) = ones(size(d)); else b(d) = zeros(size(d)); end | ||
112 | end | ||
113 | |||
114 | if nargout==0, | ||
115 | imshow(b), return | ||
116 | end | ||
117 | bout = b; | ||
118 | |||
119 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/mk_odd_filter.m b/SD-VBS/common/toolbox/toolbox_basic/filter/mk_odd_filter.m new file mode 100755 index 0000000..43ec7d7 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/mk_odd_filter.m | |||
@@ -0,0 +1,36 @@ | |||
1 | function G=doog2(sig,r,th,N); | ||
2 | % [G,H]=doog2(sig,r,th,N); | ||
3 | % Make difference of offset gaussians kernel | ||
4 | % theta is in degrees | ||
5 | % (see Malik & Perona, J. Opt. Soc. Amer., 1990) | ||
6 | % | ||
7 | |||
8 | |||
9 | [x,y]=meshgrid(-N:N,-N:N); | ||
10 | |||
11 | a=-1; | ||
12 | b=2; | ||
13 | c=-1; | ||
14 | |||
15 | ya=sig; | ||
16 | yc=-ya; | ||
17 | yb=0; | ||
18 | sigy=sig; | ||
19 | sigx=r*sig; | ||
20 | |||
21 | Ga=(1/(2*pi*sigx*sigy))*exp(-(((x-0)/sigx).^2+((y-ya)/sigy).^2)); | ||
22 | Gb=(1/(2*pi*sigx*sigy))*exp(-(((x-0)/sigx).^2+((y-yb)/sigy).^2)); | ||
23 | Gc=(1/(2*pi*sigx*sigy))*exp(-(((x-0)/sigx).^2+((y-yc)/sigy).^2)); | ||
24 | |||
25 | Go = a*Ga + b*Gb + c*Gc; | ||
26 | Ho = imag(hilbert(Go)); | ||
27 | %G = Ho; | ||
28 | |||
29 | G = mimrotate(Ho,th,'bilinear','crop'); | ||
30 | |||
31 | G = G-mean(reshape(G,prod(size(G)),1)); | ||
32 | |||
33 | G = G/sum(sum(abs(G))); | ||
34 | |||
35 | |||
36 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/mkdog1.m b/SD-VBS/common/toolbox/toolbox_basic/filter/mkdog1.m new file mode 100755 index 0000000..f1225cc --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/mkdog1.m | |||
@@ -0,0 +1,20 @@ | |||
1 | function dog1 = mkdog1(sigma_base,size_w) | ||
2 | % | ||
3 | % function dog1 = mkdog1(sigma_base,size_w) | ||
4 | % | ||
5 | % | ||
6 | |||
7 | %scale_base = 1; | ||
8 | scale_base = 3; | ||
9 | |||
10 | a = scale_base; | ||
11 | c = -1*scale_base; | ||
12 | |||
13 | sigma_a = 0.71*sigma_base; | ||
14 | sigma_c = 1.14*sigma_base; | ||
15 | |||
16 | dog1 = a*mkg(0,0,sigma_a,sigma_a,size_w) +... | ||
17 | c*mkg(0,0,sigma_c,sigma_c,size_w); | ||
18 | |||
19 | dog1 = dog1-mean(reshape(dog1,prod(size(dog1)),1)); | ||
20 | dog1 = dog1/sum(sum(abs(dog1))); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/mkdog2.m b/SD-VBS/common/toolbox/toolbox_basic/filter/mkdog2.m new file mode 100755 index 0000000..a78824a --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/mkdog2.m | |||
@@ -0,0 +1,22 @@ | |||
1 | function dog2 = mkdog2(sigma_base,size_w) | ||
2 | % | ||
3 | % function dog2 = mkdog2(sigma_base,size_w) | ||
4 | % | ||
5 | % | ||
6 | |||
7 | %scale_base = 1.224; | ||
8 | scale_base = 4.15; | ||
9 | |||
10 | a = scale_base; | ||
11 | b = -2*scale_base; | ||
12 | c = scale_base; | ||
13 | |||
14 | sigma_a = 0.62*sigma_base; | ||
15 | sigma_b = sigma_base; | ||
16 | sigma_c = 1.6*sigma_base; | ||
17 | |||
18 | dog2 = a*mkg(0,0,sigma_a,sigma_a,size_w) +... | ||
19 | b*mkg(0,0,sigma_b,sigma_b,size_w) +... | ||
20 | c*mkg(0,0,sigma_c,sigma_c,size_w); | ||
21 | |||
22 | %dog2 = 255*5.1745*dog2; \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/mkdoog2.m b/SD-VBS/common/toolbox/toolbox_basic/filter/mkdoog2.m new file mode 100755 index 0000000..5db2877 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/mkdoog2.m | |||
@@ -0,0 +1,30 @@ | |||
1 | function doog2 = mkdoog2(sigma_w,r,theta,size_w) | ||
2 | % | ||
3 | % function doog2 = mkdoog2(sigma_w,r,theta,size_w) | ||
4 | % | ||
5 | % | ||
6 | |||
7 | %scale_base = 2.8814; | ||
8 | scale_base = 2; | ||
9 | |||
10 | a = -1*scale_base; | ||
11 | b = 2*scale_base; | ||
12 | c = -1*scale_base; | ||
13 | |||
14 | sigma_x = r*sigma_w; | ||
15 | sigma_y = sigma_w; | ||
16 | |||
17 | ya = sigma_w; | ||
18 | yc = -sigma_w; | ||
19 | yb = 0; | ||
20 | |||
21 | doog2 = a*mkg(0,ya,sigma_x,sigma_y,size_w) +... | ||
22 | b*mkg(0,yb,sigma_x,sigma_y,size_w) +... | ||
23 | c*mkg(0,yc,sigma_x,sigma_y,size_w); | ||
24 | |||
25 | %doog2 = 255*5.1745*doog2; | ||
26 | |||
27 | |||
28 | |||
29 | |||
30 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/mkdoogs.m b/SD-VBS/common/toolbox/toolbox_basic/filter/mkdoogs.m new file mode 100755 index 0000000..e5796bc --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/mkdoogs.m | |||
@@ -0,0 +1,15 @@ | |||
1 | function [doogs,index] = mkdoogs(sigma_w,r,theta,theta_to,size_w) | ||
2 | % function doogs = mkdoogs(sigma_w,r,theta,theta_to,size_w) | ||
3 | % | ||
4 | |||
5 | doogs = []; | ||
6 | |||
7 | angle_start = theta*pi/180; | ||
8 | angle_end = theta_to*pi/180; | ||
9 | step = pi/180; | ||
10 | |||
11 | index = 1; | ||
12 | for k=angle_start:step:angle_end, | ||
13 | doogs = [doogs,mkdoog2(sigma_w,r,k,size_w)]; | ||
14 | index = index +1; | ||
15 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/mkg.m b/SD-VBS/common/toolbox/toolbox_basic/filter/mkg.m new file mode 100755 index 0000000..1fb1f7e --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/mkg.m | |||
@@ -0,0 +1,9 @@ | |||
1 | function g= mkgaussian(xo,yo,sigma_x,sigma_y,size_w) | ||
2 | % | ||
3 | % function G = mkgaussian(xo,yo,sigma_x,sigma_y,size_w) | ||
4 | % | ||
5 | |||
6 | size_wh = round(0.5*size_w); | ||
7 | [x,y] = meshgrid([-size_wh:1:size_wh],[-size_wh:1:size_wh]); | ||
8 | g = 1/(2*pi*sigma_x*sigma_y)*(exp(-( ((x-xo)/sigma_x).^2 + ((y-yo)/sigma_y).^2))); | ||
9 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/quadpair.m b/SD-VBS/common/toolbox/toolbox_basic/filter/quadpair.m new file mode 100755 index 0000000..96c2a22 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/quadpair.m | |||
@@ -0,0 +1,20 @@ | |||
1 | function [F1,F2]=quadpair(sig,lam,th,N); | ||
2 | % [F1,F2]=quadpair(sig,lam,th,N); | ||
3 | % | ||
4 | % For Thomas' ECCV98 filters, use sig=sqrt(2), lam=4. | ||
5 | |||
6 | %N=31; | ||
7 | [x,y]=meshgrid(-(N/2)+1/2:(N/2)-1/2,-(N/2)+1/2:(N/2)-1/2); | ||
8 | |||
9 | |||
10 | F1=(4*(y.^2)/(sig^4)-2/(sig^2)).*exp(-(y.^2)/(sig^2)-(x.^2)/(lam^2*sig^2)); | ||
11 | F2=imag(hilbert(F1)); | ||
12 | |||
13 | F1=imrotate(F1,th,'bil','crop'); | ||
14 | F2=imrotate(F2,th,'bil','crop'); | ||
15 | |||
16 | F1=F1-mean(F1(:)); | ||
17 | F2=F2-mean(F2(:)); | ||
18 | |||
19 | F1=F1/norm(F1(:),1); | ||
20 | F2=F2/norm(F2(:),1); \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/smooth.m b/SD-VBS/common/toolbox/toolbox_basic/filter/smooth.m new file mode 100755 index 0000000..5ef7579 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/smooth.m | |||
@@ -0,0 +1,24 @@ | |||
1 | % smooth an image | ||
2 | % coordinates (r, c) follow matrix convention; | ||
3 | % the gaussian is truncated at x = +- tail, and there are samples samples | ||
4 | % inbetween, where samples = hsamples * 2 + 1 | ||
5 | |||
6 | function g = smooth(image, hsamples) | ||
7 | |||
8 | tail=4; | ||
9 | samples = hsamples * 2 + 1; | ||
10 | |||
11 | x = linspace(-tail, tail, samples); | ||
12 | gauss = exp(-x.^2); | ||
13 | %s = sum(gauss)/length(x);gauss = gauss-s; | ||
14 | gauss = gauss/sum(abs(gauss)); | ||
15 | |||
16 | n = gauss * ones(samples,1); | ||
17 | gauss = gauss/n; | ||
18 | |||
19 | |||
20 | g = conv2(conv2(image, gauss,'same'), gauss','same'); | ||
21 | %g = conv2(conv2(image, gauss,'valid'), gauss','valid'); | ||
22 | |||
23 | |||
24 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/softkmean.m b/SD-VBS/common/toolbox/toolbox_basic/filter/softkmean.m new file mode 100755 index 0000000..b9b4feb --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/softkmean.m | |||
@@ -0,0 +1,56 @@ | |||
1 | function [cluster,var,mix,membership,lG] = softkmeans(data,k,cluster0) | ||
2 | |||
3 | [n,D] = size(data); | ||
4 | var = 1.0; | ||
5 | var0 = ones(k,1)*var; minvar = 0.0001; | ||
6 | mix0 = ones(k,1)/k; minmix = 0.0001; | ||
7 | |||
8 | k = size(var0,1); | ||
9 | [n,D] = size(data); | ||
10 | |||
11 | lGG = []; | ||
12 | ma = -1e20; | ||
13 | in = 0; | ||
14 | |||
15 | if (nargin == 2), | ||
16 | max_data = max(data); | ||
17 | min_data = min(data); | ||
18 | %step = (max_data-min_data)/(k+1); | ||
19 | %cluster0 = [1:k]'*step+min_data; | ||
20 | mag = ones(k,1)*(max_data-min_data); | ||
21 | base = ones(k,1)*min_data; | ||
22 | cluster0 = rand(k,D).*mag + base; | ||
23 | end | ||
24 | |||
25 | %cluster0 | ||
26 | for t = 1:3, | ||
27 | %rndindx = round(rand(1,k)*(n-3))+2; | ||
28 | %cluster0 = (data(rndindx,:)+data(rndindx+1,:)+data(rndindx-1,:))/2; | ||
29 | [cluster,var,mix,membership,lG] = softmeans(cluster0,var0,minvar,mix0,minmix,data); | ||
30 | eval(sprintf('mix_var_cluster_%d = [mix,var,cluster];',t)); | ||
31 | eval(sprintf('lG_%d = lG;',t)); | ||
32 | if ma<lG(size(lG,2)), | ||
33 | ma = lG(size(lG,2)); | ||
34 | in = t; | ||
35 | end | ||
36 | |||
37 | end | ||
38 | |||
39 | eval(sprintf('mix_var_cluster = mix_var_cluster_%d;',in)); | ||
40 | eval(sprintf('lG = lG_%d;',in)); | ||
41 | mix = mix_var_cluster(:,1); | ||
42 | var = mix_var_cluster(:,2); | ||
43 | cluster = mix_var_cluster(:,3:size(mix_var_cluster,2)) | ||
44 | |||
45 | |||
46 | [tmp,vecs2cluster] = max(membership'); | ||
47 | vecs2cluster = vecs2cluster'; | ||
48 | cluster_iCV = inv(var); | ||
49 | |||
50 | |||
51 | |||
52 | |||
53 | |||
54 | |||
55 | |||
56 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/softmeans.m b/SD-VBS/common/toolbox/toolbox_basic/filter/softmeans.m new file mode 100755 index 0000000..b7e5068 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/softmeans.m | |||
@@ -0,0 +1,46 @@ | |||
1 | function [cluster,var,mix,membership,lG] = softmeans(cluster0,var0,minvar,mix0,minmix,data) | ||
2 | |||
3 | [k,D] = size(cluster0); | ||
4 | [n,D] = size(data); | ||
5 | cluster_p = cluster0; var_p = var0; mix_p = mix0; | ||
6 | old_lg = -inf; lG = []; | ||
7 | |||
8 | for iter = 1:30, % max.iterations | ||
9 | % E-Step + comp. incomplete likelihood | ||
10 | |||
11 | H = zeros(n,k); | ||
12 | for j = 1:k, | ||
13 | Hj = (data-(ones(n,1)*cluster_p(j,:))).^2; | ||
14 | if D > 1, Hj = sum(Hj')'; end | ||
15 | H(:,j) = exp(Hj /(-2*var_p(j)))/(sqrt(var_p(j))^D); | ||
16 | end | ||
17 | H = H.*(ones(n,1)*mix_p'); | ||
18 | new_lg = sum(log(sum(H')/(sqrt(2*pi)^D))); | ||
19 | lG = [lG, new_lg]; | ||
20 | if new_lg == old_lg, break; end; old_lg = new_lg; | ||
21 | H = H./(sum(H')'*ones(1,k)); % normalize | ||
22 | |||
23 | % M-Step: | ||
24 | |||
25 | if minmix > 0, | ||
26 | mix_p = sum(H); mix_p = mix_p/sum(mix_p); mix_p = mix_p'; | ||
27 | for j = 1:k, if mix_p(j)<minmix, mix_p(j) = minmix; end; end; | ||
28 | end | ||
29 | cluster_p = (H./(ones(n,1)*sum(H)))'*data; | ||
30 | if minvar > 0, | ||
31 | for j = 1:k, | ||
32 | varj = (data-(ones(n,1)*cluster_p(j,:))).^2; | ||
33 | if D > 1, varj = sum(varj')'; end | ||
34 | var_p(j) = sum(H(:,j).*varj)/(D*sum(H(:,j))); | ||
35 | if var_p(j)<minvar, var_p(j) = minvar; end; | ||
36 | end; | ||
37 | end | ||
38 | |||
39 | % cluster_p = cluster_p./(sqrt(sum(cluster_p'.^2)')*ones(1,D)); | ||
40 | end | ||
41 | |||
42 | cluster = cluster_p; | ||
43 | var = var_p; | ||
44 | mix = mix_p; | ||
45 | membership = H; | ||
46 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter/softmeans2.m b/SD-VBS/common/toolbox/toolbox_basic/filter/softmeans2.m new file mode 100755 index 0000000..8fd194e --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter/softmeans2.m | |||
@@ -0,0 +1,39 @@ | |||
1 | function [cluster,var,mix,membership,lG] = softmeans2(var0,minvar,mix0,minmix,data,cluster0,iter) | ||
2 | |||
3 | if (~exist('iter')), | ||
4 | iter = 3; | ||
5 | end | ||
6 | |||
7 | k = size(var0,1); | ||
8 | [n,D] = size(data); | ||
9 | |||
10 | lGG = []; | ||
11 | ma = -1e20; | ||
12 | in = 0; | ||
13 | |||
14 | if (nargin == 5), | ||
15 | max_data = max(data); | ||
16 | min_data = min(data); | ||
17 | step = (max_data-min_data)/(k+1); | ||
18 | cluster0 = [1:k]'*step+min_data; | ||
19 | end | ||
20 | cluster0 | ||
21 | for t = 1:iter, | ||
22 | %rndindx = round(rand(1,k)*(n-3))+2; | ||
23 | %cluster0 = (data(rndindx,:)+data(rndindx+1,:)+data(rndindx-1,:))/2; | ||
24 | [cluster,var,mix,membership,lG] = softmeans(cluster0,var0,minvar,mix0,minmix,data); | ||
25 | eval(sprintf('mix_var_cluster_%d = [mix,var,cluster];',t)); | ||
26 | eval(sprintf('lG_%d = lG;',t)); | ||
27 | if ma<lG(size(lG,2)), | ||
28 | ma = lG(size(lG,2)); | ||
29 | in = t; | ||
30 | end | ||
31 | |||
32 | end | ||
33 | |||
34 | eval(sprintf('mix_var_cluster = mix_var_cluster_%d;',in)); | ||
35 | eval(sprintf('lG = lG_%d;',in)); | ||
36 | mix = mix_var_cluster(:,1); | ||
37 | var = mix_var_cluster(:,2); | ||
38 | cluster = mix_var_cluster(:,3:size(mix_var_cluster,2)) | ||
39 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filterQuad.zip b/SD-VBS/common/toolbox/toolbox_basic/filterQuad.zip new file mode 100755 index 0000000..00e6141 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filterQuad.zip | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/1d_cut.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/1d_cut.m new file mode 100755 index 0000000..46f865b --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/1d_cut.m | |||
@@ -0,0 +1,16 @@ | |||
1 | function [x,map] = idcut(data,cmap,nbin) | ||
2 | % | ||
3 | % | ||
4 | % | ||
5 | |||
6 | lc = size(cmap,1); | ||
7 | |||
8 | data = data - min(data); | ||
9 | data = 1+ ((lc-1)*data/max(data)); | ||
10 | |||
11 | r = cmap(data,1); | ||
12 | g = cmap(data,2); | ||
13 | b = cmap(data,3); | ||
14 | |||
15 | [x,map] = vmquant(r,g,b,nbin); | ||
16 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/Bfilter.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/Bfilter.m new file mode 100755 index 0000000..ee086f0 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/Bfilter.m | |||
@@ -0,0 +1,11 @@ | |||
1 | function output = Bfilter(img,H) | ||
2 | % | ||
3 | % function output = Bfilter(img,H) | ||
4 | % | ||
5 | |||
6 | sze = size(img); | ||
7 | |||
8 | Y = fft(reshape(img,1,sze(1)*sze(2))); | ||
9 | C = Y.*conj(H); | ||
10 | c = real(ifft(C)); | ||
11 | output = reshape(c,sze(1),sze(2)); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/BfilterS.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/BfilterS.m new file mode 100755 index 0000000..4eb4fd6 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/BfilterS.m | |||
@@ -0,0 +1,17 @@ | |||
1 | function output = Bfilters(img,H,w) | ||
2 | % | ||
3 | % function output = Bfilter(img,H,w) | ||
4 | % | ||
5 | |||
6 | sze = size(img); | ||
7 | w_h = round(0.5*(w-1)); | ||
8 | |||
9 | Y = fft(reshape(img,1,sze(1)*sze(2))); | ||
10 | C = Y.*conj(H); | ||
11 | c = real(ifft(C)); | ||
12 | o = reshape(c,sze(1),sze(2)); | ||
13 | |||
14 | output(1:w_h(1),1:w_h(2)) = o(sze(1)-w_h(1)+1:sze(1),sze(2)-w_h(2)+1:sze(2)); | ||
15 | output(1:w_h(1),w_h(2)+1:sze(2)) = o(sze(1)-w_h(1)+1:sze(1),1:sze(2)-w_h(2)); | ||
16 | output(w_h(1)+1:sze(1),w_h(2)+1:sze(2)) = o(1:sze(1)-w_h(1),1:sze(2)-w_h(2)); | ||
17 | output(w_h(1)+1:sze(1),1:w_h(2)) = o(1:sze(1)-w_h(1),sze(2)-w_h(2)+1:sze(2)); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/Ncut.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/Ncut.m new file mode 100755 index 0000000..30c9b33 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/Ncut.m | |||
@@ -0,0 +1,14 @@ | |||
1 | function [v,d] = ncut(A,nv) | ||
2 | |||
3 | ds = sum(A); | ||
4 | ds = ones(size(ds))./sqrt(ds); | ||
5 | |||
6 | D1 = ds'*ones(1,length(ds)); | ||
7 | A = D1'.*A.*D1; | ||
8 | |||
9 | disp(sprintf('computing eig values')); | ||
10 | tic;[v,d] = eigs(A,nv);toc; | ||
11 | |||
12 | d = abs(diag(d)); | ||
13 | |||
14 | v = D1(:,1:size(v,2)).*v; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/apply_image.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/apply_image.m new file mode 100755 index 0000000..0791aa4 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/apply_image.m | |||
@@ -0,0 +1,38 @@ | |||
1 | function [aout1,aout2,aout3,aout4] = apply_image(gx,gy,wc) | ||
2 | % | ||
3 | % aout = apply_image(gx,gy,wc) | ||
4 | % | ||
5 | % | ||
6 | |||
7 | [nr,nc] =size(gx); | ||
8 | |||
9 | w = 2*wc+1; | ||
10 | |||
11 | aout1 = ones(nr,nc); | ||
12 | aout2 = zeros(nr,nc); | ||
13 | aout3 = aout2; | ||
14 | aout4 = aout2; | ||
15 | |||
16 | %mask = smooth(ones(w,w),w); | ||
17 | %sig = w; | ||
18 | %[x,y] = meshgrid(-wc:wc,-wc:wc); | ||
19 | %mask = exp(-(x.*x)/sig).*exp(-(y.*y)/sig); | ||
20 | %mask = mask/sum(sum(mask)); | ||
21 | |||
22 | |||
23 | tmp = ones(w,w); | ||
24 | for j=wc+1:w:nr-wc-1, | ||
25 | for k=wc+1:w:nc-wc-1, | ||
26 | tgx = get_win(gx,[k,j],[wc,wc]); | ||
27 | tgy = get_win(gy,[k,j],[wc,wc]); | ||
28 | %mag = sum(sum(sqrt((mask.*tgx).^2+(mask.*tgy).^2))); | ||
29 | mag = sum(sum(sqrt(tgx.^2 + tgy.^2)))/prod(size(tgy)); | ||
30 | |||
31 | M = is_step(tgx,tgy); | ||
32 | |||
33 | aout1(j-wc:j+wc,k-wc:k+wc) = M(1)*tmp; | ||
34 | aout2(j-wc:j+wc,k-wc:k+wc) = M(2)*tmp; | ||
35 | aout3(j-wc:j+wc,k-wc:k+wc) = M(3)*tmp; | ||
36 | aout4(j-wc:j+wc,k-wc:k+wc) = mag*tmp; | ||
37 | end | ||
38 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/back_proj.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/back_proj.m new file mode 100755 index 0000000..47ac865 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/back_proj.m | |||
@@ -0,0 +1,10 @@ | |||
1 | function BI = back_proj(PFt,vec) | ||
2 | |||
3 | BI = []; | ||
4 | |||
5 | sz1 = sqrt(size(PFt,1)); | ||
6 | |||
7 | for j=1:size(vec,2) | ||
8 | tmp = PFt*vec(:,j); | ||
9 | BI(:,:,j) = reshape(tmp,sz1,sz1); | ||
10 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/backproj_outer.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/backproj_outer.m new file mode 100755 index 0000000..b4560c5 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/backproj_outer.m | |||
@@ -0,0 +1,9 @@ | |||
1 | function v = backproj_outer(fvs,u,hb) | ||
2 | % | ||
3 | % given the eigenvecs of the hist.bin. features | ||
4 | % computes the back projection on the eigenvects | ||
5 | % | ||
6 | |||
7 | [nv,np] = size(fvs); | ||
8 | |||
9 | for j=1: \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/backproj_outer_chank.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/backproj_outer_chank.m new file mode 100755 index 0000000..5e3eac9 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/backproj_outer_chank.m | |||
@@ -0,0 +1,33 @@ | |||
1 | function v = backproj_outer_chank(fvs,u,d,chank_size) | ||
2 | % | ||
3 | % given the eigenvecs of the hist.bin. features | ||
4 | % computes the back projection on the eigenvects | ||
5 | % | ||
6 | |||
7 | [nv,np] = size(fvs); | ||
8 | [nbins,nv] = size(u); | ||
9 | |||
10 | n_chanks = ceil(np/chank_size); | ||
11 | |||
12 | v = ones(np,nv); | ||
13 | |||
14 | for j=1:n_chanks, | ||
15 | fprintf('<'); | ||
16 | |||
17 | cm = sprintf('load st_%d',j); | ||
18 | eval(cm); | ||
19 | fprintf(sprintf('%d',n_chanks-j)); | ||
20 | |||
21 | v((j-1)*chank_size+1:min(np,j*chank_size),:) = fh'*u; | ||
22 | fprintf('>'); | ||
23 | end | ||
24 | |||
25 | fprintf('\n'); | ||
26 | |||
27 | s = 1./sqrt(d); | ||
28 | |||
29 | for j=1:nv, | ||
30 | v(:,j) = v(:,j)*s(j); | ||
31 | end | ||
32 | |||
33 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/backproj_outer_chank2.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/backproj_outer_chank2.m new file mode 100755 index 0000000..084c150 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/backproj_outer_chank2.m | |||
@@ -0,0 +1,36 @@ | |||
1 | function v = backproj_outer_chank(fvs,u,d,chank_size) | ||
2 | % | ||
3 | % given the eigenvecs of the hist.bin. features | ||
4 | % computes the back projection on the eigenvects | ||
5 | % | ||
6 | |||
7 | [nv,np] = size(fvs); | ||
8 | [nbins,nv] = size(u); | ||
9 | |||
10 | n_chanks = ceil(np/chank_size); | ||
11 | |||
12 | v = ones(np,nv); | ||
13 | |||
14 | for j=1:n_chanks, | ||
15 | fprintf('<'); | ||
16 | |||
17 | cm = sprintf('load st_%d',j); | ||
18 | eval(cm); | ||
19 | fprintf(sprintf('%d',n_chanks-j)); | ||
20 | |||
21 | ms = mean(fh'); | ||
22 | fh = fh - ms'*ones(1,size(fh,2)); | ||
23 | |||
24 | v((j-1)*chank_size+1:min(np,j*chank_size),:) = fh'*u; | ||
25 | fprintf('>'); | ||
26 | end | ||
27 | |||
28 | fprintf('\n'); | ||
29 | |||
30 | s = 1./sqrt(d); | ||
31 | |||
32 | for j=1:nv, | ||
33 | v(:,j) = v(:,j)*s(j); | ||
34 | end | ||
35 | |||
36 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/binize.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/binize.m new file mode 100755 index 0000000..d166cd5 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/binize.m | |||
@@ -0,0 +1,15 @@ | |||
1 | function [binv,bins] = binize(data,sig,bin_min,bin_max,num_bin) | ||
2 | % | ||
3 | % given an input data, and sigma which describes the uncertainty | ||
4 | % of the data, along with information on the bins, | ||
5 | % return the soft-hist on data | ||
6 | % | ||
7 | |||
8 | ndata = length(data); | ||
9 | |||
10 | bins = linspace(bin_min,bin_max,num_bin+1); | ||
11 | binv = zeros(num_bin,ndata); | ||
12 | |||
13 | for j=1:num_bin, | ||
14 | binv(j,:) = erf((bins(j+1)-data)/sig) - erf((bins(j)-data)/sig); | ||
15 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/binize_old.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/binize_old.m new file mode 100755 index 0000000..d56d263 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/binize_old.m | |||
@@ -0,0 +1,34 @@ | |||
1 | function [binv,bins] = binize(data,sig,bin_min,bin_max,num_bin) | ||
2 | % | ||
3 | % given an input data, and sigma which describes the uncertainty | ||
4 | % of the data, along with information on the bins, | ||
5 | % return the soft-hist on data | ||
6 | % | ||
7 | |||
8 | ndata = length(data); | ||
9 | |||
10 | if 0, | ||
11 | bins = linspace(bin_min,bin_max,num_bin); | ||
12 | binv = zeros(num_bin,ndata); | ||
13 | |||
14 | Largev = 1000; | ||
15 | |||
16 | bins = [-Largev,bins]; | ||
17 | |||
18 | for j=1:num_bin, | ||
19 | binv(j,:) = erf((bins(j+1)-data)/sig) - erf((bins(j)-data)/sig); | ||
20 | end | ||
21 | |||
22 | binv(num_bin,:) = binv(num_bin,:) + erf((Largev-data)/sig) - erf((bins(end)-data)/sig); | ||
23 | bins = bins(2:end); | ||
24 | else | ||
25 | |||
26 | bins = linspace(bin_min,bin_max,num_bin+1); | ||
27 | binv = zeros(num_bin,ndata); | ||
28 | |||
29 | |||
30 | for j=1:num_bin, | ||
31 | binv(j,:) = erf((bins(j+1)-data)/sig) - erf((bins(j)-data)/sig); | ||
32 | end | ||
33 | |||
34 | end \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/binomialfield.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/binomialfield.m new file mode 100755 index 0000000..d83d96d --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/binomialfield.m | |||
@@ -0,0 +1,75 @@ | |||
1 | function [x,y,success] = BinomialField(n,sx,sy,ir,numtri); | ||
2 | %BF_HardCore Generates a hard core binomial field | ||
3 | % [x,y,success] = BinomialField(n,sx,sy,ir); | ||
4 | % n : # points (default 100) | ||
5 | % sx : size in x (default 100) | ||
6 | % sy : size in y (default 100) | ||
7 | % ir : inhibition radius (default 0) | ||
8 | % numtri : number of trials (default 200) | ||
9 | % x : x coordinates | ||
10 | % y : y coordinates | ||
11 | % success: whether success or not, useful when producing hard core model | ||
12 | |||
13 | %% | ||
14 | %% (C) Thomas K. Leung | ||
15 | %% University of California at Berkeley | ||
16 | %% April 26, 1995. | ||
17 | %% leungt@cajal.cs.berkeley.edu | ||
18 | %% | ||
19 | |||
20 | %% | ||
21 | %% Generate n points first and then reject those closer to the | ||
22 | %% previous points than ir | ||
23 | %% | ||
24 | |||
25 | if nargin < 1 | ||
26 | n = 100; | ||
27 | sx = 100; | ||
28 | sy = 100; | ||
29 | ir = 0; | ||
30 | numtri = 200; | ||
31 | elseif (nargin == 1 | nargin == 2) | ||
32 | sx = 100; | ||
33 | sy = 100; | ||
34 | ir = 0; | ||
35 | numtri = 200; | ||
36 | elseif (nargin == 3) | ||
37 | ir = 0; | ||
38 | numtri = 200; | ||
39 | elseif (nargin == 4) | ||
40 | numtri = 200; | ||
41 | end | ||
42 | |||
43 | x = zeros(1,n); | ||
44 | y = zeros(1,n); | ||
45 | |||
46 | rand('seed',sum(100*clock)); | ||
47 | x(1) = rand(1) * sx; | ||
48 | y(1) = rand(1) * sy; | ||
49 | |||
50 | success = 1; | ||
51 | |||
52 | I = 2; | ||
53 | trial = 0; | ||
54 | while (I <= n & trial < numtri) | ||
55 | found = 0; | ||
56 | trial = 0; | ||
57 | while (~found & trial < numtri); | ||
58 | tx = rand(1) * sx; | ||
59 | ty = rand(1) * sy; | ||
60 | D = (x(1:(I-1)) - tx).^2 + (y(1:(I-1)) - ty).^2; | ||
61 | if sum(D > (ir^2)) == (I-1) | ||
62 | found = 1; | ||
63 | x(I) = tx; | ||
64 | y(I) = ty; | ||
65 | end | ||
66 | trial = trial + 1; | ||
67 | end | ||
68 | I = I + 1; | ||
69 | end | ||
70 | |||
71 | if trial >= numtri | ||
72 | fprintf(1,'Failed to generate a point in %d trials\n',numtri); | ||
73 | success = 0; | ||
74 | end | ||
75 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/colize.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/colize.m new file mode 100755 index 0000000..b03616f --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/colize.m | |||
@@ -0,0 +1,9 @@ | |||
1 | function t1a = colize(t1,I1); | ||
2 | |||
3 | t1a = t1; | ||
4 | |||
5 | t1a = reshape(t1a,size(t1,1)*size(t1,2),1,size(t1,3)); | ||
6 | t1a = squeeze(t1a); | ||
7 | t1a = t1a'; | ||
8 | |||
9 | %I1a = 2*I1(:)';I1a = I1a-mean(I1a(:));t1a = [I1a;t1a]; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/colize_hist.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/colize_hist.m new file mode 100755 index 0000000..9c7b68e --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/colize_hist.m | |||
@@ -0,0 +1,29 @@ | |||
1 | function fh = colize_hist(fv,hb) | ||
2 | % (hb = sigs,bin_mins,bin_maxs,nbins) | ||
3 | % | ||
4 | % fv = [nfeature x npoints]; | ||
5 | % fh = [nfeatures*nbins x npoints]; | ||
6 | % | ||
7 | % take a feature matrix, and turn it into histogram bin feature matrix | ||
8 | % | ||
9 | % | ||
10 | |||
11 | [nf,np] = size(fv); | ||
12 | |||
13 | nbins = [0,hb.nbins]; | ||
14 | disp(sprintf('need matrix of %d x %d ',sum(nbins),np)); | ||
15 | |||
16 | fh = zeros(sum(nbins),np); | ||
17 | |||
18 | for k=1:nf, | ||
19 | bin_min = hb.bmins(k); | ||
20 | bin_max = hb.bmaxs(k); | ||
21 | nbin = nbins(k+1); | ||
22 | sig = hb.sigs(k); | ||
23 | fprintf('.'); | ||
24 | b = binize(fv(k,:),sig,bin_min,bin_max,nbin); | ||
25 | fh(sum(nbins(1:k))+1:sum(nbins(1:k+1)),:) = b; | ||
26 | |||
27 | end | ||
28 | |||
29 | fprintf('\n'); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/colize_histnb_s.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/colize_histnb_s.m new file mode 100755 index 0000000..61c81ca --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/colize_histnb_s.m | |||
@@ -0,0 +1,47 @@ | |||
1 | function fhs = colize_histnb_s(fh,Is,nw,hw) | ||
2 | % | ||
3 | % fhs = colize_histneigh(fh,fvs,nw) | ||
4 | % | ||
5 | % | ||
6 | |||
7 | [tnbins,np] = size(fh); | ||
8 | |||
9 | [nr,nc] = size(Is); | ||
10 | |||
11 | st_sz = 2*hw + 1; | ||
12 | |||
13 | nr_chank = floor(nr/st_sz); | ||
14 | nc_chank = floor(nc/st_sz); | ||
15 | |||
16 | fhs = zeros(size(fh,1),nr_chank*nc_chank); | ||
17 | |||
18 | idx = 0; | ||
19 | for k=1+hw:st_sz:nc-hw, | ||
20 | |||
21 | fprintf('.'); | ||
22 | sk = max(1,k-nw); | ||
23 | ek = min(nc,k+nw); | ||
24 | |||
25 | |||
26 | % for each column, | ||
27 | for j=1+hw:st_sz:nr-hw, | ||
28 | sj = max(1,j-nw); | ||
29 | ej = min(nr,j+nw); | ||
30 | |||
31 | id = j+(k-1)*nr; | ||
32 | idx = idx+1; | ||
33 | for li=sj:ej, | ||
34 | for lj=sk:ek, | ||
35 | idn = li+(lj-1)*nr; | ||
36 | |||
37 | fhs(:,idx) = fhs(:,idx) + fh(:,idn); | ||
38 | |||
39 | end | ||
40 | end | ||
41 | end | ||
42 | end | ||
43 | |||
44 | fprintf('\n'); | ||
45 | |||
46 | |||
47 | \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/colize_histnb_sf.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/colize_histnb_sf.m new file mode 100755 index 0000000..d0d60f9 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/colize_histnb_sf.m | |||
@@ -0,0 +1,52 @@ | |||
1 | function fhs = colize_histnb_s(fvs,Is,hb,nw,hw) | ||
2 | % | ||
3 | % fhs = colize_histneigh(fvs,Is,hb,nw,hw) | ||
4 | % | ||
5 | % | ||
6 | |||
7 | [nf,np] = size(fvs); | ||
8 | |||
9 | [nr,nc] = size(Is); | ||
10 | |||
11 | st_sz = 2*hw + 1; | ||
12 | |||
13 | nr_chank = floor(nr/st_sz); | ||
14 | nc_chank = floor(nc/st_sz); | ||
15 | |||
16 | tnbins = prod(hb.nbins(1:nf)); | ||
17 | disp(sprintf('allocat memory for %d x %d',tnbins,nr_chank*nc_chank)); | ||
18 | |||
19 | fhs = zeros(tnbins,nr_chank*nc_chank); | ||
20 | |||
21 | idx = 0; | ||
22 | for k=1+hw:st_sz:nc-hw, | ||
23 | |||
24 | fprintf(','); | ||
25 | sk = max(1,k-nw); | ||
26 | ek = min(nc,k+nw); | ||
27 | |||
28 | |||
29 | % for each column, | ||
30 | for j=1+hw:st_sz:nr-hw, | ||
31 | sj = max(1,j-nw); | ||
32 | ej = min(nr,j+nw); | ||
33 | |||
34 | id = j+(k-1)*nr; | ||
35 | idx = idx+1; | ||
36 | |||
37 | %% find idx for the neighboring points | ||
38 | lis = [sj:ej]'*ones(1,ek-sk+1); | ||
39 | ljs = ones(ej-sj+1,1)*[sk:ek]; | ||
40 | idns = lis+(ljs-1)*nr; | ||
41 | |||
42 | fh = colize_joint_hist(fvs(:,idns(:)),hb); | ||
43 | |||
44 | fhs(:,idx) = sum(fh')'; | ||
45 | |||
46 | end | ||
47 | end | ||
48 | |||
49 | fprintf('\n'); | ||
50 | |||
51 | |||
52 | \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/colize_histneighb.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/colize_histneighb.m new file mode 100755 index 0000000..6189cab --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/colize_histneighb.m | |||
@@ -0,0 +1,37 @@ | |||
1 | function fhs = colize_histneigh(fh,Is,nw) | ||
2 | % | ||
3 | % fhs = colize_histneigh(fh,fvs,nw) | ||
4 | % | ||
5 | % | ||
6 | |||
7 | [tnbins,np] = size(fh); | ||
8 | |||
9 | [nr,nc] = size(Is); | ||
10 | |||
11 | fhs = zeros(size(fh)); | ||
12 | |||
13 | for j=1:nr, | ||
14 | fprintf('.'); | ||
15 | sj = max(1,j-nw); | ||
16 | ej = min(nr,j+nw); | ||
17 | |||
18 | % for each column, | ||
19 | for k=1:nc, | ||
20 | sk = max(1,k-nw); | ||
21 | ek = min(nc,k+nw); | ||
22 | |||
23 | id = j+(k-1)*nr; | ||
24 | |||
25 | for li=sj:ej, | ||
26 | for lj=sk:ek, | ||
27 | idn = li+(lj-1)*nr; | ||
28 | |||
29 | fhs(:,id) = fhs(:,id) + fh(:,idn); | ||
30 | end | ||
31 | end | ||
32 | end | ||
33 | end | ||
34 | fprintf('\n'); | ||
35 | |||
36 | |||
37 | \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/colize_joint_hist.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/colize_joint_hist.m new file mode 100755 index 0000000..e7844d8 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/colize_joint_hist.m | |||
@@ -0,0 +1,41 @@ | |||
1 | function fh = colize_joint_hist(fv,hb) | ||
2 | % (hb = sigs,bin_mins,bin_maxs,nbins) | ||
3 | % | ||
4 | % take which histogram value and turn it into histogram bin | ||
5 | % | ||
6 | |||
7 | |||
8 | [nf,np] = size(fv); | ||
9 | |||
10 | nbins = [0,hb.nbins]; | ||
11 | %disp(sprintf('need matrix of %d x %d ',prod(hb.nbins),np)); | ||
12 | |||
13 | fh = zeros(hb.nbins(1),hb.nbins(2),np); | ||
14 | |||
15 | k=1; | ||
16 | bin_min = hb.bmins(k); | ||
17 | bin_max = hb.bmaxs(k); | ||
18 | nbin = nbins(k+1); | ||
19 | sig = hb.sigs(k); | ||
20 | %fprintf('.'); | ||
21 | |||
22 | b1 = binize(fv(k,:),sig,bin_min,bin_max,nbin); | ||
23 | k=2; | ||
24 | bin_min = hb.bmins(k); | ||
25 | bin_max = hb.bmaxs(k); | ||
26 | nbin = nbins(k+1); | ||
27 | sig = hb.sigs(k); | ||
28 | %fprintf('.'); | ||
29 | |||
30 | b2 = binize(fv(k,:),sig,bin_min,bin_max,nbin); | ||
31 | |||
32 | |||
33 | for k=1:hb.nbins(1), | ||
34 | for j=1:hb.nbins(2), | ||
35 | fh(k,j,:) = b1(k,:).*b2(j,:); | ||
36 | end | ||
37 | end | ||
38 | |||
39 | %fprintf('\n'); | ||
40 | |||
41 | fh = reshape(fh,hb.nbins(1)*hb.nbins(2),np); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/colize_test.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/colize_test.m new file mode 100755 index 0000000..a9135cc --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/colize_test.m | |||
@@ -0,0 +1,19 @@ | |||
1 | function t1a = colize(t1,I1); | ||
2 | |||
3 | if 1, | ||
4 | t1a = t1; | ||
5 | %t1a = 1.2*half_sigmoid(t1,0.3,0.1);; | ||
6 | t1a = reshape(t1a,size(t1,1)*size(t1,2),1,size(t1,3)); | ||
7 | t1a = squeeze(t1a); | ||
8 | t1a = t1a'; | ||
9 | |||
10 | %I1a = I1(:)';I1a = I1a-mean(I1a(:));t1a = [I1a;t1a]; | ||
11 | |||
12 | else | ||
13 | mask = t1>=0; | ||
14 | t1a = abs(t1); | ||
15 | t1a = 0.5-t1a; | ||
16 | t1a = reshape(t1a,size(t1,1)*size(t1,2),1,size(t1,3)); | ||
17 | t1a = squeeze(t1a); | ||
18 | t1a = t1a'; | ||
19 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/compact.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/compact.m new file mode 100755 index 0000000..9863e0f --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/compact.m | |||
@@ -0,0 +1,36 @@ | |||
1 | function I = compact(img,ws) | ||
2 | |||
3 | |||
4 | %ws = 2*hws+1; | ||
5 | |||
6 | [sy,sx] = size(img); | ||
7 | |||
8 | rem_x = rem(sx,ws); | ||
9 | rem_y = rem(sy,ws); | ||
10 | |||
11 | fix_x = ceil(sx/ws); | ||
12 | fix_y = ceil(sy/ws); | ||
13 | |||
14 | fprintf('nr = %d, nc = %d\n',fix_y,fix_x); | ||
15 | |||
16 | %startx= 1 + floor(rem_x*0.5)+hws; | ||
17 | %starty= 1 + floor(rem_y*0.5)+hws; | ||
18 | |||
19 | I = zeros(fix_y,fix_x); | ||
20 | |||
21 | yid = 0; | ||
22 | for j=1:ws:sy, | ||
23 | xid = 0; | ||
24 | yid = yid +1; | ||
25 | fprintf('.'); | ||
26 | for k=1:ws:sx, | ||
27 | xid = xid+1; | ||
28 | %I(yid,xid) = median(median(img(j-hws:j+hws,k-hws:k+hws))); | ||
29 | %I(yid,xid) = sum(sum(img(j-hws:j+hws,k-hws:k+hws))); | ||
30 | v = img(j:min(sy,j+ws-1),k:min(sx,k+ws-1)); | ||
31 | %I(yid,xid) = median(reshape(v,prod(size(v)),1)); | ||
32 | I(yid,xid) = median(median(v)); | ||
33 | end | ||
34 | end | ||
35 | fprintf('\n'); | ||
36 | \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/compute_J.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/compute_J.m new file mode 100755 index 0000000..99b8b69 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/compute_J.m | |||
@@ -0,0 +1,31 @@ | |||
1 | function J = compute_J(A,I,size_x,size_y,D) | ||
2 | %% function J = compute_J(A,I,size_x,size_y,D) | ||
3 | % | ||
4 | |||
5 | [center_x,center_y] = find_center(size_x,size_y); | ||
6 | |||
7 | tmp = ones(size_y,1)*[1:size_x]; | ||
8 | index(:,1) = reshape(tmp,size_x*size_y,1)-center_x*ones(size_x*size_y,1); | ||
9 | index(:,2) = reshape(tmp',size_x*size_y,1)-center_y*ones(size_x*size_y,1); | ||
10 | |||
11 | position_new = A*index'+ [D(1),0;0,D(2)]*ones(2,size_x*size_y); | ||
12 | position_new = round(position_new +... | ||
13 | [center_x,0;0,center_y]*ones(2,size_x*size_y)); | ||
14 | % we have to deal with out of boundary ones | ||
15 | % | ||
16 | bad_ones(1,:) = position_new(1,:)<1 | position_new(1,:)>size_x; | ||
17 | bad_ones(2,:) = position_new(2,:)<1 | position_new(2,:)>size_y; | ||
18 | bad = max([bad_ones(1,:);bad_ones(2,:)]); | ||
19 | good = ~bad; | ||
20 | % if new index is out of boundary, then set it to (0,0) | ||
21 | position_new(1,:) = position_new(1,:).*good; | ||
22 | position_new(2,:) = position_new(2,:).*good; | ||
23 | |||
24 | new_index = size_y*(position_new(1,:)-ones(1,size_x*size_y))+... | ||
25 | position_new(2,:); | ||
26 | new_index = max([new_index;ones(1,size_x*size_y)]); | ||
27 | J = I(new_index); | ||
28 | % set the "out of boundary" to zero. | ||
29 | J = J.*good; | ||
30 | J = reshape(J',size_y,size_x); | ||
31 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/compute_Lf.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/compute_Lf.m new file mode 100755 index 0000000..7cda523 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/compute_Lf.m | |||
@@ -0,0 +1,35 @@ | |||
1 | function dists = compute_Lf(F,cts,wz,nr,nc) | ||
2 | |||
3 | gap = 2*wz(1)+1; | ||
4 | hw = wz(1); | ||
5 | |||
6 | nr = nr+1; | ||
7 | nc = nc+1; | ||
8 | |||
9 | dists = zeros(size(cts,1),nr*nc); | ||
10 | for ctj = 1:size(cts,1), | ||
11 | t1 = cutout(F,cts(ctj,:),wz); | ||
12 | |||
13 | rid = 1; | ||
14 | fprintf('>'); | ||
15 | |||
16 | for ri = hw+1:gap:size(F,1)-hw, | ||
17 | %fprintf('[%d]',ri); | ||
18 | cid = 1; | ||
19 | for ci = hw+1:gap:size(F,2)-hw, | ||
20 | %fprintf('(%d)',ci); | ||
21 | t2 = cutout(F,[ci,ri],wz); | ||
22 | |||
23 | dist = abs(mean(t1(:))-mean(t2(:))); | ||
24 | |||
25 | dists(ctj,rid+cid*nr) = max(dist,dists(ctj,rid+cid*nr)); | ||
26 | |||
27 | cid = cid+1; | ||
28 | end | ||
29 | rid = rid+1; | ||
30 | end | ||
31 | |||
32 | %fprintf('\n'); | ||
33 | |||
34 | end | ||
35 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/compute_corr.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/compute_corr.m new file mode 100755 index 0000000..92f9da4 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/compute_corr.m | |||
@@ -0,0 +1,10 @@ | |||
1 | function a = compute_corr(f,g) | ||
2 | % | ||
3 | % compute the circular correlation of f and g | ||
4 | % at points around zero | ||
5 | % | ||
6 | % | ||
7 | |||
8 | ff = interp(f,4); | ||
9 | gg = interp(g,4); | ||
10 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/compute_diff.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/compute_diff.m new file mode 100755 index 0000000..72bfe54 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/compute_diff.m | |||
@@ -0,0 +1,36 @@ | |||
1 | function B = compute_diff(Ja,Jfa,hw,hnb); | ||
2 | % | ||
3 | % B = compute_diff(Ja,Jfa,hw,hnb) | ||
4 | % | ||
5 | % | ||
6 | |||
7 | figure(1);%imagesc(Ja);axis('image'); | ||
8 | cs = round(ginput(1)); | ||
9 | |||
10 | B = zeros(2*hnb+1,2*hnb+1); | ||
11 | |||
12 | scales = [1:5];filter_ids = [1:7]; | ||
13 | Jc = get_win(Ja,cs,[hw,hw]); | ||
14 | Jfc= get_win5(Jfa,cs,[hw,hw]); | ||
15 | H2c = hist2d(Jc,Jfc,scales,filter_ids); | ||
16 | |||
17 | figure(2);imagesc(Ja);axis('image');colormap(gray); | ||
18 | hold on; plot(cs(1),cs(2),'g*'); | ||
19 | |||
20 | |||
21 | for ii=-hnb:hnb, | ||
22 | for jj=-hnb:hnb, | ||
23 | J1 = get_win(Ja,cs+4*[jj,ii],[hw,hw]); | ||
24 | Jf1= get_win5(Jfa,cs+4*[jj,ii],[hw,hw]); | ||
25 | figure(2);plot(cs(1)+4*jj,cs(2)+4*ii,'ro');drawnow; | ||
26 | %figure(3);imagesc(J1);drawnow; | ||
27 | |||
28 | H2 = hist2d(J1,Jf1,scales,filter_ids); | ||
29 | d = hist_diff(H2/prod(size(Jc)),H2c/prod(size(Jc))); | ||
30 | disp(sprintf('d=%f',d)); | ||
31 | B(ii+hnb+1,jj+hnb+1) = d; | ||
32 | |||
33 | end | ||
34 | end | ||
35 | |||
36 | figure(2);hold off; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/compute_diff_patch.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/compute_diff_patch.m new file mode 100755 index 0000000..260b93a --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/compute_diff_patch.m | |||
@@ -0,0 +1,34 @@ | |||
1 | function a = compute_diff_patch(gx1,gy1,gx2,gy2,I1,I2) | ||
2 | % | ||
3 | % a = compute_diff_patch(gx1,gy1,gx2,gy2,I1,I2) | ||
4 | % | ||
5 | % | ||
6 | |||
7 | %ws = size(gx1); | ||
8 | %mask = smooth(ones(ws),2*max(ws)); | ||
9 | %mask = mask/sum(sum(mask)); | ||
10 | |||
11 | %mag1= sum(sum(sqrt((mask.*gx1).^2 + (mask.*gy1).^2))); | ||
12 | %mag2= sum(sum(sqrt((mask.*gx2).^2 + (mask.*gy2).^2))); | ||
13 | |||
14 | mag1= sum(sum(sqrt((gx1).^2 + (gy1).^2))); | ||
15 | mag2= sum(sum(sqrt((gx2).^2 + (gy2).^2))); | ||
16 | |||
17 | P_tx1 = sigmoid(mag1,400,80); | ||
18 | P_tx2 = sigmoid(mag2,400,80); | ||
19 | |||
20 | diff_I = mean(reshape(I1,prod(size(I1)),1))-... | ||
21 | mean(reshape(I2,prod(size(I2)),1)); | ||
22 | diff_I = abs(diff_I); | ||
23 | |||
24 | s_g1 = [sum(sum(abs(gx1))),sum(sum(abs(gy1)))]; | ||
25 | s_g2 = [sum(sum(abs(gx2))),sum(sum(abs(gy2)))]; | ||
26 | |||
27 | s_g1 = s_g1/(norm(s_g1)); | ||
28 | s_g2 = s_g2/(norm(s_g2)); | ||
29 | |||
30 | a = (1-P_tx1)*(1-P_tx2)*exp(-diff_I/0.1) +... | ||
31 | P_tx1*P_tx2*(dot(s_g1,s_g2)); | ||
32 | |||
33 | |||
34 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/compute_diff_patch2.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/compute_diff_patch2.m new file mode 100755 index 0000000..9d2b528 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/compute_diff_patch2.m | |||
@@ -0,0 +1,45 @@ | |||
1 | function [a,phi1,phi2] = compute_diff_patch(gx1,gy1,gx2,gy2,I1,I2) | ||
2 | % | ||
3 | % a = compute_diff_patch(gx1,gy1,gx2,gy2,I1,I2) | ||
4 | % | ||
5 | % | ||
6 | |||
7 | %ws = size(gx1); | ||
8 | %mask = smooth(ones(ws),2*max(ws)); | ||
9 | %mask = mask/sum(sum(mask)); | ||
10 | |||
11 | %mag1= sum(sum(sqrt((mask.*gx1).^2 + (mask.*gy1).^2))); | ||
12 | %mag2= sum(sum(sqrt((mask.*gx2).^2 + (mask.*gy2).^2))); | ||
13 | |||
14 | mag1= sum(sum(sqrt((gx1).^2 + (gy1).^2)))/prod(size(gx1)); | ||
15 | mag2= sum(sum(sqrt((gx2).^2 + (gy2).^2)))/prod(size(gx1)); | ||
16 | |||
17 | P_tx1 = sigmoid(mag1,2,0.5); | ||
18 | P_tx2 = sigmoid(mag2,2,0.5); | ||
19 | |||
20 | diff_I = mean(reshape(I1,prod(size(I1)),1))-... | ||
21 | mean(reshape(I2,prod(size(I2)),1)); | ||
22 | diff_I = abs(diff_I); | ||
23 | |||
24 | [l1,l2,phi1] = mwis(gx1,gy1); | ||
25 | [k1,k2,phi2] = mwis(gx2,gy2); | ||
26 | |||
27 | ratio1 = min([l1,l2])/max([l1,l2]); | ||
28 | ratio2 = min([k1,k2])/max([k1,k2]); | ||
29 | |||
30 | r1 = 1-sigmoid(ratio1,0.35,0.05); | ||
31 | r2 = 1-sigmoid(ratio2,0.35,0.05); | ||
32 | |||
33 | s1 = [cos(phi1),sin(phi1)]; | ||
34 | s2 = [cos(phi2),sin(phi2)]; | ||
35 | |||
36 | angle = acos(abs(dot(s1,s2)))*180/pi; | ||
37 | |||
38 | a1 = (1-P_tx1*P_tx2)*exp(-diff_I/0.1); | ||
39 | a2 = P_tx1*P_tx2*(r1*r2*(90-angle)/90); | ||
40 | a3 = P_tx1*P_tx2*((1-r1*r2)*(1-sigmoid(abs(r1-r2),0.3,0.04))); | ||
41 | |||
42 | a = a1+a2+a3; | ||
43 | |||
44 | |||
45 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/compute_filter.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/compute_filter.m new file mode 100755 index 0000000..04e78e1 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/compute_filter.m | |||
@@ -0,0 +1,84 @@ | |||
1 | function [filter_output,filters] = compute_filter(I,sig,r,sz); | ||
2 | % | ||
3 | % | ||
4 | % | ||
5 | |||
6 | ori_incr=180/num_ori; | ||
7 | ori_offset=ori_incr/2; % helps with equalizing quantiz. error across filter set | ||
8 | |||
9 | as = ori_offset:ori_incr:180+ori_offset-ori_incr; | ||
10 | |||
11 | filter_output = []; | ||
12 | filters = []; | ||
13 | |||
14 | wsz = 2*round(sz) + 1; | ||
15 | M1 = wsz(1);M2 = wsz(2); | ||
16 | |||
17 | %%%%% prepare FFT of image %%%%%%%%%%%%% | ||
18 | |||
19 | [N1,N2]=size(I); | ||
20 | tmp=zeros(size(I)+[M1-1 M2-1]); | ||
21 | tmp(1:N1,1:N2)=I; | ||
22 | IF=fft2(tmp); | ||
23 | |||
24 | |||
25 | %%%%%%%%%% filtering stage %%%%%%%%%%% | ||
26 | if size(sig,2)== 1, | ||
27 | |||
28 | for j = 1:length(as), | ||
29 | fprintf('.'); | ||
30 | angle = as(j); | ||
31 | |||
32 | g = mdoog2(sig,r,angle,round(sz)); | ||
33 | |||
34 | g = g - mean(reshape(g,prod(size(g)),1)); | ||
35 | |||
36 | g = g/sum(sum(abs(g))); | ||
37 | |||
38 | filters(:,:,j) = g; | ||
39 | |||
40 | gF = fft2(g,N1+M1-1,N2+M2-1); | ||
41 | IgF = If.*gF; | ||
42 | Ig = real(ifft2(IgF)); | ||
43 | Ig = Ig(ceil((M1+1)/2):ceil((M1+1)/2)+N1-1,ceil((M2+1)/2):ceil((M2+1)/2)+N2-1); | ||
44 | |||
45 | %c = conv2(I,g,'valid'); | ||
46 | |||
47 | filter_output(:,:,j) = Ig; | ||
48 | end | ||
49 | else | ||
50 | |||
51 | % there are multiple scales | ||
52 | sigs = sig; | ||
53 | szs = sz; | ||
54 | for k = 1:size(sigs,2), | ||
55 | sig = sigs(k); | ||
56 | sz = szs(k); | ||
57 | fprintf('%d',k); | ||
58 | for j = 1:length(as), | ||
59 | fprintf('.'); | ||
60 | angle = as(j); | ||
61 | |||
62 | g = mdoog2(sig,r,angle,round(sz)); | ||
63 | g = g - mean(reshape(g,prod(size(g)),1)); | ||
64 | g = g/sum(sum(abs(g))); | ||
65 | |||
66 | gF = fft2(g,N1+M1-1,N2+M2-1); | ||
67 | IgF = If.*gF; | ||
68 | Ig = real(ifft2(IgF)); | ||
69 | Ig = Ig(ceil((M1+1)/2):ceil((M1+1)/2)+N1-1,ceil((M2+1)/2):ceil((M2+1)/2)+N2-1); | ||
70 | |||
71 | %c = conv2(I,g,'valid'); | ||
72 | %c = conv2(I,g,'same'); | ||
73 | |||
74 | filter_output(:,:,j,k) = Ig; | ||
75 | filters(:,:,j,k) = g; | ||
76 | end | ||
77 | |||
78 | |||
79 | end | ||
80 | |||
81 | end | ||
82 | |||
83 | fprintf('\n'); | ||
84 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/compute_filter_fft.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/compute_filter_fft.m new file mode 100755 index 0000000..359c6ba --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/compute_filter_fft.m | |||
@@ -0,0 +1,84 @@ | |||
1 | function [filter_output,filters] = compute_filter_fft(I,sig,r,sz,num_ori); | ||
2 | % | ||
3 | % | ||
4 | % | ||
5 | |||
6 | ori_incr=180/num_ori; | ||
7 | ori_offset=ori_incr/2; % helps with equalizing quantiz. error across filter set | ||
8 | |||
9 | as = ori_offset:ori_incr:180+ori_offset-ori_incr; | ||
10 | |||
11 | filter_output = []; | ||
12 | filters = []; | ||
13 | |||
14 | wsz = 2*round(sz(end)) + 1; | ||
15 | M1 = wsz;M2 = wsz; | ||
16 | |||
17 | %%%%% prepare FFT of image %%%%%%%%%%%%% | ||
18 | |||
19 | [N1,N2]=size(I); | ||
20 | tmp=zeros(size(I)+[M1-1 M2-1]); | ||
21 | tmp(1:N1,1:N2)=I; | ||
22 | IF=fft2(tmp); | ||
23 | |||
24 | |||
25 | %%%%%%%%%% filtering stage %%%%%%%%%%% | ||
26 | if size(sig,2)== 1, | ||
27 | |||
28 | for j = 1:length(as), | ||
29 | fprintf('.'); | ||
30 | angle = as(j); | ||
31 | |||
32 | g = mdoog2(sig,r,angle,round(sz)); | ||
33 | |||
34 | g = g - mean(reshape(g,prod(size(g)),1)); | ||
35 | |||
36 | g = g/sum(sum(abs(g))); | ||
37 | |||
38 | filters(:,:,j) = g; | ||
39 | |||
40 | gF = fft2(g,N1+M1-1,N2+M2-1); | ||
41 | IgF = IF.*gF; | ||
42 | Ig = real(ifft2(IgF)); | ||
43 | Ig = Ig(ceil((M1+1)/2):ceil((M1+1)/2)+N1-1,ceil((M2+1)/2):ceil((M2+1)/2)+N2-1); | ||
44 | |||
45 | %c = conv2(I,g,'valid'); | ||
46 | |||
47 | filter_output(:,:,j) = Ig; | ||
48 | end | ||
49 | else | ||
50 | |||
51 | % there are multiple scales | ||
52 | sigs = sig; | ||
53 | szs = sz; | ||
54 | for k = 1:size(sigs,2), | ||
55 | sig = sigs(k); | ||
56 | sz = szs(end); | ||
57 | fprintf('%d',k); | ||
58 | for j = 1:length(as), | ||
59 | fprintf('.'); | ||
60 | angle = as(j); | ||
61 | |||
62 | g = mdoog2(sig,r,angle,round(sz)); | ||
63 | g = g - mean(reshape(g,prod(size(g)),1)); | ||
64 | g = g/sum(sum(abs(g))); | ||
65 | |||
66 | gF = fft2(g,N1+M1-1,N2+M2-1); | ||
67 | IgF = IF.*gF; | ||
68 | Ig = real(ifft2(IgF)); | ||
69 | Ig = Ig(ceil((M1+1)/2):ceil((M1+1)/2)+N1-1,ceil((M2+1)/2):ceil((M2+1)/2)+N2-1); | ||
70 | |||
71 | %c = conv2(I,g,'valid'); | ||
72 | %c = conv2(I,g,'same'); | ||
73 | |||
74 | filter_output(:,:,j,k) = Ig; | ||
75 | filters(:,:,j,k) = g; | ||
76 | end | ||
77 | |||
78 | |||
79 | end | ||
80 | |||
81 | end | ||
82 | |||
83 | fprintf('\n'); | ||
84 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/conv_trim.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/conv_trim.m new file mode 100755 index 0000000..30d16a9 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/conv_trim.m | |||
@@ -0,0 +1,6 @@ | |||
1 | % trims an array to remove meaningless pixels after a convolution with | ||
2 | % an r * c window | ||
3 | |||
4 | function[B] = conv_trim(A, r, c) | ||
5 | |||
6 | B = A(r+1:size(A,1)-r, c+1:size(A,2)-c); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/corr_hist.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/corr_hist.m new file mode 100755 index 0000000..c538dc1 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/corr_hist.m | |||
@@ -0,0 +1,9 @@ | |||
1 | function alpha = corr_hist(hists) | ||
2 | |||
3 | [y,x,v] = find(hists); | ||
4 | mx = sum(x.*v)/sum(v); | ||
5 | my = sum(y.*v)/sum(v); | ||
6 | |||
7 | top = sum( (x-mx).*(y-my).*v); | ||
8 | bottom = sqrt(sum( ((x-mx).^2).*v))*sqrt(sum( ((y-my).^2).*v)); | ||
9 | alpha = top/bottom; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/crop_im_fil.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/crop_im_fil.m new file mode 100755 index 0000000..5472171 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/crop_im_fil.m | |||
@@ -0,0 +1,11 @@ | |||
1 | function [J,f,rect] = crop_im_fil(Ja,Jfa,fig_id) | ||
2 | % | ||
3 | % | ||
4 | |||
5 | figure(fig_id); | ||
6 | imagesc(Ja);axis('image'); | ||
7 | |||
8 | [J,rect] = imcrop;rect = round(rect); | ||
9 | J = Ja(rect(2):rect(2)+rect(4),rect(1):rect(1)+rect(3)); | ||
10 | f = Jfa(rect(2):rect(2)+rect(4),rect(1):rect(1)+rect(3),:,:); | ||
11 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/cutoff.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/cutoff.m new file mode 100755 index 0000000..58c6b94 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/cutoff.m | |||
@@ -0,0 +1,13 @@ | |||
1 | function I = cutoff(I,wc) | ||
2 | % | ||
3 | % | ||
4 | |||
5 | nr = size(I,1); | ||
6 | nc = size(I,2); | ||
7 | |||
8 | if ndims(I) == 3, | ||
9 | I = I(wc+1:nr-wc,wc+1:nc-wc,:,:); | ||
10 | else | ||
11 | I = I(wc+1:nr-wc,wc+1:nc-wc,:,:); | ||
12 | end | ||
13 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/cutout.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/cutout.m new file mode 100755 index 0000000..b80f27b --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/cutout.m | |||
@@ -0,0 +1,3 @@ | |||
1 | function a = cutout(I,ct,wz); | ||
2 | |||
3 | a = I(ct(2)-wz(2):ct(2)+wz(2),ct(1)-wz(1):ct(1)+wz(1),:); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/disp_Imask.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/disp_Imask.m new file mode 100755 index 0000000..dbd7fdb --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/disp_Imask.m | |||
@@ -0,0 +1,20 @@ | |||
1 | function Imasks = disp_Imask(Is,nr,nc,hw,masks) | ||
2 | % | ||
3 | % Imasks = disp_Imask(Is,nr,nc,hw,masks) | ||
4 | % | ||
5 | |||
6 | %hw = 2; %nr = 43;nc=68; | ||
7 | gap = 2*hw+1; | ||
8 | |||
9 | x = [1:nc*gap]; | ||
10 | y = [1:nr*gap]; | ||
11 | |||
12 | xs = (x-hw-1)/gap + 1;ys = (y-hw-1)/gap + 1; | ||
13 | |||
14 | for gid=1:size(masks,3), | ||
15 | tmp = interp2(reshape(masks(:,:,gid),nr,nc),xs,ys'); | ||
16 | |||
17 | Imasks(:,:,gid) = (tmp>0.52).* ((Is).^0.8); | ||
18 | subplot(3,3,gid); | ||
19 | im(Imasks(:,:,gid)); | ||
20 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/disp_diff.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/disp_diff.m new file mode 100755 index 0000000..090c273 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/disp_diff.m | |||
@@ -0,0 +1,37 @@ | |||
1 | function disp_diff(H1,H2) | ||
2 | % | ||
3 | % disp_diff(H1,H2) | ||
4 | % | ||
5 | |||
6 | ns = size(H1,3); | ||
7 | nf = size(H1,4); | ||
8 | |||
9 | H1 = H1/49; | ||
10 | H2 = H2/49; | ||
11 | |||
12 | |||
13 | sI= [1,0,1];sI = exp(-sI); | ||
14 | sI = sI/sum(sI); | ||
15 | |||
16 | for j = 1:ns, | ||
17 | for k = 1:nf, | ||
18 | h1 = H1(:,:,j,k); | ||
19 | h2 = H2(:,:,j,k); | ||
20 | |||
21 | subplot(ns,nf,(j-1)*nf+k); | ||
22 | h1s = conv2(conv2(h1,sI','same'),sI,'same'); | ||
23 | h2s = conv2(conv2(h2,sI','same'),sI,'same'); | ||
24 | |||
25 | [is,js] = find( (h1>0) | (h2>0)); | ||
26 | ids = (js-1)*size(h1,1) + is; | ||
27 | |||
28 | hdiff = abs(h1s-h2s).*((h1>0) | (h2>0)); | ||
29 | |||
30 | xdiff = ((h1(ids)-h2(ids)).*(h1(ids)-h2(ids)))./(h1(ids)+h2(ids)); | ||
31 | |||
32 | xdiffs = ((h1s(ids)-h2s(ids)).*(h1s(ids)-h2s(ids)))./(h1s(ids)+h2s(ids)); | ||
33 | imagesc(hdiff);colorbar;axis('off'); | ||
34 | % title(sprintf('%3.3f, %3.3f',sum(sum(hdiff))/49,sum(sum(abs(h1-h2)))/49));drawnow; | ||
35 | title(sprintf('%3.3f, %3.3f',sum(xdiff),sum(xdiffs)));drawnow | ||
36 | end | ||
37 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/disp_evresult.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/disp_evresult.m new file mode 100755 index 0000000..e07556a --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/disp_evresult.m | |||
@@ -0,0 +1,435 @@ | |||
1 | %fn = '134035'; | ||
2 | %fn = '130040'; | ||
3 | %fn = '334074'; | ||
4 | fn = '130065'; | ||
5 | |||
6 | %basedir = 'plaatje_data/olddata/'; | ||
7 | % basedir = 'data/'; nr = 49;nc =30; | ||
8 | |||
9 | basedir = 'plaatje_data/'; | ||
10 | |||
11 | fname = sprintf('%s%s_eigvec.pfm',basedir,fn); | ||
12 | eigv = readpfm(fname); | ||
13 | fname = sprintf('%s%s_eigval.pfm',basedir,fn); | ||
14 | eigval = readpfm(fname); | ||
15 | |||
16 | fname = sprintf('%s%s_ncutvec.pfm',basedir,fn); | ||
17 | ncutv = readpfm(fname); | ||
18 | fname = sprintf('%s%s_ncutval.pfm',basedir,fn); | ||
19 | ncutval = readpfm(fname); | ||
20 | |||
21 | %fname = sprintf('images/130039.pgm'); | ||
22 | fname = sprintf('images/%s.pgm',fn); | ||
23 | I = readpgm(fname); | ||
24 | cutsz = 20; I = cutoff(I,cutsz); | ||
25 | figure(3);im(I);colormap(gray); | ||
26 | |||
27 | new = 0; | ||
28 | |||
29 | if ~new, | ||
30 | |||
31 | %nr = 49;nc = 30; | ||
32 | nr = 30;nc = 49; | ||
33 | |||
34 | %nr = 68;nc = 43; | ||
35 | %nc = 68;nr = 43; | ||
36 | |||
37 | else | ||
38 | |||
39 | fn1 = fn; | ||
40 | fn = 'test'; | ||
41 | fname = sprintf('plaatje_data/%s_gcs.pfm',fn); | ||
42 | gcs = readpfm(fname); | ||
43 | |||
44 | fname = sprintf('plaatje_data/%s_gce.pfm',fn); | ||
45 | gce = readpfm(fname); | ||
46 | |||
47 | fname = sprintf('plaatje_data/%s_grs.pfm',fn); | ||
48 | grs = readpfm(fname); | ||
49 | |||
50 | fname = sprintf('plaatje_data/%s_gre.pfm',fn); | ||
51 | gre = readpfm(fname); | ||
52 | |||
53 | nr = max(gre(:))+1; | ||
54 | nc = max(gce(:))+1; | ||
55 | |||
56 | fn = fn1; | ||
57 | |||
58 | end | ||
59 | |||
60 | figure(6); | ||
61 | for j=1:8, | ||
62 | subplot(3,3,j); | ||
63 | im(reshape(ncutv(:,j+1),nr,nc));colorbar | ||
64 | title(num2str(ncutval(j+1,1))); | ||
65 | end | ||
66 | %cm = sprintf('print -dps ncut_%s',fn);disp(cm);eval(cm); | ||
67 | subplot(3,3,9);im(I);axis('off'); | ||
68 | |||
69 | figure(7);clf | ||
70 | for j=1:12, | ||
71 | subplot(3,4,j); | ||
72 | im(reshape(eigv(:,j),nr,nc));colorbar;%axis('off'); | ||
73 | title(sprintf('%3.4e',eigval(j,1))); | ||
74 | end | ||
75 | %cm = sprintf('print -dps eig_%s',fn);disp(cm);eval(cm); | ||
76 | |||
77 | %%%%%%%%%%% | ||
78 | |||
79 | ev = eigval(:,1); | ||
80 | figure(5);hold off;clf;subplot(1,2,1); | ||
81 | %semilogy((ev(1:end-1) - ev(2:end))./ev(1:end-1),'x-');grid on; | ||
82 | plot((ev(1:end-1) - ev(2:end))./ev(1:end-1),'x-');grid on; | ||
83 | %semilogy(0.01*ones(size(ev(2:end-1))),'r-');semilogy(0.005*ones(size(ev(2:end-1))),'r-');semilogy(0.0025*ones(size(ev(2:end-1))),'r-');grid on;hold off; | ||
84 | subplot(1,2,2); | ||
85 | %semilogy(ev(1:end-1)-ev(2:end),'p-');grid on; | ||
86 | semilogy((ev(1:end-1) - ev(2:end))/ev(1),'x-');grid on; | ||
87 | |||
88 | |||
89 | if 0, | ||
90 | |||
91 | fname = sprintf('plaatje_data/ncutval_%s.pfm',fn); | ||
92 | nval = readpfm(fname); | ||
93 | fname = sprintf('plaatje_data/ncutvec_%s.pfm',fn); | ||
94 | nv = readpfm(fname); | ||
95 | |||
96 | figure(2); | ||
97 | nvv = size(nv,2); | ||
98 | for j=1:min(5,nvv-1), | ||
99 | subplot(1,min(5,nvv-1),j); | ||
100 | ims(nv(:,j+1),nr,nc); | ||
101 | end | ||
102 | |||
103 | |||
104 | %figure(5); | ||
105 | %subplot(2,2,1);plot(eigval(:,1),'x-'); | ||
106 | |||
107 | |||
108 | if 0, | ||
109 | |||
110 | fname = 130039; | ||
111 | for j=0:20, | ||
112 | cm = sprintf('!cp plaatje_data/%d_%d.pfm plaatje_data/test_%d.pfm ',fname,j,j); | ||
113 | disp(cm);eval(cm); | ||
114 | end | ||
115 | |||
116 | %%%%%%%% | ||
117 | fnout = 'test';fn_t = '334003'; | ||
118 | cm = sprintf('!cp plaatje_data/%s_eigval.pfm %s_eigval.pfm',fnout,fn_t); | ||
119 | disp(cm);eval(cm); | ||
120 | cm = sprintf('!cp plaatje_data/%s_eigvec.pfm %s_eigvec.pfm',fnout,fn_t); | ||
121 | disp(cm);eval(cm); | ||
122 | cm = sprintf('!cp plaatje_data/%s_ncutvec.pfm %s_ncutvec.pfm',fnout,fn_t); | ||
123 | disp(cm);eval(cm); | ||
124 | cm = sprintf('!cp plaatje_data/%s_ncutval.pfm %s_ncutval.pfm',fnout,fn_t); | ||
125 | disp(cm);eval(cm); | ||
126 | |||
127 | |||
128 | |||
129 | |||
130 | end | ||
131 | |||
132 | disp_flag = 0; | ||
133 | if disp_flag, | ||
134 | [I1,bnr,bnc] = proj_back_id(ncutv(:,2),gcs,gce,grs,gre); | ||
135 | imvs(I,I1>0.002,bnr,bnc); | ||
136 | end | ||
137 | |||
138 | if 0, | ||
139 | |||
140 | nv = 3; | ||
141 | A = eigv(:,1:nv)*eigv(:,1:nv)'; | ||
142 | [v,d] = ncut(abs(A),min(nv,5)); | ||
143 | |||
144 | figure(3); | ||
145 | for j=1:min(nv,5), | ||
146 | subplot(2,2,j); | ||
147 | ims(v(:,j),nr,nc); | ||
148 | end | ||
149 | |||
150 | end | ||
151 | |||
152 | %%%%%%%% | ||
153 | |||
154 | figure(4);%im(I);colorbar; | ||
155 | hw = 3;st_sz = 2*hw+1; | ||
156 | ct = round(ginput(1)); | ||
157 | ct_chank(1) = round((ct(1)-hw-1)/st_sz) + 1; | ||
158 | ct_chank(2) = round((ct(2)-hw-1)/st_sz) + 1; | ||
159 | |||
160 | idx = (ct_chank(:,1)-1)*nr + ct_chank(:,2); | ||
161 | |||
162 | figure(5);im(abs(reshape(A(idx,:),nr,nc)));%colorbar; | ||
163 | |||
164 | |||
165 | |||
166 | %%%%% | ||
167 | |||
168 | fname = 'test2'; | ||
169 | fn = sprintf('plaatje_data/ncut_%s.pfm',fname); | ||
170 | ncutv1 = readpfm(fn); | ||
171 | nr = 30; nc=49; | ||
172 | |||
173 | figure(1); | ||
174 | for j=1:min(4,size(ncutv1,2)), | ||
175 | subplot(2,2,j); | ||
176 | ims(ncutv1(:,j+1),nr,nc); | ||
177 | end | ||
178 | |||
179 | |||
180 | |||
181 | %%%%%%%%%% | ||
182 | |||
183 | id = 0; | ||
184 | fn = sprintf('plaatje_data/test_Aa%d.pfm',id); | ||
185 | disp(sprintf('A = readpfm(%s);',fn)); | ||
186 | A = readpfm(fn); | ||
187 | |||
188 | cm = sprintf('[v%d,d%d] = eigs(A,12);',id,id); | ||
189 | disp(cm);eval(cm); | ||
190 | |||
191 | writepfm('test_eigv0.pfm',v0); | ||
192 | writepfm('test_eigva0.pfm',diag(d0)); | ||
193 | |||
194 | |||
195 | |||
196 | |||
197 | vs = zeros(size(v1,1),size(v1,2),6); | ||
198 | ds = zeros(length(d1),6); | ||
199 | |||
200 | for j=0:5, | ||
201 | cm = sprintf('vs(:,:,%d) = v%d;',j+1,j); | ||
202 | disp(cm);eval(cm); | ||
203 | cm = sprintf('d = diag(d%d);',j); | ||
204 | disp(cm);eval(cm); | ||
205 | cm = sprintf('ds(:,%d) = d(:);',j+1); | ||
206 | disp(cm);eval(cm); | ||
207 | |||
208 | |||
209 | end | ||
210 | |||
211 | %save evsum vs ds | ||
212 | |||
213 | figure(1);nr = 49;nc=30;evid = 3; | ||
214 | for j=1:12,subplot(3,4,j);ims(vs(:,j,evid),nr,nc);end | ||
215 | |||
216 | I = readpgm('images/334039.pgm');I = cutoff(I,20); | ||
217 | |||
218 | As = zeros(6,nr*nc); | ||
219 | |||
220 | figure(3);%im(I);colormap(gray); | ||
221 | hw = 3;st_sz = 2*hw+1; | ||
222 | ct = round(ginput(1));ct_chank(1) = round((ct(1)-hw-1)/st_sz) + 1;ct_chank(2) = round((ct(2)-hw-1)/st_sz) + 1; | ||
223 | idx = (ct_chank(:,1)-1)*nr + ct_chank(:,2); | ||
224 | |||
225 | figure(5); | ||
226 | |||
227 | figure(4);nvs = [6,9,12,12,12,12]; | ||
228 | for evid = 1:5,As(evid,:) = squeeze(vs(idx,1:nvs(evid),evid))*squeeze(vs(:,1:nvs(evid),evid))';end | ||
229 | for evid =1:5,subplot(2,3,evid);im(abs(reshape(As(evid,:),nr,nc)));colorbar;end | ||
230 | subplot(2,3,6);ims(sum(abs(As)),nr,nc);colorbar | ||
231 | |||
232 | %%%%%%%%% | ||
233 | |||
234 | %%%%%% eig of the As over all scales %% | ||
235 | |||
236 | A = zeros(nr*nc,nr*nc); | ||
237 | |||
238 | for evid=1:5, disp(evid); | ||
239 | A = A + abs(squeeze(vs(:,1:nvs(evid),evid))*squeeze(vs(:,1:nvs(evid),evid))'); | ||
240 | end | ||
241 | |||
242 | [v,d] = eigs(A,12); | ||
243 | figure(1); for j=1:12, subplot(3,4,j);ims(v(:,j),nr,nc);end | ||
244 | |||
245 | [vn,dn] = ncut_b(A,12); | ||
246 | figure(3); for j=1:12, subplot(3,4,j);ims(-vn(:,j),nr,nc);end | ||
247 | |||
248 | nv = 6; | ||
249 | A = abs(eigv(:,1:nv)*eigv(:,1:nv)'); | ||
250 | [v,d] = ncut_b(A,nv+1); | ||
251 | figure(1); | ||
252 | nv = 4; | ||
253 | for j=1:nv,subplot(2,nv,j);ims(v(:,j+1),nr,nc);title(sprintf('%3.3e',d(j+1)));end | ||
254 | |||
255 | for j=1:nv,subplot(2,nv,j+nv);ims(eigv(:,j),nr,nc);title(sprintf('%3.3e',eigval(j,1)));end | ||
256 | |||
257 | %%%%%%%%%%%%% | ||
258 | |||
259 | while 1, | ||
260 | figure(3);%im(I);colormap(gray); | ||
261 | hw = 3;st_sz = 2*hw+1; | ||
262 | ct = round(ginput(1));ct_chank(1) = round((ct(1)-hw-1)/st_sz) + 1;ct_chank(2) = round((ct(2)-hw-1)/st_sz) + 1; | ||
263 | idx = (ct_chank(:,1)-1)*nr + ct_chank(:,2); | ||
264 | |||
265 | figure(1); | ||
266 | ims(exp(-(A(idx,:))/(0.02^2)),nr,nc);colorbar | ||
267 | end | ||
268 | |||
269 | |||
270 | |||
271 | %%%%%%%%%%%%%% | ||
272 | |||
273 | figure(3); | ||
274 | hw = 3;st_sz = 2*hw+1; | ||
275 | np = 20; | ||
276 | ct = round(ginput(np)); | ||
277 | ct_chank =[]; | ||
278 | ct_chank(:,1) = round((ct(:,1)-hw-1)/st_sz) + 1; | ||
279 | ct_chank(:,2) = round((ct(:,2)-hw-1)/st_sz) + 1; | ||
280 | idx = (ct_chank(:,1)-1)*nr + ct_chank(:,2); | ||
281 | |||
282 | %As = readpfm_id('plaatje_data/130040_AX.pfm',idx,2924); | ||
283 | As = readpfm_idf('plaatje_data/tmp/134035_AX3.pfm',idx,nr*nc); | ||
284 | |||
285 | %save dist_data2 As idx ct_chank ct hw nr nc eigv eigval | ||
286 | |||
287 | %load dist_data1a | ||
288 | |||
289 | set(gcf,'DefaultLineLinewidth',5); | ||
290 | |||
291 | minA = min(min(As)); | ||
292 | figure(1);clf; hold off; | ||
293 | set(gcf,'DefaultLineLinewidth',2); | ||
294 | for id = 1:np, | ||
295 | subplot(4,5,id); | ||
296 | %image(2.8e-2*((-minA)+reshape(As(id,:),nr,nc)));axis('image');axis('off');hold on | ||
297 | ims(-As(id,:),nr,nc);axis('off');hold on | ||
298 | plot(ct_chank(id,1)+1,ct_chank(id,2)+1,'rx');hold off; | ||
299 | end | ||
300 | |||
301 | figure(1);clf;hold off; | ||
302 | nvv = 6 | ||
303 | set(gcf,'DefaultLineLinewidth',1); | ||
304 | for id=1:np, | ||
305 | At = abs(eigv(idx(id),1:nvv)*eigv(:,1:nvv)'); | ||
306 | subplot(4,5,id); | ||
307 | %image(2.5e4*reshape(At,nr,nc));axis('image');axis('off');hold on | ||
308 | ims(At,nr,nc);axis('off');hold on; | ||
309 | plot(ct_chank(id,1)+1,ct_chank(id,2)+1,'rx');hold off; | ||
310 | end | ||
311 | |||
312 | |||
313 | print_flag =0; | ||
314 | if print_flag, | ||
315 | fn = '130040'; | ||
316 | |||
317 | figure(4);clf; | ||
318 | colormap(gray); | ||
319 | set(gcf,'DefaultLineLinewidth',7); | ||
320 | |||
321 | for id =1:np, | ||
322 | %image(2.8e-2*((-minA)+reshape(As(id,:),nr,nc)));axis('image');axis('off');hold on | ||
323 | ims(-As(id,:),nr,nc);axis('off'); | ||
324 | hold on;plot(ct_chank(id,1)+1,ct_chank(id,2)+1,'rp');hold off; | ||
325 | cm = sprintf('print -deps dist_x1_%s_%d',fn,id); | ||
326 | disp(cm);eval(cm); | ||
327 | end | ||
328 | |||
329 | nvv = 5; | ||
330 | set(gcf,'DefaultLineLinewidth',7); | ||
331 | figure(4);colormap(gray); | ||
332 | for id=1:np, | ||
333 | At = abs(eigv(idx(id),1:nvv)*eigv(:,1:nvv)'); | ||
334 | %image(1.5e4*reshape(At,nr,nc));axis('image');axis('off');%hold on | ||
335 | ims(At,nr,nc);axis('off');%hold on; | ||
336 | %plot(ct_chank(id,1)+1,ct_chank(id,2)+1,'rp');hold off; | ||
337 | cm = sprintf('print -deps dist_d_%s_%d',fn,id); | ||
338 | disp(cm);eval(cm); | ||
339 | end | ||
340 | |||
341 | % print eigvects | ||
342 | for j=1:size(eigv,2), | ||
343 | ims(eigv(:,j),nr,nc);axis('off'); | ||
344 | cm = sprintf('print -deps eigv_%s_%d',fn,j); | ||
345 | disp(cm);eval(cm); | ||
346 | end | ||
347 | |||
348 | for j=1:size(ncutv,2), | ||
349 | ims(ncutv(:,j),nr,nc);axis('off'); | ||
350 | cm = sprintf('print -deps ncutv_%s_%d',fn,j); | ||
351 | disp(cm);eval(cm); | ||
352 | end | ||
353 | |||
354 | |||
355 | end | ||
356 | |||
357 | basedir ='plaatje_data/newdata/'; | ||
358 | fname = sprintf('%s%s_eigvec.pfm',basedir,fn); | ||
359 | eigv = readpfm(fname); | ||
360 | |||
361 | ix = 1; | ||
362 | figure(5);colormap(gray);clf | ||
363 | for j=1:7, | ||
364 | for k=[2,3,4,6,9,12]; | ||
365 | subplot(7,6,ix); | ||
366 | At = abs(eigv(idx(j),1:k)*eigv(:,1:k)'); | ||
367 | ims(At,nr,nc);axis('off');%colorbar; | ||
368 | if (k==2), | ||
369 | hold on; plot(ct_chank(j,1),ct_chank(j,2),'rp');hold off; | ||
370 | title(num2str(j)); | ||
371 | end | ||
372 | ix = ix+1; | ||
373 | end | ||
374 | end | ||
375 | |||
376 | figure(4);clf;colormap(gray); | ||
377 | set(gcf,'DefaultLineLinewidth',7); | ||
378 | for j=1:20, | ||
379 | for k=[2,3,4,6,9,12]; | ||
380 | |||
381 | At = abs(eigv(idx(j),1:k)*eigv(:,1:k)'); | ||
382 | ims(At,nr,nc);axis('off');%colorbar; | ||
383 | if (k==2), | ||
384 | hold on; plot(ct_chank(j,1),ct_chank(j,2),'rp');hold off; | ||
385 | end | ||
386 | |||
387 | cm = sprintf('print -deps dist_scale_65_%d_%d',j,k); | ||
388 | disp(cm);eval(cm); | ||
389 | |||
390 | end | ||
391 | end | ||
392 | |||
393 | base_dir = 'plaatje_data/'; | ||
394 | |||
395 | % cts are the centers, | ||
396 | |||
397 | wz = [hw,hw]; | ||
398 | gap = 2*hw+1; | ||
399 | dist = zeros(size(cts,1),(nr+1)*(nc+1)); | ||
400 | |||
401 | for j=1:1:24, | ||
402 | fn = sprintf('%s134035_%d.pfm',base_dir,j); | ||
403 | disp(fn); | ||
404 | F = readpfm(fn); | ||
405 | |||
406 | dists = compute_Lf(F,cts,wz,nr,nc); | ||
407 | dist = max(dists,dist); | ||
408 | |||
409 | end | ||
410 | |||
411 | |||
412 | figure(4);clf;colormap(gray); | ||
413 | set(gcf,'DefaultLineLinewidth',7); | ||
414 | |||
415 | ids = [8,1,12,5,10,15]; | ||
416 | |||
417 | for j=1:6, | ||
418 | |||
419 | d = reshape(dist(j,:),nr+1,nc+1); | ||
420 | d = d(1:end-1,2:end); | ||
421 | im(-d);axis('off'); hold on; | ||
422 | plot(ct_chank(ids(j),1),ct_chank(ids(j),2),'p'); | ||
423 | hold off | ||
424 | |||
425 | cm = sprintf('print -deps dist_lf_65_%d',j); | ||
426 | disp(cm);eval(cm); | ||
427 | |||
428 | pause; | ||
429 | end | ||
430 | |||
431 | |||
432 | |||
433 | end | ||
434 | |||
435 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/disp_evresult2.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/disp_evresult2.m new file mode 100755 index 0000000..46239ef --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/disp_evresult2.m | |||
@@ -0,0 +1,215 @@ | |||
1 | fn = '130042'; | ||
2 | |||
3 | fname = sprintf('data/%s_eigvec.pfm',fn); | ||
4 | eigv = readpfm(fname); | ||
5 | fname = sprintf('data/%s_eigval.pfm',fn); | ||
6 | eigval = readpfm(fname); | ||
7 | |||
8 | fname = sprintf('data/%s_ncutvec.pfm',fn); | ||
9 | ncutv = readpfm(fname); | ||
10 | fname = sprintf('data/%s_ncutval.pfm',fn); | ||
11 | ncutval = readpfm(fname); | ||
12 | |||
13 | %fname = sprintf('images/130038.pgm'); | ||
14 | fname = sprintf('images/%s.pgm',fn); | ||
15 | I = readpgm(fname); | ||
16 | cutsz = 20; I = cutoff(I,cutsz); | ||
17 | figure(3);im(I);colormap(gray); | ||
18 | |||
19 | new = 0; | ||
20 | |||
21 | if new, | ||
22 | fn1 = fn; | ||
23 | fn = 'test'; | ||
24 | fname = sprintf('data/%s_gcs.pfm',fn); | ||
25 | gcs = readpfm(fname); | ||
26 | |||
27 | fname = sprintf('data/%s_gce.pfm',fn); | ||
28 | gce = readpfm(fname); | ||
29 | |||
30 | fname = sprintf('data/%s_grs.pfm',fn); | ||
31 | grs = readpfm(fname); | ||
32 | |||
33 | fname = sprintf('data/%s_gre.pfm',fn); | ||
34 | gre = readpfm(fname); | ||
35 | |||
36 | nr = max(gre(:))+1; | ||
37 | nc = max(gce(:))+1; | ||
38 | |||
39 | fn = fn1; | ||
40 | |||
41 | else | ||
42 | %nr = 49;nc = 30; | ||
43 | nr = 30;nc = 49; | ||
44 | |||
45 | end | ||
46 | |||
47 | figure(6); | ||
48 | for j=1:8, | ||
49 | subplot(3,3,j); | ||
50 | im(reshape(ncutv(:,j+1),nr,nc));colorbar | ||
51 | title(num2str(ncutval(j+1,1))); | ||
52 | end | ||
53 | %cm = sprintf('print -dps ncut_%s',fn);disp(cm);eval(cm); | ||
54 | subplot(3,3,9);im(I);axis('off'); | ||
55 | |||
56 | figure(7);clf | ||
57 | for j=1:9, | ||
58 | subplot(3,3,j); | ||
59 | im(reshape(eigv(:,j),nr,nc));colorbar;%axis('off'); | ||
60 | title(sprintf('%3.4e',eigval(j,1))); | ||
61 | end | ||
62 | %cm = sprintf('print -dps eig_%s',fn);disp(cm);eval(cm); | ||
63 | |||
64 | |||
65 | |||
66 | if 0, | ||
67 | |||
68 | fname = 130042; | ||
69 | for j=0:30, | ||
70 | cm = sprintf('!cp plaatje_data/%d_%d.pfm data/%d_%d.pfm ',fname,j,fname,j); | ||
71 | disp(cm);eval(cm); | ||
72 | end | ||
73 | |||
74 | %%%%%%%% | ||
75 | fnout = '130042';fn_t = '130042'; | ||
76 | cm = sprintf('!cp data/%s_eigval.pfm %s_eigval.pfm',fnout,fn_t); | ||
77 | disp(cm);eval(cm); | ||
78 | cm = sprintf('!cp data/%s_eigvec.pfm %s_eigvec.pfm',fnout,fn_t); | ||
79 | disp(cm);eval(cm); | ||
80 | cm = sprintf('!cp data/%s_ncutvec.pfm %s_ncutvec.pfm',fnout,fn_t); | ||
81 | disp(cm);eval(cm); | ||
82 | cm = sprintf('!cp data/%s_ncutval.pfm %s_ncutval.pfm',fnout,fn_t); | ||
83 | disp(cm);eval(cm); | ||
84 | |||
85 | |||
86 | |||
87 | |||
88 | end | ||
89 | |||
90 | disp_flag = 0; | ||
91 | if disp_flag, | ||
92 | [I1,bnr,bnc] = proj_back_id(ncutv(:,2),gcs,gce,grs,gre); | ||
93 | imvs(I,I1>0.002,bnr,bnc); | ||
94 | end | ||
95 | |||
96 | if 0, | ||
97 | |||
98 | nv = 3; | ||
99 | A = eigv(:,1:nv)*eigv(:,1:nv)'; | ||
100 | [v,d] = ncut(abs(A),min(nv,5)); | ||
101 | |||
102 | figure(3); | ||
103 | for j=1:min(nv,5), | ||
104 | subplot(2,2,j); | ||
105 | ims(v(:,j),nr,nc); | ||
106 | end | ||
107 | |||
108 | |||
109 | %%%%%%%% | ||
110 | |||
111 | figure(4);%im(I);colorbar; | ||
112 | hw = 3;st_sz = 2*hw+1; | ||
113 | ct = round(ginput(1)); | ||
114 | ct_chank(1) = round((ct(1)-hw-1)/st_sz) + 1; | ||
115 | ct_chank(2) = round((ct(2)-hw-1)/st_sz) + 1; | ||
116 | |||
117 | idx = (ct_chank(:,1)-1)*nr + ct_chank(:,2); | ||
118 | |||
119 | figure(5);im(abs(reshape(A(idx,:),nr,nc)));%colorbar; | ||
120 | |||
121 | |||
122 | |||
123 | %%%%% | ||
124 | |||
125 | fname = 'test2'; | ||
126 | fn = sprintf('data/ncut_%s.pfm',fname); | ||
127 | ncutv1 = readpfm(fn); | ||
128 | nr = 30; nc=49; | ||
129 | |||
130 | figure(1); | ||
131 | for j=1:min(4,size(ncutv1,2)), | ||
132 | subplot(2,2,j); | ||
133 | ims(ncutv1(:,j+1),nr,nc); | ||
134 | end | ||
135 | |||
136 | |||
137 | |||
138 | %%%%%%%%%% | ||
139 | |||
140 | id = 0; | ||
141 | fn = sprintf('data/test_Aa%d.pfm',id); | ||
142 | disp(sprintf('A = readpfm(%s);',fn)); | ||
143 | A = readpfm(fn); | ||
144 | |||
145 | cm = sprintf('[v%d,d%d] = eigs(A,12);',id,id); | ||
146 | disp(cm);eval(cm); | ||
147 | |||
148 | writepfm('test_eigv0.pfm',v0); | ||
149 | writepfm('test_eigva0.pfm',diag(d0)); | ||
150 | |||
151 | |||
152 | |||
153 | |||
154 | vs = zeros(size(v1,1),size(v1,2),6); | ||
155 | ds = zeros(length(d1),6); | ||
156 | |||
157 | for j=0:5, | ||
158 | cm = sprintf('vs(:,:,%d) = v%d;',j+1,j); | ||
159 | disp(cm);eval(cm); | ||
160 | cm = sprintf('d = diag(d%d);',j); | ||
161 | disp(cm);eval(cm); | ||
162 | cm = sprintf('ds(:,%d) = d(:);',j+1); | ||
163 | disp(cm);eval(cm); | ||
164 | |||
165 | |||
166 | end | ||
167 | |||
168 | %save evsum vs ds | ||
169 | |||
170 | figure(1);nr = 49;nc=30;evid = 3; | ||
171 | for j=1:12,subplot(3,4,j);ims(vs(:,j,evid),nr,nc);end | ||
172 | |||
173 | I = readpgm('images/334039.pgm');I = cutoff(I,20); | ||
174 | |||
175 | As = zeros(6,nr*nc); | ||
176 | |||
177 | figure(3);%im(I);colormap(gray); | ||
178 | hw = 3;st_sz = 2*hw+1; | ||
179 | ct = round(ginput(1));ct_chank(1) = round((ct(1)-hw-1)/st_sz) + 1;ct_chank(2) = round((ct(2)-hw-1)/st_sz) + 1; | ||
180 | idx = (ct_chank(:,1)-1)*nr + ct_chank(:,2); | ||
181 | |||
182 | figure(5); | ||
183 | |||
184 | figure(4);nvs = [6,9,12,12,12,12]; | ||
185 | for evid = 1:5,As(evid,:) = squeeze(vs(idx,1:nvs(evid),evid))*squeeze(vs(:,1:nvs(evid),evid))';end | ||
186 | for evid =1:5,subplot(2,3,evid);im(abs(reshape(As(evid,:),nr,nc)));colorbar;end | ||
187 | subplot(2,3,6);ims(sum(abs(As)),nr,nc);colorbar | ||
188 | |||
189 | %%%%%%%%% | ||
190 | |||
191 | %%%%%% eig of the As over all scales %% | ||
192 | |||
193 | A = zeros(nr*nc,nr*nc); | ||
194 | |||
195 | for evid=1:5, disp(evid); | ||
196 | A = A + abs(squeeze(vs(:,1:nvs(evid),evid))*squeeze(vs(:,1:nvs(evid),evid))'); | ||
197 | end | ||
198 | |||
199 | [v,d] = eigs(A,12); | ||
200 | figure(1); for j=1:12, subplot(3,4,j);ims(v(:,j),nr,nc);end | ||
201 | |||
202 | [vn,dn] = ncut_b(A,12); | ||
203 | figure(3); for j=1:12, subplot(3,4,j);ims(-vn(:,j),nr,nc);end | ||
204 | |||
205 | nv = 6; | ||
206 | A = abs(eigv(:,1:nv)*eigv(:,1:nv)'); | ||
207 | [v,d] = ncut_b(A,nv+1); | ||
208 | figure(1); | ||
209 | for j=1:nv,subplot(2,nv,j);ims(v(:,j+1),nr,nc);title(sprintf('%3.3e',d(j+1)));end | ||
210 | |||
211 | for j=1:nv,subplot(2,nv,j+nv);ims(eigv(:,j),nr,nc);title(sprintf('%3.3e',eigval(j,1)));end | ||
212 | |||
213 | |||
214 | |||
215 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/disp_evresulthome.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/disp_evresulthome.m new file mode 100755 index 0000000..208b86a --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/disp_evresulthome.m | |||
@@ -0,0 +1,237 @@ | |||
1 | fn = '334003'; | ||
2 | |||
3 | fname = sprintf('%s_eigvec.pfm',fn); | ||
4 | disp(sprintf('reading %s',fname)); | ||
5 | eigv = readpfm(fname); | ||
6 | fname = sprintf('%s_eigval.pfm',fn); | ||
7 | eigval = readpfm(fname); | ||
8 | |||
9 | fname = sprintf('%s_ncutvec.pfm',fn); | ||
10 | ncutv = readpfm(fname); | ||
11 | fname = sprintf('%s_ncutval.pfm',fn); | ||
12 | ncutval = readpfm(fname); | ||
13 | |||
14 | %fname = sprintf('images/130038.pgm'); | ||
15 | fname = sprintf('images/%s.pgm',fn); | ||
16 | I = readpgm(fname); | ||
17 | cutsz = 20; I = cutoff(I,cutsz); | ||
18 | figure(3);im(I);colormap(gray); | ||
19 | |||
20 | new = 0; | ||
21 | |||
22 | if new, | ||
23 | fn1 = fn; | ||
24 | fn = 'test'; | ||
25 | fname = sprintf('%s_gcs.pfm',fn); | ||
26 | gcs = readpfm(fname); | ||
27 | |||
28 | fname = sprintf('%s_gce.pfm',fn); | ||
29 | gce = readpfm(fname); | ||
30 | |||
31 | fname = sprintf('%s_grs.pfm',fn); | ||
32 | grs = readpfm(fname); | ||
33 | |||
34 | fname = sprintf('%s_gre.pfm',fn); | ||
35 | gre = readpfm(fname); | ||
36 | |||
37 | nr = max(gre(:))+1; | ||
38 | nc = max(gce(:))+1; | ||
39 | |||
40 | fn = fn1; | ||
41 | |||
42 | else | ||
43 | nr = 49;nc = 30; | ||
44 | %nr = 30;nc = 49; | ||
45 | |||
46 | end | ||
47 | |||
48 | figure(6); | ||
49 | for j=1:8, | ||
50 | subplot(3,3,j); | ||
51 | im(reshape(ncutv(:,j+1),nr,nc));colorbar | ||
52 | title(num2str(ncutval(j+1,1))); | ||
53 | end | ||
54 | %cm = sprintf('print -dps ncut_%s',fn);disp(cm);eval(cm); | ||
55 | %subplot(3,3,9);im(I);axis('off'); | ||
56 | |||
57 | figure(7);clf | ||
58 | for j=1:9, | ||
59 | subplot(3,3,j); | ||
60 | im(reshape(eigv(:,j),nr,nc));colorbar;%axis('off'); | ||
61 | title(sprintf('%3.4e',eigval(j,1))); | ||
62 | end | ||
63 | %cm = sprintf('print -dps eig_%s',fn);disp(cm);eval(cm); | ||
64 | |||
65 | |||
66 | |||
67 | if 0, | ||
68 | |||
69 | fname = 130042; | ||
70 | for j=0:30, | ||
71 | cm = sprintf('!cp plaatje_data/%d_%d.pfm data/%d_%d.pfm ',fname,j,fname,j); | ||
72 | disp(cm);eval(cm); | ||
73 | end | ||
74 | |||
75 | %%%%%%%% | ||
76 | fnout = '130042';fn_t = '130042'; | ||
77 | cm = sprintf('!cp data/%s_eigval.pfm %s_eigval.pfm',fnout,fn_t); | ||
78 | disp(cm);eval(cm); | ||
79 | cm = sprintf('!cp data/%s_eigvec.pfm %s_eigvec.pfm',fnout,fn_t); | ||
80 | disp(cm);eval(cm); | ||
81 | cm = sprintf('!cp data/%s_ncutvec.pfm %s_ncutvec.pfm',fnout,fn_t); | ||
82 | disp(cm);eval(cm); | ||
83 | cm = sprintf('!cp data/%s_ncutval.pfm %s_ncutval.pfm',fnout,fn_t); | ||
84 | disp(cm);eval(cm); | ||
85 | |||
86 | |||
87 | |||
88 | |||
89 | end | ||
90 | |||
91 | disp_flag = 0; | ||
92 | if disp_flag, | ||
93 | [I1,bnr,bnc] = proj_back_id(ncutv(:,2),gcs,gce,grs,gre); | ||
94 | imvs(I,I1>0.002,bnr,bnc); | ||
95 | end | ||
96 | |||
97 | if 0, | ||
98 | |||
99 | nv = 3; | ||
100 | A = eigv(:,1:nv)*eigv(:,1:nv)'; | ||
101 | [v,d] = ncut(abs(A),min(nv,5)); | ||
102 | |||
103 | figure(3); | ||
104 | for j=1:min(nv,5), | ||
105 | subplot(2,2,j); | ||
106 | ims(v(:,j),nr,nc); | ||
107 | end | ||
108 | |||
109 | |||
110 | %%%%%%%% | ||
111 | |||
112 | figure(4);%im(I);colorbar; | ||
113 | hw = 3;st_sz = 2*hw+1; | ||
114 | ct = round(ginput(1)); | ||
115 | ct_chank(1) = round((ct(1)-hw-1)/st_sz) + 1; | ||
116 | ct_chank(2) = round((ct(2)-hw-1)/st_sz) + 1; | ||
117 | |||
118 | idx = (ct_chank(:,1)-1)*nr + ct_chank(:,2); | ||
119 | |||
120 | figure(5);im(abs(reshape(A(idx,:),nr,nc)));%colorbar; | ||
121 | |||
122 | |||
123 | |||
124 | %%%%% | ||
125 | |||
126 | fname = 'test2'; | ||
127 | fn = sprintf('data/ncut_%s.pfm',fname); | ||
128 | ncutv1 = readpfm(fn); | ||
129 | nr = 30; nc=49; | ||
130 | |||
131 | figure(1); | ||
132 | for j=1:min(4,size(ncutv1,2)), | ||
133 | subplot(2,2,j); | ||
134 | ims(ncutv1(:,j+1),nr,nc); | ||
135 | end | ||
136 | |||
137 | |||
138 | |||
139 | %%%%%%%%%% | ||
140 | |||
141 | id = 0; | ||
142 | fn = sprintf('test_Aa%d.pfm',id); | ||
143 | disp(sprintf('A = readpfm(%s);',fn)); | ||
144 | A = readpfm(fn); | ||
145 | |||
146 | cm = sprintf('[v%d,d%d] = eigs(A,12);',id,id); | ||
147 | disp(cm);eval(cm); | ||
148 | |||
149 | writepfm('test_eigv0.pfm',v0); | ||
150 | writepfm('test_eigva0.pfm',diag(d0)); | ||
151 | |||
152 | |||
153 | |||
154 | |||
155 | vs = zeros(size(v1,1),size(v1,2),6); | ||
156 | ds = zeros(length(d1),6); | ||
157 | |||
158 | for j=0:5, | ||
159 | cm = sprintf('vs(:,:,%d) = v%d;',j+1,j); | ||
160 | disp(cm);eval(cm); | ||
161 | cm = sprintf('d = diag(d%d);',j); | ||
162 | disp(cm);eval(cm); | ||
163 | cm = sprintf('ds(:,%d) = d(:);',j+1); | ||
164 | disp(cm);eval(cm); | ||
165 | |||
166 | |||
167 | end | ||
168 | |||
169 | %save evsum vs ds | ||
170 | |||
171 | figure(1);nr = 49;nc=30;evid = 3; | ||
172 | for j=1:12,subplot(3,4,j);ims(vs(:,j,evid),nr,nc);end | ||
173 | |||
174 | I = readpgm('images/334039.pgm');I = cutoff(I,20); | ||
175 | |||
176 | As = zeros(6,nr*nc); | ||
177 | |||
178 | figure(3);%im(I);colormap(gray); | ||
179 | hw = 3;st_sz = 2*hw+1; | ||
180 | ct = round(ginput(1));ct_chank(1) = round((ct(1)-hw-1)/st_sz) + 1;ct_chank(2) = round((ct(2)-hw-1)/st_sz) + 1; | ||
181 | idx = (ct_chank(:,1)-1)*nr + ct_chank(:,2); | ||
182 | |||
183 | figure(5); | ||
184 | |||
185 | figure(4);nvs = [6,9,12,12,12,12]; | ||
186 | for evid = 1:5,As(evid,:) = squeeze(vs(idx,1:nvs(evid),evid))*squeeze(vs(:,1:nvs(evid),evid))';end | ||
187 | for evid =1:5,subplot(2,3,evid);im(abs(reshape(As(evid,:),nr,nc)));colorbar;end | ||
188 | subplot(2,3,6);ims(sum(abs(As)),nr,nc);colorbar | ||
189 | |||
190 | %%%%%%%%% | ||
191 | |||
192 | %%%%%% eig of the As over all scales %% | ||
193 | |||
194 | A = zeros(nr*nc,nr*nc); | ||
195 | |||
196 | for evid=1:5, disp(evid); | ||
197 | A = A + abs(squeeze(vs(:,1:nvs(evid),evid))*squeeze(vs(:,1:nvs(evid),evid))'); | ||
198 | end | ||
199 | |||
200 | [v,d] = eigs(A,12); | ||
201 | figure(1); for j=1:12, subplot(3,4,j);ims(v(:,j),nr,nc);end | ||
202 | |||
203 | [vn,dn] = ncut_b(A,12); | ||
204 | figure(3); for j=1:12, subplot(3,4,j);ims(-vn(:,j),nr,nc);end | ||
205 | |||
206 | nv = 6; | ||
207 | A = abs(eigv(:,1:nv)*eigv(:,1:nv)'); | ||
208 | [v,d] = ncut_b(A,nv+1); | ||
209 | figure(1); | ||
210 | for j=1:nv,subplot(2,nv,j);ims(v(:,j+1),nr,nc);title(sprintf('%3.3e',d(j+1)));end | ||
211 | |||
212 | for j=1:nv,subplot(2,nv,j+nv);ims(eigv(:,j),nr,nc);title(sprintf('%3.3e',eigval(j,1)));end | ||
213 | |||
214 | %%%%%%%%%%%%%%%%% | ||
215 | |||
216 | while 1, | ||
217 | figure(3);%im(I);colormap(gray); | ||
218 | hw = 3;st_sz = 2*hw+1; | ||
219 | ct = round(ginput(1));ct_chank(1) = round((ct(1)-hw-1)/st_sz) + 1;ct_chank(2) = round((ct(2)-hw-1)/st_sz) + 1; | ||
220 | idx = (ct_chank(:,1)-1)*nr + ct_chank(:,2); | ||
221 | |||
222 | figure(1); | ||
223 | ims(exp(-(A(idx,:))/(0.03^2)),nr,nc);colorbar | ||
224 | end | ||
225 | |||
226 | disp_evresulthome; | ||
227 | close(3);close(7);close(6); | ||
228 | A = euclid_dist(ncutv(:,2:6)); | ||
229 | A = exp(-A/(0.05^2)); | ||
230 | |||
231 | [v,d] = eigs(A,9); | ||
232 | |||
233 | figure(2); | ||
234 | for j=1:9,subplot(3,3,j);ims(v(:,j),nr,nc);colorbar;end | ||
235 | |||
236 | |||
237 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/disp_groups.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/disp_groups.m new file mode 100755 index 0000000..d087218 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/disp_groups.m | |||
@@ -0,0 +1,13 @@ | |||
1 | function disp_groups(groups,ids,nr,nc); | ||
2 | |||
3 | np = ids(end); | ||
4 | |||
5 | baseid =1; | ||
6 | for j=1:length(ids), | ||
7 | mask = zeros(np,1); | ||
8 | mask(groups(baseid:ids(j))) = 1+mask(groups(baseid:ids(j))); | ||
9 | |||
10 | subplot(3,3,j); | ||
11 | ims(mask,nr,nc); | ||
12 | baseid = 1+ids(j); | ||
13 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/disp_hist2d.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/disp_hist2d.m new file mode 100755 index 0000000..4313234 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/disp_hist2d.m | |||
@@ -0,0 +1,15 @@ | |||
1 | function H2 = disp_hist2d(J,Jf,scales,filter_ids) | ||
2 | |||
3 | ns = length(scales); | ||
4 | nf = length(filter_ids); | ||
5 | |||
6 | H2 = []; | ||
7 | for j=1:ns, | ||
8 | for k=1:nf, | ||
9 | subplot(ns,nf,(j-1)*nf+k); | ||
10 | H2d = hist_I_f(J,Jf(:,:,filter_ids(k),scales(j))); | ||
11 | imagesc(H2d);axis('image');axis('off');drawnow; | ||
12 | H2(:,:,j,k) = H2d; | ||
13 | end | ||
14 | end | ||
15 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/dist_pair.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/dist_pair.m new file mode 100755 index 0000000..1c7b2cf --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/dist_pair.m | |||
@@ -0,0 +1,28 @@ | |||
1 | function d = dist_pair(idx,fv,hb) | ||
2 | % (hb=sigs,bin_mins,bin_maxs,nbins) | ||
3 | % | ||
4 | % | ||
5 | % computes the pairwise distance between | ||
6 | % a point and everyone else using histogram binized feature | ||
7 | % | ||
8 | |||
9 | |||
10 | [nf,np] = size(fv); | ||
11 | |||
12 | d = zeros(1,np); | ||
13 | nbins = [0,hb.nbins]; | ||
14 | |||
15 | |||
16 | for j=1:nf, | ||
17 | bin_min = hb.bmins(j); | ||
18 | bin_max = hb.bmaxs(j); | ||
19 | nbin = nbins(j+1); | ||
20 | sig = hb.sigs(j); | ||
21 | fprintf(sprintf('|%d',j)); | ||
22 | b = binize(fv(j,:),sig,bin_min,bin_max,nbin); | ||
23 | |||
24 | a = binize(fv(j,idx),sig,bin_min,bin_max,nbin); | ||
25 | |||
26 | d = d + a'*b; | ||
27 | end | ||
28 | fprintf('\n'); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/dist_pair_chank.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/dist_pair_chank.m new file mode 100755 index 0000000..96a0d60 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/dist_pair_chank.m | |||
@@ -0,0 +1,25 @@ | |||
1 | function d = dist_pair_chank(a,fvs,chank_size) | ||
2 | % (hb=sigs,bin_mins,bin_maxs,nbins) | ||
3 | % | ||
4 | % | ||
5 | % computes the pairwise distance between | ||
6 | % a point and everyone else using histogram binized feature | ||
7 | % | ||
8 | |||
9 | |||
10 | [nf,np] = size(fvs); | ||
11 | |||
12 | n_chanks = ceil(np/chank_size); | ||
13 | |||
14 | d = []; | ||
15 | for j=1:n_chanks, | ||
16 | fprintf('<'); | ||
17 | |||
18 | cm = sprintf('load st_%d',j); | ||
19 | eval(cm); | ||
20 | fprintf(sprintf('%d',n_chanks-j)); | ||
21 | |||
22 | d = [d,a*fh]; | ||
23 | end | ||
24 | |||
25 | fprintf('\n'); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/doog2.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/doog2.m new file mode 100755 index 0000000..3ec22c1 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/doog2.m | |||
@@ -0,0 +1,43 @@ | |||
1 | function [G]=doog2(sig,r,th,N); | ||
2 | % [G,H]=doog2(sig,r,th,N); | ||
3 | % Make difference of offset gaussians kernel | ||
4 | % theta is in degrees | ||
5 | % (see Malik & Perona, J. Opt. Soc. Amer., 1990) | ||
6 | % | ||
7 | % Example: | ||
8 | % >> imagesc(-doog2(.5,4,15,32)) | ||
9 | % >> colormap(gray) | ||
10 | |||
11 | % by Serge Belongie | ||
12 | |||
13 | no_pts=N; % no. of points in x,y grid | ||
14 | pad_pts=no_pts*sqrt(2); % pad grid dimensions for up to a 45 degree rotation | ||
15 | siz=6; % range of x,y grid | ||
16 | |||
17 | [x,y]=meshgrid(linspace(-siz,siz,pad_pts),linspace(-siz,siz,pad_pts)); | ||
18 | |||
19 | a=-1; | ||
20 | b=2; | ||
21 | c=-1; | ||
22 | |||
23 | ya=sig; | ||
24 | yc=-ya; | ||
25 | yb=0; | ||
26 | sigy=sig; | ||
27 | sigx=r*sig; | ||
28 | |||
29 | Ga=(1/(2*pi*sigx*sigy))*exp(-(((x-0)/sigx).^2+((y-ya)/sigy).^2)); | ||
30 | Gb=(1/(2*pi*sigx*sigy))*exp(-(((x-0)/sigx).^2+((y-yb)/sigy).^2)); | ||
31 | Gc=(1/(2*pi*sigx*sigy))*exp(-(((x-0)/sigx).^2+((y-yc)/sigy).^2)); | ||
32 | |||
33 | Go = a*Ga + b*Gb + c*Gc; | ||
34 | %Ho = imag(hilbert(Go)); | ||
35 | G = Go; | ||
36 | |||
37 | G = mimrotate(Go,th,'bilinear','crop'); | ||
38 | G = imcrop(G,[(pad_pts-no_pts)/2, (pad_pts-no_pts)/2, no_pts, no_pts]); | ||
39 | |||
40 | %H = imrotate(Ho,th,'bilinear','crop'); | ||
41 | %H = imcrop(H,[(pad_pts-no_pts)/2, (pad_pts-no_pts)/2, no_pts, no_pts]); | ||
42 | |||
43 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/eig_decomp.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/eig_decomp.m new file mode 100755 index 0000000..5209088 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/eig_decomp.m | |||
@@ -0,0 +1,15 @@ | |||
1 | function [v,d] = eig_decomp(A) | ||
2 | |||
3 | ds = sum(A); | ||
4 | ds = ones(size(ds))./sqrt(ds); | ||
5 | D1 = ds'*ones(1,length(ds)); | ||
6 | A = D1'.*A.*D1; | ||
7 | |||
8 | disp(sprintf('computing eig values')); | ||
9 | tic;[v,d] = eig(A);toc; | ||
10 | |||
11 | d = abs(diag(d)); | ||
12 | [tmp,idx] = sort(-d); | ||
13 | d = d(idx); | ||
14 | v = v(:,idx); | ||
15 | v = D1.*v; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/eig_decomp_v5.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/eig_decomp_v5.m new file mode 100755 index 0000000..e0fab2c --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/eig_decomp_v5.m | |||
@@ -0,0 +1,13 @@ | |||
1 | function [v,d] = eig_decomp_v5(A,nv) | ||
2 | |||
3 | ds = sum(A); | ||
4 | ds = ones(size(ds))./sqrt(ds); | ||
5 | D1 = ds'*ones(1,length(ds)); | ||
6 | A = D1'.*A.*D1; | ||
7 | |||
8 | disp(sprintf('computing eig values')); | ||
9 | tic;[v,d] = eigs(A,nv);toc; | ||
10 | |||
11 | d = abs(diag(d)); | ||
12 | |||
13 | v = D1(:,1:size(v,2)).*v; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/eig_proj.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/eig_proj.m new file mode 100755 index 0000000..78d5296 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/eig_proj.m | |||
@@ -0,0 +1,12 @@ | |||
1 | function v = eig_proj(u,data) | ||
2 | |||
3 | % fd = feature dimension, nv = num. of eigvectors | ||
4 | [fd,nv] = size(u); | ||
5 | |||
6 | [fd2,nd] = size(data); | ||
7 | |||
8 | if (fd ~= fd2), | ||
9 | error(sprintf('size don't match')); | ||
10 | else | ||
11 | v = data'*u; | ||
12 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/eigs_decomp.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/eigs_decomp.m new file mode 100755 index 0000000..7763124 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/eigs_decomp.m | |||
@@ -0,0 +1,39 @@ | |||
1 | function [v,d,D,Ipara] = eigs_decomp(fn,num_eigs) | ||
2 | % | ||
3 | % function [v,d,D,Ipara] = eigs_decomp(fn,num_eigs) | ||
4 | % | ||
5 | |||
6 | %fn = '2.ppm'; | ||
7 | fn = 'images/130049.pgm'; | ||
8 | |||
9 | |||
10 | % spatial gaussian parameter | ||
11 | xscale = 3; | ||
12 | |||
13 | % half size of the neighbourhood | ||
14 | xnb = 6; | ||
15 | |||
16 | % setting the the HSV gaussian parameter:[h s v] | ||
17 | Iscale = [0.008,0.01,0.01]; | ||
18 | |||
19 | Input_para = [xscale,xnb,Iscale]; | ||
20 | |||
21 | % compute the lower half the association matrix | ||
22 | [A,D,Ipara] = compute_A_ppm(fn,Input_para); | ||
23 | |||
24 | B = A+A'; | ||
25 | clear A; | ||
26 | |||
27 | % eigen decompostion | ||
28 | options.tol = 1e-7; | ||
29 | num_eig_v = 4; | ||
30 | fprintf('doing eigs ...\n'); | ||
31 | [v,d] = eigs(B,num_eig_v,options); | ||
32 | |||
33 | d = diag(d); | ||
34 | |||
35 | % to display the final result | ||
36 | |||
37 | %nr = Ipara(1);nc = Ipara(2); | ||
38 | %k = 1;imagesc(reshape(v(:,k).*D,nc,nr)');colorbar | ||
39 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/euclid_dist.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/euclid_dist.m new file mode 100755 index 0000000..cbf0734 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/euclid_dist.m | |||
@@ -0,0 +1,22 @@ | |||
1 | function [A,mag] = euclid_dist(v) | ||
2 | |||
3 | |||
4 | |||
5 | A = 2*v*v'; | ||
6 | |||
7 | nv = size(v,2); | ||
8 | if (nv>1) | ||
9 | mag = sum((v.*v)')'; | ||
10 | else | ||
11 | mag = v.*v; | ||
12 | end | ||
13 | |||
14 | np = length(mag); | ||
15 | |||
16 | for j=1:np, | ||
17 | A(:,j) = mag-A(:,j); | ||
18 | end | ||
19 | |||
20 | for j=1:np, | ||
21 | A(j,:) = mag' + A(j,:); | ||
22 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/filter_all_files.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/filter_all_files.m new file mode 100755 index 0000000..c1752e5 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/filter_all_files.m | |||
@@ -0,0 +1,29 @@ | |||
1 | sigs = [1/sqrt(2),1,sqrt(2),2,2*sqrt(2)];r = 3;szs = round(r*3*sigs); | ||
2 | |||
3 | load filenames; | ||
4 | |||
5 | nfiles = size(filename,1); | ||
6 | |||
7 | for j = 48:nfiles, | ||
8 | fname = ['images/',filename(j,:)]; | ||
9 | fname | ||
10 | I = readpgm(fname); | ||
11 | |||
12 | text_des = compute_filter(I,sigs,r,szs); | ||
13 | |||
14 | data_name = sprintf('filter_%s.mat',filename(j,:)); | ||
15 | cm = sprintf('save %s ',data_name); | ||
16 | |||
17 | disp(cm); | ||
18 | eval(cm); | ||
19 | clear; | ||
20 | |||
21 | sigs = [1/sqrt(2),1,sqrt(2),2,2*sqrt(2)];r = 3;szs = round(r*3*sigs); | ||
22 | |||
23 | load filenames; | ||
24 | |||
25 | nfiles = size(filename,1); | ||
26 | |||
27 | |||
28 | end | ||
29 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/filter_output.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/filter_output.m new file mode 100755 index 0000000..a489c6e --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/filter_output.m | |||
@@ -0,0 +1,38 @@ | |||
1 | function If = filter_output(I,sigs,szs,flag); | ||
2 | % | ||
3 | % compute filter output for all orientation and scale, | ||
4 | % | ||
5 | |||
6 | %% flag = 1 if compute oriented filter output | ||
7 | if (~exist('flag')), | ||
8 | flag = 1; | ||
9 | end | ||
10 | |||
11 | |||
12 | If = []; | ||
13 | |||
14 | for j = 1:length(sigs), | ||
15 | sig = sigs(j); | ||
16 | sz = 2*round(4*sig)+1; | ||
17 | |||
18 | g = mkdog1(sig,sz); | ||
19 | fprintf('['); | ||
20 | fprintf('.'); | ||
21 | If(:,:,1,j) = conv2(I,g,'same'); | ||
22 | |||
23 | angles = [0:30:150]; | ||
24 | r = 3; | ||
25 | |||
26 | if flag, | ||
27 | for k = 1:length(angles), | ||
28 | fprintf('.'); | ||
29 | g = mdoog2(sig,r,angles(k),szs(j)); | ||
30 | If(:,:,k+1,j) = conv2(I,g,'same'); | ||
31 | end | ||
32 | end | ||
33 | |||
34 | fprintf(']'); | ||
35 | |||
36 | end | ||
37 | |||
38 | fprintf('\n'); \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/find_bst_cut.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/find_bst_cut.m new file mode 100755 index 0000000..c85cc2b --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/find_bst_cut.m | |||
@@ -0,0 +1,24 @@ | |||
1 | function [cut_threshold,max_asso] = find_bst_cut(fn_base,para,threshold,Gmask) | ||
2 | |||
3 | basedir = 'plaatje_data/'; | ||
4 | %basedir = './'; | ||
5 | |||
6 | fn = sprintf('%sbst_cut.tex',basedir); | ||
7 | write_command(fn,fn_base,para); | ||
8 | |||
9 | fn= sprintf('%sthreshold_%s.pfm',basedir,fn_base); | ||
10 | writepfm(fn,threshold(:)); | ||
11 | |||
12 | fn= sprintf('%sGmask_%s.pfm',basedir,fn_base); | ||
13 | writepfm(fn,Gmask(:)); | ||
14 | |||
15 | cd plaatje_data | ||
16 | !./find_bestcut | ||
17 | cd /home/barad-dur/vision/malik/jshi/proj/grouping/texture | ||
18 | |||
19 | fn = sprintf('%sbst_asso_%s.pfm',basedir,fn_base); | ||
20 | results = readpfm(fn); | ||
21 | asso = results(1,:); | ||
22 | [max_asso,id] = max(asso); | ||
23 | cut_threshold = threshold(id); | ||
24 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/find_center.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/find_center.m new file mode 100755 index 0000000..b5a127a --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/find_center.m | |||
@@ -0,0 +1,4 @@ | |||
1 | function [center_x,center_y] = find_center(size_x,size_y); | ||
2 | |||
3 | center_x = 0.5*(size_x -1)+1; | ||
4 | center_y = 0.5*(size_y -1)+1; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/find_cutpoint.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/find_cutpoint.m new file mode 100755 index 0000000..5cab956 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/find_cutpoint.m | |||
@@ -0,0 +1,13 @@ | |||
1 | function [cutpoints,x] = find_cutpoint(data,cmap,nbin) | ||
2 | % | ||
3 | % [cutpoints,x] = find_cutpoint(data,cmap,nbin) | ||
4 | % | ||
5 | % | ||
6 | |||
7 | x = id_cut(data,cmap,nbin); | ||
8 | |||
9 | cutpoints = zeros(1,nbin); | ||
10 | |||
11 | for j=1:nbin, | ||
12 | cutpoints(j) = max(data(x<=j)); | ||
13 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/gen_filters.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/gen_filters.m new file mode 100755 index 0000000..65e3c3a --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/gen_filters.m | |||
@@ -0,0 +1,47 @@ | |||
1 | function filters = gen_filters(sig,r,sz); | ||
2 | |||
3 | |||
4 | as = 0:30:150; | ||
5 | |||
6 | filters = []; | ||
7 | |||
8 | if size(sig,2)== 1, | ||
9 | |||
10 | for j = 1:length(as), | ||
11 | fprintf('.'); | ||
12 | angle = as(j); | ||
13 | |||
14 | g = mdoog2(sig,r,angle,round(sz)); | ||
15 | |||
16 | g = g - mean(reshape(g,prod(size(g)),1)); | ||
17 | |||
18 | g = g/sum(sum(abs(g))); | ||
19 | |||
20 | filters(:,:,j) = g; | ||
21 | end | ||
22 | else | ||
23 | |||
24 | % there are multiple scales | ||
25 | sigs = sig; | ||
26 | szs = sz; | ||
27 | for k = 1:size(sigs,2), | ||
28 | sig = sigs(k); | ||
29 | sz = szs(length(szs)-1); | ||
30 | fprintf('%d',k); | ||
31 | for j = 1:length(as), | ||
32 | fprintf('.'); | ||
33 | angle = as(j); | ||
34 | |||
35 | g = mdoog2(sig,r,angle,round(sz)); | ||
36 | g = g - mean(reshape(g,prod(size(g)),1)); | ||
37 | g = g/sum(sum(abs(g))); | ||
38 | |||
39 | filters(:,:,j,k) = g; | ||
40 | end | ||
41 | |||
42 | |||
43 | end | ||
44 | |||
45 | end | ||
46 | |||
47 | fprintf('\n'); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/get_cumhist.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/get_cumhist.m new file mode 100755 index 0000000..b05d680 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/get_cumhist.m | |||
@@ -0,0 +1,9 @@ | |||
1 | function cumhists = get_cumhist(hists) | ||
2 | % | ||
3 | % | ||
4 | % cumhists = get_cumhist(hists) | ||
5 | % | ||
6 | |||
7 | cumhists.inten = cumsum(hists.inten)/sum(hists.inten); | ||
8 | cumhists.text = cumsum(hists.text,1)./(ones(size(hists.text,1),1)*sum(hists.text,1)); | ||
9 | cumhists.mag = cumsum(hists.mag)/sum(hists.mag); \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/get_cumhist_inten.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/get_cumhist_inten.m new file mode 100755 index 0000000..911b4e6 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/get_cumhist_inten.m | |||
@@ -0,0 +1,7 @@ | |||
1 | function CH_inten = get_cumhist(hists) | ||
2 | % | ||
3 | % | ||
4 | % cumhists = get_cumhist(hists) | ||
5 | % | ||
6 | |||
7 | CH_inten = cumsum(hists)/sum(hists); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/get_hist.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/get_hist.m new file mode 100755 index 0000000..d480a3a --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/get_hist.m | |||
@@ -0,0 +1,24 @@ | |||
1 | function [hists,bins] = get_hists(J,Jbar) | ||
2 | % | ||
3 | % | ||
4 | % produce histogram output of the image J and its | ||
5 | % filter outputs Jbar | ||
6 | % | ||
7 | |||
8 | maxval = 60; | ||
9 | bin = [1:4:maxval+1]; | ||
10 | |||
11 | w = size(J); | ||
12 | |||
13 | |||
14 | [hists.inten,bins.inten] = hist(reshape(J,prod(w),1),[1:26:256]); | ||
15 | |||
16 | for j=1:size(Jbar,3), | ||
17 | hists.text(:,j) = hist(reshape(abs(Jbar(:,:,j)),prod(w),1),bin); | ||
18 | end | ||
19 | |||
20 | bins.text = bin; | ||
21 | |||
22 | [hists.mag,bins.mag] = hist(reshape(sum(abs(Jbar),3),prod(w),1),[1:10:161]); | ||
23 | |||
24 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/get_hist_inten.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/get_hist_inten.m new file mode 100755 index 0000000..c8357c6 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/get_hist_inten.m | |||
@@ -0,0 +1,15 @@ | |||
1 | function [Hinten,Hbins] = get_hists_inten(J,nbin) | ||
2 | % | ||
3 | % | ||
4 | % produce histogram output of the image J and its | ||
5 | % filter outputs Jbar | ||
6 | % | ||
7 | |||
8 | |||
9 | w = size(J); | ||
10 | |||
11 | [Hinten,Hbins] = hist(reshape(J,prod(w),1),linspace(1,256,nbin)); | ||
12 | |||
13 | |||
14 | |||
15 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/get_win.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/get_win.m new file mode 100755 index 0000000..411a694 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/get_win.m | |||
@@ -0,0 +1,10 @@ | |||
1 | function J = get_win(I,center,wc) | ||
2 | % | ||
3 | % J = get_win(I,center,wc) | ||
4 | % | ||
5 | % center: [x,y] | ||
6 | |||
7 | |||
8 | |||
9 | J = I(center(2)-wc(2):center(2)+wc(2),... | ||
10 | center(1)-wc(1):center(1)+wc(1)); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/get_win5.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/get_win5.m new file mode 100755 index 0000000..e8404e5 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/get_win5.m | |||
@@ -0,0 +1,11 @@ | |||
1 | function J = get_win5(I,center,wc) | ||
2 | % | ||
3 | % J = get_win5(I,center,wc) | ||
4 | % | ||
5 | % center: [x,y] | ||
6 | |||
7 | |||
8 | |||
9 | J = I(center(2)-wc(2):center(2)+wc(2),... | ||
10 | center(1)-wc(1):center(1)+wc(1),:,:); | ||
11 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/grad.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/grad.m new file mode 100755 index 0000000..6da0fbf --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/grad.m | |||
@@ -0,0 +1,24 @@ | |||
1 | % gradient of an image | ||
2 | % coordinates (r, c) follow matrix convention; | ||
3 | % the gaussian is truncated at x = +- tail, and there are samples samples | ||
4 | % inbetween, where samples = hsamples * 2 + 1 | ||
5 | |||
6 | function[gr,gc] = gradient(image, hsamples) | ||
7 | |||
8 | tail=4; | ||
9 | samples = hsamples * 2 + 1; | ||
10 | |||
11 | x = linspace(-tail, tail, samples); | ||
12 | gauss = exp(-x.^2); | ||
13 | n = gauss * ones(samples,1); | ||
14 | gauss = gauss/n; | ||
15 | |||
16 | gaussderiv = -x.*gauss; | ||
17 | n = -gaussderiv*linspace(1,samples,samples)'; | ||
18 | gaussderiv = gaussderiv/n; | ||
19 | |||
20 | gr = conv2(conv2(image, gaussderiv','valid'), gauss,'valid'); | ||
21 | gc = conv2(conv2(image, gaussderiv,'valid'), gauss','valid'); | ||
22 | |||
23 | %gr = conv_trim(gr, hsamples, hsamples); | ||
24 | %gc = conv_trim(gc, hsamples, hsamples); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/half_sigmoid.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/half_sigmoid.m new file mode 100755 index 0000000..c187b6c --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/half_sigmoid.m | |||
@@ -0,0 +1,17 @@ | |||
1 | function a = half_sigmoid(x,offset,sig) | ||
2 | % | ||
3 | % a = half_sigmoid(x,offset,sig) | ||
4 | % | ||
5 | % a = ones(size(x))./(1+exp(-(x-offset)/sig)); | ||
6 | % | ||
7 | % keep the sign of a | ||
8 | |||
9 | sign_x = sign(x); | ||
10 | x = abs(x); | ||
11 | |||
12 | a = ones(size(x))./(1+exp(-(x-offset)/sig)); | ||
13 | |||
14 | off = 1/(1+exp(-(0-offset)/sig)); | ||
15 | |||
16 | a = sign_x.*(a-off); | ||
17 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/hist2d.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/hist2d.m new file mode 100755 index 0000000..3f4db0c --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/hist2d.m | |||
@@ -0,0 +1,13 @@ | |||
1 | function H2 = hist2d(J,Jf,scales,filter_ids) | ||
2 | |||
3 | ns = length(scales); | ||
4 | nf = length(filter_ids); | ||
5 | |||
6 | H2 = []; | ||
7 | for j=1:ns, | ||
8 | for k=1:nf, | ||
9 | H2d = hist_I_f(J,Jf(:,:,filter_ids(k),scales(j))); | ||
10 | H2(:,:,j,k) = H2d; | ||
11 | end | ||
12 | end | ||
13 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/hist_I_f.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/hist_I_f.m new file mode 100755 index 0000000..a993661 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/hist_I_f.m | |||
@@ -0,0 +1,22 @@ | |||
1 | function h2d = hist_I_f(I,If,binI,binf) | ||
2 | |||
3 | if (nargin == 2), | ||
4 | binI = [0:13:260]; | ||
5 | binf = [-30:2.5*2:30]; | ||
6 | end | ||
7 | |||
8 | %%% make 2d histogram bin | ||
9 | h2d = []; | ||
10 | |||
11 | for j = 2:length(binf), | ||
12 | |||
13 | [id_i,id_j] = find((If>binf(j-1)) & (If<=binf(j))); | ||
14 | if (length(id_i) >0), | ||
15 | h = hist(I(id_i+(id_j-1)*size(I,1)),binI); | ||
16 | else | ||
17 | h = zeros(size(binI)); | ||
18 | end | ||
19 | |||
20 | h2d = [h2d,h']; | ||
21 | end | ||
22 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/hist_diff.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/hist_diff.m new file mode 100755 index 0000000..6976c8f --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/hist_diff.m | |||
@@ -0,0 +1,30 @@ | |||
1 | function hdiff = hist_diff(H1,H2) | ||
2 | % | ||
3 | % hdiff = hist_diff(H1,H2) | ||
4 | % | ||
5 | |||
6 | ns = size(H1,3); | ||
7 | nf = size(H1,4); | ||
8 | |||
9 | sI= [1,0,1];sI = exp(-sI); | ||
10 | sI = sI/sum(sI); | ||
11 | |||
12 | hdiff = 0; | ||
13 | for j = 1:ns, | ||
14 | for k = 1:nf, | ||
15 | h1 = H1(:,:,j,k); | ||
16 | h2 = H2(:,:,j,k); | ||
17 | |||
18 | h1s = conv2(conv2(h1,sI','same'),sI,'same'); | ||
19 | h2s = conv2(conv2(h2,sI','same'),sI,'same'); | ||
20 | |||
21 | [is,js] = find( (h1>0) | (h2>0)); | ||
22 | ids = (js-1)*size(h1,1) + is; | ||
23 | |||
24 | xdiffs = ((h1s(ids)-h2s(ids)).*(h1s(ids)-h2s(ids)))./(h1s(ids)+h2s(ids)); | ||
25 | hdiff = hdiff + sum(xdiffs); | ||
26 | |||
27 | end | ||
28 | end | ||
29 | |||
30 | hdiff = hdiff/(ns*nf); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/hist_f.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/hist_f.m new file mode 100755 index 0000000..93f50a9 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/hist_f.m | |||
@@ -0,0 +1,28 @@ | |||
1 | function h2d = hist_f(Ifs,f1,s1,f2,s2) | ||
2 | |||
3 | |||
4 | binf = [-30:2.5*2:30]; | ||
5 | |||
6 | |||
7 | %%% make 2d histogram bin | ||
8 | |||
9 | If1 = Ifs(:,:,f1,s1); | ||
10 | If2 = Ifs(:,:,f2,s2); | ||
11 | h2d = []; | ||
12 | |||
13 | binf(1) = -100; | ||
14 | binf(length(binf)) = 100; | ||
15 | |||
16 | for j = 2:length(binf), | ||
17 | |||
18 | [id_i,id_j] = find((If1>binf(j-1)) & (If1<=binf(j))); | ||
19 | if (length(id_i) >0), | ||
20 | |||
21 | h = hist(If2(id_i+(id_j-1)*size(If2,1)),binf); | ||
22 | else | ||
23 | h = zeros(size(binf)); | ||
24 | end | ||
25 | |||
26 | |||
27 | h2d = [h2d,h']; | ||
28 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/hist_in_chank.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/hist_in_chank.m new file mode 100755 index 0000000..74661b2 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/hist_in_chank.m | |||
@@ -0,0 +1,33 @@ | |||
1 | function covfh = hist_inner_chank(fv,chank_size,nbin) | ||
2 | % fh = hist_inner_chank(fv,hb,chank_file) | ||
3 | % | ||
4 | % (hb = bin_mins,bin_maxs,nbins) | ||
5 | % | ||
6 | % take which histogram value and turn it into histogram bin | ||
7 | % compute the inner product of the histogram bin features | ||
8 | % | ||
9 | |||
10 | [nf,np] = size(fv); | ||
11 | |||
12 | tbins = nf*nbin; | ||
13 | disp(sprintf('need matrix of %d x %d ',tbins,tbins)); | ||
14 | |||
15 | covfh = zeros(tbins,tbins); | ||
16 | |||
17 | n_chanks = ceil(np/chank_size); | ||
18 | for j=1:n_chanks, | ||
19 | fprintf('<'); | ||
20 | |||
21 | cm = sprintf('load st_%d',j); | ||
22 | eval(cm); | ||
23 | fprintf(sprintf('%d',n_chanks-j)); | ||
24 | |||
25 | %ms = mean(fh'); | ||
26 | %fh = fh- ms'*ones(1,size(fh,2)); | ||
27 | |||
28 | covfh = covfh + fh*fh'; | ||
29 | fprintf('>'); | ||
30 | end | ||
31 | |||
32 | fprintf('\n'); | ||
33 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/hist_inner.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/hist_inner.m new file mode 100755 index 0000000..6fd02b7 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/hist_inner.m | |||
@@ -0,0 +1,40 @@ | |||
1 | function fh = hist_inner(fv,hb) | ||
2 | % (hb = bin_mins,bin_maxs,nbins) | ||
3 | % | ||
4 | % take which histogram value and turn it into histogram bin | ||
5 | % compute the inner product of the histogram bin features | ||
6 | % | ||
7 | |||
8 | [nf,np] = size(fv); | ||
9 | |||
10 | nbins = [0,hb.nbins]; | ||
11 | |||
12 | disp(sprintf('need matrix of %d x %d ',sum(nbins),sum(nbins))); | ||
13 | |||
14 | fh = zeros(sum(nbins),sum(nbins)); | ||
15 | |||
16 | for j=1:nf, | ||
17 | bin_min = hb.bmins(j); | ||
18 | bin_max = hb.bmaxs(j); | ||
19 | nbin = nbins(j+1); | ||
20 | sig = hb.sigs(j); | ||
21 | fprintf('|'); | ||
22 | b0 = binize(fv(j,:),sig,bin_min,bin_max,nbin); | ||
23 | |||
24 | fh(sum(nbins(1:j))+1:sum(nbins(1:j+1)),sum(nbins(1:j))+1:sum(nbins(1:j+1))) = b0*b0'; | ||
25 | |||
26 | for k=j+1:nf, | ||
27 | bin_min = hb.bmins(k); | ||
28 | bin_max = hb.bmaxs(k); | ||
29 | nbin = nbins(k+1); | ||
30 | sig = hb.sigs(k); | ||
31 | fprintf('.'); | ||
32 | b = binize(fv(k,:),sig,bin_min,bin_max,nbin); | ||
33 | tmp = b0*b'; | ||
34 | |||
35 | fh(sum(nbins(1:j))+1:sum(nbins(1:j+1)),sum(nbins(1:k))+1:sum(nbins(1:k+1))) = tmp; | ||
36 | fh(sum(nbins(1:k))+1:sum(nbins(1:k+1)),sum(nbins(1:j))+1:sum(nbins(1:j+1))) = tmp'; | ||
37 | end | ||
38 | end | ||
39 | |||
40 | fprintf('\n'); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/histbin_fv_chank.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/histbin_fv_chank.m new file mode 100755 index 0000000..8cf2a35 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/histbin_fv_chank.m | |||
@@ -0,0 +1,14 @@ | |||
1 | function histbin_fv_chank(fvs,hb,chank_size,fname_base) | ||
2 | |||
3 | [nv,np] = size(fvs); | ||
4 | |||
5 | k =1; | ||
6 | for j=1:chank_size:np, | ||
7 | disp(sprintf('|%d',j)); | ||
8 | fh = colize_hist(fvs(:,j:min(j+chank_size-1,np)),hb); | ||
9 | fname = sprintf('%s_%d.mat',fname_base,k); | ||
10 | cm = sprintf('save %s fh hb;',fname); | ||
11 | disp(cm); | ||
12 | eval(cm); | ||
13 | k = k+1; | ||
14 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/hsv2clrs.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/hsv2clrs.m new file mode 100755 index 0000000..cfbb8b0 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/hsv2clrs.m | |||
@@ -0,0 +1,25 @@ | |||
1 | function [x,y,z] = hsv2clrs(h,s,v) | ||
2 | % | ||
3 | % function [x,y,z] = hsv2clrs(h,s,v) | ||
4 | % if h is 3D matrix, output in 3D x | ||
5 | % | ||
6 | |||
7 | if (size(h,3) == 3), | ||
8 | s = h(:,:,2); | ||
9 | v = h(:,:,3); | ||
10 | h = h(:,:,1); | ||
11 | |||
12 | z = v; | ||
13 | xx = s.*v.*cos(2*pi*h); | ||
14 | y = s.*v.*sin(2*pi*h); | ||
15 | |||
16 | x(:,:,1) = xx; | ||
17 | x(:,:,2) = y; | ||
18 | x(:,:,3) = z; | ||
19 | else | ||
20 | |||
21 | z = v; | ||
22 | x = s.*v.*cos(2*pi*h); | ||
23 | y = s.*v.*sin(2*pi*h); | ||
24 | end | ||
25 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/id_cut.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/id_cut.m new file mode 100755 index 0000000..daf8f2b --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/id_cut.m | |||
@@ -0,0 +1,14 @@ | |||
1 | function [x,map] = idcut(data,cmap,nbin) | ||
2 | % | ||
3 | % | ||
4 | % | ||
5 | |||
6 | lc = size(cmap,1); | ||
7 | |||
8 | data = data - min(data); | ||
9 | data = 1+ ((lc-1)*data/max(data)); | ||
10 | |||
11 | r = cmap(data,1);g = cmap(data,2);b = cmap(data,3); | ||
12 | |||
13 | [x,map] = vmquant(r,g,b,nbin); | ||
14 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/im.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/im.m new file mode 100755 index 0000000..6450120 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/im.m | |||
@@ -0,0 +1,3 @@ | |||
1 | function im(I) | ||
2 | |||
3 | imagesc(I);axis('image');drawnow; \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/im3.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/im3.m new file mode 100755 index 0000000..b49e690 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/im3.m | |||
@@ -0,0 +1,3 @@ | |||
1 | function im3(d) | ||
2 | |||
3 | imagesc(reshape(d,size(d,1),size(d,2)*size(d,3))); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/im5.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/im5.m new file mode 100755 index 0000000..7f1b16d --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/im5.m | |||
@@ -0,0 +1,16 @@ | |||
1 | function im5(data,nr,nc,mag) | ||
2 | |||
3 | if nargin == 4, | ||
4 | for j=1:size(data,3), | ||
5 | subplot(nr,nc,j); | ||
6 | imagesc(data(:,:,j)./mag);axis('image');axis('off');colorbar;drawnow; | ||
7 | |||
8 | % image(150*data(:,:,j));axis('image');axis('off');colorbar;drawnow; | ||
9 | end | ||
10 | |||
11 | else | ||
12 | for j=1:size(data,3), | ||
13 | subplot(nr,nc,j); | ||
14 | imagesc(data(:,:,j));axis('image');axis('off');colorbar;drawnow; | ||
15 | end | ||
16 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/im_vect.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/im_vect.m new file mode 100755 index 0000000..d0a5b30 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/im_vect.m | |||
@@ -0,0 +1,20 @@ | |||
1 | function a = im_vect(loca,v,scale); | ||
2 | |||
3 | if ~exist('scale'), | ||
4 | scale = 50; | ||
5 | end | ||
6 | |||
7 | y = loca(1,:); | ||
8 | x = loca(2,:); | ||
9 | |||
10 | x = x - min(x); | ||
11 | y = y - min(y); | ||
12 | |||
13 | max_x = max(x);max_y = max(y); | ||
14 | min_scale = min(max_x,max_y); | ||
15 | |||
16 | x = scale*x/min_scale; | ||
17 | y = scale*y/min_scale; | ||
18 | |||
19 | |||
20 | a = sparse(y+1,x+1,v); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/imrotate.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/imrotate.m new file mode 100755 index 0000000..167fd02 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/imrotate.m | |||
@@ -0,0 +1,119 @@ | |||
1 | function bout = imrotate(arg1,arg2,arg3,arg4) | ||
2 | %IMROTATE Rotate image. | ||
3 | % B = IMROTATE(A,ANGLE,'method') rotates the image A by ANGLE | ||
4 | % degrees. The image returned B will, in general, be larger | ||
5 | % than A. Invalid values on the periphery are set to one | ||
6 | % for indexed images or zero for all other image types. Possible | ||
7 | % interpolation methods are 'nearest','bilinear' or 'bicubic'. | ||
8 | % 'bilinear' is the default for intensity images, otherwise | ||
9 | % 'nearest' is used if no method is given. | ||
10 | % | ||
11 | % B = IMROTATE(A,ANGLE,'crop') or IMROTATE(A,ANGLE,'method','crop') | ||
12 | % crops B to be the same size as A. | ||
13 | % | ||
14 | % Without output arguments, IMROTATE(...) displays the rotated | ||
15 | % image in the current axis. | ||
16 | % | ||
17 | % See also IMRESIZE, IMCROP, ROT90. | ||
18 | |||
19 | % Clay M. Thompson 8-4-92 | ||
20 | % Copyright (c) 1992 by The MathWorks, Inc. | ||
21 | % $Revision: 1.14 $ $Date: 1993/09/01 21:27:38 $ | ||
22 | |||
23 | if nargin<2, error('Requires at least two input parameters.'); end | ||
24 | if nargin<3, | ||
25 | if isgray(arg1), caseid = 'bil'; else caseid = 'nea'; end | ||
26 | docrop = 0; | ||
27 | elseif nargin==3, | ||
28 | if isstr(arg3), | ||
29 | method = [lower(arg3),' ']; % Protect against short method | ||
30 | caseid = method(1:3); | ||
31 | if caseid(1)=='c', % Crop string | ||
32 | if isgray(arg1), caseid = 'bil'; else caseid = 'nea'; end | ||
33 | docrop = 1; | ||
34 | else | ||
35 | docrop = 0; | ||
36 | end | ||
37 | else | ||
38 | error('''METHOD'' must be a string of at least three characters.'); | ||
39 | end | ||
40 | else | ||
41 | if isstr(arg3), | ||
42 | method = [lower(arg3),' ']; % Protect against short method | ||
43 | caseid = method(1:3); | ||
44 | else | ||
45 | error('''METHOD'' must be a string of at least three characters.'); | ||
46 | end | ||
47 | docrop = 1; | ||
48 | end | ||
49 | |||
50 | % Catch and speed up 90 degree rotations | ||
51 | if rem(arg2,90)==0 & nargin<4, | ||
52 | phi = rem(arg2,360); | ||
53 | if phi==90, | ||
54 | b = rot90(arg1); | ||
55 | elseif phi==180, | ||
56 | b = rot90(arg1,2); | ||
57 | elseif phi==270, | ||
58 | b = rot90(arg1,-1); | ||
59 | else | ||
60 | b = arg1; | ||
61 | end | ||
62 | if nargout==0, imshow(b), else bout = b; end | ||
63 | return | ||
64 | end | ||
65 | |||
66 | phi = arg2*pi/180; % Convert to radians | ||
67 | |||
68 | % Rotation matrix | ||
69 | T = [cos(phi) -sin(phi); sin(phi) cos(phi)]; | ||
70 | |||
71 | % Coordinates from center of A | ||
72 | [m,n] = size(arg1); | ||
73 | if ~docrop, % Determine limits for rotated image | ||
74 | siz = ceil(max(abs([(n-1)/2 -(m-1)/2;(n-1)/2 (m-1)/2]*T))/2)*2; | ||
75 | uu = -siz(1):siz(1); vv = -siz(2):siz(2); | ||
76 | else % Cropped image | ||
77 | uu = (1:n)-(n+1)/2; vv = (1:m)-(m+1)/2; | ||
78 | end | ||
79 | nu = length(uu); nv = length(vv); | ||
80 | |||
81 | blk = bestblk([nv nu]); | ||
82 | nblks = floor([nv nu]./blk); nrem = [nv nu] - nblks.*blk; | ||
83 | mblocks = nblks(1); nblocks = nblks(2); | ||
84 | mb = blk(1); nb = blk(2); | ||
85 | |||
86 | rows = 1:blk(1); b = zeros(nv,nu); | ||
87 | for i=0:mblocks, | ||
88 | if i==mblocks, rows = (1:nrem(1)); end | ||
89 | for j=0:nblocks, | ||
90 | if j==0, cols = 1:blk(2); elseif j==nblocks, cols=(1:nrem(2)); end | ||
91 | if ~isempty(rows) & ~isempty(cols) | ||
92 | [u,v] = meshgrid(uu(j*nb+cols),vv(i*mb+rows)); | ||
93 | % Rotate points | ||
94 | uv = [u(:) v(:)]*T'; % Rotate points | ||
95 | u(:) = uv(:,1)+(n+1)/2; v(:) = uv(:,2)+(m+1)/2; | ||
96 | if caseid(1)=='n', % Nearest neighbor interpolation | ||
97 | b(i*mb+rows,j*nb+cols) = interp6(arg1,u,v); | ||
98 | elseif all(caseid=='bil'), % Bilinear interpolation | ||
99 | b(i*mb+rows,j*nb+cols) = interp4(arg1,u,v); | ||
100 | elseif all(caseid=='bic'), % Bicubic interpolation | ||
101 | b(i*mb+rows,j*nb+cols) = interp5(arg1,u,v); | ||
102 | else | ||
103 | error(['Unknown interpolation method: ',method]); | ||
104 | end | ||
105 | end | ||
106 | end | ||
107 | end | ||
108 | |||
109 | d = find(isnan(b)); | ||
110 | if length(d)>0, | ||
111 | if isind(arg1), b(d) = ones(size(d)); else b(d) = zeros(size(d)); end | ||
112 | end | ||
113 | |||
114 | if nargout==0, | ||
115 | imshow(b), return | ||
116 | end | ||
117 | bout = b; | ||
118 | |||
119 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/ims.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/ims.m new file mode 100755 index 0000000..2fb5f25 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/ims.m | |||
@@ -0,0 +1,3 @@ | |||
1 | function ims(I,nr,nc) | ||
2 | |||
3 | im(reshape(I,nr,nc)); \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/imvs.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/imvs.m new file mode 100755 index 0000000..21dde73 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/imvs.m | |||
@@ -0,0 +1,4 @@ | |||
1 | function imvs(I,v,nr,nc) | ||
2 | |||
3 | v = reshape(v,nr,nc); | ||
4 | im(I(1:size(v,1),1:size(v,2)).*v); \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/is_step.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/is_step.m new file mode 100755 index 0000000..4903778 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/is_step.m | |||
@@ -0,0 +1,33 @@ | |||
1 | function P_step = is_step(gx,gy) | ||
2 | % | ||
3 | % P_step = is_step(gx,gy) | ||
4 | % | ||
5 | % determine wheter gx,gy(which is first | ||
6 | % order filter output) is a response | ||
7 | % to a step function | ||
8 | % | ||
9 | |||
10 | M = zeros(2,2); | ||
11 | M(1,1) = sum(sum(gx.*gx)); | ||
12 | M(2,2) = sum(sum(gy.*gy)); | ||
13 | M(1,2) = sum(sum(gx.*gy)); | ||
14 | M(2,1) = M(1,2); | ||
15 | |||
16 | [v,d] = eig(M); | ||
17 | d = diag(d); | ||
18 | |||
19 | % make the first eig_value to be the smaller one | ||
20 | if (d(2)< d(1)), | ||
21 | tmp = d(1);d(1) = d(2);d(2) = tmp; | ||
22 | tmp = v(:,1); v(:,1) = v(:,2); v(:,2) = tmp; | ||
23 | end | ||
24 | |||
25 | ratio = d(1)/d(2); | ||
26 | threshold = 0; | ||
27 | gx_ratio = sum(sum(gx.*(gx>threshold)))/(sum(sum(abs(gx).*(abs(gx)>threshold)))); | ||
28 | gx_ratio = max(gx_ratio,1-gx_ratio); | ||
29 | |||
30 | gy_ratio = sum(sum(gy.*(gy>threshold)))/(sum(sum(abs(gy).*(abs(gy)>threshold)))); | ||
31 | gy_ratio = max(gy_ratio,1-gy_ratio); | ||
32 | |||
33 | P_step = [ratio,gx_ratio,gy_ratio]; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/ks_2d.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/ks_2d.m new file mode 100755 index 0000000..cfac005 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/ks_2d.m | |||
@@ -0,0 +1,20 @@ | |||
1 | function [na,nb,nc,nd] = ks_2d(cum_filter) | ||
2 | |||
3 | [nb_filters,nb_bins] = size(cum_filter); | ||
4 | |||
5 | T = 1; | ||
6 | |||
7 | for j = [1:nb_filters], | ||
8 | for l = [1:nb_bins], | ||
9 | nc(j,l) = sum(cum_filter(1:j,l)); | ||
10 | nd(j,l) = j*T - nc(j,l); | ||
11 | |||
12 | if (j~= nb_filters), | ||
13 | nb(j,l) = sum(cum_filter(j+1:nb_filters,l)); | ||
14 | na(j,l) = (nb_filters-j)*T-nb(j,l); | ||
15 | else | ||
16 | nb(j,l) = 0; | ||
17 | na(j,l) = 0; | ||
18 | end | ||
19 | end | ||
20 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/load_result.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/load_result.m new file mode 100755 index 0000000..0ff328c --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/load_result.m | |||
@@ -0,0 +1,39 @@ | |||
1 | |||
2 | fnameI = '130056'; | ||
3 | |||
4 | cm = sprintf('load filter_%s.pgm.mat',fnameI); | ||
5 | disp(cm); | ||
6 | eval(cm); | ||
7 | |||
8 | text_des= reshape(text_des,size(text_des,1),size(text_des,2),size(text_des,3)*size(text_des,4)); | ||
9 | |||
10 | for j=1:size(text_des,3), | ||
11 | text_des(:,:,j) = abs(text_des(:,:,j)).*(text_des(:,:,j) <0); | ||
12 | end | ||
13 | |||
14 | %text_des = abs(text_des); | ||
15 | |||
16 | |||
17 | %%%% cutoff margins, | ||
18 | margin = 6+10; | ||
19 | |||
20 | Iw = cutoff(I,margin); | ||
21 | |||
22 | |||
23 | T1 = cutoff(text_des,margin); | ||
24 | |||
25 | %%%%% reduce resolution | ||
26 | |||
27 | |||
28 | |||
29 | T1 = reduce_all(T1); | ||
30 | T1 = reduce_all(T1); | ||
31 | |||
32 | im5(T1,5,6); | ||
33 | |||
34 | cm = sprintf('writepnm5(''%s_f.pnm'',%s)',fnameI,'T1/70'); | ||
35 | |||
36 | % disp(cm);eval(cm); | ||
37 | |||
38 | nr = size(T1,1); | ||
39 | nc = size(T1,2); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/m_interp4.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/m_interp4.m new file mode 100755 index 0000000..314f140 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/m_interp4.m | |||
@@ -0,0 +1,49 @@ | |||
1 | function [F,mask] = m_interp4(z,s,t) | ||
2 | %INTERP4 2-D bilinear data interpolation. | ||
3 | % ZI = INTERP4(Z,XI,YI) assumes X = 1:N and Y = 1:M, where | ||
4 | % [M,N] = SIZE(Z). | ||
5 | % | ||
6 | % Copyright (c) 1984-93 by The MathWorks, Inc. | ||
7 | % Clay M. Thompson 4-26-91, revised 7-3-91, 3-22-93 by CMT. | ||
8 | % | ||
9 | % modified to | ||
10 | |||
11 | |||
12 | [nrows,ncols] = size(z); | ||
13 | |||
14 | |||
15 | if any(size(z)<[3 3]), error('Z must be at least 3-by-3.'); end | ||
16 | if size(s)~=size(t), error('XI and YI must be the same size.'); end | ||
17 | |||
18 | % Check for out of range values of s and set to 1 | ||
19 | sout = find((s<1)|(s>ncols)); | ||
20 | if length(sout)>0, s(sout) = ones(size(sout)); end | ||
21 | |||
22 | % Check for out of range values of t and set to 1 | ||
23 | tout = find((t<1)|(t>nrows)); | ||
24 | if length(tout)>0, t(tout) = ones(size(tout)); end | ||
25 | |||
26 | % Matrix element indexing | ||
27 | ndx = floor(t)+floor(s-1)*nrows; | ||
28 | |||
29 | % Compute intepolation parameters, check for boundary value. | ||
30 | d = find(s==ncols); | ||
31 | s(:) = (s - floor(s)); | ||
32 | if length(d)>0, s(d) = s(d)+1; ndx(d) = ndx(d)-nrows; end | ||
33 | |||
34 | % Compute intepolation parameters, check for boundary value. | ||
35 | d = find(t==nrows); | ||
36 | t(:) = (t - floor(t)); | ||
37 | if length(d)>0, t(d) = t(d)+1; ndx(d) = ndx(d)-1; end | ||
38 | d = []; | ||
39 | |||
40 | % Now interpolate, reuse u and v to save memory. | ||
41 | F = ( z(ndx).*(1-t) + z(ndx+1).*t ).*(1-s) + ... | ||
42 | ( z(ndx+nrows).*(1-t) + z(ndx+(nrows+1)).*t ).*s; | ||
43 | |||
44 | mask = ones(size(z)); | ||
45 | |||
46 | % Now set out of range values to zeros. | ||
47 | if length(sout)>0, F(sout) = zeros(size(sout));mask(sout)=zeros(size(sout));end | ||
48 | if length(tout)>0, F(tout) = zeros(size(tout));mask(tout)=zeros(size(tout));end | ||
49 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/make_masks.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/make_masks.m new file mode 100755 index 0000000..d2c8ba7 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/make_masks.m | |||
@@ -0,0 +1,12 @@ | |||
1 | function masks = make_masks(groups,ids,nr,nc); | ||
2 | |||
3 | np = ids(end); | ||
4 | |||
5 | baseid =1; | ||
6 | for j=1:length(ids), | ||
7 | mask = zeros(np,1); | ||
8 | mask(groups(baseid:ids(j))) = 1+mask(groups(baseid:ids(j))); | ||
9 | baseid = 1+ids(j); | ||
10 | |||
11 | masks(:,:,j) = mask; | ||
12 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/makefilter.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/makefilter.m new file mode 100755 index 0000000..a768269 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/makefilter.m | |||
@@ -0,0 +1,14 @@ | |||
1 | function H = make_filter(txture,sze,noise) | ||
2 | % function H = make_filter(txture,sze) | ||
3 | % | ||
4 | % | ||
5 | |||
6 | x = zeros(sze); | ||
7 | tx_sze = size(txture); | ||
8 | |||
9 | x(1:tx_sze(1),1:tx_sze(2)) = txture; | ||
10 | x = reshape(x,1,sze(1)*sze(2)); | ||
11 | X = fft(x); | ||
12 | figure(3);plot(abs(X).^2); | ||
13 | |||
14 | H = X./(abs(X).^2+noise); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mkf_t1.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mkf_t1.m new file mode 100755 index 0000000..256e609 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mkf_t1.m | |||
@@ -0,0 +1,22 @@ | |||
1 | function [H,h] = make_filter(txture,sze,noise) | ||
2 | % function H = make_filter(txture,sze) | ||
3 | % | ||
4 | % | ||
5 | |||
6 | tx_sze = size(txture); | ||
7 | x = reshape(txture,1,tx_sze(1)*tx_sze(2)); | ||
8 | X = fft(x); | ||
9 | H = X./(abs(X).^2+noise); | ||
10 | h = reshape(real(ifft(H)),tx_sze(1),tx_sze(2)); | ||
11 | |||
12 | |||
13 | x = zeros(sze); | ||
14 | x(1:tx_sze(1),1:tx_sze(2)) = h; | ||
15 | figure(1);imagesc(x);drawnow; | ||
16 | x = reshape(x,1,sze(1)*sze(2)); | ||
17 | H = fft(x); | ||
18 | |||
19 | h = reshape(real(ifft(H)),sze(1),sze(2)); | ||
20 | figure(2);imagesc(h); | ||
21 | |||
22 | figure(3); mesh(h); \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mkf_t2.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mkf_t2.m new file mode 100755 index 0000000..c84482d --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mkf_t2.m | |||
@@ -0,0 +1,21 @@ | |||
1 | function [H,h] = make_filter(txture,sze,noise) | ||
2 | % function H = make_filter(txture,sze) | ||
3 | % | ||
4 | % | ||
5 | |||
6 | x = zeros(sze); | ||
7 | tx_sze = size(txture); | ||
8 | |||
9 | [center_x,center_y] = find_center(sze(2),sze(1)); | ||
10 | tx_sze_h = round(0.5*tx_sze); | ||
11 | |||
12 | x(center_y-tx_sze_h(1):center_y-tx_sze_h(1)+tx_sze(1)-1,... | ||
13 | center_x-tx_sze_h(2):center_x-tx_sze_h(2)+tx_sze(2)-1) = txture; | ||
14 | figure(1);imagesc(x);drawnow; | ||
15 | x = reshape(x,1,sze(1)*sze(2)); | ||
16 | X = fft(x); | ||
17 | H = X./(abs(X).^2+noise); | ||
18 | h = reshape(real(ifft(H)),sze(1),sze(2)); | ||
19 | figure(2);imagesc(h); | ||
20 | |||
21 | figure(3); mesh(h); \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mkf_test.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mkf_test.m new file mode 100755 index 0000000..e8d0ad8 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mkf_test.m | |||
@@ -0,0 +1,43 @@ | |||
1 | function [H,h] = make_filter(txture,sze,n_c,a,b,c) | ||
2 | % function H = make_filter(txture,sze) | ||
3 | % | ||
4 | % | ||
5 | |||
6 | x = zeros(sze); | ||
7 | tx_sze = size(txture); | ||
8 | |||
9 | x(1:tx_sze(1),1:tx_sze(2)) = txture; | ||
10 | %figure(1);imagesc(x);drawnow; | ||
11 | x = reshape(x,1,sze(1)*sze(2)); | ||
12 | X = fft(x); | ||
13 | power = abs(X).^2; | ||
14 | |||
15 | figure(3);plot(power); | ||
16 | len = length(X); | ||
17 | |||
18 | t = [1:0.5*(length(X)-1),0.5*(length(X)-1):-1:1]; | ||
19 | |||
20 | top = max(power); | ||
21 | if (c == -1), | ||
22 | c = top*5.0e-1 | ||
23 | end | ||
24 | if (n_c == -1), | ||
25 | n_c = top*1.0e-1 | ||
26 | end | ||
27 | |||
28 | nois = n_c +c*(exp(-a*(t.^b))); | ||
29 | if (rem(len,2) == 1), | ||
30 | noise = [c+n_c,nois]; | ||
31 | else | ||
32 | noise = [c+n_c,nois,c+n_c]; | ||
33 | end | ||
34 | |||
35 | figure(3);hold on;plot(noise,'r'); | ||
36 | hold off | ||
37 | H = X./(abs(X).^2+noise); | ||
38 | h = reshape(real(ifft(H)),sze(1),sze(2)); | ||
39 | figure(2);imagesc(h); | ||
40 | |||
41 | figure(4);plot(abs(H).^2,'c') | ||
42 | %figure(3); mesh(h); | ||
43 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mkg.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mkg.m new file mode 100755 index 0000000..1fb1f7e --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mkg.m | |||
@@ -0,0 +1,9 @@ | |||
1 | function g= mkgaussian(xo,yo,sigma_x,sigma_y,size_w) | ||
2 | % | ||
3 | % function G = mkgaussian(xo,yo,sigma_x,sigma_y,size_w) | ||
4 | % | ||
5 | |||
6 | size_wh = round(0.5*size_w); | ||
7 | [x,y] = meshgrid([-size_wh:1:size_wh],[-size_wh:1:size_wh]); | ||
8 | g = 1/(2*pi*sigma_x*sigma_y)*(exp(-( ((x-xo)/sigma_x).^2 + ((y-yo)/sigma_y).^2))); | ||
9 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mkgaussian.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mkgaussian.m new file mode 100755 index 0000000..1213757 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mkgaussian.m | |||
@@ -0,0 +1,11 @@ | |||
1 | function G = mkgaussian(xo,yo,sigma_x,sigma_y,size_w) | ||
2 | % | ||
3 | % function G = mkgaussian(xo,yo,sigma_x,sigma_y,size_w) | ||
4 | % | ||
5 | |||
6 | size_wh = round(0.5*size_w); | ||
7 | |||
8 | [x,y] = meshgrid([-size_wh:1:size_wh],[-size_wh:1:size_wh]); | ||
9 | |||
10 | G = 0.5/(sigma_x*sigma_y)*(exp(-( ((x-xo)/sigma_x).^2 + ((y-yo)/sigma).^2))); | ||
11 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mkmulfilter.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mkmulfilter.m new file mode 100755 index 0000000..fe501b5 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mkmulfilter.m | |||
@@ -0,0 +1,52 @@ | |||
1 | function H = make_multi_filter(templates,num_templates,sze,u,noise) | ||
2 | % function H = make_filter(templates,num_templates,sze,u,noise) | ||
3 | % templates are column vectors of template | ||
4 | % sze is the size of the filter | ||
5 | % u is a vector of specified value | ||
6 | % | ||
7 | % | ||
8 | |||
9 | templates_size_x = size(templates,2)/num_templates; | ||
10 | templates_size_y = size(templates,1); | ||
11 | |||
12 | alpha = 1/num_templates; | ||
13 | |||
14 | X = zeros(num_templates,sze(1)*sze(2)); | ||
15 | Spectrums = zeros(num_templates,sze(1)*sze(2)); | ||
16 | |||
17 | |||
18 | for k =1:num_templates, | ||
19 | tmp = zeros(sze); | ||
20 | tmp(1:templates_size_y,1:templates_size_x) =... | ||
21 | templates(:,(k-1)*templates_size_x+1:k*templates_size_x); | ||
22 | x(k,:) = reshape(tmp,1,sze(1)*sze(2)); | ||
23 | X(k,:) = fft(x(k,:)); | ||
24 | Spectrums(k,:) = conj(X(k,:)).*X(k,:); | ||
25 | end | ||
26 | |||
27 | if num_templates > 1 | ||
28 | sum_Spect = sum(Spectrums)*alpha; | ||
29 | else | ||
30 | sum_Spect = Spectrums; | ||
31 | end | ||
32 | |||
33 | for row = 1:num_templates, | ||
34 | for column = 1:num_templates, | ||
35 | |||
36 | A(row,column) = sum( ((conj(X(row,:)).*X(column,:))./... | ||
37 | (sum_Spect + noise))')/(sze(1)*sze(2)); | ||
38 | end | ||
39 | end | ||
40 | |||
41 | |||
42 | epsilon = inv(A)*u; | ||
43 | |||
44 | top = epsilon(1)*X(1,:); | ||
45 | for k = 2:num_templates, | ||
46 | top = top + epsilon(k)*X(k,:); | ||
47 | end | ||
48 | |||
49 | H = top./(sum_Spect + noise); | ||
50 | |||
51 | |||
52 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mkpoog2.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mkpoog2.m new file mode 100755 index 0000000..4bd0366 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mkpoog2.m | |||
@@ -0,0 +1,29 @@ | |||
1 | function doog2 = mkdoog2(sigma_w,r,theta,size_w) | ||
2 | % | ||
3 | % function doog2 = mkdoog2(sigma_w,r,theta,size_w) | ||
4 | % | ||
5 | % | ||
6 | |||
7 | %scale_base = 2.8814; | ||
8 | scale_base = 2; | ||
9 | |||
10 | a = -1*scale_base; | ||
11 | b = 2*scale_base; | ||
12 | c = -1*scale_base; | ||
13 | |||
14 | sigma_x = r*sigma_w; | ||
15 | sigma_y = sigma_w; | ||
16 | |||
17 | ya = sigma_w; | ||
18 | yc = -sigma_w; | ||
19 | yb = 0; | ||
20 | |||
21 | doog2 = a*mkg(0,ya,sigma_x,sigma_y,size_w) +... | ||
22 | b*mkg(0,yb,sigma_x,sigma_y,size_w) +... | ||
23 | c*mkg(0,yc,sigma_x,sigma_y,size_w); | ||
24 | |||
25 | figure(3);colormap(hsv); | ||
26 | subplot(1,3,1);mesh(a*mkg(0,ya,sigma_x,sigma_y,size_w)); | ||
27 | subplot(1,3,2);mesh(b*mkg(0,yb,sigma_x,sigma_y,size_w)); | ||
28 | subplot(1,3,3);mesh(c*mkg(0,yc,sigma_x,sigma_y,size_w)); | ||
29 | %doog2 = 255*5.1745*doog2; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mksgn.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mksgn.m new file mode 100755 index 0000000..15f947b --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mksgn.m | |||
@@ -0,0 +1,10 @@ | |||
1 | function sgn = makesgn(sigma,sigma_x,sze) | ||
2 | |||
3 | |||
4 | size_wh = round(0.5*sze); | ||
5 | [x,y] = meshgrid([-size_wh:1:size_wh],[-size_wh:1:size_wh]); | ||
6 | steps = 1/(1+2*sigma_x); | ||
7 | |||
8 | fx = -1*(x<=-sigma_x) + (x>=sigma_x) + steps*((x+sigma_x).*(x>-sigma_x).*(x<sigma_x)); | ||
9 | |||
10 | sgn = fx.*(exp(- (y.*y)/(2*sigma))); \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mksgn2.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mksgn2.m new file mode 100755 index 0000000..857360b --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mksgn2.m | |||
@@ -0,0 +1,9 @@ | |||
1 | function sgn = makesgn(sigma,sigma_x,sze) | ||
2 | |||
3 | |||
4 | size_wh = round(0.5*sze); | ||
5 | [x,y] = meshgrid([-size_wh(2):1:size_wh(2)],[-size_wh(1):1:size_wh(1)]); | ||
6 | steps = 1/(1+sigma_x); | ||
7 | |||
8 | fx = steps*((x+sigma_x).*(x>-sigma_x).*(x<1)) + steps*(sigma_x-x).*(x<sigma_x).*(x>=1); | ||
9 | sgn = fx.*(exp(- (y.*y)/(2*sigma))); \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mreadpfm.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mreadpfm.m new file mode 100755 index 0000000..cf68a01 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mreadpfm.m | |||
@@ -0,0 +1,11 @@ | |||
1 | function I = read_pfm(filename) | ||
2 | |||
3 | fid = fopen(filename,'r'); | ||
4 | |||
5 | A = fscanf(fid,'%d',2) | ||
6 | I = fscanf(fid,'%f',[A(1),A(2)]); | ||
7 | |||
8 | |||
9 | I = I'; | ||
10 | size(I); | ||
11 | fclose(fid); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mreadpfm2.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mreadpfm2.m new file mode 100755 index 0000000..c01b25b --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mreadpfm2.m | |||
@@ -0,0 +1,9 @@ | |||
1 | function I = read_pfm(filename) | ||
2 | |||
3 | fid = fopen(filename,'r'); | ||
4 | |||
5 | A = fscanf(fid,'%d',2) | ||
6 | I = fscanf(fid,'%f',[A(1),A(2)]); | ||
7 | |||
8 | |||
9 | fclose(fid); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mwis.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mwis.m new file mode 100755 index 0000000..95de8f6 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mwis.m | |||
@@ -0,0 +1,16 @@ | |||
1 | function [l1,l2,phi] = mwis(gx,gy) | ||
2 | % | ||
3 | % [l1,l2,phi] = mwis(gx,gy) | ||
4 | % | ||
5 | % | ||
6 | |||
7 | sgx = sum(sum(gx.*gx)); | ||
8 | sgxy = sum(sum(gx.*gy)); | ||
9 | sgy = sum(sum(gy.*gy)); | ||
10 | |||
11 | tr = sgx + sgy; | ||
12 | v1 = 0.5*sqrt(tr*tr - 4*(sgx*sgy-sgxy*sgxy)); | ||
13 | l1 = real(0.5*tr+v1); | ||
14 | l2 = real(0.5*tr-v1); | ||
15 | |||
16 | phi= 0.5*atan2(2*sgxy,sgx-sgy); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mwis_image.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mwis_image.m new file mode 100755 index 0000000..c8e8b66 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/mwis_image.m | |||
@@ -0,0 +1,25 @@ | |||
1 | function [l1,l2,phi] = mwis_image(gx,gy,hs) | ||
2 | % | ||
3 | % [l1,l2,phi] = mwis_image(gx,gy) | ||
4 | % | ||
5 | % | ||
6 | |||
7 | if (~exist('hs')), | ||
8 | hs = 10; | ||
9 | end | ||
10 | |||
11 | |||
12 | sgx = gx.*gx; | ||
13 | sgxy = gx.*gy; | ||
14 | sgy = gy.*gy; | ||
15 | |||
16 | ssgx = smooth(sgx,hs); | ||
17 | ssgxy = smooth(sgxy,hs); | ||
18 | ssgy = smooth(sgy,hs); | ||
19 | |||
20 | tr = ssgx + ssgy; | ||
21 | v1 = 0.5*sqrt(tr.*tr - 4*(ssgx.*ssgy-ssgxy.*ssgxy)); | ||
22 | l1 = real(0.5*tr+v1); | ||
23 | l2 = real(0.5*tr-v1); | ||
24 | |||
25 | phi= 0.5*atan2(2*sgxy,sgx-sgy); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/myinterp.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/myinterp.m new file mode 100755 index 0000000..6d8f055 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/myinterp.m | |||
@@ -0,0 +1,18 @@ | |||
1 | function y = myinterp(d,rate) | ||
2 | % | ||
3 | |||
4 | |||
5 | if (size(d,1)>1), | ||
6 | d = [d;d(1)]; | ||
7 | else | ||
8 | d = [d,d(1)]; | ||
9 | end | ||
10 | |||
11 | lgn = length(d); | ||
12 | |||
13 | x = 1:lgn; | ||
14 | xx = linspace(1,lgn,rate*lgn); | ||
15 | |||
16 | y = interp1(x,d,xx,'linear'); | ||
17 | |||
18 | y = y(1:(length(y)-1)); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/ncut_b.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/ncut_b.m new file mode 100755 index 0000000..c9eee35 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/ncut_b.m | |||
@@ -0,0 +1,25 @@ | |||
1 | function [v,d] = ncut(A,nv) | ||
2 | |||
3 | ds = sum(A); | ||
4 | ds = ones(size(ds))./sqrt(ds); | ||
5 | |||
6 | for j=1:size(A,1), | ||
7 | A(j,:) = A(j,:).*ds; | ||
8 | end | ||
9 | |||
10 | for j=1:size(A,2); | ||
11 | A(:,j) = A(:,j).*ds'; | ||
12 | end | ||
13 | |||
14 | %D1 = ds'*ones(1,length(ds)); | ||
15 | %A = D1'.*A.*D1; | ||
16 | |||
17 | disp(sprintf('computing eig values')); | ||
18 | tic;[v,d] = eigs(A,nv);toc; | ||
19 | |||
20 | d = abs(diag(d)); | ||
21 | |||
22 | for j=1:nv, | ||
23 | v(:,j) = v(:,j).*ds'; | ||
24 | end | ||
25 | %v = D1(:,1:size(v,2)).*v; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/new_compute_J.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/new_compute_J.m new file mode 100755 index 0000000..f4e376a --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/new_compute_J.m | |||
@@ -0,0 +1,32 @@ | |||
1 | function [JJ,mask] = compute_J(A,D,I,center,window_size_h) | ||
2 | %% function J = compute_J(A,D,I,center,window_size_h) | ||
3 | % | ||
4 | |||
5 | [size_y,size_x] = size(I); | ||
6 | |||
7 | center_x = center(1); | ||
8 | center_y = center(2); | ||
9 | |||
10 | XX = meshgrid(1:size_x,1:size_y); | ||
11 | YY = meshgrid(1:size_y,1:size_x)'; | ||
12 | x = reshape(XX,size_x*size_y,1); | ||
13 | y = reshape(YY,size_x*size_y,1); | ||
14 | index(:,1) = x-center_x; | ||
15 | index(:,2) = y-center_y; | ||
16 | |||
17 | position_new = A*index'+ [D(1),0;0,D(2)]*ones(2,size_x*size_y); | ||
18 | position_new(1,:) = position_new(1,:)+center_x; | ||
19 | position_new(2,:) = position_new(2,:)+center_y; | ||
20 | |||
21 | position_new_x = reshape(position_new(1,:),size_y,size_x); | ||
22 | position_new_y = reshape(position_new(2,:),size_y,size_x); | ||
23 | |||
24 | [J,mask]= m_interp4(I,position_new_x,position_new_y); | ||
25 | |||
26 | JJ = J(center(2)-window_size_h(2):center(2)+window_size_h(2),... | ||
27 | center(1)-window_size_h(1):center(1)+window_size_h(1)); | ||
28 | mask = mask(center(2)-window_size_h(2):center(2)+window_size_h(2),... | ||
29 | center(1)-window_size_h(1):center(1)+window_size_h(1)); | ||
30 | |||
31 | |||
32 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/pair_dist.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/pair_dist.m new file mode 100755 index 0000000..f8dbd32 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/pair_dist.m | |||
@@ -0,0 +1,45 @@ | |||
1 | function A = apply_image(gx,gy,I,wc) | ||
2 | % | ||
3 | % aout = apply_image(gx,gy,wc) | ||
4 | % | ||
5 | % | ||
6 | |||
7 | [nr,nc] =size(gx); | ||
8 | |||
9 | w = 2*wc+1; | ||
10 | |||
11 | s1 = floor(nr/w); | ||
12 | s2 = floor(nc/w); | ||
13 | |||
14 | A = zeros(s1*s2,s1*s2); | ||
15 | |||
16 | yid = 0; | ||
17 | for j=wc+1:w:nr-wc-1, | ||
18 | yid = yid+1; | ||
19 | xid = 0; | ||
20 | for k=wc+1:w:nc-wc-1, | ||
21 | xid = xid + 1; | ||
22 | c1 = [k,j]; | ||
23 | |||
24 | yyid = 0; | ||
25 | fprintf('.'); | ||
26 | for jj=wc+1:w:nr-wc-1, | ||
27 | yyid = yyid+1; | ||
28 | xxid = 0; | ||
29 | for kk=wc+1:w:nc-wc-1, | ||
30 | xxid = xxid + 1; | ||
31 | |||
32 | c2 = [kk,jj]; | ||
33 | |||
34 | a = compute_diff_patch(get_win(gx,c1,[wc,wc]),... | ||
35 | get_win(gy,c1,[wc,wc]),... | ||
36 | get_win(gx,c2,[wc,wc]),... | ||
37 | get_win(gy,c2,[wc,wc]),... | ||
38 | get_win(I,c1,[wc,wc]),... | ||
39 | get_win(I,c2,[wc,wc])); | ||
40 | |||
41 | A(yid+(xid-1)*s1,yyid+(xxid-1)*s1) = a; | ||
42 | end | ||
43 | end | ||
44 | end | ||
45 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/pair_dist2.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/pair_dist2.m new file mode 100755 index 0000000..dc31469 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/pair_dist2.m | |||
@@ -0,0 +1,46 @@ | |||
1 | function A = apply_image(gx,gy,I,wc) | ||
2 | % | ||
3 | % aout = apply_image(gx,gy,wc) | ||
4 | % | ||
5 | % | ||
6 | |||
7 | [nr,nc] =size(gx); | ||
8 | |||
9 | w = 2*wc+1; | ||
10 | |||
11 | lws = 4; | ||
12 | |||
13 | s1 = floor(nr/w); | ||
14 | s2 = floor(nc/w); | ||
15 | |||
16 | A = zeros(s1*s2,s1*s2); | ||
17 | |||
18 | for j=1:s1, | ||
19 | for k=1:s2, | ||
20 | c1 = [(wc+1)+(k-1)*w,(wc+1)+(j-1)*w]; | ||
21 | fprintf('.'); | ||
22 | |||
23 | for jj=j-lws:j+lws, | ||
24 | for kk=k-lws:k+lws, | ||
25 | |||
26 | c2 = [(wc+1)+(kk-1)*w,(wc+1)+(jj-1)*w]; | ||
27 | if ( (jj>0) & (kk>0) & (jj <= s1) & (kk <= s2)) | ||
28 | a = compute_diff_patch(get_win(gx,c1,[wc,wc]),... | ||
29 | get_win(gy,c1,[wc,wc]),... | ||
30 | get_win(gx,c2,[wc,wc]),... | ||
31 | get_win(gy,c2,[wc,wc]),... | ||
32 | get_win(I,c1,[wc,wc]),... | ||
33 | get_win(I,c2,[wc,wc])); | ||
34 | |||
35 | dx = abs(k-kk);dy = abs(j-jj); | ||
36 | sp_diff = exp(-sqrt(dx.^2+dy.^2)/4); | ||
37 | A(j+(k-1)*s1,jj+(kk-1)*s1) = a*sp_diff; | ||
38 | |||
39 | end | ||
40 | |||
41 | end | ||
42 | end | ||
43 | end | ||
44 | end | ||
45 | |||
46 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/pair_dist_text.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/pair_dist_text.m new file mode 100755 index 0000000..5cdb201 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/pair_dist_text.m | |||
@@ -0,0 +1,70 @@ | |||
1 | function A = apply_image(I,bars,wc) | ||
2 | % | ||
3 | % aout = apply_image(gx,gy,wc) | ||
4 | % | ||
5 | % | ||
6 | |||
7 | [nr,nc] =size(I); | ||
8 | |||
9 | w = 2*wc+1; | ||
10 | |||
11 | lws = 4; | ||
12 | |||
13 | gap = 10; | ||
14 | |||
15 | s1 = floor((nr-w)/gap); | ||
16 | s2 = floor((nc-w)/gap); | ||
17 | |||
18 | A = zeros(s1*s2,s1*s2); | ||
19 | |||
20 | sigma.text = 0.20; | ||
21 | sigma.mag = 0.20; | ||
22 | sigma.inten = 0.15; | ||
23 | |||
24 | for j=1:s1, | ||
25 | for k=1:s2, | ||
26 | |||
27 | |||
28 | c1 = [(wc+1)+(k-1)*gap,(wc+1)+(j-1)*gap]; | ||
29 | fprintf('.'); | ||
30 | for jj=j-lws:j+lws, | ||
31 | for kk=k-lws:k+lws, | ||
32 | |||
33 | c2 = [(wc+1)+(kk-1)*gap,(wc+1)+(jj-1)*gap]; | ||
34 | if ( (jj>0) & (kk>0) & (jj <= s1) & (kk <= s2)), | ||
35 | |||
36 | J1 = get_win(I,c1,[wc,wc]); | ||
37 | J2 = get_win(I,c2,[wc,wc]); | ||
38 | |||
39 | Jbars1 = get_win5(bars,c1,[wc,wc]); | ||
40 | Jbars2 = get_win5(bars,c2,[wc,wc]); | ||
41 | |||
42 | |||
43 | hists1 = get_hist(J1,Jbars1); | ||
44 | hists2 = get_hist(J2,Jbars2); | ||
45 | |||
46 | cumhists1 = get_cumhist(hists1); | ||
47 | cumhists2 = get_cumhist(hists2); | ||
48 | |||
49 | |||
50 | diff.inten = max(abs(cumhists1.inten-cumhists2.inten)); | ||
51 | diff.mag = max(abs(cumhists1.mag-cumhists2.mag)); | ||
52 | diff.text = max(max(abs(cumhists1.text-cumhists2.text))); | ||
53 | |||
54 | diffs = max([diff.inten/sigma.inten,... | ||
55 | diff.mag/sigma.mag,... | ||
56 | diff.text/sigma.text]); | ||
57 | |||
58 | dx = abs(k-kk);dy = abs(j-jj); | ||
59 | sp_diff = sqrt(dx.^2+dy.^2)/4; | ||
60 | |||
61 | A(j+(k-1)*s1,jj+(kk-1)*s1) = exp(-diffs-sp_diff); | ||
62 | |||
63 | end | ||
64 | |||
65 | end | ||
66 | end | ||
67 | end | ||
68 | end | ||
69 | |||
70 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/pair_dist_text2.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/pair_dist_text2.m new file mode 100755 index 0000000..5c6e0d4 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/pair_dist_text2.m | |||
@@ -0,0 +1,58 @@ | |||
1 | function A = apply_image(I,bars,wc) | ||
2 | % | ||
3 | % aout = apply_image(gx,gy,wc) | ||
4 | % | ||
5 | % | ||
6 | |||
7 | [nr,nc] =size(I); | ||
8 | |||
9 | w = 2*wc+1; | ||
10 | |||
11 | lws = 4; | ||
12 | |||
13 | gap = 10; | ||
14 | |||
15 | mag = sum(bars,3); | ||
16 | |||
17 | s1 = floor((nr-w)/gap) | ||
18 | s2 = floor((nc-w)/gap) | ||
19 | |||
20 | A = zeros(s1*s2,s1*s2); | ||
21 | |||
22 | sigma.text = 0.20; | ||
23 | sigma.mag = 0.20; | ||
24 | sigma.inten = 0.15; | ||
25 | |||
26 | for j=1:s1, | ||
27 | for k=1:s2, | ||
28 | |||
29 | |||
30 | c1 = [(wc+1)+(k-1)*gap,(wc+1)+(j-1)*gap]; | ||
31 | fprintf('.'); | ||
32 | for jj=j-lws:j+lws, | ||
33 | for kk=k-lws:k+lws, | ||
34 | |||
35 | c2 = [(wc+1)+(kk-1)*gap,(wc+1)+(jj-1)*gap]; | ||
36 | if ( (jj>0) & (kk>0) & (jj <= s1) & (kk <= s2)), | ||
37 | |||
38 | ces = [c1,c2]-wc; | ||
39 | cum = compute_dist_hist(I,mag,bars,[ces,w]); | ||
40 | |||
41 | diffs = max([cum(1)/sigma.inten,... | ||
42 | cum(2)/sigma.mag,... | ||
43 | cum(3)/sigma.text]); | ||
44 | |||
45 | dx = abs(k-kk);dy = abs(j-jj); | ||
46 | sp_diff = sqrt(dx.^2+dy.^2)/4; | ||
47 | |||
48 | A(j+(k-1)*s1,jj+(kk-1)*s1) = exp(-diffs-sp_diff); | ||
49 | |||
50 | end | ||
51 | |||
52 | end | ||
53 | end | ||
54 | |||
55 | end | ||
56 | end | ||
57 | |||
58 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/pair_dist_text3.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/pair_dist_text3.m new file mode 100755 index 0000000..a7ff408 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/pair_dist_text3.m | |||
@@ -0,0 +1,84 @@ | |||
1 | function [A,D] = pair_dist_text3(Cum,cumhists) | ||
2 | % | ||
3 | % A = pair_dist_text3(Cum,cumhists); | ||
4 | % | ||
5 | % | ||
6 | |||
7 | s1 = Cum(2); | ||
8 | s2 = Cum(1); | ||
9 | |||
10 | st = Cum(3) + Cum(4) + 1; | ||
11 | ed = size(cumhists,1); | ||
12 | |||
13 | cumhists = cumhists(st:ed,:); | ||
14 | |||
15 | np = size(cumhists,2); | ||
16 | |||
17 | sigma.text = 0.20; | ||
18 | sigma.mag = 0.20; | ||
19 | sigma.inten = 0.15; | ||
20 | |||
21 | lws = 4; | ||
22 | |||
23 | |||
24 | k = sqrt(2)/2; | ||
25 | M = 8*6; | ||
26 | N = k*sqrt(M); | ||
27 | |||
28 | r1 = 0.001; | ||
29 | r2 = 0.001; | ||
30 | |||
31 | c = N/(1+ (sqrt(1-0.5*(r1*r1+r2*r2)))*(0.25-0.75/N)); | ||
32 | |||
33 | D = zeros(1,s1*s2); | ||
34 | |||
35 | nn = 1; | ||
36 | for j =1:s1, | ||
37 | for k=1:s2, | ||
38 | |||
39 | id = j*s2+k; | ||
40 | |||
41 | cum_filter1 = reshape(cumhists(:,id),8,6)'; | ||
42 | [na1,nb1,nc1,nd1] = ks_2d(cum_filter1); | ||
43 | |||
44 | |||
45 | fprintf('.'); | ||
46 | for jj=j-lws:j+lws, | ||
47 | for kk=k-lws:k+lws, | ||
48 | |||
49 | if ( (jj>0) & (kk>0) & (jj <= s1) & (kk <= s2)), | ||
50 | |||
51 | idn = jj*s2+k; | ||
52 | |||
53 | cum_filter2 = reshape(cumhists(:,idn),8,6)'; | ||
54 | [na2,nb2,nc2,nd2] = ks_2d(cum_filter2); | ||
55 | |||
56 | |||
57 | diffa = abs(na2-na1);diffb =abs(nb2-nb1); | ||
58 | diffc = abs(nc2-nc1);diffd = abs(nd2-nd1); | ||
59 | maxs(1) = max(max(diffa));maxs(2) = max(max(diffb)); | ||
60 | maxs(3) = max(max(diffc));maxs(4) = max(max(diffd)); | ||
61 | |||
62 | |||
63 | maxs = maxs/6; | ||
64 | |||
65 | d = min(1,signif(c*max(maxs))); | ||
66 | |||
67 | ids(nn) = id; | ||
68 | idns(nn) = idn; | ||
69 | B(nn) = d; | ||
70 | |||
71 | D(id) = D(id) + d; | ||
72 | D(idn) = D(idn) + d; | ||
73 | |||
74 | nn = nn+1; | ||
75 | |||
76 | end | ||
77 | |||
78 | end | ||
79 | end | ||
80 | |||
81 | end | ||
82 | end | ||
83 | |||
84 | A = sparse(ids,idns,b); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/pair_dist_text4.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/pair_dist_text4.m new file mode 100755 index 0000000..83f3d49 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/pair_dist_text4.m | |||
@@ -0,0 +1,81 @@ | |||
1 | function [A] = pair_dist_text4(Iw,Cresult,cso) | ||
2 | % | ||
3 | % A = pair_dist_text3(Cum,cumhists); | ||
4 | % | ||
5 | % | ||
6 | |||
7 | %s1 = Cum(2);s2 = Cum(1); | ||
8 | |||
9 | figure(1);hold on;plot(cso(1),cso(2),'bo'); | ||
10 | |||
11 | ws = [10,10]; | ||
12 | |||
13 | lws = 3; | ||
14 | gap = 7; | ||
15 | |||
16 | J1 = get_win(Iw,round(cso),ws); | ||
17 | Jbar1 = abs(get_win5(Cresult,round(cso),ws)); | ||
18 | hists1 = get_hist(J1,Jbar1); | ||
19 | cumhists1 = get_cumhist(hists1); | ||
20 | [na1,nb1,nc1,nd1] = ks_2d(cumhists1.text'); | ||
21 | |||
22 | figure(4);colormap(gray); | ||
23 | imagesc(reshape(abs(Jbar1),size(Jbar1,1),size(Jbar1,2)*size(Jbar1,3))); | ||
24 | colorbar;axis('image');drawnow; | ||
25 | |||
26 | figure(2); | ||
27 | subplot(2,5,1);imagesc(J1);%colormap(gray) | ||
28 | subplot(2,5,2);imagesc(hists1.text');title('hist_1');colorbar; | ||
29 | subplot(2,5,3);imagesc(cumhists1.text');title('cumhist_1');colorbar; | ||
30 | subplot(2,5,4);imagesc(nc1);title('nc_1');colorbar | ||
31 | subplot(2,5,5);imagesc(nb1);title('nb_1');colorbar | ||
32 | drawnow; | ||
33 | |||
34 | k = sqrt(2)/2;M = prod(size(cumhists1.text)); | ||
35 | N = k*sqrt(M); | ||
36 | r1 = 0.001;r2 = 0.001; | ||
37 | con = N/(1+ (sqrt(1-0.5*(r1*r1+r2*r2)))*(0.25-0.75/N)); | ||
38 | |||
39 | jid = 1; | ||
40 | for jj=cso(2)-lws*gap:gap:cso(2)+lws*gap, | ||
41 | kid = 1; | ||
42 | for kk=cso(1)-lws*gap:gap:cso(1)+lws*gap, | ||
43 | |||
44 | figure(1);hold on; plot(kk,jj,'r*');drawnow; | ||
45 | |||
46 | J2 = get_win(Iw,round([kk,jj]),ws); | ||
47 | Jbar2 = get_win5(Cresult,round([kk,jj]),ws); | ||
48 | |||
49 | hists2 = get_hist(J2,Jbar2); | ||
50 | cumhists2 = get_cumhist(hists2); | ||
51 | [na2,nb2,nc2,nd2] = ks_2d(cumhists2.text'); | ||
52 | |||
53 | figure(2); | ||
54 | subplot(2,5,6);imagesc(J2);%colormap(gray) | ||
55 | subplot(2,5,7);imagesc(hists2.text');title('hist_2');colorbar | ||
56 | subplot(2,5,8);imagesc(cumhists2.text');title('cumhist_2');colorbar | ||
57 | |||
58 | diffa = abs(na2-na1);diffb =abs(nb2-nb1); | ||
59 | diffc = abs(nc2-nc1);diffd = abs(nd2-nd1); | ||
60 | |||
61 | maxs(1) = max(max(diffa));maxs(2) = max(max(diffb)); | ||
62 | maxs(3) = max(max(diffc));maxs(4) = max(max(diffd)); | ||
63 | |||
64 | maxs = maxs/6;for j=1:4, sig(j) = signif(con*maxs(j)); end | ||
65 | |||
66 | subplot(2,5,9);imagesc(diffc);title('diff_{nc}');colorbar | ||
67 | subplot(2,5,10);imagesc(diffb);title('diff_{nb} ');colorbar | ||
68 | |||
69 | disp(sprintf('max diff is %f\n',min(sig))); | ||
70 | |||
71 | A(jid,kid) = min(1,min(sig)); | ||
72 | |||
73 | %disp('press return to continue'); | ||
74 | pause(3); | ||
75 | |||
76 | kid = kid+1; | ||
77 | end | ||
78 | jid = jid+1; | ||
79 | end | ||
80 | |||
81 | figure(1);hold off; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/patch_cat.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/patch_cat.m new file mode 100755 index 0000000..0bf22c3 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/patch_cat.m | |||
@@ -0,0 +1,9 @@ | |||
1 | function T = patch_cat(dotfilter,text_des) | ||
2 | |||
3 | T(:,:,2:7,:) = text_des; | ||
4 | clear text_des; | ||
5 | |||
6 | for k=1:size(T,4), | ||
7 | T(:,:,1,k) = dotfilter(:,:,1,k); | ||
8 | end | ||
9 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/pgmread.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/pgmread.m new file mode 100755 index 0000000..620408a --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/pgmread.m | |||
@@ -0,0 +1,15 @@ | |||
1 | function img = pgmread(filename,size) | ||
2 | % function img = pgmread(filename) | ||
3 | % this is my version of pgmread for the pgm file created by XV. | ||
4 | % | ||
5 | % this program also corrects for the shifts in the image from pm file. | ||
6 | |||
7 | fid = fopen(filename,'r'); | ||
8 | |||
9 | for j=1:4, | ||
10 | a = fgetl(fid); | ||
11 | end | ||
12 | |||
13 | img = fscanf(fid,'%d',size); | ||
14 | img = img'; | ||
15 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/poisson.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/poisson.m new file mode 100755 index 0000000..99d49b6 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/poisson.m | |||
@@ -0,0 +1,44 @@ | |||
1 | function [x] = Poisson(lambda); | ||
2 | %Poisson generates a random variable with a Poisson | ||
3 | % distribution | ||
4 | % Pr(x = n) = lambda^n exp(-lambda)/n | ||
5 | % | ||
6 | % [x] = Poisson(lambda); | ||
7 | % lambda: the parameter for the Poisson distribution | ||
8 | % (default is 1) | ||
9 | % x : the output number | ||
10 | % | ||
11 | |||
12 | %% | ||
13 | %% (C) Thomas K. Leung | ||
14 | %% University of California at Berkeley | ||
15 | %% Apr 25, 1995. | ||
16 | %% | ||
17 | |||
18 | %%% Notice that in this implementation, we are comparing log(Z) with | ||
19 | %%% T. In fact, we can compare T = exp(-lambda) with Z, which will | ||
20 | %%% save us from computing a large number of log's. However, when | ||
21 | %%% lambda is bigger than 709, exp(-lambda) = 0, which causes problem. | ||
22 | |||
23 | if nargin == 0 | ||
24 | lambda = 1; | ||
25 | end | ||
26 | |||
27 | if lambda < 0 | ||
28 | lambda = 1; | ||
29 | end | ||
30 | |||
31 | P = 0; | ||
32 | N = 0; | ||
33 | T = -lambda; | ||
34 | |||
35 | rand('seed',sum(100*clock)); | ||
36 | |||
37 | while P >= T | ||
38 | Z = rand(1); | ||
39 | P = P + log(Z); | ||
40 | N = N + 1; | ||
41 | end | ||
42 | |||
43 | x = N; | ||
44 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/poissonfield.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/poissonfield.m new file mode 100755 index 0000000..8051867 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/poissonfield.m | |||
@@ -0,0 +1,53 @@ | |||
1 | function [x,y,success] = PoissonField(int,sx,sy,ir); | ||
2 | %BF_HardCore Generates a hard core Poisson field | ||
3 | % [x,y] = Poisson_HC(int,ir,sx,sy); | ||
4 | % int: intensity of the field. (default is 1) | ||
5 | % ir : inhibition radius (default is 1) | ||
6 | % sx : size in x (default 100) | ||
7 | % sy : size in y (default 100) | ||
8 | % x : x coordinates | ||
9 | % y : y coordinates | ||
10 | % | ||
11 | |||
12 | %% | ||
13 | %% (C) Thomas K. Leung | ||
14 | %% University of California at Berkeley | ||
15 | %% April 26, 1995. | ||
16 | %% leungt@cajal.cs.berkeley.edu | ||
17 | %% | ||
18 | |||
19 | %% | ||
20 | %% Generate each point in sequence and reject it if it's too close to | ||
21 | %% previous ones. | ||
22 | %% | ||
23 | |||
24 | if nargin <= 0 | ||
25 | int = 1; | ||
26 | sx = 100; | ||
27 | sy = 100; | ||
28 | ir = 0; | ||
29 | elseif nargin <= 1 | ||
30 | sx = 100; | ||
31 | sy = 100; | ||
32 | ir = 0; | ||
33 | elseif nargin <= 2 | ||
34 | sy = 100; | ||
35 | ir = 0; | ||
36 | elseif nargin <= 3 | ||
37 | ir = 0; | ||
38 | end | ||
39 | |||
40 | %% | ||
41 | %% Notice that the average number of a poisson process is the | ||
42 | %% parameter lambda. This is consistent with our definition of the | ||
43 | %% intensity here. Intensity is the mean number of points inside each | ||
44 | %% unit area. Therefore, in a window of sx by sy, we should get | ||
45 | %% int*sx*sy number of points on average which is the mean number of | ||
46 | %% arrivals in a Poisson Process | ||
47 | %% | ||
48 | |||
49 | [n] = poisson(int * sx * sy); | ||
50 | |||
51 | [x,y,success] = binomialfield(n,sx,sy,ir); | ||
52 | |||
53 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/proj_back.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/proj_back.m new file mode 100755 index 0000000..069fe61 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/proj_back.m | |||
@@ -0,0 +1,24 @@ | |||
1 | function mask = proj_back(I,hw,mask_s) | ||
2 | % | ||
3 | % mask = proj_back(I,hw,mask_s) | ||
4 | % | ||
5 | % | ||
6 | |||
7 | |||
8 | [nr,nc] = size(I2); | ||
9 | |||
10 | hw = 3; | ||
11 | st_sz = 2*hw + 1; | ||
12 | |||
13 | nr_chank = floor(nr/st_sz); | ||
14 | nc_chank = floor(nc/st_sz); | ||
15 | |||
16 | [x,y] = meshgrid(1:nc,1:nr); | ||
17 | |||
18 | ct_chank_x = round((x-hw-1)/st_sz) + 1; | ||
19 | ct_chank_y = round((y-hw-1)/st_sz) + 1; | ||
20 | |||
21 | idx = (ct_chank_x - 1)*nr_chank + ct_chank_y; | ||
22 | |||
23 | mask = full(sparse(y,x,mask_s(idx(:)))); | ||
24 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/proj_back_id.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/proj_back_id.m new file mode 100755 index 0000000..9db322e --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/proj_back_id.m | |||
@@ -0,0 +1,19 @@ | |||
1 | function [vbig,bnr,bnc] = proj_back_id(v,gcs,gce,grs,gre) | ||
2 | % | ||
3 | % vbig = proj_back_id(v,gcs,gce,grs,gre) | ||
4 | % | ||
5 | |||
6 | nr = max(gre)+1; | ||
7 | nc = max(gce)+1; | ||
8 | |||
9 | sw = 3; | ||
10 | gap = 2*sw+1; | ||
11 | |||
12 | bnc = nc*gap; | ||
13 | bnr = nr*gap; | ||
14 | |||
15 | [x,y] = meshgrid(1:bnc,1:bnr); | ||
16 | |||
17 | idx = grs(y(:))+1+gcs(x(:))*nr; | ||
18 | |||
19 | vbig = full(sparse(y(:),x(:),v(idx))); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/quant.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/quant.m new file mode 100755 index 0000000..c2dfae6 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/quant.m | |||
@@ -0,0 +1,20 @@ | |||
1 | function [x,map] = quant(d1,d2,d3,nbin,ws) | ||
2 | |||
3 | if (~exist('ws')), | ||
4 | ws = [1,1,1]; | ||
5 | end | ||
6 | |||
7 | d1 = d1-min(d1); | ||
8 | d2 = d2-min(d2); | ||
9 | d3 = d3-min(d3); | ||
10 | |||
11 | d1 = d1/max(d1); | ||
12 | d2 = d2/max(d2); | ||
13 | d3 = d3/max(d3); | ||
14 | |||
15 | d1 = d1*ws(1); | ||
16 | d2 = d2*ws(2); | ||
17 | d3 = d3*ws(3); | ||
18 | |||
19 | |||
20 | [x,map] = vmquant(d1,d2,d3,nbin); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/readpdm.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/readpdm.m new file mode 100755 index 0000000..9a1068e --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/readpdm.m | |||
@@ -0,0 +1,8 @@ | |||
1 | function I = readpfm(filename) | ||
2 | |||
3 | fid = fopen(filename,'r'); | ||
4 | |||
5 | A = fscanf(fid,'%d',2); | ||
6 | I = fscanf(fid,'%d',[A(1),A(2)]); | ||
7 | |||
8 | fclose(fid); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/readpfm.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/readpfm.m new file mode 100755 index 0000000..48ecd78 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/readpfm.m | |||
@@ -0,0 +1,10 @@ | |||
1 | function I = readpfm(filename) | ||
2 | |||
3 | fid = fopen(filename,'r'); | ||
4 | |||
5 | A = fscanf(fid,'%d',2); | ||
6 | I = fscanf(fid,'%f',[A(1),A(2)]); | ||
7 | |||
8 | %I = fscanf(fid,'%f',A(2)*A(1));I = reshape(I,A(1),A(2)); | ||
9 | |||
10 | fclose(fid); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/readpfm_id.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/readpfm_id.m new file mode 100755 index 0000000..5f5c4f7 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/readpfm_id.m | |||
@@ -0,0 +1,21 @@ | |||
1 | function Is = readpfm(filename,ids,nodes) | ||
2 | |||
3 | fid = fopen(filename,'r'); | ||
4 | |||
5 | A = fscanf(fid,'%d',2); | ||
6 | |||
7 | Is = zeros(length(ids),nodes); | ||
8 | |||
9 | ix = 1; | ||
10 | for j=1:max(ids), | ||
11 | I = fscanf(fid,'%f',nodes); | ||
12 | if (find(ids==j)), | ||
13 | Is(ix,:) = I(:)'; | ||
14 | ix = ix+1; | ||
15 | fprintf('.'); | ||
16 | end | ||
17 | end | ||
18 | |||
19 | %I = fscanf(fid,'%f',A(2)*A(1));I = reshape(I,A(1),A(2)); | ||
20 | |||
21 | fclose(fid); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/readpfm_idf.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/readpfm_idf.m new file mode 100755 index 0000000..d7916e7 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/readpfm_idf.m | |||
@@ -0,0 +1,29 @@ | |||
1 | function Is = readpfm(filename,ids,nodes) | ||
2 | |||
3 | fid = fopen(filename,'r'); | ||
4 | |||
5 | A = fscanf(fid,'%d',2); | ||
6 | |||
7 | Is = zeros(length(ids),nodes); | ||
8 | |||
9 | idt = sort(ids); | ||
10 | |||
11 | idh = 1; | ||
12 | |||
13 | ix = 1; | ||
14 | for j=1:length(ids), | ||
15 | |||
16 | gap = idt(j) - idh; | ||
17 | fprintf('%d',gap); | ||
18 | |||
19 | I = fscanf(fid,'%f',nodes*gap); | ||
20 | I = fscanf(fid,'%f',nodes); | ||
21 | |||
22 | Is(find(ids==idt(j)),:) = I(:)'; | ||
23 | fprintf('.'); | ||
24 | |||
25 | idh = idt(j)+1; | ||
26 | end | ||
27 | |||
28 | |||
29 | fclose(fid); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/readpgm.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/readpgm.m new file mode 100755 index 0000000..a5fd7f2 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/readpgm.m | |||
@@ -0,0 +1,26 @@ | |||
1 | function img = pgmread(filename) | ||
2 | % function img = pgmread(filename) | ||
3 | % this is my version of pgmread for the pgm file created by XV. | ||
4 | % | ||
5 | % this program also corrects for the shifts in the image from pm file. | ||
6 | |||
7 | |||
8 | fid = fopen(filename,'r'); | ||
9 | fscanf(fid, 'P5\n'); | ||
10 | cmt = '#'; | ||
11 | while findstr(cmt, '#'), | ||
12 | cmt = fgets(fid); | ||
13 | if length(findstr(cmt, '#')) ~= 1, | ||
14 | YX = sscanf(cmt, '%d %d'); | ||
15 | y = YX(1); x = YX(2); | ||
16 | end | ||
17 | end | ||
18 | |||
19 | fgets(fid); | ||
20 | |||
21 | %img = fscanf(fid,'%d',size); | ||
22 | %img = img'; | ||
23 | |||
24 | img = fread(fid,[y,x],'uint8'); | ||
25 | img = img'; | ||
26 | fclose(fid); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/readpnm.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/readpnm.m new file mode 100755 index 0000000..ab78c2c --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/readpnm.m | |||
@@ -0,0 +1,21 @@ | |||
1 | function I = readpnm(name) | ||
2 | |||
3 | fid = fopen(name, 'r'); | ||
4 | fscanf(fid, 'P5\n'); | ||
5 | cmt = '#'; | ||
6 | while findstr(cmt, '#') == 1 | ||
7 | cmt = fgets(fid); | ||
8 | if findstr(cmt, '#') ~= 1 | ||
9 | YX = sscanf(cmt, '%d %d %d'); | ||
10 | y = YX(1); x = YX(2); nb = YX(3); | ||
11 | end | ||
12 | end | ||
13 | fgets(fid); | ||
14 | packed = fscanf(fid,'%f',[nb*y*x]); | ||
15 | |||
16 | for j = 1:nb, | ||
17 | I(:,:,j) = reshape(packed(j:nb:nb*y*x),y,x)'; | ||
18 | end | ||
19 | |||
20 | fclose(fid); | ||
21 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/readppm.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/readppm.m new file mode 100755 index 0000000..300f597 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/readppm.m | |||
@@ -0,0 +1,19 @@ | |||
1 | function [r, g, b] = readppm(name) | ||
2 | |||
3 | fid = fopen(name, 'r'); | ||
4 | fscanf(fid, 'P6\n'); | ||
5 | cmt = '#'; | ||
6 | while findstr(cmt, '#') == 1 | ||
7 | cmt = fgets(fid); | ||
8 | if findstr(cmt, '#') ~= 1 | ||
9 | YX = sscanf(cmt, '%d %d'); | ||
10 | y = YX(1); x = YX(2); | ||
11 | end | ||
12 | end | ||
13 | fgets(fid); | ||
14 | packed = fread(fid,[3*y,x],'uint8')'; | ||
15 | r = packed(:,1:3:3*y); | ||
16 | g = packed(:,2:3:3*y); | ||
17 | b = packed(:,3:3:3*y); | ||
18 | fclose(fid); | ||
19 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/record.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/record.m new file mode 100755 index 0000000..9626038 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/record.m | |||
@@ -0,0 +1,6 @@ | |||
1 | load patch1; | ||
2 | doog2 = mkdoog2(2,10,0,80); | ||
3 | dog2 = rotate_J(90,doog2); | ||
4 | |||
5 | H = mkf_test(dog2,size(patch1),-1,0.00001,2,-1); | ||
6 | o = BfilterS(patch1,H,size(dog));figure(4);colormap(gray);imagesc(o.*(o>0)); \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/recursive_cut_tc.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/recursive_cut_tc.m new file mode 100755 index 0000000..a8c9362 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/recursive_cut_tc.m | |||
@@ -0,0 +1,140 @@ | |||
1 | %function [groups,ids] = recursive_cut(ncutv,fn_base) | ||
2 | % | ||
3 | % | ||
4 | % function [groups,ids] = recursive_cut(ncutv,threshold,spthresh) | ||
5 | % | ||
6 | % | ||
7 | |||
8 | ncutv= ncutv_o(:,1:4); | ||
9 | |||
10 | fn_base = fn; | ||
11 | %fn_base = '130040'; | ||
12 | |||
13 | nvv = size(ncutv_o,2); | ||
14 | nbin = 24; | ||
15 | |||
16 | ids = []; | ||
17 | groups = []; | ||
18 | labels = []; | ||
19 | |||
20 | load cmaps | ||
21 | cmap = cmapg; | ||
22 | |||
23 | j = 1; | ||
24 | done = 0; | ||
25 | np = size(ncutv,1); | ||
26 | nv = size(ncutv,2); | ||
27 | |||
28 | %%%%%% find the cut for the first ncut vector | ||
29 | ev_id = 2; | ||
30 | para = [nvv ev_id nr nc 100]; | ||
31 | Gmask = ones(nr,nc); | ||
32 | %threshold = find_cutpoint(ncutv(:,ev_id),cmapg,nbin);threshold = threshold(1:end-1); | ||
33 | threshold = linspace(min(ncutv(:,ev_id)),max(ncutv(:,ev_id)),nbin); | ||
34 | [cut_threshold,max_asso] = find_bst_cut(fn_base,para,threshold,Gmask); | ||
35 | disp(max_asso); | ||
36 | |||
37 | id1 = find(ncutv(:,ev_id)<=cut_threshold); | ||
38 | id2 = find(ncutv(:,ev_id)>cut_threshold); | ||
39 | |||
40 | groups = [groups,id1(:)']; | ||
41 | ids = [ids,length(id1)]; | ||
42 | |||
43 | groups = [groups,id2(:)']; | ||
44 | ids = [ids,length(groups)]; | ||
45 | |||
46 | |||
47 | for j=3:nv, | ||
48 | fprintf('j = %d\n',j); | ||
49 | % expand the current level, | ||
50 | new_groups = []; | ||
51 | new_ids = []; | ||
52 | |||
53 | |||
54 | figure(4);ims(ncutv(:,j),nr,nc);title(num2str(j)); | ||
55 | |||
56 | figure(1);clf | ||
57 | disp_groups(groups,ids,nr,nc); | ||
58 | drawnow; | ||
59 | |||
60 | %figure(3); | ||
61 | % for each leaves, | ||
62 | mx = max(ncutv(:,j))-min(ncutv(:,j)); | ||
63 | %mx = std(ncutv(:,j)); | ||
64 | |||
65 | base_id =1; | ||
66 | for k=1:length(ids), | ||
67 | old_groups = groups(base_id:ids(k)); | ||
68 | |||
69 | v = ncutv(old_groups,j); | ||
70 | change_v = max(v)-min(v); | ||
71 | %change_v = std(v); | ||
72 | n1 = sum(v>(min(v)+0.85*change_v));%n1 = n1/length(old_groups); | ||
73 | n2 = sum(v<=(min(v)+0.15*change_v));%n2 = n2/length(old_groups); | ||
74 | disp(sprintf('n1 = %f, n2 = %f',n1,n2)); | ||
75 | |||
76 | figure(2); | ||
77 | Gmask = zeros(np,1); | ||
78 | Gmask(old_groups) = Gmask(old_groups)+1; | ||
79 | drawnow; | ||
80 | ims(ncutv(:,j).*Gmask,nr,nc); | ||
81 | |||
82 | disp(sprintf('!!!!!!!!!!!!!RATIO= %f',change_v/mx)) | ||
83 | |||
84 | %pause; | ||
85 | |||
86 | if (((change_v/mx)>0.5) & (n1>10) &(n2>10)), | ||
87 | |||
88 | ev_id = j; | ||
89 | |||
90 | %threshold = find_cutpoint(ncutv(old_groups,ev_id),cmapg,nbin);threshold = threshold(1:end-1); | ||
91 | threshold = linspace(min(ncutv(:,ev_id)),max(ncutv(:,ev_id)),nbin); | ||
92 | para = [nvv ev_id nr nc 100]; | ||
93 | [cut_threshold,max_asso] = find_bst_cut(fn_base,para,threshold,Gmask); | ||
94 | |||
95 | disp(max_asso); | ||
96 | |||
97 | if (max_asso>1.2), | ||
98 | id1 = find(ncutv(old_groups,ev_id)<=cut_threshold); | ||
99 | id2 = find(ncutv(old_groups,ev_id)>cut_threshold); | ||
100 | |||
101 | figure(5); | ||
102 | subplot(1,2,1);maskt= zeros(np,1);maskt(old_groups(id1))=1+maskt(old_groups(id1));ims(maskt,nr,nc); | ||
103 | subplot(1,2,2);maskt= zeros(np,1);maskt(old_groups(id2))=1+maskt(old_groups(id2));ims(maskt,nr,nc); | ||
104 | |||
105 | new_groups = [new_groups,old_groups(id1)]; | ||
106 | new_ids = [new_ids,length(new_groups)]; | ||
107 | |||
108 | |||
109 | new_groups = [new_groups,old_groups(id2)]; | ||
110 | new_ids = [new_ids,length(new_groups)]; | ||
111 | else | ||
112 | fprintf(' keep '); | ||
113 | new_groups = [new_groups,old_groups]; | ||
114 | new_ids = [new_ids,length(new_groups)]; | ||
115 | end | ||
116 | |||
117 | else | ||
118 | fprintf(' keep '); | ||
119 | new_groups = [new_groups,old_groups]; | ||
120 | new_ids = [new_ids,length(new_groups)]; | ||
121 | end | ||
122 | fprintf('\n'); | ||
123 | base_id = ids(k) + 1; | ||
124 | end | ||
125 | |||
126 | |||
127 | |||
128 | groups = new_groups; | ||
129 | ids = new_ids; | ||
130 | |||
131 | figure(1);disp_groups(groups,ids,nr,nc); | ||
132 | |||
133 | fprintf('press return\n'); | ||
134 | pause; | ||
135 | j= j+1; | ||
136 | end | ||
137 | |||
138 | fprintf('total group = %d \n',length(ids)); | ||
139 | |||
140 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/reduce_all.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/reduce_all.m new file mode 100755 index 0000000..d7d31f8 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/reduce_all.m | |||
@@ -0,0 +1,8 @@ | |||
1 | function b = reduce_all(a) | ||
2 | |||
3 | numband = size(a,3); | ||
4 | |||
5 | for j=1:numband, | ||
6 | |||
7 | b(:,:,j) = reduce(a(:,:,j)); | ||
8 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/rotate_J.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/rotate_J.m new file mode 100755 index 0000000..12f29b6 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/rotate_J.m | |||
@@ -0,0 +1,30 @@ | |||
1 | function J = compute_J(angle,I) | ||
2 | %% function J = compute_J(angle,I) | ||
3 | % | ||
4 | |||
5 | [size_y,size_x] = size(I); | ||
6 | |||
7 | [center_x,center_y] = find_center(size_x,size_y); | ||
8 | |||
9 | a = angle * pi/180; | ||
10 | A = [cos(a),-sin(a);sin(a),cos(a)]; | ||
11 | |||
12 | [XX,YY] = meshgrid(1:size_x,1:size_y); | ||
13 | |||
14 | x = reshape(XX,size_x*size_y,1); | ||
15 | y = reshape(YY,size_x*size_y,1); | ||
16 | index(:,1) = x-center_x; | ||
17 | index(:,2) = y-center_y; | ||
18 | |||
19 | position_new = A*index'; | ||
20 | position_new(1,:) = position_new(1,:)+center_x; | ||
21 | position_new(2,:) = position_new(2,:)+center_y; | ||
22 | |||
23 | position_new_x = reshape(position_new(1,:),size_y,size_x); | ||
24 | position_new_y = reshape(position_new(2,:),size_y,size_x); | ||
25 | |||
26 | J = m_interp4(I,position_new_x,position_new_y); | ||
27 | |||
28 | |||
29 | |||
30 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/session.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/session.m new file mode 100755 index 0000000..70fabbf --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/session.m | |||
@@ -0,0 +1,4 @@ | |||
1 | t = rj(1:50,19:50); tt = interp4(t,1); | ||
2 | sgn = mksgn2(182,2,[91,9]); | ||
3 | H = mkf_test(sgn,size(tt),1,0.01,2,300); | ||
4 | o = BfilterS(tt,H,size(sgn));figure(1);imagesc(o.*(o>0));axis('equal'); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/show_cumhist.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/show_cumhist.m new file mode 100755 index 0000000..fe82e64 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/show_cumhist.m | |||
@@ -0,0 +1,28 @@ | |||
1 | function show_hist(cumhists,bins,fig_id,hold_flag,ct) | ||
2 | %% | ||
3 | % show_hist(cumhists,bins,fig_id,ct) | ||
4 | % | ||
5 | % | ||
6 | |||
7 | if (~exist('ct')), | ||
8 | ct = 'b-o'; | ||
9 | end | ||
10 | |||
11 | figure(fig_id); | ||
12 | |||
13 | subplot(3,3,1);plot(bins.inten,cumhists.inten,ct); | ||
14 | |||
15 | if (hold_flag == 1), hold on;else hold off; end | ||
16 | |||
17 | for j=1:size(cumhists.text,2), | ||
18 | subplot(3,3,1+j); | ||
19 | plot(bins.text,cumhists.text(:,j),ct); | ||
20 | if (hold_flag == 1), hold on;else hold off; end | ||
21 | end | ||
22 | |||
23 | subplot(3,3,8); | ||
24 | plot(bins.mag,cumhists.mag,ct); | ||
25 | if (hold_flag == 1), hold on;else hold off; end | ||
26 | |||
27 | |||
28 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/show_hist.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/show_hist.m new file mode 100755 index 0000000..efaf899 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/show_hist.m | |||
@@ -0,0 +1,23 @@ | |||
1 | function show_hist(hists,bins,fig_id) | ||
2 | %% | ||
3 | % show_hist(hists,bins,fig_id) | ||
4 | % | ||
5 | % | ||
6 | |||
7 | figure(fig_id); | ||
8 | |||
9 | subplot(3,3,1);bar(bins.inten,hists.inten); | ||
10 | |||
11 | %maxval = max(max(max(abs(Jbar)))); | ||
12 | |||
13 | for j=1:size(hists.text,2), | ||
14 | subplot(3,3,1+j);% hist(reshape(abs(Jbar(:,:,j)),prod(w),1),[1:10:maxval+1]); | ||
15 | bar(bins.text,hists.text(:,j)); | ||
16 | end | ||
17 | |||
18 | subplot(3,3,8);%hist(reshape(sum(abs(Jbar),3),prod(w),1),[1:10:161]); | ||
19 | bar(bins.mag,hists.mag); | ||
20 | |||
21 | |||
22 | |||
23 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/showsmm.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/showsmm.m new file mode 100755 index 0000000..1833062 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/showsmm.m | |||
@@ -0,0 +1,45 @@ | |||
1 | function [T,A,M2,TAM]=showsmm(L1,L2,phi,maxM); | ||
2 | % [T,A,M]=showsmm(L1,L2,phi,maxM); | ||
3 | |||
4 | if (~exist('maxM')), | ||
5 | % needs to know upper bound on M for given window function in smm | ||
6 | maxM=0.18; % temporary | ||
7 | end | ||
8 | |||
9 | |||
10 | A=1-L2./(L1+eps); | ||
11 | T=2*(phi+pi/2)/(2*pi); | ||
12 | M=L1+L2; | ||
13 | M2=min(M/maxM,1); % keep it from exceeding 1 | ||
14 | %M2 = sigmoid(M,maxM,30); | ||
15 | |||
16 | matlab5on = 1; | ||
17 | |||
18 | if matlab5on == 1, | ||
19 | TAM=hsv2rgb(T,A,M2); | ||
20 | |||
21 | figure(3); | ||
22 | image(TAM); | ||
23 | axis('tightequal'); | ||
24 | else | ||
25 | H = [reshape(T,prod(size(T)),1),... | ||
26 | reshape(A,prod(size(A)),1),... | ||
27 | reshape(M2,prod(size(M2)),1)]; | ||
28 | M = hsv2rgb(H); | ||
29 | [Ic,map] =vmquant(M(:,1),M(:,2),M(:,3),256); | ||
30 | |||
31 | image(reshape(Ic,size(T,1),size(T,2)));colormap(map); | ||
32 | end | ||
33 | |||
34 | if 0 | ||
35 | plot3(A(:).*M(:).*cos(2*pi*T(:)),A(:).*M(:).*sin(2*pi*T(:)),M(:),'.','markersize',15) | ||
36 | axis([-1 1 -1 1 0 1]) | ||
37 | [x,y,z] = cylinder(ones(1,5)); | ||
38 | x=x.*z; | ||
39 | y=y.*z; | ||
40 | hold on | ||
41 | h=mesh(x,y,z); | ||
42 | set(h,'edgecolor',[.2 .2 .2]); | ||
43 | hidden off | ||
44 | hold off | ||
45 | end \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/showsmm_v5.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/showsmm_v5.m new file mode 100755 index 0000000..937303d --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/showsmm_v5.m | |||
@@ -0,0 +1,34 @@ | |||
1 | function [T,A,M2,TAM]=showsmm(L1,L2,phi,maxM); | ||
2 | % [T,A,M]=showsmm(L1,L2,phi,maxM); | ||
3 | |||
4 | if (~exist('maxM')), | ||
5 | % needs to know upper bound on M for given window function in smm | ||
6 | maxM=0.18; % temporary | ||
7 | end | ||
8 | |||
9 | |||
10 | A=1-L2./(L1+eps); | ||
11 | T=2*(phi+pi/2)/(2*pi); | ||
12 | M=L1+L2; | ||
13 | M2=min(M/maxM,1); % keep it from exceeding 1 | ||
14 | %M2 = sigmoid(M,maxM,30); | ||
15 | |||
16 | TAM=hsv2rgb(T,A,M2); | ||
17 | |||
18 | figure(3); | ||
19 | image(TAM); | ||
20 | axis('tightequal'); | ||
21 | |||
22 | |||
23 | if 0 | ||
24 | plot3(A(:).*M(:).*cos(2*pi*T(:)),A(:).*M(:).*sin(2*pi*T(:)),M(:),'.','markersize',15) | ||
25 | axis([-1 1 -1 1 0 1]) | ||
26 | [x,y,z] = cylinder(ones(1,5)); | ||
27 | x=x.*z; | ||
28 | y=y.*z; | ||
29 | hold on | ||
30 | h=mesh(x,y,z); | ||
31 | set(h,'edgecolor',[.2 .2 .2]); | ||
32 | hidden off | ||
33 | hold off | ||
34 | end \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/sigmoid.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/sigmoid.m new file mode 100755 index 0000000..996f7fe --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/sigmoid.m | |||
@@ -0,0 +1,10 @@ | |||
1 | function a = sigmoid(x,offset,sig) | ||
2 | % | ||
3 | % a = sigmoid(x,offset,sig) | ||
4 | % | ||
5 | % a = ones(size(x))./(1+exp(-(x-offset)/sig)); | ||
6 | % | ||
7 | |||
8 | |||
9 | a = ones(size(x))./(1+exp(-(x-offset)/sig)); | ||
10 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/signif.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/signif.m new file mode 100755 index 0000000..f49eefc --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/signif.m | |||
@@ -0,0 +1,22 @@ | |||
1 | function a = signif(b) | ||
2 | |||
3 | js = [1:101]; | ||
4 | |||
5 | |||
6 | if 0, | ||
7 | d = (-ones(size(js))).^(js-1); | ||
8 | d1 = exp(-2*(js.*js)*b*b); | ||
9 | |||
10 | a = 2*sum(d.*d1); | ||
11 | |||
12 | end | ||
13 | |||
14 | d1 = exp(-2*(js.*js)*b*b); | ||
15 | d2 = 4*(js.*js)*b*b - 1; | ||
16 | |||
17 | a = 2*sum(d1.*d2); | ||
18 | |||
19 | if (b<0.03),a = 1;end | ||
20 | |||
21 | |||
22 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/signif_N.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/signif_N.m new file mode 100755 index 0000000..82dc914 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/signif_N.m | |||
@@ -0,0 +1,10 @@ | |||
1 | function a = signif_N(b,N) | ||
2 | % | ||
3 | % | ||
4 | % | ||
5 | |||
6 | Ne = sqrt(N*0.5); | ||
7 | |||
8 | cof = Ne + 0.155 + 0.24/Ne; | ||
9 | |||
10 | a= signif(cof*b); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/smooth.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/smooth.m new file mode 100755 index 0000000..919b53a --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/smooth.m | |||
@@ -0,0 +1,20 @@ | |||
1 | % smooth an image | ||
2 | % coordinates (r, c) follow matrix convention; | ||
3 | % the gaussian is truncated at x = +- tail, and there are samples samples | ||
4 | % inbetween, where samples = hsamples * 2 + 1 | ||
5 | |||
6 | function g = smooth(image, hsamples) | ||
7 | |||
8 | tail=4; | ||
9 | samples = hsamples * 2 + 1; | ||
10 | |||
11 | x = linspace(-tail, tail, samples); | ||
12 | gauss = exp(-x.^2); | ||
13 | n = gauss * ones(samples,1); | ||
14 | gauss = gauss/n; | ||
15 | |||
16 | |||
17 | g = conv2(conv2(image, gauss), gauss'); | ||
18 | |||
19 | g = conv_trim(g, hsamples, hsamples); | ||
20 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/startup.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/startup.m new file mode 100755 index 0000000..8d38803 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/startup.m | |||
@@ -0,0 +1,9 @@ | |||
1 | %path(path,'/usr/sww/matlab-4.2c/toolbox/images'); | ||
2 | home_dir = '/home/barad-dur/vision/malik/jshi/'; | ||
3 | path(path,[home_dir,'matlab/toolbox/io']) | ||
4 | path(path,[home_dir,'matlab/pyramid']); | ||
5 | path(path,[home_dir,'matlab/toolbox/filter']) | ||
6 | path(path,[home_dir,'matlab/toolbox/disp']) | ||
7 | path(path,[home_dir,'matlab/vision/vision94/tracking/']) | ||
8 | path(path,[home_dir,'proj/grouping/laso']); | ||
9 | path(path,[home_dir,'proj/grouping/eig']); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/swarp.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/swarp.m new file mode 100755 index 0000000..60a4530 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/swarp.m | |||
@@ -0,0 +1,9 @@ | |||
1 | function J = swarp(I) | ||
2 | |||
3 | [nr,nc] = size(I); | ||
4 | |||
5 | center_x = round(0.5*nc); | ||
6 | center_y = round(0.5*nr); | ||
7 | |||
8 | J = [I(center_y:nr,center_x:nc),I(center_y:nr,1:center_x-1);... | ||
9 | I(1:center_y-1,center_x:nc),I(1:center_y-1,1:center_x-1)]; \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/swarpback.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/swarpback.m new file mode 100755 index 0000000..513bc25 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/swarpback.m | |||
@@ -0,0 +1,12 @@ | |||
1 | function J = swarpback(I); | ||
2 | |||
3 | [nr,nc] = size(I); | ||
4 | |||
5 | center_x = round(0.5*nc); | ||
6 | center_y = round(0.5*nr); | ||
7 | |||
8 | cx= center_x -1; | ||
9 | cy= center_y -1; | ||
10 | |||
11 | J = [I(nr-cy+1:nr,nc-cx+1:nc),I(nr-cy+1:nr,1:(nc-center_x+1));... | ||
12 | I(1:(nr-center_y+1),nc-cx+1:nc),I(1:(nr-center_y+1),1:(nc-center_x+1))]; \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test.m new file mode 100755 index 0000000..12470eb --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test.m | |||
@@ -0,0 +1,110 @@ | |||
1 | |||
2 | fn = '130065'; nr = 30;nc = 49; | ||
3 | %nr = 49;nc = 30; | ||
4 | %nc = 68;nr = 43; | ||
5 | %nr =49;nc = 30; | ||
6 | |||
7 | basedir = 'plaatje_data/newdata/'; | ||
8 | if 1, | ||
9 | fname = sprintf('%s%s_eigvec.pfm',basedir,fn); | ||
10 | eigv = readpfm(fname); | ||
11 | fname = sprintf('%s%s_eigval.pfm',basedir,fn); | ||
12 | eigval = readpfm(fname); | ||
13 | |||
14 | fname = sprintf('%s%s_ncutvec.pfm',basedir,fn); | ||
15 | ncutv = readpfm(fname); | ||
16 | fname = sprintf('%s%s_ncutval.pfm',basedir,fn); | ||
17 | ncutval = readpfm(fname); | ||
18 | else | ||
19 | fname = sprintf('%sncutvec_%s.pfm',basedir,fn); | ||
20 | ncutv = readpfm(fname); | ||
21 | fname = sprintf('%sncutval_%s.pfm',basedir,fn); | ||
22 | ncutval = readpfm(fname); | ||
23 | end | ||
24 | |||
25 | |||
26 | fname = sprintf('images/%s.pgm',fn); | ||
27 | I = readpgm(fname); | ||
28 | cutsz = 20; I = cutoff(I,cutsz); | ||
29 | figure(3);im(I);colormap(gray); | ||
30 | |||
31 | figure(6); | ||
32 | for j=1:min(8,size(ncutv,2)-1), | ||
33 | subplot(3,3,j); | ||
34 | im(reshape(ncutv(:,j+1),nr,nc));colorbar | ||
35 | title(num2str(ncutval(j+1,1))); | ||
36 | end | ||
37 | %cm = sprintf('print -dps ncut_%s',fn);disp(cm);eval(cm); | ||
38 | subplot(3,3,9);im(I);axis('off'); | ||
39 | |||
40 | ev = eigval(:,1); | ||
41 | figure(5);hold off;clf;subplot(1,2,1); | ||
42 | %semilogy((ev(1:end-1) - ev(2:end))./ev(1:end-1),'x-');grid on; | ||
43 | plot((ev(1:end-1) - ev(2:end))./ev(1:end-1),'x-');grid on; | ||
44 | %semilogy(0.01*ones(size(ev(2:end-1))),'r-');semilogy(0.005*ones(size(ev(2:end-1))),'r-');semilogy(0.0025*ones(size(ev(2:end-1))),'r-');grid on;hold off; | ||
45 | subplot(1,2,2); | ||
46 | %semilogy(ev(1:end-1)-ev(2:end),'p-');grid on; | ||
47 | semilogy((ev(1:end-1) - ev(2:end))/ev(1),'x-');grid on; | ||
48 | |||
49 | |||
50 | ncutv_o = ncutv; | ||
51 | |||
52 | recursive_cut_tc; | ||
53 | |||
54 | %[groups,ids] = recursive_cut(ncutv(:,1:4),fn); | ||
55 | |||
56 | masks = make_masks(groups,ids,nr,nc); | ||
57 | |||
58 | cm = sprintf('save masks_%s masks ncutv_o groups ids nr nc',fn); | ||
59 | disp(cm); | ||
60 | |||
61 | eval(cm); | ||
62 | |||
63 | |||
64 | %%%%%%%%%%%%%%%%%% | ||
65 | fn = '130040'; | ||
66 | cm = sprintf('load masks_%s',fn); | ||
67 | disp(cm); | ||
68 | eval(cm); | ||
69 | |||
70 | fn = '130040'; | ||
71 | fname= sprintf('images/%s.pgm',fn); | ||
72 | I = readpgm(fname);cutsz = 20; I = cutoff(I,cutsz); | ||
73 | figure(3);im(I);colormap(gray); | ||
74 | hw = 2; %nr = 43;nc=68; | ||
75 | gap = 2*hw+1; | ||
76 | %nr = 30;nc=49; | ||
77 | Is = I(1:nr*gap,1:nc*gap); | ||
78 | figure(3);im(Is);axis('off'); | ||
79 | |||
80 | %cm = sprintf('print -deps I_%s',fn);disp(cm);eval(cm); | ||
81 | |||
82 | |||
83 | |||
84 | %masks = make_masks(groups,ids,nr,nc); | ||
85 | figure(2);disp_groups(groups,ids,nr,nc); | ||
86 | |||
87 | figure(1); | ||
88 | Imasks = disp_Imask(Is,nr,nc,hw,masks); | ||
89 | |||
90 | for j=1:length(ids), | ||
91 | figure(4);colormap(gray);clf | ||
92 | im(Imasks(:,:,j));axis('off'); | ||
93 | cm = sprintf('print -deps result_cut_%s_%d',fn,j); | ||
94 | disp(cm);eval(cm); | ||
95 | |||
96 | %print -deps result_cut_134011_1 | ||
97 | end | ||
98 | |||
99 | |||
100 | if 0, | ||
101 | |||
102 | %load st_134013 | ||
103 | |||
104 | fn = '134013_t'; | ||
105 | |||
106 | I_max = 250; | ||
107 | tex_max = 40; | ||
108 | |||
109 | writeout_feature(I1,T1,fn,I_max,tex_max); | ||
110 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test1.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test1.m new file mode 100755 index 0000000..691b63e --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test1.m | |||
@@ -0,0 +1,175 @@ | |||
1 | |||
2 | fnameI = '130068'; | ||
3 | |||
4 | cm = sprintf('load filter_%s.pgm.mat',fnameI); | ||
5 | disp(cm); | ||
6 | eval(cm); | ||
7 | |||
8 | text_des = abs(text_des); | ||
9 | |||
10 | |||
11 | %%%% cutoff margins, | ||
12 | margin = 6+10; | ||
13 | |||
14 | Iw = cutoff(I,margin); | ||
15 | |||
16 | T1= reshape(text_des,size(text_des,1),size(text_des,2),size(text_des,3)*size(text_des,4)); | ||
17 | T1 = cutoff(T1,margin); | ||
18 | |||
19 | %%%%% reduce resolution | ||
20 | |||
21 | |||
22 | |||
23 | T1 = reduce_all(T1); | ||
24 | T1 = reduce_all(T1); | ||
25 | |||
26 | im5(T1,5,6); | ||
27 | |||
28 | cm = sprintf('writepnm5(''%s_f.pnm'',%s)',fnameI,'T1/70'); | ||
29 | |||
30 | % disp(cm);eval(cm); | ||
31 | |||
32 | nr = size(T1,1); | ||
33 | nc = size(T1,2); | ||
34 | |||
35 | % D = mreadpfm('D_134011_f.pnm.pfm'); | ||
36 | |||
37 | % figure(3);imagesc(reshape(D,nc,nr)');axis('image');colorbar | ||
38 | |||
39 | if 0, | ||
40 | figure(7); | ||
41 | subplot(3,1,1);hist(reshape(I1,prod(size(I1)),1),binI); | ||
42 | subplot(3,1,2);hist(reshape(I2,prod(size(I2)),1),binI); | ||
43 | subplot(3,1,3);hist(reshape(I3,prod(size(I3)),1),binI); | ||
44 | |||
45 | |||
46 | If1 = filter_output(I1,sigs,szs); | ||
47 | If2 = filter_output(I2,sigs,szs); | ||
48 | If3 = filter_output(I3,sigs,szs); | ||
49 | |||
50 | I1a = cutoff(I1,5); If1 = cutoff(If1,5); | ||
51 | I2a = cutoff(I2,5); If2 = cutoff(If2,5); | ||
52 | I3a = cutoff(I3,5); If3 = cutoff(If3,5); | ||
53 | |||
54 | |||
55 | |||
56 | figure(4); | ||
57 | bint = [-0.15:0.02:0.15]; | ||
58 | id = 4; | ||
59 | |||
60 | If = If1; | ||
61 | for j=1:5, | ||
62 | subplot(5,2,2*(j-1)+1); | ||
63 | hist(reshape(If(:,:,id,j)./s1,prod(size(If(:,:,id,j))),1),bint); | ||
64 | end | ||
65 | |||
66 | If = If2; | ||
67 | for j=1:5, | ||
68 | subplot(5,2,2*j); | ||
69 | hist(reshape(If(:,:,id,j)./s2,prod(size(If(:,:,id,j))),1),bint); | ||
70 | end | ||
71 | |||
72 | |||
73 | %%% make 2d histogram bin | ||
74 | figure(5); | ||
75 | idmax = 5; | ||
76 | filt_id = 4; | ||
77 | |||
78 | for id=1:idmax, | ||
79 | |||
80 | subplot(idmax,3,(id-1)*3+1); | ||
81 | h2d1 = hist_I_f(I1a,If1(:,:,filt_id,id),binI,bintex); | ||
82 | imagesc(h2d1);axis('image') | ||
83 | subplot(idmax,3,(id-1)*3+2); | ||
84 | h2d2 = hist_I_f(I2a,If2(:,:,filt_id,id),binI,bintex); | ||
85 | imagesc(h2d2);axis('image') | ||
86 | |||
87 | subplot(idmax,3,id*3); | ||
88 | imagesc(h2d2/sum(sum(h2d2)) + h2d1/sum(sum(h2d1)));axis('image') | ||
89 | colorbar | ||
90 | end | ||
91 | |||
92 | %%%%%%%%%%%%%%%%%%%%% three types %%%%%%%% | ||
93 | figure(4); | ||
94 | idmax = 5; | ||
95 | filt_id = 2; | ||
96 | |||
97 | width = 4; | ||
98 | |||
99 | for id=1:idmax, | ||
100 | |||
101 | subplot(idmax,width,(id-1)*width+1); | ||
102 | h2d1 = hist_I_f(I1a,If1(:,:,filt_id,id),binI,bintex); | ||
103 | h2d1 = h2d1/sum(sum(h2d1)); | ||
104 | imagesc(h2d1);axis('image'); | ||
105 | |||
106 | subplot(idmax,width,(id-1)*width+2); | ||
107 | h2d2 = hist_I_f(I2a,If2(:,:,filt_id,id),binI,bintex); | ||
108 | h2d2 = h2d2/sum(sum(h2d2)); | ||
109 | imagesc(h2d2);axis('image') | ||
110 | |||
111 | subplot(idmax,width,(id-1)*width+3); | ||
112 | h2d3 = hist_I_f(I3a,If3(:,:,filt_id,id),binI,bintex); | ||
113 | h2d3 = h2d3/sum(sum(h2d3)); | ||
114 | imagesc(h2d3);axis('image') | ||
115 | |||
116 | subplot(idmax,width,id*width); | ||
117 | imagesc(h2d1+h2d2+h2d3);axis('image') | ||
118 | colorbar | ||
119 | end | ||
120 | |||
121 | |||
122 | %%%%%%%%%%%% smaller window %%%% | ||
123 | hw = round(4*sigs(1)); | ||
124 | |||
125 | figure(5);%imagesc(I1a);axis('image'); | ||
126 | cs = round(ginput(1)); | ||
127 | |||
128 | J = get_win(I1a,cs,[hw,hw]);figure(7);imagesc(J);axis('image'); | ||
129 | |||
130 | Jf = get_win5(If1,cs,[hw,hw]); | ||
131 | scales = 1:5; nscales = length(scales); | ||
132 | filters = 1:7; nfilters = length(filters); | ||
133 | |||
134 | figure(8); | ||
135 | for j=1:nscales, | ||
136 | for k=1:nfilters, | ||
137 | subplot(nscales,nfilters,(j-1)*nfilters+k); | ||
138 | h2d = hist_I_f(J,Jf(:,:,(j-1)*7+k));h2d = h2d/sum(sum(h2d)); | ||
139 | imagesc(h2d);axis('image');colorbar;axis('off'); | ||
140 | end | ||
141 | end | ||
142 | |||
143 | |||
144 | if 0, | ||
145 | |||
146 | figure(3); | ||
147 | cs = ginput(1); | ||
148 | |||
149 | ws = [15,15]; | ||
150 | J = get_win(I,cs,ws); | ||
151 | figure(6);imagesc(J);axis('image'); | ||
152 | |||
153 | t1 = get_win5(text_des,cs,ws); | ||
154 | |||
155 | t1p = abs(t1); | ||
156 | %t1p = abs(t1); | ||
157 | %t1p = t1.*(t1>0); | ||
158 | |||
159 | figure(2);im5(t1p,5,6); | ||
160 | |||
161 | t1p = reshape(t1p,size(t1p,1)*size(t1p,2),size(t1p,3))'; | ||
162 | |||
163 | t1pm = mean(t1p')'; | ||
164 | t1ps = t1p- t1pm*ones(1,size(t1p,2)); | ||
165 | |||
166 | B = t1ps*t1ps'; | ||
167 | [v,d] = eig(B);d = diag(d); | ||
168 | figure(4);plot(d,'x-'); | ||
169 | |||
170 | figure(5); | ||
171 | subplot(2,2,1);vid = 30;plot(reshape(v(:,vid),6,5),'x-'); | ||
172 | |||
173 | end | ||
174 | |||
175 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test2.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test2.m new file mode 100755 index 0000000..c70446a --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test2.m | |||
@@ -0,0 +1,220 @@ | |||
1 | |||
2 | %fnameI = '130056'; | ||
3 | %fnameI = '134013'; | ||
4 | fnameI = '134007'; | ||
5 | |||
6 | %%%% flags %%%%%%%%% | ||
7 | read_image = 1; | ||
8 | |||
9 | margin = 10+6; | ||
10 | sigs = [1/sqrt(2),1,sqrt(2),2,2*sqrt(2)]; | ||
11 | r =3; | ||
12 | szs = round(3*r*sigs); | ||
13 | |||
14 | |||
15 | |||
16 | %%% image read %%% | ||
17 | if read_image, | ||
18 | cm = sprintf('I = readpgm(''images/%s.pgm'');',fnameI); | ||
19 | disp(cm); | ||
20 | eval(cm); | ||
21 | |||
22 | Iw = cutoff(I,margin); | ||
23 | figure(1);imagesc(Iw);axis('image'); | ||
24 | end | ||
25 | |||
26 | %%%% image crop %%% | ||
27 | figure(1);J = imcrop; | ||
28 | figure(2);imagesc(J);axis('image');drawnow; | ||
29 | |||
30 | Jf = filter_output(J,sigs,szs); | ||
31 | margin = 5; | ||
32 | Ja = cutoff(J,margin);Jfa = cutoff(Jf,margin); | ||
33 | figure(2);imagesc(Ja);axis('image'); | ||
34 | |||
35 | figure(3); | ||
36 | imagesc(Jfa(:,:,1,3));axis('image');drawnow; | ||
37 | |||
38 | Jfb = reshape(Jfa,size(Jfa,1),size(Jfa,2),size(Jfa,3)*size(Jfa,4)); | ||
39 | mag = sum(abs(Jfb),3); | ||
40 | |||
41 | %%%%%% Joint hist. %%%%%%%%% | ||
42 | |||
43 | filter_id = 1; | ||
44 | scale = 1; | ||
45 | h2d = hist_I_f(Ja,Jfa(:,:,filter_id,scale)); | ||
46 | |||
47 | figure(4); | ||
48 | imagesc(h2d/sum(sum(h2d)));axis('image');colorbar;colormap(hot); | ||
49 | |||
50 | |||
51 | %%%%%%%%%% Jointe hist of cropped area %%%%% | ||
52 | %%% block 1 | ||
53 | fig_id = 1; | ||
54 | [J3,f3,rect] = crop_im_fil(Ja,Jfa,fig_id); | ||
55 | |||
56 | filter_id = 1;scale = 1;H1 = hist_I_f(J1,f1(:,:,filter_id,scale)); | ||
57 | |||
58 | |||
59 | %%% block 2 | ||
60 | fig_id = 1; | ||
61 | [J2,f2,rect] = crop_im_fil(Ja,Jfa,fig_id); | ||
62 | |||
63 | filter_id = 1;scale = 1;H2 = hist_I_f(J2,f2(:,:,filter_id,scale)); | ||
64 | |||
65 | |||
66 | %%%%% disp result %%%%% | ||
67 | |||
68 | scales = [1:5]; | ||
69 | filter_ids = [1:7]; | ||
70 | |||
71 | figure(6);disp_hist2d(J2,f2,scales,filter_ids); | ||
72 | |||
73 | figure(4);disp_hist2d(J1,f1,scales,filter_ids); | ||
74 | |||
75 | %%%%%%%%%%%%%%%%% | ||
76 | %%%%%%%%%%%%%%%%% smaller window | ||
77 | hw = round(4*sigs(1)); | ||
78 | |||
79 | figure(2);%imagesc(Ja);axis('image'); | ||
80 | cs = round(ginput(1)); | ||
81 | |||
82 | J1 = get_win(Ja,cs,[hw,hw]);Jf1 = get_win5(Jfa,cs,[hw,hw]); | ||
83 | figure(4);imagesc(J1);axis('image');drawnow; | ||
84 | scales = [1:5];filter_ids = [1:7]; | ||
85 | figure(9);H2 = disp_hist2d(J1,Jf1,scales,filter_ids); | ||
86 | |||
87 | figure(6); disp_diff(H2,H2o); | ||
88 | |||
89 | |||
90 | %%%%%% difference in the neighbourhood %% | ||
91 | hw = round(4*sigs(1)); | ||
92 | hnb = 3; | ||
93 | |||
94 | B = compute_diff(Ja,Jfa,hw,hnb); | ||
95 | |||
96 | |||
97 | %%%%%%%%%% | ||
98 | |||
99 | if 0, | ||
100 | |||
101 | figure(4); | ||
102 | bint = [-0.15:0.02:0.15]; | ||
103 | id = 4; | ||
104 | |||
105 | If = If1; | ||
106 | for j=1:5, | ||
107 | subplot(5,2,2*(j-1)+1); | ||
108 | hist(reshape(If(:,:,id,j)./s1,prod(size(If(:,:,id,j))),1),bint); | ||
109 | end | ||
110 | |||
111 | If = If2; | ||
112 | for j=1:5, | ||
113 | subplot(5,2,2*j); | ||
114 | hist(reshape(If(:,:,id,j)./s2,prod(size(If(:,:,id,j))),1),bint); | ||
115 | end | ||
116 | |||
117 | |||
118 | %%% make 2d histogram bin | ||
119 | figure(5); | ||
120 | idmax = 5; | ||
121 | filt_id = 4; | ||
122 | |||
123 | for id=1:idmax, | ||
124 | |||
125 | subplot(idmax,3,(id-1)*3+1); | ||
126 | h2d1 = hist_I_f(I1a,If1(:,:,filt_id,id),binI,bintex); | ||
127 | imagesc(h2d1);axis('image') | ||
128 | subplot(idmax,3,(id-1)*3+2); | ||
129 | h2d2 = hist_I_f(I2a,If2(:,:,filt_id,id),binI,bintex); | ||
130 | imagesc(h2d2);axis('image') | ||
131 | |||
132 | subplot(idmax,3,id*3); | ||
133 | imagesc(h2d2/sum(sum(h2d2)) + h2d1/sum(sum(h2d1)));axis('image') | ||
134 | colorbar | ||
135 | end | ||
136 | |||
137 | %%%%%%%%%%%%%%%%%%%%% three types %%%%%%%% | ||
138 | figure(4); | ||
139 | idmax = 5; | ||
140 | filt_id = 2; | ||
141 | |||
142 | width = 4; | ||
143 | |||
144 | for id=1:idmax, | ||
145 | |||
146 | subplot(idmax,width,(id-1)*width+1); | ||
147 | h2d1 = hist_I_f(I1a,If1(:,:,filt_id,id),binI,bintex); | ||
148 | h2d1 = h2d1/sum(sum(h2d1)); | ||
149 | imagesc(h2d1);axis('image'); | ||
150 | |||
151 | subplot(idmax,width,(id-1)*width+2); | ||
152 | h2d2 = hist_I_f(I2a,If2(:,:,filt_id,id),binI,bintex); | ||
153 | h2d2 = h2d2/sum(sum(h2d2)); | ||
154 | imagesc(h2d2);axis('image') | ||
155 | |||
156 | subplot(idmax,width,(id-1)*width+3); | ||
157 | h2d3 = hist_I_f(I3a,If3(:,:,filt_id,id),binI,bintex); | ||
158 | h2d3 = h2d3/sum(sum(h2d3)); | ||
159 | imagesc(h2d3);axis('image') | ||
160 | |||
161 | subplot(idmax,width,id*width); | ||
162 | imagesc(h2d1+h2d2+h2d3);axis('image') | ||
163 | colorbar | ||
164 | end | ||
165 | |||
166 | |||
167 | %%%%%%%%%%%% smaller window %%%% | ||
168 | hw = round(4*sigs(1)); | ||
169 | |||
170 | figure(5);%imagesc(I1a);axis('image'); | ||
171 | cs = round(ginput(1)); | ||
172 | |||
173 | J = get_win(I1a,cs,[hw,hw]);figure(7);imagesc(J);axis('image'); | ||
174 | |||
175 | Jf = get_win5(If1,cs,[hw,hw]); | ||
176 | scales = 1:5; nscales = length(scales); | ||
177 | filters = 1:7; nfilters = length(filters); | ||
178 | |||
179 | figure(8); | ||
180 | for j=1:nscales, | ||
181 | for k=1:nfilters, | ||
182 | subplot(nscales,nfilters,(j-1)*nfilters+k); | ||
183 | h2d = hist_I_f(J,Jf(:,:,(j-1)*7+k));h2d = h2d/sum(sum(h2d)); | ||
184 | imagesc(h2d);axis('image');colorbar;axis('off'); | ||
185 | end | ||
186 | end | ||
187 | |||
188 | |||
189 | if 0, | ||
190 | |||
191 | figure(3); | ||
192 | cs = ginput(1); | ||
193 | |||
194 | ws = [15,15]; | ||
195 | J = get_win(I,cs,ws); | ||
196 | figure(6);imagesc(J);axis('image'); | ||
197 | |||
198 | t1 = get_win5(text_des,cs,ws); | ||
199 | |||
200 | t1p = abs(t1); | ||
201 | %t1p = abs(t1); | ||
202 | %t1p = t1.*(t1>0); | ||
203 | |||
204 | figure(2);im5(t1p,5,6); | ||
205 | |||
206 | t1p = reshape(t1p,size(t1p,1)*size(t1p,2),size(t1p,3))'; | ||
207 | |||
208 | t1pm = mean(t1p')'; | ||
209 | t1ps = t1p- t1pm*ones(1,size(t1p,2)); | ||
210 | |||
211 | B = t1ps*t1ps'; | ||
212 | [v,d] = eig(B);d = diag(d); | ||
213 | figure(4);plot(d,'x-'); | ||
214 | |||
215 | figure(5); | ||
216 | subplot(2,2,1);vid = 30;plot(reshape(v(:,vid),6,5),'x-'); | ||
217 | |||
218 | end | ||
219 | |||
220 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test3.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test3.m new file mode 100755 index 0000000..040ed3d --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test3.m | |||
@@ -0,0 +1,4 @@ | |||
1 | fn = 'lightsmall.ppm'; | ||
2 | nr = Ipara(1);nc = Ipara(2); | ||
3 | |||
4 | k = 1;imagesc(reshape(v(:,k).*D,nc,nr)');colorbar \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test_best_cut.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test_best_cut.m new file mode 100755 index 0000000..e04c6ff --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test_best_cut.m | |||
@@ -0,0 +1,12 @@ | |||
1 | |||
2 | fn_base = '134035'; | ||
3 | ev_id = 4; | ||
4 | para = [12 ev_id nr nc 100]; | ||
5 | Gmask = ones(nr,nc); | ||
6 | threshold = find_cutpoint(ncutv(:,ev_id),cmapg,12); | ||
7 | threshold = threshold(1:end-1); | ||
8 | |||
9 | cut_threshold = find_bst_cut(fn_base,para,threshold,Gmask); | ||
10 | |||
11 | figure(8);ims(ncutv(:,ev_id)<cut_threshold,nr,nc); | ||
12 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test_evtex.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test_evtex.m new file mode 100755 index 0000000..fc420c7 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test_evtex.m | |||
@@ -0,0 +1,361 @@ | |||
1 | |||
2 | setup_flag = 0; | ||
3 | cut_window_flag = 0; | ||
4 | run_flag = 0; | ||
5 | other_flag = 0; | ||
6 | test_flag = 1; | ||
7 | |||
8 | |||
9 | %%%%%%%%%%%%%%%%% | ||
10 | if setup_flag == 1, | ||
11 | I = readpgm('images/134035.pgm'); | ||
12 | |||
13 | sigs = [1/sqrt(2),1,sqrt(2),2,2*sqrt(2)];r = 3;szs = round(r*3*sigs); | ||
14 | %[text_des,TIw] = compute_filter(I,sigs,r,szs); | ||
15 | load filter_134035 | ||
16 | |||
17 | text_des = cutoff(text_des,szs(1)); | ||
18 | |||
19 | I_max = 255; | ||
20 | tex_max = 75; | ||
21 | |||
22 | TIw = cutoff(I,szs(1)); | ||
23 | figure(1);im(TIw); | ||
24 | |||
25 | fts = gen_filters(sigs,r,szs); | ||
26 | Ft = reshape(fts,size(fts,1)*size(fts,2),size(fts,3)*size(fts,4)); | ||
27 | Ft = Ft'; | ||
28 | PFt1 = pinv(Ft); | ||
29 | |||
30 | temp1 = zeros(2*szs(end-1)+1,2*szs(end-1)+1); | ||
31 | temp1(szs(end-1)+1,szs(end-1)+1) = 1; | ||
32 | Ft2 = [Ft;temp1(:)']; | ||
33 | PFt2 = pinv(Ft2); | ||
34 | |||
35 | |||
36 | end | ||
37 | |||
38 | %%%%%%%%%% | ||
39 | |||
40 | if cut_window_flag == 1, | ||
41 | wz = [30,30]; | ||
42 | |||
43 | figure(1); | ||
44 | ct0 = round(ginput(1)) | ||
45 | |||
46 | t0 = cutout(text_des,ct0,wz)/tex_max; | ||
47 | I0 = cutout(TIw,ct0,wz)/I_max; | ||
48 | |||
49 | figure(3);im(I0);colorbar | ||
50 | |||
51 | figure(1); | ||
52 | ct1 = round(ginput(1)) | ||
53 | |||
54 | t1 = cutout(text_des,ct1,wz)/tex_max; | ||
55 | I1 = cutout(TIw,ct1,wz)/I_max; | ||
56 | |||
57 | figure(3);im(I1);colorbar | ||
58 | |||
59 | %%%%%%%%%% | ||
60 | ts = cat(2,t0,t1); | ||
61 | Is = [I0,I1]; | ||
62 | |||
63 | figure(3); | ||
64 | subplot(2,1,1);im(Is); | ||
65 | subplot(2,1,2);im(ts(:,:,15)); | ||
66 | |||
67 | end | ||
68 | |||
69 | %%%%%% | ||
70 | |||
71 | if run_flag == 1, | ||
72 | |||
73 | neigs = 15; | ||
74 | |||
75 | fv1 = colize(t1,I1); | ||
76 | cov1 = fv1*fv1'; | ||
77 | |||
78 | [u1,s1] = eigs(cov1,neigs); s1= diag(s1); | ||
79 | figure(4);plot(s1,'p-'); | ||
80 | |||
81 | fv0 = colize(t0,I0); | ||
82 | cov0 = fv0*fv0'; | ||
83 | |||
84 | [u0,s0] = eigs(cov0,neigs); s0 = diag(s0); | ||
85 | figure(4);hold on; plot(s0,'rp-'); | ||
86 | |||
87 | fvs = colize(ts,Is); | ||
88 | covs = fvs*fvs'; | ||
89 | |||
90 | [us,ss] = eigs(covs,neigs); ss = diag(ss); | ||
91 | figure(4);plot(ss,'mo-'); | ||
92 | hold off | ||
93 | |||
94 | figure(5); | ||
95 | subplot(2,2,1); | ||
96 | im(cov0);colorbar; | ||
97 | subplot(2,2,2); | ||
98 | im(cov1);colorbar; | ||
99 | subplot(2,2,3); | ||
100 | im(covs);colorbar; | ||
101 | |||
102 | %%%%%%%%%%%%%%%%% | ||
103 | |||
104 | ivss = ones(size(ss))./sqrt(ss); | ||
105 | ivs0 = ones(size(s0))./sqrt(s0); | ||
106 | ivs1 = ones(size(s1))./sqrt(s1); | ||
107 | |||
108 | |||
109 | nv = 10; | ||
110 | v1 = fv1'*u1(:,1:nv)*diag(ivs1(1:nv)); | ||
111 | v0 = fv0'*u0(:,1:nv)*diag(ivs0(1:nv)); | ||
112 | vs = fvs'*us(:,1:nv)*diag(ivss(1:nv)); | ||
113 | |||
114 | |||
115 | %v1s = v1(1:50:3721,:); | ||
116 | vss = vs(1:10:7442,:); | ||
117 | |||
118 | if nv == 1, | ||
119 | mag = vss'; | ||
120 | else | ||
121 | mag = sum(vss'.*vss'); | ||
122 | end | ||
123 | |||
124 | tmp1 = vss*vss'; | ||
125 | figure(5);im(abs(tmp1)); | ||
126 | |||
127 | if 0, | ||
128 | magx = mag'*ones(1,length(mag)); | ||
129 | magy = ones(length(mag),1)*mag; | ||
130 | tmp2 = tmp1./(magx+magy); | ||
131 | figure(5);subplot(1,2,2);im(abs(tmp2));colorbar;axis('off'); | ||
132 | end | ||
133 | |||
134 | |||
135 | end | ||
136 | |||
137 | %%%%%%%%%%%%%%%%%%% | ||
138 | if other_flag == 1, | ||
139 | |||
140 | %tmp1 = PFt*us(:,1); | ||
141 | %im(reshape(tmp1,sqrt(length(tmp1)),sqrt(length(tmp1)))); | ||
142 | PFt = PFt1; | ||
143 | |||
144 | |||
145 | BI0 = back_proj(PFt,u0); | ||
146 | BI1 = back_proj(PFt,u1); | ||
147 | BIs = back_proj(PFt,us); | ||
148 | |||
149 | figure(7);im5(BI0(:,:,1:9),3,3); | ||
150 | figure(8);im5(BI1(:,:,1:9),3,3); | ||
151 | figure(9);im5(BIs(:,:,1:9),3,3); | ||
152 | |||
153 | |||
154 | %%%%%%%%%% | ||
155 | figure(12); | ||
156 | im(Is); | ||
157 | |||
158 | figure(13); | ||
159 | clf | ||
160 | x1 = vs(1:3721,2); | ||
161 | y1 = vs(1:3721,3); | ||
162 | subplot(1,2,1); | ||
163 | plot(x1,y1,'.') | ||
164 | axis('image');hold on; | ||
165 | subplot(1,2,2); | ||
166 | x2 = vs(3722:end,2); | ||
167 | y2 = vs(3722:end,3); | ||
168 | plot(x2,y2,'.') | ||
169 | axis('image');hold on; | ||
170 | |||
171 | |||
172 | figure(11); | ||
173 | subplot(1,2,1);hist0 = im_vect([y1,x1]',ones(size(y1))); | ||
174 | im(hist0);axis('xy'); | ||
175 | subplot(1,2,2);hist1 = im_vect([y2,x2]',ones(size(y1))); | ||
176 | im(hist1);axis('xy'); | ||
177 | |||
178 | end | ||
179 | |||
180 | if test_flag == 1, | ||
181 | figure(12); | ||
182 | ct = round(ginput(1)); | ||
183 | idx = (ct(1)-1)*size(Is,1) + ct(2); | ||
184 | |||
185 | cl = 'r'; | ||
186 | figure(13);subplot(1,2,1); | ||
187 | plot(vs(idx,2),vs(idx,3),[cl,'o']); | ||
188 | subplot(1,2,2);plot(vs(idx,2),vs(idx,3),[cl,'o']); | ||
189 | |||
190 | tmp = vs(idx,1:2)*vs(:,1:2)';tmp = reshape(tmp,size(Is,1),size(Is,2)); | ||
191 | figure(14);subplot(3,2,1); | ||
192 | im(abs(tmp));colorbar | ||
193 | subplot(3,2,2); im((Is+0.5).*(abs(tmp)>0.2*max(max(abs(tmp))))); | ||
194 | |||
195 | tmp = vs(idx,1:3)*vs(:,1:3)';tmp = reshape(tmp,size(Is,1),size(Is,2)); | ||
196 | subplot(3,2,3); | ||
197 | im(abs(tmp));colorbar; | ||
198 | subplot(3,2,4); im((Is+0.5).*(abs(tmp)>0.2*max(max(abs(tmp))))); | ||
199 | |||
200 | tmp = vs(idx,1:5)*vs(:,1:5)'; | ||
201 | tmp = reshape(tmp,size(Is,1),size(Is,2)); | ||
202 | subplot(3,2,5); | ||
203 | im(abs(tmp));colorbar | ||
204 | subplot(3,2,6); im((Is+0.5).*(abs(tmp)>0.2*max(max(abs(tmp))))); | ||
205 | |||
206 | end | ||
207 | |||
208 | |||
209 | %%%%%%%%%% | ||
210 | test_tmp = 0; | ||
211 | if test_tmp, | ||
212 | x = -10:0.02:20; | ||
213 | sig = 4; | ||
214 | d = exp(-(x.^2)/sig); | ||
215 | figure(2);plot(x,d); | ||
216 | |||
217 | ers = []; | ||
218 | for j=0:0.5:10, | ||
219 | d1 = exp(-(x-j).^2/sig); | ||
220 | hold on | ||
221 | plot(x,d1,'r'); | ||
222 | ers = [ers,sum((d1-d).^2)]; | ||
223 | end | ||
224 | hold off; | ||
225 | |||
226 | figure(1);plot(ers(end)-ers); | ||
227 | |||
228 | |||
229 | |||
230 | |||
231 | |||
232 | |||
233 | end | ||
234 | |||
235 | %%%%%%%%%%%%%%%%%%% | ||
236 | |||
237 | |||
238 | fvs = colize(ts,Is); | ||
239 | |||
240 | nf = 24;np = 0.5*7442; | ||
241 | hb.sigs = 0.02*ones(1,nf); | ||
242 | hb.bmins= -0.6*ones(1,nf); | ||
243 | hb.bmaxs= 0.6*ones(1,nf); | ||
244 | hb.nbins= 20*ones(1,nf); | ||
245 | |||
246 | %fh = colize_hist(fvs(1:nf,1:10:end),hb); | ||
247 | |||
248 | fh2 = hist_inner(fvs(1:nf,1:np),hb); | ||
249 | |||
250 | [u,d] = eigs(fh2,60); d = diag(d); | ||
251 | |||
252 | %%%%%%%%%%%% | ||
253 | figure(12); | ||
254 | ct = round(ginput(1)); | ||
255 | idx = (ct(:,1)-1)*size(Is,1) + ct(:,2); | ||
256 | |||
257 | dist = dist_pair(idx,fvs(1:nf,:),hb); | ||
258 | figure(4); | ||
259 | im(reshape(dist,size(Is,1),size(Is,2)));colorbar | ||
260 | |||
261 | |||
262 | %%%%%%%%% | ||
263 | figure(12); | ||
264 | ct = round(ginput(1)); | ||
265 | idx = (ct(:,1)-1)*size(Is,1) + ct(:,2); | ||
266 | |||
267 | a = colize_hist(fvs(1:nf,idx'),hb); | ||
268 | |||
269 | figure(5); | ||
270 | cl = 'brgm'; | ||
271 | for j=1:length(idx); | ||
272 | plot(a(:,j),cl(j)); | ||
273 | hold on; | ||
274 | end | ||
275 | hold off | ||
276 | |||
277 | %%%%%%%%%%% | ||
278 | |||
279 | %% use chanked feature vectors | ||
280 | |||
281 | chank_size = 1000; | ||
282 | fname = 'st'; | ||
283 | histbin_fv_chank(fvs(1:nf,:),hb,chank_size,fname); | ||
284 | |||
285 | |||
286 | covfh2 = hist_in_chank(fvs(1:nf,:),chank_size,hb.nbins(1)); | ||
287 | [u2,d2] = eigs(covfh2,60); d2 = diag(d2); | ||
288 | |||
289 | figure(4); | ||
290 | semilogy(d,'p-'); | ||
291 | |||
292 | figure(3);imagesc(u); | ||
293 | |||
294 | back_v = backproj_outer_chank(fvs,u,d,chank_size); | ||
295 | |||
296 | back_v2 = backproj_outer_chank2(fvs,u,d,chank_size); | ||
297 | |||
298 | |||
299 | %%%%%%%%%% | ||
300 | figure(2); | ||
301 | for j = 1:16, | ||
302 | subplot(4,4,j); | ||
303 | im(reshape(back_v(:,j),size(Is,1),size(Is,2))); | ||
304 | axis('off');title(num2str(j)); | ||
305 | end | ||
306 | |||
307 | binv = linspace(-0.6,0.6,20); | ||
308 | |||
309 | figure(4); | ||
310 | for j=1:16, | ||
311 | subplot(4,4,j); | ||
312 | imagesc(reshape(u(:,j),20,24));title(num2str(j));drawnow; | ||
313 | end | ||
314 | |||
315 | |||
316 | figure(6); | ||
317 | for j=1:16, | ||
318 | subplot(4,4,j); | ||
319 | plot(binv,(reshape(u(:,j),20,24)));title(num2str(j));drawnow; | ||
320 | end | ||
321 | |||
322 | |||
323 | %%%%%%%%%% | ||
324 | figure(12); | ||
325 | ct = round(ginput(1)); | ||
326 | idx = (ct(:,1)-1)*size(Is,1) + ct(:,2); | ||
327 | |||
328 | figure(5); | ||
329 | for j = 1:7*2, | ||
330 | subplot(7,2,j); | ||
331 | nvv = 2*j; | ||
332 | dist = back_v(idx,1:nvv)*back_v(:,1:nvv)'; | ||
333 | im(reshape(abs(dist).^2,size(Is,1),size(Is,2)));colorbar | ||
334 | axis('off');title(num2str(nvv)); | ||
335 | end | ||
336 | |||
337 | |||
338 | a = colize_hist(fvs(1:nf,idx'),hb)'; | ||
339 | |||
340 | dist_raw = dist_pair_chank(a,fvs,chank_size); | ||
341 | figure(3);im(reshape(dist_raw.^2,size(Is,1),size(Is,2))); | ||
342 | |||
343 | |||
344 | |||
345 | %%%%%%%%%%%%%% | ||
346 | figure(12); | ||
347 | ct_t3 = round(ginput(5)); | ||
348 | idx_t3 = (ct_t3(:,1)-1)*size(Is,1) + ct_t3(:,2); | ||
349 | |||
350 | a1 = colize_hist(fvs(1:nf,idx_t1'),hb)'; | ||
351 | a2 = colize_hist(fvs(1:nf,idx_t2'),hb)'; | ||
352 | a3 = colize_hist(fvs(1:nf,idx_t3'),hb)'; | ||
353 | |||
354 | |||
355 | %%%%%%%%%%% | ||
356 | figure(1); | ||
357 | for j=1:9, | ||
358 | subplot(3,3,j); | ||
359 | hist(back_v(:,j)) | ||
360 | end | ||
361 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test_evtex2.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test_evtex2.m new file mode 100755 index 0000000..9e1d3e7 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test_evtex2.m | |||
@@ -0,0 +1,136 @@ | |||
1 | |||
2 | %%%%%%%%% test histogram on gray levels %%%%%%%%%%%%% | ||
3 | |||
4 | %load st | ||
5 | %fvs = colize(Is,Is); | ||
6 | |||
7 | nf = 1;np = 7442;nbins = 10; | ||
8 | |||
9 | hb.sigs = 0.02*ones(1,nf); | ||
10 | hb.bmins= 0*ones(1,nf); | ||
11 | hb.bmaxs= 1*ones(1,nf); | ||
12 | hb.nbins= nbins*ones(1,nf); | ||
13 | |||
14 | fh = colize_hist(fvs(1:nf,1:np),hb); | ||
15 | |||
16 | fh_inner = fh*fh'; | ||
17 | |||
18 | nv = nbins-1; | ||
19 | |||
20 | [u,d] = eigs(fh_inner,nv); d = diag(d); | ||
21 | |||
22 | figure(6); | ||
23 | for j=1:nv, | ||
24 | subplot(4,4,j); | ||
25 | plot(u(:,j)); | ||
26 | title(num2str(j)); | ||
27 | end | ||
28 | |||
29 | s = 1./sqrt(d); | ||
30 | |||
31 | back_v = (fh'*u(:,1:nv)).*(ones(np,1)*s(1:nv)'); | ||
32 | |||
33 | figure(7); | ||
34 | for j=1:nv, | ||
35 | subplot(4,4,j); | ||
36 | im(reshape(back_v(:,j),size(Is,1),size(Is,2)));axis('off'); | ||
37 | title(num2str(j)); | ||
38 | end | ||
39 | |||
40 | figure(1); | ||
41 | plot(d,'p-'); | ||
42 | figure(2); | ||
43 | im(u); | ||
44 | |||
45 | |||
46 | %%%%%%%%% try the joint x-I histogram bin %%%%%%%%%%%%% | ||
47 | |||
48 | x = [1:size(Is,1)]'*ones(1,size(Is,2)); | ||
49 | x = reshape(x,size(Is,1),size(Is,2)); | ||
50 | |||
51 | joint_f(:,:,1) = x; | ||
52 | joint_f(:,:,2) = Is; | ||
53 | |||
54 | fvs = colize(joint_f,Is); | ||
55 | |||
56 | nf = 2;np = 7442;nbins = [5,10]; | ||
57 | |||
58 | hb.sigs = [4,0.02].*ones(1,nf); | ||
59 | hb.bmins= [1,0].*ones(1,nf); | ||
60 | hb.bmaxs= [size(Is,1),1].*ones(1,nf); | ||
61 | hb.nbins= nbins.*ones(1,nf); | ||
62 | |||
63 | fh = colize_joint_hist(fvs,hb); | ||
64 | fh = reshape(fh,50,np); | ||
65 | |||
66 | fh_inner = fh*fh'; | ||
67 | |||
68 | nv = 30; | ||
69 | |||
70 | [u,d] = eigs(fh_inner,nv); d = diag(d); | ||
71 | |||
72 | figure(3); | ||
73 | for j=1:min(16,nv), | ||
74 | subplot(4,4,j); | ||
75 | im(reshape(u(:,j),5,10));axis('off'); | ||
76 | title(num2str(j)); | ||
77 | end | ||
78 | |||
79 | s = 1./sqrt(d); | ||
80 | |||
81 | back_v = (fh'*u(:,1:nv)).*(ones(np,1)*s(1:nv)'); | ||
82 | |||
83 | figure(4); | ||
84 | for j=1:min(16,nv), | ||
85 | subplot(4,4,j); | ||
86 | im(reshape(back_v(:,j),size(Is,1),size(Is,2)));axis('off'); | ||
87 | title(num2str(j)); | ||
88 | end | ||
89 | |||
90 | |||
91 | %%%%%%%% | ||
92 | |||
93 | |||
94 | joint_f = []; | ||
95 | |||
96 | joint_f(:,:,1) = Is; | ||
97 | joint_f(:,:,2) = ts(:,:,1); | ||
98 | |||
99 | fvs = colize(joint_f,Is); | ||
100 | |||
101 | nf = 2;np = 7442;nbins = [10,10]; | ||
102 | |||
103 | hb.sigs = [0.02,0.02].*ones(1,nf); | ||
104 | hb.bmins= [0,-0.6].*ones(1,nf); | ||
105 | hb.bmaxs= [1,0.6].*ones(1,nf); | ||
106 | hb.nbins= nbins.*ones(1,nf); | ||
107 | |||
108 | fh = colize_joint_hist(fvs,hb); | ||
109 | |||
110 | fh = reshape(fh,size(fh,1)*size(fh,2),np); | ||
111 | |||
112 | fh_inner = fh*fh'; | ||
113 | |||
114 | nv = 30; | ||
115 | |||
116 | [u,d] = eigs(fh_inner,nv); d = diag(d); | ||
117 | |||
118 | figure(3); | ||
119 | for j=1:min(16,nv), | ||
120 | subplot(4,4,j); | ||
121 | im(reshape(u(:,j),10,10));axis('off'); | ||
122 | title(num2str(j)); | ||
123 | end | ||
124 | |||
125 | s = 1./sqrt(d); | ||
126 | |||
127 | back_v = (fh'*u(:,1:nv)).*(ones(np,1)*s(1:nv)'); | ||
128 | |||
129 | figure(4); | ||
130 | for j=1:min(16,nv), | ||
131 | subplot(4,4,j); | ||
132 | im(reshape(back_v(:,j),size(Is,1),size(Is,2)));axis('off'); | ||
133 | title(num2str(j)); | ||
134 | end | ||
135 | |||
136 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test_evtex3.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test_evtex3.m new file mode 100755 index 0000000..2f245ec --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test_evtex3.m | |||
@@ -0,0 +1,169 @@ | |||
1 | %%%%%%%%% test histogram on gray levels %%%%%%%%%%%%% | ||
2 | |||
3 | %load st | ||
4 | |||
5 | nf = 24;np = 7442;nbins = 10; | ||
6 | fvs = colize(ts(:,:,1:nf),Is); | ||
7 | |||
8 | hb.sigs = 0.02*ones(1,nf); | ||
9 | hb.bmins= -0.6*ones(1,nf); | ||
10 | hb.bmaxs= 0.6*ones(1,nf); | ||
11 | hb.nbins= nbins*ones(1,nf); | ||
12 | |||
13 | fh = colize_hist(fvs(1:nf,1:np),hb); | ||
14 | |||
15 | nw = 4; | ||
16 | fhs = colize_histneighb(fh,Is,nw); | ||
17 | |||
18 | %%%%%%%%%%%%%%%%%% | ||
19 | figure(12); | ||
20 | ct = round(ginput(1)); | ||
21 | idx = (ct(:,1)-1)*size(Is,1) + ct(:,2); | ||
22 | |||
23 | figure(1); | ||
24 | subplot(1,2,1); | ||
25 | imagesc(reshape(fhs(:,idx),nbins,nf)) | ||
26 | subplot(1,2,2); | ||
27 | imagesc(reshape(fh(:,idx),nbins,nf)) | ||
28 | %%%%%%%%%% | ||
29 | |||
30 | fh = fhs; | ||
31 | fhs = sqrt(fhs); | ||
32 | |||
33 | fh_inner = fhs*fhs'; | ||
34 | |||
35 | nv = 30; | ||
36 | |||
37 | [u,d] = eigs(fh_inner,nv); d = diag(d); | ||
38 | |||
39 | figure(3); | ||
40 | for j=1:min(16,nv), | ||
41 | subplot(4,4,j); | ||
42 | %plot(u(:,j)); | ||
43 | im(reshape(u(:,j),nbins,nf)); | ||
44 | title(num2str(j)); | ||
45 | end | ||
46 | |||
47 | s = 1./sqrt(d); | ||
48 | |||
49 | back_v = (fhs'*u(:,1:nv)).*(ones(np,1)*s(1:nv)'); | ||
50 | |||
51 | figure(4); | ||
52 | for j=1:min(16,nv), | ||
53 | subplot(4,4,j); | ||
54 | im(reshape(back_v(:,j),size(Is,1),size(Is,2)));axis('off'); | ||
55 | title(num2str(j)); | ||
56 | end | ||
57 | |||
58 | figure(1); | ||
59 | semilogy(d,'p-'); | ||
60 | %figure(2);imagesc(u); | ||
61 | |||
62 | %%%%%%%%% | ||
63 | figure(12); | ||
64 | ct = round(ginput(1)); | ||
65 | idx = (ct(:,1)-1)*size(Is,1) + ct(:,2); | ||
66 | |||
67 | figure(5); | ||
68 | for j = 1:min(14,nv), | ||
69 | subplot(7,2,j); | ||
70 | nvv = j; | ||
71 | dist = back_v(idx,1:nvv)*back_v(:,1:nvv)'; | ||
72 | im(reshape(abs(dist).^2,size(Is,1),size(Is,2)));colorbar | ||
73 | axis('off');title(num2str(nvv)); | ||
74 | end | ||
75 | |||
76 | |||
77 | |||
78 | |||
79 | %%%%%%%%% try the joint x-I histogram bin %%%%%%%%%%%%% | ||
80 | |||
81 | x = [1:size(Is,1)]'*ones(1,size(Is,2)); | ||
82 | x = reshape(x,size(Is,1),size(Is,2)); | ||
83 | |||
84 | joint_f(:,:,1) = x; | ||
85 | joint_f(:,:,2) = Is; | ||
86 | |||
87 | fvs = colize(joint_f,Is); | ||
88 | |||
89 | nf = 2;np = 7442;nbins = [5,10]; | ||
90 | |||
91 | hb.sigs = [4,0.02].*ones(1,nf); | ||
92 | hb.bmins= [1,0].*ones(1,nf); | ||
93 | hb.bmaxs= [size(Is,1),1].*ones(1,nf); | ||
94 | hb.nbins= nbins.*ones(1,nf); | ||
95 | |||
96 | fh = colize_joint_hist(fvs,hb); | ||
97 | fh = reshape(fh,50,np); | ||
98 | |||
99 | fh_inner = fh*fh'; | ||
100 | |||
101 | nv = 30; | ||
102 | |||
103 | [u,d] = eigs(fh_inner,nv); d = diag(d); | ||
104 | |||
105 | figure(3); | ||
106 | for j=1:min(16,nv), | ||
107 | subplot(4,4,j); | ||
108 | im(reshape(u(:,j),5,10));axis('off'); | ||
109 | title(num2str(j)); | ||
110 | end | ||
111 | |||
112 | s = 1./sqrt(d); | ||
113 | |||
114 | back_v = (fh'*u(:,1:nv)).*(ones(np,1)*s(1:nv)'); | ||
115 | |||
116 | figure(4); | ||
117 | for j=1:min(16,nv), | ||
118 | subplot(4,4,j); | ||
119 | im(reshape(back_v(:,j),size(Is,1),size(Is,2)));axis('off'); | ||
120 | title(num2str(j)); | ||
121 | end | ||
122 | |||
123 | |||
124 | %%%%%%%% | ||
125 | |||
126 | |||
127 | joint_f = []; | ||
128 | |||
129 | joint_f(:,:,1) = Is; | ||
130 | joint_f(:,:,2) = ts(:,:,1); | ||
131 | |||
132 | fvs = colize(joint_f,Is); | ||
133 | |||
134 | nf = 2;np = 7442;nbins = [10,10]; | ||
135 | |||
136 | hb.sigs = [0.02,0.02].*ones(1,nf); | ||
137 | hb.bmins= [0,-0.6].*ones(1,nf); | ||
138 | hb.bmaxs= [1,0.6].*ones(1,nf); | ||
139 | hb.nbins= nbins.*ones(1,nf); | ||
140 | |||
141 | fh = colize_joint_hist(fvs,hb); | ||
142 | |||
143 | fh = reshape(fh,size(fh,1)*size(fh,2),np); | ||
144 | |||
145 | fh_inner = fh*fh'; | ||
146 | |||
147 | nv = 30; | ||
148 | |||
149 | [u,d] = eigs(fh_inner,nv); d = diag(d); | ||
150 | |||
151 | figure(3); | ||
152 | for j=1:min(16,nv), | ||
153 | subplot(4,4,j); | ||
154 | im(reshape(u(:,j),10,10));axis('off'); | ||
155 | title(num2str(j)); | ||
156 | end | ||
157 | |||
158 | s = 1./sqrt(d); | ||
159 | |||
160 | back_v = (fh'*u(:,1:nv)).*(ones(np,1)*s(1:nv)'); | ||
161 | |||
162 | figure(4); | ||
163 | for j=1:min(16,nv), | ||
164 | subplot(4,4,j); | ||
165 | im(reshape(back_v(:,j),size(Is,1),size(Is,2)));axis('off'); | ||
166 | title(num2str(j)); | ||
167 | end | ||
168 | |||
169 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test_evtex4.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test_evtex4.m new file mode 100755 index 0000000..61f1307 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test_evtex4.m | |||
@@ -0,0 +1,353 @@ | |||
1 | |||
2 | setup_flag = 0; | ||
3 | cut_window_flag = 0; | ||
4 | run_flag = 0; | ||
5 | other_flag = 0; | ||
6 | test_flag = 1; | ||
7 | |||
8 | |||
9 | %%%%%%%%%%%%%%%%% | ||
10 | if setup_flag == 1, | ||
11 | % = readpgm('images/134035.pgm'); | ||
12 | |||
13 | load st3 | ||
14 | |||
15 | I_max = 255; | ||
16 | tex_max = 40; | ||
17 | |||
18 | I2 = min(1,I2/I_max); | ||
19 | t2 = t2/tex_max; | ||
20 | t2 = t2.*(t2<=1) + 1*(t2>1); | ||
21 | t2 = t2.*(t2>=-1) + (-1)*(t2<-1); | ||
22 | |||
23 | |||
24 | end | ||
25 | |||
26 | %%%%%%%%%% | ||
27 | |||
28 | %% for a given sampling rate, get the index for window center | ||
29 | %% | ||
30 | |||
31 | [nr,nc] = size(I2); | ||
32 | |||
33 | hw = 3; | ||
34 | st_sz = 2*hw + 1; | ||
35 | |||
36 | nr_chank = floor(nr/st_sz); | ||
37 | nc_chank = floor(nc/st_sz); | ||
38 | |||
39 | id_chank = []; | ||
40 | for k=1+hw:st_sz:nc-hw, | ||
41 | for j=1+hw:st_sz:nr-hw, | ||
42 | id = j+(k-1)*nr; | ||
43 | id_chank = [id_chank,id]; | ||
44 | end | ||
45 | end | ||
46 | |||
47 | %%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||
48 | |||
49 | %%%%%%%%%%%%%%%%%%%%%%%%%% | ||
50 | %%%%% F1 difference %%%%% | ||
51 | %%%%%%%%%%%%%%%%%%%%%%%%%% | ||
52 | |||
53 | fvs = 2*I2(:)'; fvs = fvs -1; | ||
54 | |||
55 | nf = 1; | ||
56 | hb.sigs = 0.02*ones(1,nf); | ||
57 | hb.bmins= -1*ones(1,nf); | ||
58 | hb.bmaxs= 1*ones(1,nf); | ||
59 | hb.nbins= 10*ones(1,nf); | ||
60 | |||
61 | fh = colize_hist(fvs(1:nf,:),hb); | ||
62 | fhs = colize_histnb_s(fh,I2,nw,hw); | ||
63 | |||
64 | A = fhs'*fhs; | ||
65 | figure(1);im(A);colorbar; | ||
66 | |||
67 | B = A; | ||
68 | |||
69 | %% display %%% | ||
70 | figure(12); | ||
71 | ct = round(ginput(1)); | ||
72 | ct_chank(1) = round((ct(1)-hw-1)/st_sz) + 1; | ||
73 | ct_chank(2) = round((ct(2)-hw-1)/st_sz) + 1; | ||
74 | |||
75 | idx = (ct_chank(:,1)-1)*nr_chank + ct_chank(:,2); | ||
76 | |||
77 | figure(3); | ||
78 | im(reshape(A(idx,:),nr_chank,nc_chank));colorbar; | ||
79 | |||
80 | |||
81 | |||
82 | %%%%%%%%%%%%%%%%%%%%%%%%%% | ||
83 | %%%%% F2 difference %%%%% | ||
84 | %%%%%%%%%%%%%%%%%%%%%%%%%% | ||
85 | |||
86 | nw = 4;hw =3; | ||
87 | |||
88 | tnf = size(t2,3); | ||
89 | fst = 1; | ||
90 | r_id = 1; | ||
91 | for j=1:fst:tnf, | ||
92 | nf = fst; | ||
93 | hb.sigs = 0.02*ones(1,nf); hb.bmins= -1*ones(1,nf); | ||
94 | hb.bmaxs= 1*ones(1,nf); hb.nbins= 10*ones(1,nf); | ||
95 | |||
96 | fvs = colize(t2(:,:,j:j+fst-1),I2); | ||
97 | fh = colize_hist(fvs,hb); | ||
98 | fhs = colize_histnb_s(fh,I2,nw,hw); | ||
99 | A = fhs'*fhs; | ||
100 | cm = sprintf('save F%d A fhs',r_id+1); | ||
101 | disp(cm);eval(cm); | ||
102 | clear fh; | ||
103 | |||
104 | B = B + A; | ||
105 | |||
106 | clear A; | ||
107 | |||
108 | |||
109 | r_id = r_id +1; | ||
110 | end | ||
111 | |||
112 | |||
113 | %%%%%% debug + display %%%%%%%% | ||
114 | |||
115 | figure(6); | ||
116 | for j=2:30, | ||
117 | subplot(5,6,j); | ||
118 | im(t2(:,:,j-1));axis('off');title(num2str(j-1)); | ||
119 | end | ||
120 | subplot(5,6,1);im(I2);axis('off'); | ||
121 | |||
122 | |||
123 | figure(6); | ||
124 | B = zeros(size(A)); | ||
125 | for j = 1:31, | ||
126 | %subplot(5,6,j); | ||
127 | cm = sprintf('load F%d;',j); | ||
128 | disp(cm);eval(cm); | ||
129 | |||
130 | fhs1 = sqrt(fhs); A = fhs1'*fhs1; | ||
131 | % im(reshape(A(idx,:),nr_chank,nc_chank));axis('off');title(num2str(j-1));colorbar; | ||
132 | B = B+A; | ||
133 | end | ||
134 | |||
135 | |||
136 | %%%%%% disp dist. %%%%%% | ||
137 | figure(12); | ||
138 | ct = round(ginput(1));ct_chank(1) = round((ct(1)-hw-1)/st_sz) + 1; | ||
139 | ct_chank(2) = round((ct(2)-hw-1)/st_sz) + 1; | ||
140 | |||
141 | idx = (ct_chank(:,1)-1)*nr_chank + ct_chank(:,2); | ||
142 | |||
143 | figure(2); | ||
144 | im(reshape(B(idx,:),nr_chank,nc_chank));axis('off');title('B');colorbar; | ||
145 | |||
146 | |||
147 | |||
148 | %%%%%%%%%%%%%%%%%%%%%%%%%% | ||
149 | %%%%% F3 features %%%%%% | ||
150 | %%%%%%%%%%%%%%%%%%%%%%%%%% | ||
151 | |||
152 | %%% Joint Intensity with filters %%%% | ||
153 | |||
154 | |||
155 | tnf = size(t2,3); | ||
156 | |||
157 | plaatjeon = 1; | ||
158 | if plaatjeon, | ||
159 | for j=7:tnf, | ||
160 | cm = sprintf('!touch /disks/plaatje/scratch/jshi/FJ%d.mat',j); | ||
161 | disp(cm); | ||
162 | eval(cm);cm = sprintf('!ln -s /disks/plaatje/scratch/jshi/FJ%d.mat .',j); | ||
163 | disp(cm);eval(cm); | ||
164 | end | ||
165 | else | ||
166 | for j=1:1, | ||
167 | cm = sprintf('!touch ~/store/st/FJ%d.mat',j); | ||
168 | disp(cm);eval(cm); | ||
169 | cm = sprintf('!ln -s ~/store/st/FJ%d.mat .',j); | ||
170 | disp(cm);eval(cm); | ||
171 | end | ||
172 | end | ||
173 | |||
174 | for j=7:tnf, | ||
175 | nf = 2; | ||
176 | hb.sigs = 0.02*ones(1,nf); hb.bmins= -1*ones(1,nf); | ||
177 | hb.bmaxs= 1*ones(1,nf); hb.nbins= 10*ones(1,nf); | ||
178 | |||
179 | fvs = colize(cat(3,t2(:,:,j),I2)); | ||
180 | |||
181 | fhs = colize_histnb_sf(fvs,I2,hb,nw,hw); | ||
182 | fhs = sqrt(fhs); | ||
183 | A = fhs'*fhs; | ||
184 | cm = sprintf('save FJ%d A fhs',j); | ||
185 | disp(cm);eval(cm); | ||
186 | |||
187 | end | ||
188 | |||
189 | %%%% reload data %%%%%%%%%%%%%% | ||
190 | B = zeros(size(A)); | ||
191 | |||
192 | figure(3); | ||
193 | |||
194 | for j=1:tnf, | ||
195 | cm = sprintf('load FJ%d;',j); | ||
196 | disp(cm);eval(cm); | ||
197 | |||
198 | subplot(5,6,j); | ||
199 | im(reshape(A(idx,:),nr_chank,nc_chank));axis('off');title(num2str(j)); | ||
200 | |||
201 | B = B + A; | ||
202 | end | ||
203 | |||
204 | figure(2);im(reshape(B(idx,:),nr_chank,nc_chank));axis('off');title('B'); | ||
205 | |||
206 | |||
207 | %%%%%% disp dist. %%%%%% | ||
208 | figure(12); | ||
209 | ct = round(ginput(1));ct_chank(1) = round((ct(1)-hw-1)/st_sz) + 1; | ||
210 | ct_chank(2) = round((ct(2)-hw-1)/st_sz) + 1; | ||
211 | idx = (ct_chank(:,1)-1)*nr_chank + ct_chank(:,2); | ||
212 | |||
213 | figure(2); | ||
214 | im(reshape(A(idx,:),nr_chank,nc_chank));axis('off');colorbar; | ||
215 | |||
216 | %%%%%% disp Joint Hist %%%%%%%%% | ||
217 | |||
218 | figure(12); | ||
219 | ct = round(ginput(1));ct_chank(1) = round((ct(1)-hw-1)/st_sz) + 1; | ||
220 | ct_chank(2) = round((ct(2)-hw-1)/st_sz) + 1; | ||
221 | idx = (ct_chank(:,1)-1)*nr_chank + ct_chank(:,2); | ||
222 | |||
223 | figure(1); | ||
224 | im(reshape(fhs(:,idx),10,10));axis('off');colorbar; | ||
225 | |||
226 | |||
227 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||
228 | %%%%% F4: Joint filters %%%%%% | ||
229 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||
230 | |||
231 | |||
232 | |||
233 | tnf = size(t2,3); | ||
234 | |||
235 | nw = 4;hw =3; | ||
236 | |||
237 | for scale=1:5, | ||
238 | for angle = 1:3, | ||
239 | cm = sprintf('!touch /disks/plaatje/scratch/jshi/FFJ_%d_%d_%d_%d.mat',angle,angle+3,scale,scale); | ||
240 | disp(cm);eval(cm); | ||
241 | cm = sprintf('!ln -s /disks/plaatje/scratch/jshi/FFJ_%d_%d_%d_%d.mat .',angle,angle+3,scale,scale); | ||
242 | disp(cm);eval(cm); | ||
243 | end | ||
244 | end | ||
245 | |||
246 | |||
247 | for scale = 1:5, | ||
248 | for angle = 1:3, | ||
249 | nf = 2; | ||
250 | hb.sigs = 0.02*ones(1,nf); hb.bmins= -1*ones(1,nf); | ||
251 | hb.bmaxs= 1*ones(1,nf); hb.nbins= 10*ones(1,nf); | ||
252 | |||
253 | fvs = colize(cat(3,t2(:,:,(scale-1)*6+angle),... | ||
254 | t2(:,:,(scale-1)*6+angle+3))); | ||
255 | |||
256 | fhs = colize_histnb_sf(fvs,I2,hb,nw,hw); | ||
257 | fhs = sqrt(fhs); | ||
258 | A = fhs'*fhs; | ||
259 | cm = sprintf('save FFJ_%d_%d_%d_%d A fhs',angle,angle+3,scale,scale); | ||
260 | disp(cm);eval(cm); | ||
261 | end | ||
262 | end | ||
263 | |||
264 | |||
265 | %%%%%%%%% load results %%%%%%%%%%% | ||
266 | %B = zeros(size(A)); | ||
267 | |||
268 | figure(3); | ||
269 | for scale=1:5, | ||
270 | for angle = 1:3, | ||
271 | cm = sprintf('load FFJ_%d_%d_%d_%d.mat',angle,angle+3,scale,scale); | ||
272 | disp(cm);eval(cm); | ||
273 | |||
274 | subplot(3,5,scale+(angle-1)*5); | ||
275 | im(reshape(A(idx,:),nr_chank,nc_chank)); | ||
276 | axis('off');title(sprintf('%d-%d,%d',angle,angle+3,scale)); | ||
277 | |||
278 | %B = B + A; | ||
279 | end | ||
280 | end | ||
281 | |||
282 | |||
283 | |||
284 | |||
285 | %%% disp results | ||
286 | |||
287 | angle = 1;scale = 1; | ||
288 | cm = sprintf('load FFJ_%d_%d_%d_%d.mat',angle,angle+3,scale,scale); | ||
289 | disp(cm);eval(cm); | ||
290 | |||
291 | |||
292 | |||
293 | figure(12); | ||
294 | ct = round(ginput(1));ct_chank(1) = round((ct(1)-hw-1)/st_sz) + 1; | ||
295 | ct_chank(2) = round((ct(2)-hw-1)/st_sz) + 1; | ||
296 | idx = (ct_chank(:,1)-1)*nr_chank + ct_chank(:,2); | ||
297 | |||
298 | %figure(1);im(reshape(fhs(:,idx),10,10));axis('off');%colorbar; | ||
299 | %figure(2);im(reshape(A(idx,:),nr_chank,nc_chank));%axis('off');%title('B'); | ||
300 | figure(4);im(reshape(B(idx,:),nr_chank,nc_chank));%axis('off');%title('B'); | ||
301 | |||
302 | |||
303 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||
304 | |||
305 | %%%%%% reduction %%%%%%%%%%%%%%%%% | ||
306 | nv = 50; | ||
307 | [uB,dB] = eigs(B,nv);dB = diag(dB); | ||
308 | |||
309 | figure(1);subplot(2,1,1);plot(dB,'p-'); | ||
310 | subplot(2,1,2);semilogy(dB,'p-'); | ||
311 | |||
312 | figure(2); | ||
313 | |||
314 | for j=1:20, | ||
315 | subplot(4,5,j); | ||
316 | im(reshape(uB(:,j),nr_chank,nc_chank));axis('off');colorbar;title(num2str(j)); | ||
317 | end | ||
318 | |||
319 | |||
320 | %%%%% Ncut without reduction %%%% | ||
321 | [uNu,dNu] = eig_decomp_v5(B,20); | ||
322 | |||
323 | figure(1);subplot(2,1,1);plot(dNu,'p-'); | ||
324 | subplot(2,1,2);semilogy(dNu,'p-'); | ||
325 | |||
326 | figure(2); | ||
327 | for j=2:6, | ||
328 | subplot(1,5,j-1); | ||
329 | im(reshape(-uNu(:,j),nr_chank,nc_chank));axis('off');colorbar;title(num2str(j)); | ||
330 | end | ||
331 | |||
332 | %%%%%% Ncut with reduction %%%%%%%%% | ||
333 | nvv = 6; | ||
334 | B1 = uB(:,1:nvv)*uB(:,1:nvv)'; | ||
335 | |||
336 | |||
337 | [uN,dN] = eig_decomp_v5(abs(B1),20); | ||
338 | |||
339 | figure(1);subplot(2,1,1);plot(dN,'p-'); | ||
340 | subplot(2,1,2);semilogy(dN,'p-'); | ||
341 | |||
342 | figure(3); | ||
343 | for j=2:6, | ||
344 | subplot(1,5,j-1); | ||
345 | im(reshape(uN(:,j),nr_chank,nc_chank));axis('off');colorbar;title(num2str(j)); | ||
346 | end | ||
347 | |||
348 | |||
349 | %%%%%% | ||
350 | |||
351 | |||
352 | |||
353 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test_evtex5.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test_evtex5.m new file mode 100755 index 0000000..2b86e0a --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test_evtex5.m | |||
@@ -0,0 +1,446 @@ | |||
1 | |||
2 | setup_flag = 0; | ||
3 | cut_window_flag = 0; | ||
4 | run_flag = 0; | ||
5 | other_flag = 0; | ||
6 | test_flag = 1; | ||
7 | |||
8 | |||
9 | %%%%%%%%%%%%%%%%% | ||
10 | if setup_flag == 1, | ||
11 | |||
12 | sigs = [1/sqrt(2),1,sqrt(2),2,2*sqrt(2)];r = 3;szs = round(r*3*sigs); | ||
13 | szs = szs(length(szs))*ones(1,length(szs)); | ||
14 | num_ori = 6; | ||
15 | |||
16 | compute_flag = 0; | ||
17 | if compute_flag, | ||
18 | fnames = [134002,134007,134011,134013,130065,130038,130039,130040,130042,... | ||
19 | 130045,130046,130056,130068]; | ||
20 | |||
21 | for j=1:length(fnames), | ||
22 | fname = sprintf('images/%d.pgm',fnames(j)); | ||
23 | |||
24 | cm = sprintf('!touch /disks/plaatje/scratch/jshi/Fe_%d.mat',fnames(j)); | ||
25 | disp(cm);eval(cm); | ||
26 | |||
27 | cm = sprintf('!ln -s /disks/plaatje/scratch/jshi/Fe_%d.mat .',fnames(j)); | ||
28 | disp(cm);eval(cm); | ||
29 | |||
30 | disp(fname); | ||
31 | I = readpgm(fname);figure(3);im(I);title(num2str(fname));drawnow; | ||
32 | [text_des,filters] = compute_filter_fft(I,sigs,r,szs,num_ori); | ||
33 | |||
34 | cm = sprintf('save Fe_%d text_des filters fname sigs r szs num_ori',fnames(j)); | ||
35 | disp(cm);eval(cm); | ||
36 | |||
37 | clear text_des filters I | ||
38 | end | ||
39 | |||
40 | end | ||
41 | else | ||
42 | %%%%%%%%%%%%% | ||
43 | fname = 134013; | ||
44 | |||
45 | Iname = sprintf('images/%d.pgm',fname); | ||
46 | I = readpgm(Iname); | ||
47 | |||
48 | cm = sprintf('load Fe_%d.mat',fname); | ||
49 | disp(cm);eval(cm); | ||
50 | |||
51 | figure(1);im(I); | ||
52 | |||
53 | |||
54 | cutsz =20; | ||
55 | I = cutoff(I,cutsz);figure(1);im(I); | ||
56 | text_des = cutoff(text_des,cutsz); | ||
57 | |||
58 | figure(2); | ||
59 | for j =1:30, | ||
60 | subplot(5,6,j);im(text_des(:,:,j));axis('off'); | ||
61 | end | ||
62 | |||
63 | I1 = I(20:200,70:240); | ||
64 | T1 = text_des(20:200,70:240,:); | ||
65 | |||
66 | save st_134013 I1 T1 fname sigs szs r num_ori | ||
67 | |||
68 | end | ||
69 | |||
70 | |||
71 | |||
72 | %%%%%%%%%%% normalization %%%%%%%%%%% | ||
73 | |||
74 | |||
75 | I_max = 250; | ||
76 | tex_max = 40; | ||
77 | |||
78 | I1 = min(1,I1/I_max); | ||
79 | T1 = T1/tex_max; | ||
80 | T1 = T1.*(T1<=1) + 1*(T1>1); | ||
81 | T1 = T1.*(T1>=-1) + (-1)*(T1<-1); | ||
82 | |||
83 | |||
84 | end | ||
85 | |||
86 | %%%%%%%%%% | ||
87 | |||
88 | %% for a given sampling rate, get the index for window center | ||
89 | %% | ||
90 | |||
91 | [nr,nc] = size(I1); | ||
92 | |||
93 | hw = 3; | ||
94 | st_sz = 2*hw + 1; | ||
95 | |||
96 | nr_chank = floor(nr/st_sz); | ||
97 | nc_chank = floor(nc/st_sz); | ||
98 | |||
99 | id_chank = []; | ||
100 | for k=1+hw:st_sz:nc-hw, | ||
101 | for j=1+hw:st_sz:nr-hw, | ||
102 | id = j+(k-1)*nr; | ||
103 | id_chank = [id_chank,id]; | ||
104 | end | ||
105 | end | ||
106 | |||
107 | %%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||
108 | |||
109 | %%%%%%%%%%%%%%%%%%%%%%%%%% | ||
110 | %%%%% F1 difference %%%%% | ||
111 | %%%%%%%%%%%%%%%%%%%%%%%%%% | ||
112 | |||
113 | fvs = 2*I1(:)'; fvs = fvs -1; | ||
114 | |||
115 | nf = 1; | ||
116 | hb.sigs = 0.02*ones(1,nf); | ||
117 | hb.bmins= -1*ones(1,nf); | ||
118 | hb.bmaxs= 1*ones(1,nf); | ||
119 | hb.nbins= 10*ones(1,nf); | ||
120 | nw = 4;hw =3; | ||
121 | |||
122 | fh = colize_hist(fvs(1:nf,:),hb); | ||
123 | fhs = colize_histnb_s(fh,I1,nw,hw); | ||
124 | |||
125 | fhs = sqrt(fhs); | ||
126 | A = fhs'*fhs; | ||
127 | figure(2);im(A);colorbar; | ||
128 | |||
129 | B = A; | ||
130 | |||
131 | %% display %%% | ||
132 | figure(2); | ||
133 | ct = round(ginput(1)); | ||
134 | ct_chank(1) = round((ct(1)-hw-1)/st_sz) + 1; | ||
135 | ct_chank(2) = round((ct(2)-hw-1)/st_sz) + 1; | ||
136 | |||
137 | idx = (ct_chank(:,1)-1)*nr_chank + ct_chank(:,2); | ||
138 | |||
139 | figure(3);im(reshape(A(idx,:),nr_chank,nc_chank));colorbar; | ||
140 | |||
141 | subplot(1,2,1);im(reshape(A1(idx,:),nr_chank,nc_chank));colorbar; | ||
142 | subplot(1,2,2);im(reshape(A2(idx,:),nr_chank,nc_chank));colorbar; | ||
143 | |||
144 | |||
145 | %%%%%%%%%% | ||
146 | save_flag = 0; | ||
147 | |||
148 | fn = 134013; | ||
149 | |||
150 | if save_flag, | ||
151 | cm = sprintf('save F1_%d fhs hw nw nr_chank nc_chank',fn); | ||
152 | disp(cm);eval(cm); | ||
153 | |||
154 | end | ||
155 | |||
156 | load_flag = 1; | ||
157 | if load_flag, | ||
158 | cm = sprintf('load F1_%d',fn); | ||
159 | disp(cm);eval(cm); | ||
160 | |||
161 | A=fhs'*fhs; | ||
162 | end | ||
163 | |||
164 | |||
165 | %%%%%%%%%%%%%%%%%%%%%%%%%% | ||
166 | %%%%% F2 difference %%%%% | ||
167 | %%%%%%%%%%%%%%%%%%%%%%%%%% | ||
168 | |||
169 | nw = 4;hw =3; | ||
170 | |||
171 | tnf = size(T1,3); | ||
172 | fst = 1; | ||
173 | |||
174 | for j=1:fst:1, | ||
175 | nf = fst; | ||
176 | hb.sigs = 0.02*ones(1,nf); hb.bmins= -1*ones(1,nf); | ||
177 | hb.bmaxs= 1*ones(1,nf); hb.nbins= 15*ones(1,nf); | ||
178 | |||
179 | fvs = colize(T1(:,:,j:j+fst-1),I1); | ||
180 | fh = colize_hist(fvs,hb); | ||
181 | fhs = colize_histnb_s(fh,I1,nw,hw); | ||
182 | fhs = sqrt(fhs); | ||
183 | |||
184 | A = fhs'*fhs; | ||
185 | |||
186 | cm = sprintf('save F2_%d_%d fhs hw nw nr_chank nc_chank',j,fn); | ||
187 | disp(cm);eval(cm); | ||
188 | clear fh; | ||
189 | |||
190 | B = B + A; | ||
191 | |||
192 | clear A; | ||
193 | |||
194 | end | ||
195 | |||
196 | |||
197 | %%%%%% debug + display %%%%%%%% | ||
198 | |||
199 | figure(6); | ||
200 | for j=2:30, | ||
201 | subplot(5,6,j); | ||
202 | im(T1(:,:,j-1));axis('off');title(num2str(j-1)); | ||
203 | end | ||
204 | subplot(5,6,1);im(I1);axis('off'); | ||
205 | |||
206 | |||
207 | figure(6); | ||
208 | B = zeros(size(A)); | ||
209 | for j = 1:31, | ||
210 | %subplot(5,6,j); | ||
211 | cm = sprintf('load F%d;',j); | ||
212 | disp(cm);eval(cm); | ||
213 | |||
214 | fhs1 = sqrt(fhs); A = fhs1'*fhs1; | ||
215 | % im(reshape(A(idx,:),nr_chank,nc_chank));axis('off');title(num2str(j-1));colorbar; | ||
216 | B = B+A; | ||
217 | end | ||
218 | |||
219 | |||
220 | %%%%%% disp dist. %%%%%% | ||
221 | weight= 5; | ||
222 | A = weight*B+B2; | ||
223 | |||
224 | figure(1); | ||
225 | ct = round(ginput(1));ct_chank(1) = round((ct(1)-hw-1)/st_sz) + 1; | ||
226 | ct_chank(2) = round((ct(2)-hw-1)/st_sz) + 1; | ||
227 | idx = (ct_chank(:,1)-1)*nr_chank + ct_chank(:,2); | ||
228 | |||
229 | figure(2); | ||
230 | im(reshape(A(idx,:),nr_chank,nc_chank));axis('off');colorbar; %title('B'); | ||
231 | %figure(3); | ||
232 | |||
233 | |||
234 | save_flag = 0; | ||
235 | if save_flag , | ||
236 | B2 = B; | ||
237 | save tmp B2 nr_chank nc_chank | ||
238 | end | ||
239 | |||
240 | %%%%%%%%%%%%%%%%%%%%%%%%%% | ||
241 | %%%%% F3 features %%%%%% | ||
242 | %%%%%%%%%%%%%%%%%%%%%%%%%% | ||
243 | |||
244 | %%% Joint Intensity with filters %%%% | ||
245 | |||
246 | |||
247 | tnf = size(T1,3); | ||
248 | |||
249 | plaatjeon = 1; | ||
250 | if plaatjeon, | ||
251 | for j=7:tnf, | ||
252 | cm = sprintf('!touch /disks/plaatje/scratch/jshi/FJ%d.mat',j); | ||
253 | disp(cm); | ||
254 | eval(cm);cm = sprintf('!ln -s /disks/plaatje/scratch/jshi/FJ%d.mat .',j); | ||
255 | disp(cm);eval(cm); | ||
256 | end | ||
257 | else | ||
258 | for j=1:1, | ||
259 | cm = sprintf('!touch ~/store/st/FJ%d.mat',j); | ||
260 | disp(cm);eval(cm); | ||
261 | cm = sprintf('!ln -s ~/store/st/FJ%d.mat .',j); | ||
262 | disp(cm);eval(cm); | ||
263 | end | ||
264 | end | ||
265 | |||
266 | for j=7:tnf, | ||
267 | nf = 2; | ||
268 | hb.sigs = 0.02*ones(1,nf); hb.bmins= -1*ones(1,nf); | ||
269 | hb.bmaxs= 1*ones(1,nf); hb.nbins= 10*ones(1,nf); | ||
270 | |||
271 | fvs = colize(cat(3,T1(:,:,j),I1)); | ||
272 | |||
273 | fhs = colize_histnb_sf(fvs,I1,hb,nw,hw); | ||
274 | fhs = sqrt(fhs); | ||
275 | A = fhs'*fhs; | ||
276 | cm = sprintf('save FJ%d A fhs',j); | ||
277 | disp(cm);eval(cm); | ||
278 | |||
279 | end | ||
280 | |||
281 | %%%% reload data %%%%%%%%%%%%%% | ||
282 | B = zeros(size(A)); | ||
283 | |||
284 | figure(3); | ||
285 | |||
286 | for j=1:tnf, | ||
287 | cm = sprintf('load FJ%d;',j); | ||
288 | disp(cm);eval(cm); | ||
289 | |||
290 | subplot(5,6,j); | ||
291 | im(reshape(A(idx,:),nr_chank,nc_chank));axis('off');title(num2str(j)); | ||
292 | |||
293 | B = B + A; | ||
294 | end | ||
295 | |||
296 | figure(2);im(reshape(B(idx,:),nr_chank,nc_chank));axis('off');title('B'); | ||
297 | |||
298 | |||
299 | %%%%%% disp dist. %%%%%% | ||
300 | figure(12); | ||
301 | ct = round(ginput(1));ct_chank(1) = round((ct(1)-hw-1)/st_sz) + 1; | ||
302 | ct_chank(2) = round((ct(2)-hw-1)/st_sz) + 1; | ||
303 | idx = (ct_chank(:,1)-1)*nr_chank + ct_chank(:,2); | ||
304 | |||
305 | figure(2); | ||
306 | im(reshape(A(idx,:),nr_chank,nc_chank));axis('off');colorbar; | ||
307 | |||
308 | %%%%%% disp Joint Hist %%%%%%%%% | ||
309 | |||
310 | figure(12); | ||
311 | ct = round(ginput(1));ct_chank(1) = round((ct(1)-hw-1)/st_sz) + 1; | ||
312 | ct_chank(2) = round((ct(2)-hw-1)/st_sz) + 1; | ||
313 | idx = (ct_chank(:,1)-1)*nr_chank + ct_chank(:,2); | ||
314 | |||
315 | figure(1); | ||
316 | im(reshape(fhs(:,idx),10,10));axis('off');colorbar; | ||
317 | |||
318 | |||
319 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||
320 | %%%%% F4: Joint filters %%%%%% | ||
321 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||
322 | |||
323 | |||
324 | |||
325 | tnf = size(T1,3); | ||
326 | |||
327 | nw = 4;hw =3; | ||
328 | |||
329 | for scale=1:5, | ||
330 | for angle = 1:3, | ||
331 | cm = sprintf('!touch /disks/plaatje/scratch/jshi/FFJ_%d_%d_%d_%d.mat',angle,angle+3,scale,scale); | ||
332 | disp(cm);eval(cm); | ||
333 | cm = sprintf('!ln -s /disks/plaatje/scratch/jshi/FFJ_%d_%d_%d_%d.mat .',angle,angle+3,scale,scale); | ||
334 | disp(cm);eval(cm); | ||
335 | end | ||
336 | end | ||
337 | |||
338 | |||
339 | for scale = 1:5, | ||
340 | for angle = 1:3, | ||
341 | nf = 2; | ||
342 | hb.sigs = 0.02*ones(1,nf); hb.bmins= -1*ones(1,nf); | ||
343 | hb.bmaxs= 1*ones(1,nf); hb.nbins= 10*ones(1,nf); | ||
344 | |||
345 | fvs = colize(cat(3,T1(:,:,(scale-1)*6+angle),... | ||
346 | T1(:,:,(scale-1)*6+angle+3))); | ||
347 | |||
348 | fhs = colize_histnb_sf(fvs,I1,hb,nw,hw); | ||
349 | fhs = sqrt(fhs); | ||
350 | A = fhs'*fhs; | ||
351 | cm = sprintf('save FFJ_%d_%d_%d_%d A fhs',angle,angle+3,scale,scale); | ||
352 | disp(cm);eval(cm); | ||
353 | end | ||
354 | end | ||
355 | |||
356 | |||
357 | %%%%%%%%% load results %%%%%%%%%%% | ||
358 | %B = zeros(size(A)); | ||
359 | |||
360 | figure(3); | ||
361 | for scale=1:5, | ||
362 | for angle = 1:3, | ||
363 | cm = sprintf('load FFJ_%d_%d_%d_%d.mat',angle,angle+3,scale,scale); | ||
364 | disp(cm);eval(cm); | ||
365 | |||
366 | subplot(3,5,scale+(angle-1)*5); | ||
367 | im(reshape(A(idx,:),nr_chank,nc_chank)); | ||
368 | axis('off');title(sprintf('%d-%d,%d',angle,angle+3,scale)); | ||
369 | |||
370 | %B = B + A; | ||
371 | end | ||
372 | end | ||
373 | |||
374 | |||
375 | |||
376 | |||
377 | %%% disp results | ||
378 | |||
379 | angle = 1;scale = 1; | ||
380 | cm = sprintf('load FFJ_%d_%d_%d_%d.mat',angle,angle+3,scale,scale); | ||
381 | disp(cm);eval(cm); | ||
382 | |||
383 | |||
384 | |||
385 | figure(12); | ||
386 | ct = round(ginput(1));ct_chank(1) = round((ct(1)-hw-1)/st_sz) + 1; | ||
387 | ct_chank(2) = round((ct(2)-hw-1)/st_sz) + 1; | ||
388 | idx = (ct_chank(:,1)-1)*nr_chank + ct_chank(:,2); | ||
389 | |||
390 | %figure(1);im(reshape(fhs(:,idx),10,10));axis('off');%colorbar; | ||
391 | %figure(2);im(reshape(A(idx,:),nr_chank,nc_chank));%axis('off');%title('B'); | ||
392 | figure(4);im(reshape(B(idx,:),nr_chank,nc_chank));%axis('off');%title('B'); | ||
393 | |||
394 | |||
395 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||
396 | |||
397 | %%%%%% reduction %%%%%%%%%%%%%%%%% | ||
398 | nv = 50; | ||
399 | [uA,dA] = eigs(A,nv);dA = diag(dA); | ||
400 | |||
401 | figure(4);suAplot(2,1,1);plot(dA,'p-'); | ||
402 | subplot(2,1,2);semilogy(dA,'p-'); | ||
403 | |||
404 | figure(3); | ||
405 | |||
406 | for j=1:20, | ||
407 | subplot(4,5,j); | ||
408 | im(reshape(uA(:,j),nr_chank,nc_chank));axis('off');colorbar;title(num2str(j)); | ||
409 | end | ||
410 | |||
411 | |||
412 | %%%%% Ncut without reduction %%%% | ||
413 | |||
414 | [uNu,dNu] = eig_decomp_v5(A,20); | ||
415 | |||
416 | figure(4);subplot(2,1,1);plot(dNu,'p-'); | ||
417 | subplot(2,1,2);semilogy(dNu,'p-'); | ||
418 | |||
419 | figure(3); | ||
420 | for j=2:6, | ||
421 | subplot(1,5,j-1); | ||
422 | im(reshape(-uNu(:,j),nr_chank,nc_chank));axis('off');colorbar;title(num2str(j)); | ||
423 | end | ||
424 | |||
425 | %%%%%% Ncut with reduction %%%%%%%%% | ||
426 | nvv = 7; | ||
427 | A1 = uA(:,1:nvv)*uA(:,1:nvv)'; | ||
428 | |||
429 | |||
430 | [uN,dN] = eig_decomp_v5(abs(A1),20); | ||
431 | |||
432 | figure(1);subplot(2,1,1);plot(dN,'p-'); | ||
433 | subplot(2,1,2);semilogy(dN,'p-'); | ||
434 | |||
435 | figure(3); | ||
436 | for j=2:6, | ||
437 | subplot(1,5,j-1); | ||
438 | im(reshape(uN(:,j),nr_chank,nc_chank));axis('off');colorbar;title(num2str(j)); | ||
439 | end | ||
440 | |||
441 | |||
442 | %%%%%% | ||
443 | |||
444 | |||
445 | |||
446 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test_motion.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test_motion.m new file mode 100755 index 0000000..91c97f9 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test_motion.m | |||
@@ -0,0 +1,117 @@ | |||
1 | |||
2 | im_sz = [40,40]; | ||
3 | |||
4 | ob_szh = [6,3]; | ||
5 | |||
6 | ob_c = [15,12]; | ||
7 | |||
8 | bg_color = 0.2; | ||
9 | |||
10 | ob_color = 0.8; | ||
11 | |||
12 | mag = 0.2; | ||
13 | |||
14 | I_bg = bg_color + mag*randn(im_sz); | ||
15 | |||
16 | I_obj = ob_color + mag*randn(2*ob_szh+1); | ||
17 | |||
18 | |||
19 | w = 3; | ||
20 | |||
21 | v5 = 1; | ||
22 | Js = []; | ||
23 | |||
24 | if ~v5, | ||
25 | for j=1:5, | ||
26 | fc = sprintf('J%d = I_bg;',j); | ||
27 | eval(fc); | ||
28 | |||
29 | fc = sprintf('J%d(ob_c(1)-ob_szh(1):ob_c(1)+ob_szh(1),ob_c(2)-ob_szh(2):ob_c(2)+ob_szh(2)) = I_obj;',j); | ||
30 | eval(fc); | ||
31 | |||
32 | ob_c = ob_c+[0,2]; | ||
33 | end | ||
34 | else | ||
35 | nf = 4; | ||
36 | for j = 1:nf, | ||
37 | |||
38 | J = I_bg; | ||
39 | J(ob_c(1)-ob_szh(1):ob_c(1)+ob_szh(1),ob_c(2)-ob_szh(2):ob_c(2)+ob_szh(2)) = I_obj; | ||
40 | |||
41 | if (j==1), | ||
42 | [gy,gx] = grad(J,w); | ||
43 | end | ||
44 | |||
45 | ob_c = ob_c+[0,2]; | ||
46 | |||
47 | Jw = cutoff(J,w); | ||
48 | Js(:,:,j) = Jw; | ||
49 | end | ||
50 | |||
51 | end | ||
52 | |||
53 | [nr,nc] = size(gx); | ||
54 | |||
55 | for j=1:nf, | ||
56 | subplot(1,nf,j); | ||
57 | imagesc(Js(:,:,j));axis('tightequal'); | ||
58 | end | ||
59 | |||
60 | |||
61 | writepnm5('test_motion.pnm',Js); | ||
62 | writepnm5('test_motion_gx.pnm',gx); | ||
63 | writepnm5('test_motion_gy.pnm',gy); | ||
64 | %imagesc(J1);colorbar; | ||
65 | |||
66 | |||
67 | inpara = [2,5,0.5,1,0.5]; | ||
68 | |||
69 | [A,D,Ipara] = cas('test_motion',inpara); | ||
70 | |||
71 | B= A+ A'; | ||
72 | clear A; | ||
73 | |||
74 | %BB = B(1:19^2,19^2+(1:19^2)); | ||
75 | %imagesc(BB); | ||
76 | |||
77 | [v,d] = eigs(B);d = diag(d); | ||
78 | |||
79 | k = 2; | ||
80 | |||
81 | figure(1); | ||
82 | %nf = 5; | ||
83 | |||
84 | nr = nr-5; | ||
85 | nc = nc-5; | ||
86 | |||
87 | n = nr* nc; | ||
88 | |||
89 | for j =1:nf, | ||
90 | subplot(1,nf,j); | ||
91 | imagesc(reshape(v((j-1)*n+(1:n),k).*D(1:n),nr,nc)');axis('tightequal'); | ||
92 | end | ||
93 | |||
94 | %%%%% | ||
95 | |||
96 | |||
97 | figure(3); | ||
98 | T = readpnm('test_motion.pnm'); | ||
99 | nf = size(T,3); | ||
100 | for j=1:nf, | ||
101 | subplot(1,nf,j); | ||
102 | imagesc(T(:,:,j));axis('tightequal'); | ||
103 | end | ||
104 | |||
105 | |||
106 | figure(2); | ||
107 | Gx = readpnm('test_motion_gx.pnm'); | ||
108 | |||
109 | [nr,nc] =size(Gx); | ||
110 | n = nr*nc; | ||
111 | |||
112 | imagesc(reshape(B(n+1:2*n,6*nc+7),nc,nr)');colorbar | ||
113 | |||
114 | |||
115 | |||
116 | |||
117 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test_motion2.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test_motion2.m new file mode 100755 index 0000000..2959fa8 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test_motion2.m | |||
@@ -0,0 +1,127 @@ | |||
1 | |||
2 | im_sz = [40,40]; | ||
3 | |||
4 | ob_szh = [4,3]; | ||
5 | |||
6 | ob_c = [12,12]; | ||
7 | |||
8 | ob_co = [30,28]; | ||
9 | |||
10 | bg_color = 0.2; | ||
11 | |||
12 | ob_color = 0.8; | ||
13 | |||
14 | mag = 0.2; | ||
15 | |||
16 | I_bg = bg_color + mag*randn(im_sz); | ||
17 | |||
18 | I_obj = ob_color + mag*randn(2*ob_szh+1); | ||
19 | |||
20 | |||
21 | w = 3; | ||
22 | |||
23 | v5 = 1; | ||
24 | Js = []; | ||
25 | |||
26 | if ~v5, | ||
27 | for j=1:5, | ||
28 | fc = sprintf('J%d = I_bg;',j); | ||
29 | eval(fc); | ||
30 | |||
31 | fc = sprintf('J%d(ob_c(1)-ob_szh(1):ob_c(1)+ob_szh(1),ob_c(2)-ob_szh(2):ob_c(2)+ob_szh(2)) = I_obj;',j); | ||
32 | eval(fc); | ||
33 | |||
34 | fc = sprintf('J%d(ob_co(1)-ob_szh(1):ob_co(1)+ob_szh(1),ob_co(2)-ob_szh(2):ob_co(2)+ob_szh(2)) = I_obj;',j); | ||
35 | eval(fc); | ||
36 | |||
37 | ob_c = ob_c+[0,2]; | ||
38 | ob_co = ob_co-[0,2]; | ||
39 | |||
40 | end | ||
41 | else | ||
42 | nf = 4; | ||
43 | for j = 1:nf, | ||
44 | |||
45 | J = I_bg; | ||
46 | J(ob_c(1)-ob_szh(1):ob_c(1)+ob_szh(1),ob_c(2)-ob_szh(2):ob_c(2)+ob_szh(2)) = I_obj; | ||
47 | J(ob_co(1)-ob_szh(1):ob_co(1)+ob_szh(1),ob_co(2)-ob_szh(2):ob_co(2)+ob_szh(2)) = I_obj; | ||
48 | |||
49 | if (j==1), | ||
50 | [gy,gx] = grad(J,w); | ||
51 | end | ||
52 | |||
53 | ob_c = ob_c+[0,2]; | ||
54 | ob_co = ob_co-[0,2]; | ||
55 | |||
56 | Jw = cutoff(J,w); | ||
57 | Js(:,:,j) = Jw; | ||
58 | end | ||
59 | |||
60 | end | ||
61 | |||
62 | [nr,nc] = size(gx); | ||
63 | |||
64 | for j=1:nf, | ||
65 | subplot(1,nf,j); | ||
66 | imagesc(Js(:,:,j));axis('tightequal'); | ||
67 | end | ||
68 | |||
69 | |||
70 | writepnm5('test_motion.pnm',Js); | ||
71 | writepnm5('test_motion_gx.pnm',gx); | ||
72 | writepnm5('test_motion_gy.pnm',gy); | ||
73 | %imagesc(J1);colorbar; | ||
74 | |||
75 | |||
76 | inpara = [2,5,0.5,1,0.5]; | ||
77 | |||
78 | [A,D,Ipara] = cas('test_motion',inpara); | ||
79 | |||
80 | B= A+ A'; | ||
81 | clear A; | ||
82 | |||
83 | %BB = B(1:19^2,19^2+(1:19^2)); | ||
84 | %imagesc(BB); | ||
85 | |||
86 | [v,d] = eigs(B);d = diag(d); | ||
87 | |||
88 | k = 2; | ||
89 | |||
90 | figure(1); | ||
91 | %nf = 5; | ||
92 | |||
93 | nr = nr-5; | ||
94 | nc = nc-5; | ||
95 | |||
96 | n = nr* nc; | ||
97 | |||
98 | for j =1:nf, | ||
99 | subplot(1,nf,j); | ||
100 | imagesc(reshape(v((j-1)*n+(1:n),k).*D(1:n),nr,nc)');axis('tightequal'); | ||
101 | end | ||
102 | |||
103 | %%%%% | ||
104 | |||
105 | |||
106 | figure(3); | ||
107 | T = readpnm('test_motion.pnm'); | ||
108 | nf = size(T,3); | ||
109 | for j=1:nf, | ||
110 | subplot(1,nf,j); | ||
111 | imagesc(T(:,:,j));axis('tightequal'); | ||
112 | end | ||
113 | |||
114 | |||
115 | figure(2); | ||
116 | Gx = readpnm('test_motion_gx.pnm'); | ||
117 | |||
118 | [nr,nc] =size(Gx); | ||
119 | n = nr*nc; | ||
120 | |||
121 | imagesc(reshape(B(n+1:2*n,6*nc+7),nc,nr)');colorbar | ||
122 | |||
123 | |||
124 | %%%%%%%%%%%%% | ||
125 | |||
126 | |||
127 | K = zeros(im_sz); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test_period.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test_period.m new file mode 100755 index 0000000..2994d15 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test_period.m | |||
@@ -0,0 +1,58 @@ | |||
1 | flag = 2; | ||
2 | |||
3 | if flag ==1, | ||
4 | |||
5 | ws = [50,50]; | ||
6 | |||
7 | figure(1);J = get_win(I,ginput(1),ws); | ||
8 | figure(4);imagesc(J); | ||
9 | |||
10 | J = J - mean(mean(reshape(J,prod(size(J)),1))); | ||
11 | X = fftshift(fft2(J)); | ||
12 | |||
13 | figure(3);imagesc(abs(X));colorbar | ||
14 | figure(2);mesh(abs(X)); | ||
15 | |||
16 | else | ||
17 | |||
18 | fn = '1.pgm'; | ||
19 | |||
20 | % spatial gaussian parameter | ||
21 | xscale = 1; | ||
22 | |||
23 | % half size of the neighbourhood | ||
24 | xnb = 5; | ||
25 | |||
26 | % setting the the HSV gaussian parameter:[h s v] | ||
27 | Iscale = [0.01]; | ||
28 | |||
29 | Input_para = [xscale,xnb,Iscale]; | ||
30 | |||
31 | % compute the lower half the association matrix | ||
32 | [A,D,Ipara] = compute_A_pgm(fn,Input_para); | ||
33 | |||
34 | nr = Ipara(1);nc = Ipara(2); | ||
35 | |||
36 | B = A+A'; | ||
37 | clear A; | ||
38 | |||
39 | |||
40 | % eigen decompostion | ||
41 | options.tol = 1e-4; | ||
42 | num_eig_v = 10; | ||
43 | fprintf('doing eigs ...\n'); | ||
44 | [v,d] = eigs(B,num_eig_v,options); | ||
45 | |||
46 | k = 1;imagesc(reshape(v(:,k).*D,nc,nr)');colorbar | ||
47 | |||
48 | |||
49 | end | ||
50 | |||
51 | |||
52 | |||
53 | |||
54 | |||
55 | |||
56 | |||
57 | |||
58 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test_text.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test_text.m new file mode 100755 index 0000000..4cc5759 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/test_text.m | |||
@@ -0,0 +1,434 @@ | |||
1 | |||
2 | |||
3 | %case = 1; | ||
4 | |||
5 | read_flag = 1; | ||
6 | compute_flag = 0; | ||
7 | load_flag = 0; | ||
8 | decomp_flag = 0; | ||
9 | hist_flag = 0; | ||
10 | |||
11 | test_real = 0; | ||
12 | |||
13 | |||
14 | if read_flag, | ||
15 | if caseid == 1, | ||
16 | ifn = 'images/130049.pgm'; | ||
17 | elseif caseid == 2, | ||
18 | ifn = 'images/130055.pgm'; | ||
19 | elseif caseid == 3, | ||
20 | ifn = 'images/130056.pgm'; | ||
21 | elseif caseid == 4, | ||
22 | ifn = 'images/130057.pgm'; | ||
23 | elseif caseid == 5, | ||
24 | ifn = 'images/130060.pgm'; | ||
25 | elseif caseid == 6, | ||
26 | ifn = 'images/130061.pgm'; | ||
27 | elseif caseid == 7, | ||
28 | ifn = 'images/130062.pgm'; | ||
29 | elseif caseid == 8, | ||
30 | ifn = 'images/130065.pgm'; | ||
31 | elseif caseid == 9, | ||
32 | ifn = 'images/130066.pgm'; | ||
33 | elseif caseid == 10, | ||
34 | ifn = 'images/130068.pgm'; | ||
35 | elseif caseid == 11, | ||
36 | ifn = 'images/130070.pgm'; | ||
37 | else | ||
38 | ifn = 'images/130070.pgm'; | ||
39 | end | ||
40 | |||
41 | I = readpgm(ifn); | ||
42 | figure(1); | ||
43 | imagesc(I);colormap(gray);drawnow; | ||
44 | axis('tightequal'); | ||
45 | |||
46 | end | ||
47 | |||
48 | %%%%% load %%% | ||
49 | |||
50 | if load_flag, | ||
51 | fn = sprintf('load cresult_%d;',caseid); | ||
52 | eval(fn); | ||
53 | end | ||
54 | |||
55 | |||
56 | %%%%%%%%%%%%% compute %%%%%%%%%%% | ||
57 | sig = 0.5; | ||
58 | r = 3; | ||
59 | sz = 15; | ||
60 | Iw = cutoff(I,0.5*sz); | ||
61 | figure(1);imagesc(Iw); | ||
62 | axis('image'); | ||
63 | |||
64 | if compute_flag, | ||
65 | |||
66 | as = 0:30:150; | ||
67 | |||
68 | Cresult = []; | ||
69 | |||
70 | for j = 1:length(as), | ||
71 | fprintf('.'); | ||
72 | angle = as(j); | ||
73 | |||
74 | g = doog2( sig,r,angle,sz); | ||
75 | |||
76 | g = g - mean(reshape(g,prod(size(g)),1)); | ||
77 | |||
78 | g = g/sum(sum(abs(g))); | ||
79 | |||
80 | c = conv2(I,g,'valid'); | ||
81 | |||
82 | Cresult(:,:,j) = c; | ||
83 | end | ||
84 | |||
85 | |||
86 | fprintf('\n'); | ||
87 | |||
88 | |||
89 | figure(2); | ||
90 | |||
91 | subplot(2,3,1); | ||
92 | imagesc(Cresult(:,:,1).^2);axis('tightequal');colorbar | ||
93 | |||
94 | subplot(2,3,2); | ||
95 | imagesc(Cresult(:,:,2).^2);axis('tightequal');colorbar | ||
96 | |||
97 | subplot(2,3,3); | ||
98 | imagesc(Cresult(:,:,3).^2);axis('tightequal');colorbar | ||
99 | |||
100 | subplot(2,3,4); | ||
101 | imagesc(Cresult(:,:,4).^2);axis('tightequal');colorbar | ||
102 | |||
103 | subplot(2,3,5); | ||
104 | imagesc(Cresult(:,:,5).^2);axis('tightequal');colorbar | ||
105 | |||
106 | subplot(2,3,6); | ||
107 | imagesc(Cresult(:,:,6).^2);axis('tightequal');colorbar | ||
108 | |||
109 | Cs = []; | ||
110 | Mcs = []; | ||
111 | for j=1:length(as), | ||
112 | Cs(:,:,j) = reduce(reduce(abs(Cresult(:,:,j)))); | ||
113 | |||
114 | Mcs = [Mcs,max(max(Cs(:,:,j)))]; | ||
115 | |||
116 | end | ||
117 | |||
118 | ms = max(Mcs); | ||
119 | |||
120 | figure(3); | ||
121 | for j=1:6, | ||
122 | fn = sprintf('Cs(:,:,%d) = Cs(:,:,%d)/ms;',j,j); | ||
123 | eval(fn); | ||
124 | fn = sprintf('subplot(2,3,%d);imagesc(Cs(:,:,%d));',j,j); | ||
125 | eval(fn);axis('tightequal');colorbar | ||
126 | end | ||
127 | |||
128 | fn = sprintf('save cresult_%d.mat Cresult Cs',caseid); | ||
129 | disp(fn); | ||
130 | eval(fn); | ||
131 | |||
132 | end | ||
133 | |||
134 | %%%%%%%%%%%%%%%%% decomp %%%%%%%%%%%% | ||
135 | |||
136 | |||
137 | if decomp_flag, | ||
138 | |||
139 | %writepnm5('txt_2.pnm',Cs); | ||
140 | |||
141 | %writepnm5('130068.pnm',Cs); | ||
142 | |||
143 | |||
144 | %I_scale = 0.0025; | ||
145 | %X_scale = 3^2; | ||
146 | %[A,D,Ipara] = compute_A_sparmul2(10,I_scale,X_scale); | ||
147 | |||
148 | |||
149 | I_scale = 0.02; | ||
150 | X_scale = 2; | ||
151 | [A,D,Ipara] = compute_A_pnm('130068.pnm',[X_scale,I_scale]); | ||
152 | |||
153 | nr = Ipara(1);nc = Ipara(2); | ||
154 | imagesc(reshape(D,nc,nr)');colorbar; | ||
155 | |||
156 | B = A+A';clear A; | ||
157 | |||
158 | options.tol = 1e-7; | ||
159 | |||
160 | [v,d] = eigs(B,9,options); | ||
161 | |||
162 | figure(4); | ||
163 | k = 1; imagesc(reshape(v(:,k).*D,nc,nr)'); | ||
164 | |||
165 | end | ||
166 | |||
167 | |||
168 | %%%% histogram %%%% | ||
169 | |||
170 | %hist_flag = 1; | ||
171 | |||
172 | %figure(1);imagesc(Iw);axis('image'); | ||
173 | if hist_flag ==1, | ||
174 | |||
175 | |||
176 | ws = [12,12]; | ||
177 | |||
178 | figure(7); | ||
179 | |||
180 | cs = ginput(1); | ||
181 | |||
182 | cs = 10*(cs-1)+w/2; | ||
183 | |||
184 | %cs(1,:) = w+(floor((cs(1,:)-w)/gap)*gap); | ||
185 | %cs(2,:) = w+(floor((cs(2,:)-w)/gap)*gap); | ||
186 | |||
187 | J = get_win(Iw,cs(1,:),ws); | ||
188 | Jbar = get_win5(Cresult,cs(1,:),ws); | ||
189 | |||
190 | |||
191 | figure(2); | ||
192 | subplot(3,3,1);imagesc(J);colorbar | ||
193 | for j=1:6,subplot(3,3,1+j);imagesc(abs(Jbar(:,:,j)));colorbar; end | ||
194 | |||
195 | [hists,bins] = get_hist(J,Jbar);show_hist(hists,bins,4); | ||
196 | cumhists = get_cumhist(hists);show_cumhist(cumhists,bins,6,1,'b-o'); | ||
197 | |||
198 | J2 = get_win(Iw,cs(2,:),ws); | ||
199 | Jbar2 = get_win5(Cresult,cs(2,:),ws); | ||
200 | |||
201 | figure(3); | ||
202 | subplot(3,3,1);imagesc(J2);colorbar | ||
203 | for j=1:6,subplot(3,3,1+j);imagesc(abs(Jbar2(:,:,j)));colorbar; end | ||
204 | |||
205 | [hists2,bins2] = get_hist(J2,Jbar2);show_hist(hists2,bins2,5); | ||
206 | cumhists2 = get_cumhist(hists2);show_cumhist(cumhists2,bins2,6,0,'r-*'); | ||
207 | |||
208 | diff.inten = max(abs(cumhists.inten-cumhists2.inten)); | ||
209 | diff.mag = max(abs(cumhists.mag-cumhists2.mag)); | ||
210 | diff.text = max(max(abs(cumhists.text-cumhists2.text))); | ||
211 | |||
212 | figure(7); | ||
213 | |||
214 | disp([diff.inten,diff.mag,diff.text]); | ||
215 | maxdiff = max([diff.inten,diff.mag,diff.text]); | ||
216 | disp(1-sigmoid(diff.inten,0.22,0.02)); | ||
217 | |||
218 | |||
219 | if 0, | ||
220 | %A = pair_dist_text(Iw,Cresult,15); | ||
221 | |||
222 | r =4;w = 22;gap = 5;sig_x= 20.0; | ||
223 | inpara = [r,w,gap,sig_x,0.16,0.2,0.2]; | ||
224 | [Cum,tm] = cAh(Iw,mag,abs(Cresult),inpara); | ||
225 | |||
226 | [Cum,Nb,Nc] = cAh4(Iw,mag,abs(Cresult),inpara); | ||
227 | |||
228 | |||
229 | B = A+ A';clear A; | ||
230 | |||
231 | figure(1); | ||
232 | c = ginput(1); | ||
233 | cx = floor(c(1)/gap); | ||
234 | cy = floor(c(2)/gap); | ||
235 | [cx,cy] | ||
236 | figure(7) | ||
237 | imagesc(reshape(B(cy*Cum(1)+cx,:),Cum(1),Cum(2))');colorbar | ||
238 | |||
239 | |||
240 | cutoff = [0.22,0.2,0.2]; | ||
241 | sig_hist = [0.02,0.04,0.05]; | ||
242 | |||
243 | inpara2 = [r,5,cutoff,sig_hist]; | ||
244 | [A,D] = compute_A_hist3(tm,Cum,inpara2); | ||
245 | |||
246 | B = A+A';clear A; | ||
247 | imagesc(reshape(D,Cum(1),Cum(2))'); | ||
248 | |||
249 | |||
250 | [v,d] = eigs(B); | ||
251 | |||
252 | |||
253 | end | ||
254 | |||
255 | end | ||
256 | |||
257 | %%%%%%%%%%%%% trans_texture %%%%%%%%%%%% | ||
258 | trans_text = 0; | ||
259 | |||
260 | |||
261 | if trans_text, | ||
262 | figure(1); | ||
263 | cs = ginput(1); | ||
264 | |||
265 | ws = [40,40]; | ||
266 | |||
267 | J = get_win(Iw,cs(1,:),ws); | ||
268 | Jbar = get_win5(Cresult,cs(1,:),ws); | ||
269 | Jmag = get_win(mag,cs(1,:),ws); | ||
270 | |||
271 | figure(3);imagesc(J); | ||
272 | |||
273 | figure(3); | ||
274 | for j=1:6, | ||
275 | subplot(2,3,j);imagesc(abs(Jbar(:,:,j)));axis('image');colorbar; | ||
276 | end | ||
277 | |||
278 | f= abs(Jbar(40,38,:)); | ||
279 | g= abs(Jbar(40,47,:)); | ||
280 | |||
281 | dot(f,g)/max(dot(f,f),dot(g,g)) | ||
282 | |||
283 | ff = myinterp(f,10); gg = myinterp(g,10); | ||
284 | dot(ff,gg)/max(dot(ff,ff),dot(gg,gg)) | ||
285 | |||
286 | cum = mc_corr(ff,gg,[-6,6]); | ||
287 | max(cum)/max(dot(f,f),dot(g,g)) | ||
288 | |||
289 | |||
290 | center = [40,35]; | ||
291 | |||
292 | f = squeeze(abs(Jbar(center(1),center(2),:))); | ||
293 | ff = myinterp(f,10); | ||
294 | mag_ff = dot(ff,ff); | ||
295 | mag_c = Jmag(center(1),center(2)); | ||
296 | dy = 0; | ||
297 | |||
298 | cor_cofs = []; | ||
299 | mags = []; | ||
300 | for dx = -15:15, | ||
301 | g = squeeze(abs(Jbar(center(1)+dy,center(2)+dx,:))); | ||
302 | gg = myinterp(g,10); | ||
303 | |||
304 | cum = mc_corr(ff,gg,[-6,6]); | ||
305 | cor_cofs = [cor_cofs,max(cum)/max(mag_ff,dot(gg,gg))]; | ||
306 | |||
307 | mags =[mags,max(mag_c,Jmag(center(1)+dy,center(2)+dx,:))]; | ||
308 | |||
309 | end | ||
310 | |||
311 | simulation_on =0; | ||
312 | |||
313 | if simulation_on, | ||
314 | |||
315 | sz = [161,161] | ||
316 | SI = zeros(sz); | ||
317 | |||
318 | for i=2:18:sz(1), | ||
319 | SI(i:i+2,:) = 1+SI(i:i+2,:); | ||
320 | end | ||
321 | |||
322 | imagesc(SI);axis('image'); | ||
323 | |||
324 | tmp1 = mimrotate(SI,90,'nearest','crop'); | ||
325 | tmp2 = mimrotate(SI,45,'nearest','crop'); | ||
326 | |||
327 | ly = round(0.7*sz(1)); | ||
328 | lx = round(0.7*sz(1)); | ||
329 | sy = round(0.16*sz(1)); | ||
330 | sx = round(0.2*sz(2)); | ||
331 | TI = [tmp1(1:ly,1:lx),tmp2(sy+1:sy+ly,sy+1:sy+round(0.4*lx))]; | ||
332 | |||
333 | TI = TI+0.04*randn(size(TI)); | ||
334 | |||
335 | %sig = 1/sqrt(2);r = 3;sz = round(r*3*sig); | ||
336 | |||
337 | sigs = [1/sqrt(2),1,sqrt(2),2,2*sqrt(2)];r = 3;szs = round(r*3*sigs); | ||
338 | [text_des,TIw] = compute_filter(TI,sigs,r,szs); | ||
339 | figure(2);imagesc(TIw);axis('image'); | ||
340 | |||
341 | figure(3); | ||
342 | im5(abs(text_des),2,3); | ||
343 | |||
344 | text_des = abs(text_des); | ||
345 | |||
346 | text_des = T1; | ||
347 | |||
348 | numband = size(text_des,3); r = 10; | ||
349 | sig_x = 90; sig_inten = 0.15; sig_tex = 0.01;w_inten = 0.03; | ||
350 | para = [numband,r,sig_x,sig_inten,sig_tex,w_inten]; | ||
351 | |||
352 | [A,D,Ipara] = compute_A_text(TIw,text_des,para); | ||
353 | nr = Ipara(1);nc = Ipara(2); | ||
354 | B = A+A'; clear A; | ||
355 | |||
356 | figure(2); | ||
357 | cs = ginput(1); | ||
358 | cs = round(cs);id = cs(2)*nc+cs(1); | ||
359 | |||
360 | figure(4); | ||
361 | imagesc(reshape(B(id,:),nc,nr)');axis('image');colorbar | ||
362 | |||
363 | [v,d] = eigs(B); | ||
364 | figure(4);imagesc(reshape(D.*v(:,1),nc,nr)');axis('image'); | ||
365 | |||
366 | end | ||
367 | |||
368 | end | ||
369 | |||
370 | if test_real == 1, | ||
371 | sigs = [1/sqrt(2),1,sqrt(2),2,2*sqrt(2)];r = 3;szs = round(r*3*sigs); | ||
372 | text_des = compute_filter(I,sigs,r,szs); | ||
373 | |||
374 | text_des = abs(text_des); | ||
375 | %save filter_3.mat | ||
376 | |||
377 | %%%% cutoff margins, | ||
378 | margin = 6+10; | ||
379 | |||
380 | Iw = cutoff(I,margin); | ||
381 | |||
382 | T1= reshape(text_des,size(text_des,1),size(text_des,2),size(text_des,3)*size(text_des,4)); | ||
383 | T1 = cutoff(T1,margin); | ||
384 | |||
385 | %%%%% reduce resolution | ||
386 | |||
387 | Iwp = compact(Iw,4); | ||
388 | |||
389 | T1 = reduce_all(T1); | ||
390 | T1 = reduce_all(T1); | ||
391 | |||
392 | % T1 = T1/70; | ||
393 | |||
394 | % writepnm5('test6_image.pnm',Iwp);writepnm5('test6_filter.pnm',T1); | ||
395 | |||
396 | numband = size(T1,3); r = 2; | ||
397 | sig_x = 20; sig_inten = 0.15; sig_tex = 0.01;w_inten = 0.01; | ||
398 | para = [numband,r,sig_x,sig_inten,sig_tex,w_inten]; | ||
399 | |||
400 | [A,D,Ipara] = compute_A_text(Iwp,T1,para); | ||
401 | nr = Ipara(1);nc = Ipara(2); | ||
402 | figure(4);imagesc(reshape(D,nc,nr)');axis('image'); | ||
403 | drawnow; | ||
404 | |||
405 | |||
406 | numband = 6; | ||
407 | r = 5; sig_x = 20.0; | ||
408 | sig_tex = 0.01; w_inten = 0.01; w = 2; | ||
409 | para = [numband,r,sig_x,sig_tex,w_inten,w,size(T1,2)]; | ||
410 | |||
411 | [A,D,Ipara] = compute_A_text2(Iw,T1(:,:,1:numband)/70,para); | ||
412 | nr = Ipara(1);nc = Ipara(2); | ||
413 | |||
414 | |||
415 | |||
416 | B = A+A'; clear A; | ||
417 | |||
418 | |||
419 | figure(2); | ||
420 | cs = ginput(1); | ||
421 | cs = floor(cs/4)+1;id = cs(2)*nc+cs(1); | ||
422 | |||
423 | figure(4); | ||
424 | imagesc(reshape(B(id,:),nc,nr)');axis('image');colorbar | ||
425 | |||
426 | |||
427 | end | ||
428 | |||
429 | |||
430 | |||
431 | |||
432 | |||
433 | |||
434 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/tmp.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/tmp.m new file mode 100755 index 0000000..b932912 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/tmp.m | |||
@@ -0,0 +1,68 @@ | |||
1 | |||
2 | sw = 3; | ||
3 | gap = 2*sw+1; | ||
4 | |||
5 | nw = 6; | ||
6 | |||
7 | for j=1:20, | ||
8 | l = max(0,j-1-nw); | ||
9 | % l = max(0,j-1-2*nw); | ||
10 | rs(j) = ceil((l-sw)/gap) + 1; | ||
11 | l = min(20,j-1+nw); | ||
12 | % l = min(20,j-1); | ||
13 | re(j) = floor((l-sw)/gap) +1; | ||
14 | end | ||
15 | |||
16 | plot([1:20],rs,'p-',[1:20],re,'rp-') | ||
17 | |||
18 | |||
19 | %%%%%%%% | ||
20 | |||
21 | bin_max = 1.0; | ||
22 | bin_min = -1.0; | ||
23 | num_bin = 30; | ||
24 | sig = 0.2; | ||
25 | |||
26 | data = 0.482; | ||
27 | |||
28 | inc = (bin_max-bin_min)/num_bin; | ||
29 | |||
30 | bs = -100; | ||
31 | be = bin_min+inc; | ||
32 | b = []; | ||
33 | |||
34 | for j=1:num_bin, | ||
35 | |||
36 | b(j) = tmp1(bs,be,data,sig); | ||
37 | bs = be; | ||
38 | be= be+inc; | ||
39 | end | ||
40 | plot(b,'p-'); | ||
41 | |||
42 | |||
43 | |||
44 | bmin = -1; | ||
45 | |||
46 | inc = 0.2; | ||
47 | a = 0.1; | ||
48 | b = -1250; | ||
49 | ovs = 625; | ||
50 | |||
51 | bs = bmin; | ||
52 | be = bs+inc; | ||
53 | |||
54 | data = -0.482; | ||
55 | |||
56 | for j=1:10, | ||
57 | tmp = bs-data; | ||
58 | fs = exp(-(tmp*tmp*ovs)); | ||
59 | ks = b*tmp; | ||
60 | |||
61 | tmp = be-data; | ||
62 | fe = exp(-(tmp*tmp*ovs)); | ||
63 | ke = b*tmp; | ||
64 | |||
65 | bin(j) = fs*(2+a*ks) + fe*(2-a*ke); | ||
66 | bs = be; | ||
67 | be = be+inc; | ||
68 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/tmp1.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/tmp1.m new file mode 100755 index 0000000..db5dbc1 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/tmp1.m | |||
@@ -0,0 +1,25 @@ | |||
1 | function d = tmp1(bs,be,data,sig) | ||
2 | |||
3 | sig = sig^2; | ||
4 | |||
5 | if 1, | ||
6 | a = (bs+be)*0.5; | ||
7 | d = (a-bs)*(exp(-(bs-data)^2/sig) + exp(-(a-data)^2/sig)) + ... | ||
8 | (be-a)*(exp(-(a-data)^2/sig) + exp(-(be-data)^2/sig)); | ||
9 | d = d*2/sqrt(pi); | ||
10 | else | ||
11 | |||
12 | a = (be-bs)/2; | ||
13 | |||
14 | h1 = exp(-(bs-data)^2/sig); | ||
15 | h2 = exp(-(be-data)^2/sig); | ||
16 | |||
17 | k1 = -2*(bs-data)/sig; | ||
18 | k2 = -2*(be-data)/sig; | ||
19 | |||
20 | d = a*(h1*(2+2*a*k1) + h2*(2-2*a*k2)); | ||
21 | d = d*2/sqrt(pi); | ||
22 | |||
23 | end | ||
24 | |||
25 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/tmp2.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/tmp2.m new file mode 100755 index 0000000..b361cdc --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/tmp2.m | |||
@@ -0,0 +1,17 @@ | |||
1 | function d = tmp2(bs,be,data,sig) | ||
2 | |||
3 | sig = sig^2; | ||
4 | |||
5 | |||
6 | a = (be-bs)/2; | ||
7 | |||
8 | h1 = exp(-(bs-data)^2/sig); | ||
9 | h2 = exp(-(be-data)^2/sig); | ||
10 | |||
11 | k1 = -2*(bs-data)/sig; | ||
12 | k2 = -2*(be-data)/sig; | ||
13 | |||
14 | d = (h1*(2+2*a*k1) + h2*(2-2*a*k2)); | ||
15 | %d = a*d*2/sqrt(pi); | ||
16 | |||
17 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/tmp3.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/tmp3.m new file mode 100755 index 0000000..c1bffd9 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/tmp3.m | |||
@@ -0,0 +1,126 @@ | |||
1 | function result = erfcore(x,jint) | ||
2 | %ERFCORE Core algorithm for error functions. | ||
3 | % erf(x) = erfcore(x,0) | ||
4 | % erfc(x) = erfcore(x,1) | ||
5 | % erfcx(x) = exp(x^2)*erfc(x) = erfcore(x,2) | ||
6 | |||
7 | % C. Moler, 2-1-91. | ||
8 | % Copyright (c) 1984-96 by The MathWorks, Inc. | ||
9 | % $Revision: 5.7 $ $Date: 1996/10/28 20:57:59 $ | ||
10 | |||
11 | % This is a translation of a FORTRAN program by W. J. Cody, | ||
12 | % Argonne National Laboratory, NETLIB/SPECFUN, March 19, 1990. | ||
13 | % The main computation evaluates near-minimax approximations | ||
14 | % from "Rational Chebyshev approximations for the error function" | ||
15 | % by W. J. Cody, Math. Comp., 1969, PP. 631-638. | ||
16 | |||
17 | if ~isreal(x), | ||
18 | error('Input argument must be real.') | ||
19 | end | ||
20 | result = repmat(NaN,size(x)); | ||
21 | % | ||
22 | % evaluate erf for |x| <= 0.46875 | ||
23 | % | ||
24 | xbreak = 0.46875; | ||
25 | k = find(abs(x) <= xbreak); | ||
26 | if ~isempty(k) | ||
27 | a = [3.16112374387056560e00; 1.13864154151050156e02; | ||
28 | 3.77485237685302021e02; 3.20937758913846947e03; | ||
29 | 1.85777706184603153e-1]; | ||
30 | b = [2.36012909523441209e01; 2.44024637934444173e02; | ||
31 | 1.28261652607737228e03; 2.84423683343917062e03]; | ||
32 | |||
33 | y = abs(x(k)); | ||
34 | z = y .* y; | ||
35 | xnum = a(5)*z; | ||
36 | xden = z; | ||
37 | for i = 1:3 | ||
38 | xnum = (xnum + a(i)) .* z; | ||
39 | xden = (xden + b(i)) .* z; | ||
40 | end | ||
41 | result(k) = x(k) .* (xnum + a(4)) ./ (xden + b(4)); | ||
42 | if jint ~= 0, result(k) = 1 - result(k); end | ||
43 | if jint == 2, result(k) = exp(z) .* result(k); end | ||
44 | end | ||
45 | % | ||
46 | % evaluate erfc for 0.46875 <= |x| <= 4.0 | ||
47 | % | ||
48 | k = find((abs(x) > xbreak) & (abs(x) <= 2.)); | ||
49 | if ~isempty(k) | ||
50 | c = [5.64188496988670089e-1; 8.88314979438837594e00; | ||
51 | 6.61191906371416295e01; 2.98635138197400131e02; | ||
52 | 8.81952221241769090e02; 1.71204761263407058e03; | ||
53 | 2.05107837782607147e03; 1.23033935479799725e03; | ||
54 | 2.15311535474403846e-8]; | ||
55 | d = [1.57449261107098347e01; 1.17693950891312499e02; | ||
56 | 5.37181101862009858e02; 1.62138957456669019e03; | ||
57 | 3.29079923573345963e03; 4.36261909014324716e03; | ||
58 | 3.43936767414372164e03; 1.23033935480374942e03]; | ||
59 | |||
60 | y = abs(x(k)); | ||
61 | xnum = c(9)*y; | ||
62 | xden = y; | ||
63 | for i = 1:7 | ||
64 | xnum = (xnum + c(i)) .* y; | ||
65 | xden = (xden + d(i)) .* y; | ||
66 | end | ||
67 | result(k) = (xnum + c(8)) ./ (xden + d(8)); | ||
68 | if jint ~= 2 | ||
69 | z = fix(y*16)/16; | ||
70 | del = (y-z).*(y+z); | ||
71 | result(k) = exp(-z.*z) .* exp(-del) .* result(k); | ||
72 | end | ||
73 | end | ||
74 | % | ||
75 | % evaluate erfc for |x| > 4.0 | ||
76 | % | ||
77 | k = find(abs(x) > 2.0); | ||
78 | if ~isempty(k) | ||
79 | if 0, | ||
80 | p = [3.05326634961232344e-1; 3.60344899949804439e-1; | ||
81 | 1.25781726111229246e-1; 1.60837851487422766e-2; | ||
82 | 6.58749161529837803e-4; 1.63153871373020978e-2]; | ||
83 | q = [2.56852019228982242e00; 1.87295284992346047e00; | ||
84 | 5.27905102951428412e-1; 6.05183413124413191e-2; | ||
85 | 2.33520497626869185e-3]; | ||
86 | |||
87 | y = abs(x(k)); | ||
88 | z = 1 ./ (y .* y); | ||
89 | xnum = p(6).*z; | ||
90 | xden = z; | ||
91 | for i = 1:4 | ||
92 | xnum = (xnum + p(i)) .* z; | ||
93 | xden = (xden + q(i)) .* z; | ||
94 | end | ||
95 | result(k) = z .* (xnum + p(5)) ./ (xden + q(5)); | ||
96 | result(k) = (1/sqrt(pi) - result(k)) ./ y; | ||
97 | if jint ~= 2 | ||
98 | z = fix(y*16)/16; | ||
99 | del = (y-z).*(y+z); | ||
100 | result(k) = exp(-z.*z) .* exp(-del) .* result(k); | ||
101 | k = find(~isfinite(result)); | ||
102 | result(k) = 0*k; | ||
103 | end | ||
104 | end | ||
105 | result(k) = 0; | ||
106 | end | ||
107 | % | ||
108 | % fix up for negative argument, erf, etc. | ||
109 | % | ||
110 | if jint == 0 | ||
111 | k = find(x > xbreak); | ||
112 | result(k) = (0.5 - result(k)) + 0.5; | ||
113 | k = find(x < -xbreak); | ||
114 | result(k) = (-0.5 + result(k)) - 0.5; | ||
115 | elseif jint == 1 | ||
116 | k = find(x < -xbreak); | ||
117 | result(k) = 2. - result(k); | ||
118 | else % jint must = 2 | ||
119 | k = find(x < -xbreak); | ||
120 | z = fix(x(k)*16)/16; | ||
121 | del = (x(k)-z).*(x(k)+z); | ||
122 | y = exp(z.*z) .* exp(del); | ||
123 | result(k) = (y+y) - result(k); | ||
124 | end | ||
125 | |||
126 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/true_loc.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/true_loc.m new file mode 100755 index 0000000..7bf060f --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/true_loc.m | |||
@@ -0,0 +1,23 @@ | |||
1 | function a = true_loc(loca,g,scale); | ||
2 | |||
3 | if ~exist('scale'), | ||
4 | scale = 50; | ||
5 | end | ||
6 | |||
7 | y = loca(1,:); | ||
8 | x = loca(2,:); | ||
9 | |||
10 | min_x = min(x); | ||
11 | min_y = min(y); | ||
12 | |||
13 | x = x - min_x; | ||
14 | y = y - min_y; | ||
15 | |||
16 | max_x = max(x);max_y = max(y); | ||
17 | min_scale = min(max_x,max_y); | ||
18 | |||
19 | a(1) = (g(1)-1)*min_scale/(scale); | ||
20 | a(2) = (g(2)-1)*min_scale/(scale); | ||
21 | |||
22 | a(1) = a(1) + min_x; | ||
23 | a(2) = a(2) + min_y; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/vmquant.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/vmquant.m new file mode 100755 index 0000000..ab4eb28 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/vmquant.m | |||
@@ -0,0 +1,112 @@ | |||
1 | function [im, map] = vmquant(arg1,arg2,arg3,arg4,arg5,arg6,arg7) | ||
2 | %VMQUANT Variance Minimization Color Quantization. | ||
3 | % [X, MAP] = VMQUANT(R,G,B,K,[Qr Qg Qb],DITHER,Qe) or | ||
4 | % VMQUANT(RGB,K,[Qr Qg Qb],DITHER,Qe), where RGB is a 3-D array, | ||
5 | % converts an arbitrary image comprised of RGB triples into an | ||
6 | % indexed image X with color map MAP. K specifies the number | ||
7 | % of desired entries in the target color map, and [Qr Qg Qb] | ||
8 | % specifies the number of quantization bits to assign each color | ||
9 | % axis during color interpolation. DITHER is a string ('dither' or | ||
10 | % 'nodither') that indicates whether or not to perform error propagation | ||
11 | % dither on the output image. Qe specifies the number of bits of | ||
12 | % quantization used in the error calculations. | ||
13 | % | ||
14 | % K is optional and defaults to 256. | ||
15 | % [Qr Qg Qb] is optional and defaults to [5 5 5]. | ||
16 | % DITHER is optional and defaults to 'nodither'. | ||
17 | % Qe is optional and defaults to 8. | ||
18 | % | ||
19 | % See also: RGB2IND, RGB2GRAY, DITHER, IND2RGB, CMUNIQUE, IMAPPROX. | ||
20 | |||
21 | % This is the wrapper function for the MEX file VMQUANTC.C | ||
22 | |||
23 | % Joseph M. Winograd 6-93 | ||
24 | % Copyright (c) 1993 by The MathWorks, Inc. | ||
25 | % $Revision: 5.3 $ $Date: 1996/08/22 22:09:03 $ | ||
26 | |||
27 | % Reference: Xiaolin Wu, "Efficient Statistical Computation for | ||
28 | % Optimal Color Quantization," Graphics Gems II, (ed. James | ||
29 | % Arvo). Academic Press: Boston. 1991. | ||
30 | |||
31 | if nargin < 1, | ||
32 | error('Not enough input arguments.'); | ||
33 | end | ||
34 | |||
35 | threeD = (ndims(arg1)==3); % Determine if input includes a 3-D array | ||
36 | |||
37 | if threeD, | ||
38 | error( nargchk( 1, 5, nargin ) ); | ||
39 | |||
40 | % NOTE: If you change defaults, change them also | ||
41 | % in VMQUANTC.C and recompile the MEX function. | ||
42 | if nargin < 5 | ||
43 | arg5 = 8; % DEFAULT_QE = 8 | ||
44 | end | ||
45 | |||
46 | if nargin < 4 | ||
47 | arg4 = 'n'; % DEFAULT_DITHER = 0 | ||
48 | end | ||
49 | |||
50 | if nargin < 3 | ||
51 | arg3 = [5 5 5]; % DEFAULT_Q = [5 5 5] | ||
52 | end | ||
53 | |||
54 | if nargin < 2 | ||
55 | arg2 = 256; % DEFAULT_K = 256 | ||
56 | end | ||
57 | |||
58 | rout = arg1(:,:,1); | ||
59 | g = arg1(:,:,2); | ||
60 | b = arg1(:,:,3); | ||
61 | |||
62 | if strcmp(lower(arg4(1)),'d') | ||
63 | dith = 1; | ||
64 | else | ||
65 | dith = 0; | ||
66 | end | ||
67 | |||
68 | arg7 = arg5; | ||
69 | arg5 = arg3; | ||
70 | arg4 = arg2; | ||
71 | |||
72 | else | ||
73 | error( nargchk( 3, 7, nargin ) ); | ||
74 | |||
75 | if nargin < 7 | ||
76 | arg7 = 8; % DEFAULT_QE = 8 | ||
77 | end | ||
78 | |||
79 | if nargin < 6 | ||
80 | arg6 = 'n'; % DEFAULT_DITHER = 0 | ||
81 | end | ||
82 | |||
83 | if nargin < 5 | ||
84 | arg5 = [5 5 5]; % DEFAULT_Q = [5 5 5] | ||
85 | end | ||
86 | |||
87 | if nargin < 4 | ||
88 | arg4 = 256; % DEFAULT_K = 256 | ||
89 | end | ||
90 | |||
91 | rout = arg1; | ||
92 | g = arg2; | ||
93 | b = arg3; | ||
94 | |||
95 | if strcmp(lower(arg6(1)),'d') | ||
96 | dith = 1; | ||
97 | else | ||
98 | dith = 0; | ||
99 | end | ||
100 | |||
101 | end | ||
102 | |||
103 | if (~isa(rout,'uint8')) | ||
104 | rout = uint8(round(255*rout)); | ||
105 | end | ||
106 | if (~isa(g,'uint8')) | ||
107 | g = uint8(round(255*g)); | ||
108 | end | ||
109 | if (~isa(b,'uint8')) | ||
110 | b = uint8(round(255*b)); | ||
111 | end | ||
112 | [im,map] = vmquantc( rout, g, b, arg4, arg5, dith, arg7 ); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/wismm.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/wismm.m new file mode 100755 index 0000000..915e07d --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/wismm.m | |||
@@ -0,0 +1,26 @@ | |||
1 | function [L1,L2,phi,Txx,Txy,Tyy]=wismm(X,N); | ||
2 | % [L1,L2,phi,T11,T12,T22]=wismm(X,N); | ||
3 | % Calculate windowed image second moment matrices for image X and return | ||
4 | % the following values: | ||
5 | % | ||
6 | % L1 is the larger eigenvalue (lambda_1) | ||
7 | % L2 is the smaller eigenvalue (lambda_2) | ||
8 | % phi is the angle of the 1st eigenvector (phi) | ||
9 | |||
10 | [G1,G2]=gradient(X); | ||
11 | |||
12 | GGTxx=G1.^2; | ||
13 | GGTxy=G1.*G2; | ||
14 | GGTyy=G2.^2; | ||
15 | |||
16 | Txx=gaussN(GGTxx,N); | ||
17 | Txy=gaussN(GGTxy,N); | ||
18 | Tyy=gaussN(GGTyy,N); | ||
19 | |||
20 | tr=Txx+Tyy; | ||
21 | V1=0.5*sqrt(tr.^2-4*(Txx.*Tyy-Txy.^2)); | ||
22 | |||
23 | L1=real(0.5*tr+V1); | ||
24 | L2=real(0.5*tr-V1); | ||
25 | phi=0.5*atan2(2*Txy,Txx-Tyy); | ||
26 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/wismm2.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/wismm2.m new file mode 100755 index 0000000..ae62ce9 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/wismm2.m | |||
@@ -0,0 +1,66 @@ | |||
1 | function [L1,L2,phi,aniso,pol,con,window_sizes]=wismm2(V); | ||
2 | % [L1,L2,phi,aniso,pol,con,window_sizes]=wismm2(V); | ||
3 | % Calculate windowed image second moment matrices for image V and return | ||
4 | % the following values: | ||
5 | % | ||
6 | % L1 is the larger eigenvalue (lambda_1) | ||
7 | % L2 is the smaller eigenvalue (lambda_2) | ||
8 | % phi is the angle of the 1st eigenvector (phi) | ||
9 | % | ||
10 | |||
11 | [Gx,Gy]=gradient(V); | ||
12 | |||
13 | GGTxx=Gx.^2; | ||
14 | GGTxy=Gx.*Gy; | ||
15 | GGTyy=Gy.^2; | ||
16 | |||
17 | [r,c]=size(V); | ||
18 | |||
19 | min_window_size=3; | ||
20 | max_window_size=3*round(min(r,c)/16); | ||
21 | if (-1)^max_window_size==1 | ||
22 | max_window_size=max_window_size+1; | ||
23 | end | ||
24 | window_step_size=2; | ||
25 | |||
26 | window_sizes=min_window_size:2:max_window_size; | ||
27 | max_count=length(window_sizes); | ||
28 | |||
29 | L1=zeros(r,c,max_count); | ||
30 | L2=zeros(r,c,max_count); | ||
31 | phi=zeros(r,c,max_count); | ||
32 | pol=zeros(r,c,max_count); | ||
33 | con=zeros(r,c,max_count); | ||
34 | |||
35 | fprintf(1,'Integration window size: '); | ||
36 | counter=1; | ||
37 | for n=window_sizes | ||
38 | fprintf(1,'%d ',n); | ||
39 | Txx=gaussN(GGTxx,n); | ||
40 | Txy=gaussN(GGTxy,n); | ||
41 | Tyy=gaussN(GGTyy,n); | ||
42 | |||
43 | tr=Txx+Tyy; | ||
44 | V1=0.5*sqrt(tr.^2-4*(Txx.*Tyy-Txy.^2)); | ||
45 | V1=real(V1); | ||
46 | |||
47 | L1(:,:,counter)=0.5*tr+V1; | ||
48 | L2(:,:,counter)=0.5*tr-V1; | ||
49 | phi(:,:,counter)=0.5*atan2(2*Txy,Txx-Tyy); | ||
50 | |||
51 | % do polarity stuff here | ||
52 | grad_smooth_x=gaussN(Gx,n); | ||
53 | grad_smooth_y=gaussN(Gy,n); | ||
54 | grad_smooth_mag=sqrt(grad_smooth_x.^2+grad_smooth_y.^2); | ||
55 | grad_mag=sqrt(Gx.^2+Gy.^2); | ||
56 | grad_mag_smooth=gaussN(grad_mag,n); | ||
57 | pol(:,:,counter)=grad_smooth_mag./(grad_mag_smooth+eps); | ||
58 | |||
59 | % contrast calculation | ||
60 | con(:,:,counter)=tr; | ||
61 | counter=counter+1; | ||
62 | end | ||
63 | fprintf(1,'\n') | ||
64 | |||
65 | aniso=1-L2./(L1+eps); | ||
66 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/wismm3.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/wismm3.m new file mode 100755 index 0000000..89c56ef --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/wismm3.m | |||
@@ -0,0 +1,71 @@ | |||
1 | function [L1,L2,phi,aniso,pol,con,window_sizes]=wismm3(V); | ||
2 | % [L1,L2,phi,aniso,pol,con,window_sizes]=wismm3(V); | ||
3 | % Calculate windowed image second moment matrices for image V and return | ||
4 | % the following values: | ||
5 | % | ||
6 | % L1 is the larger eigenvalue (lambda_1) | ||
7 | % L2 is the smaller eigenvalue (lambda_2) | ||
8 | % phi is the angle of the 1st eigenvector (phi) | ||
9 | % | ||
10 | |||
11 | [Gx,Gy]=gradient(V); | ||
12 | |||
13 | GGTxx=Gx.^2; | ||
14 | GGTxy=Gx.*Gy; | ||
15 | GGTyy=Gy.^2; | ||
16 | |||
17 | [r,c]=size(V); | ||
18 | |||
19 | min_window_size=3; | ||
20 | max_window_size=3*round(min(r,c)/16); | ||
21 | if (-1)^max_window_size==1 | ||
22 | max_window_size=max_window_size+1; | ||
23 | end | ||
24 | window_step_size=2; | ||
25 | |||
26 | window_sizes=min_window_size:2:max_window_size; | ||
27 | max_count=length(window_sizes); | ||
28 | |||
29 | L1=zeros(r,c,max_count); | ||
30 | L2=zeros(r,c,max_count); | ||
31 | phi=zeros(r,c,max_count); | ||
32 | pol=zeros(r,c,max_count); | ||
33 | con=zeros(r,c,max_count); | ||
34 | |||
35 | fprintf(1,'Integration window size: '); | ||
36 | counter=1; | ||
37 | for n=window_sizes | ||
38 | fprintf(1,'%d ',n); | ||
39 | Txx=gaussN(GGTxx,n); | ||
40 | Txy=gaussN(GGTxy,n); | ||
41 | Tyy=gaussN(GGTyy,n); | ||
42 | |||
43 | tr=Txx+Tyy; | ||
44 | V1=0.5*sqrt(tr.^2-4*(Txx.*Tyy-Txy.^2)); | ||
45 | V1=real(V1); | ||
46 | |||
47 | L1(:,:,counter)=0.5*tr+V1; | ||
48 | L2(:,:,counter)=0.5*tr-V1; | ||
49 | phi(:,:,counter)=0.5*atan2(2*Txy,Txx-Tyy); | ||
50 | |||
51 | % do polarity stuff here | ||
52 | [P,angle_vector]=polarity(Gx,Gy,n); | ||
53 | quant_bound=angle_vector(2)/2; | ||
54 | % (quantize angle and pull corresponding polarity out of P) | ||
55 | % (perhaps use set-theoretic functions for masking out P???) | ||
56 | for m=1:length(angle_vector); | ||
57 | a=angle_vector(end-m+1); | ||
58 | old_pol=pol(:,:,counter); | ||
59 | Pmask=abs(cos(phi(:,:,counter)-a))>=cos(quant_bound); | ||
60 | Pmask=Pmask&(old_pol==0); % prevent pileup on quant. boundaries | ||
61 | pol(:,:,counter)=old_pol+(Pmask.*P(:,:,m)); | ||
62 | end | ||
63 | |||
64 | % contrast calculation | ||
65 | con(:,:,counter)=tr; | ||
66 | counter=counter+1; | ||
67 | end | ||
68 | fprintf(1,'\n') | ||
69 | |||
70 | aniso=1-L2./(L1+eps); | ||
71 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/write_command.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/write_command.m new file mode 100755 index 0000000..954a39e --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/write_command.m | |||
@@ -0,0 +1,8 @@ | |||
1 | function write_command(fname,fn_base,para) | ||
2 | |||
3 | fid = fopen(fname,'w'); | ||
4 | |||
5 | fprintf(fid,'%s ',fn_base); | ||
6 | fprintf(fid,'%d ',para); | ||
7 | fprintf(fid,'\nrun\n'); | ||
8 | fclose(fid); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/write_test.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/write_test.m new file mode 100755 index 0000000..e444c27 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/write_test.m | |||
@@ -0,0 +1,38 @@ | |||
1 | |||
2 | I_max = 250; | ||
3 | tex_max = 30; | ||
4 | |||
5 | %fnames = [130038,130039,130042,130056,130057]; | ||
6 | %fnames = [334074 334031 334044 334003 334065 334000 334039 334018 334002 334029] | ||
7 | |||
8 | fnames = 130057; | ||
9 | |||
10 | for j=1:length(fnames), | ||
11 | fname = sprintf('images/%d.pgm',fnames(j)); | ||
12 | |||
13 | sigs = [1/sqrt(2),1,sqrt(2),2,2*sqrt(2)];r = 3;szs = round(r*3*sigs); | ||
14 | szs = szs(length(szs))*ones(1,length(szs)); | ||
15 | num_ori = 6; | ||
16 | |||
17 | I = readpgm(fname); | ||
18 | [text_des,filters] = compute_filter_fft(I,sigs,r,szs,num_ori); | ||
19 | |||
20 | outname = sprintf('plaatje_data/%d',fnames(j)); | ||
21 | |||
22 | cutsz =20; | ||
23 | I = cutoff(I,cutsz);%figure(1);im(I); | ||
24 | text_des = cutoff(text_des,cutsz); | ||
25 | |||
26 | writeout_feature(I,text_des(:,:,:),outname,I_max,tex_max); | ||
27 | |||
28 | |||
29 | if 0, | ||
30 | for j=0:30, | ||
31 | cm = sprintf('!mv plaatje_data/134013.pfm_%d.pfm plaatje_data/134013_%d.pfm',j,j); | ||
32 | disp(cm);eval(cm); | ||
33 | end | ||
34 | end | ||
35 | |||
36 | end | ||
37 | |||
38 | exit | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/writeout_feature.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/writeout_feature.m new file mode 100755 index 0000000..5376d5f --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/writeout_feature.m | |||
@@ -0,0 +1,40 @@ | |||
1 | function writeout_feature(I,tex,fname,I_max,tex_max) | ||
2 | % | ||
3 | % writeout_feature(I,tex,fname,I_max,tex_max) | ||
4 | % | ||
5 | % | ||
6 | |||
7 | |||
8 | %%%%% print out image | ||
9 | I_min = min(I(:)); | ||
10 | |||
11 | I = I-I_min; | ||
12 | I = min(1,I/(I_max-I_min)); | ||
13 | |||
14 | I = 2*I-1; | ||
15 | |||
16 | j = 0; | ||
17 | fn = sprintf('%s_%d.pfm',fname,j); | ||
18 | cm = sprintf('writepfm: I->%s',fn); | ||
19 | disp(cm); | ||
20 | writepfm(fn,I); | ||
21 | |||
22 | |||
23 | %%% print out texture | ||
24 | nf = size(tex,3) | ||
25 | |||
26 | for j=1:nf, | ||
27 | |||
28 | fn = sprintf('%s_%d.pfm',fname,j); | ||
29 | cm = sprintf('writepfm:tex_%d->%s',j,fn); | ||
30 | disp(cm); | ||
31 | |||
32 | tex(:,:,j) = tex(:,:,j)/tex_max;fprintf('.'); | ||
33 | tex(:,:,j) = tex(:,:,j).*(tex(:,:,j)<=1) + 1*(tex(:,:,j)>1);fprintf('.') | ||
34 | tex(:,:,j) = tex(:,:,j).*(tex(:,:,j)>=-1) + (-1)*(tex(:,:,j)<-1);fprintf('.'); | ||
35 | |||
36 | writepfm(fn,tex(:,:,j)); | ||
37 | |||
38 | |||
39 | end | ||
40 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/writepfm.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/writepfm.m new file mode 100755 index 0000000..a831970 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/writepfm.m | |||
@@ -0,0 +1,11 @@ | |||
1 | function writepfm(name,I) | ||
2 | % | ||
3 | % writepfm(name,I) | ||
4 | % | ||
5 | [nr,nc] = size(I); | ||
6 | |||
7 | fid = fopen(name, 'w'); | ||
8 | fprintf(fid, '%d %d\n', nr,nc); | ||
9 | fprintf(fid,'%f ',I); | ||
10 | fclose(fid); | ||
11 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/writepgm.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/writepgm.m new file mode 100755 index 0000000..113cb18 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/writepgm.m | |||
@@ -0,0 +1,8 @@ | |||
1 | function I = writepgm(name,I) | ||
2 | |||
3 | [y,x] = size(I); | ||
4 | |||
5 | fid = fopen(name, 'w'); | ||
6 | fprintf(fid, 'P5\n%d %d\n255\n', x,y); | ||
7 | fwrite(fid, I', 'uint8'); | ||
8 | fclose(fid); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/writepmm.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/writepmm.m new file mode 100755 index 0000000..675df93 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/writepmm.m | |||
@@ -0,0 +1,14 @@ | |||
1 | function writepmm(name,I) | ||
2 | % | ||
3 | % writepmm(name,I) | ||
4 | % | ||
5 | |||
6 | [nr,nc,nb] = size(I); | ||
7 | |||
8 | fid = fopen(name,'w'); | ||
9 | |||
10 | fprintf(fid, 'P5\n%d %d %d\n255\n', nc,nr,nb); | ||
11 | |||
12 | fprintf(fid,'%f ',I); | ||
13 | fclose(fid); | ||
14 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filter_hist/writepnm5.m b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/writepnm5.m new file mode 100755 index 0000000..633fba9 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filter_hist/writepnm5.m | |||
@@ -0,0 +1,26 @@ | |||
1 | function writepnm5(name,I) | ||
2 | % | ||
3 | % writepnm5(name,I) | ||
4 | % | ||
5 | % I is a mul-band image | ||
6 | % | ||
7 | |||
8 | [nr,nc,nb] = size(I); | ||
9 | |||
10 | fid = fopen(name,'w'); | ||
11 | |||
12 | fprintf(fid, 'P5\n%d %d %d\n255\n', nc,nr,nb); | ||
13 | |||
14 | n = nr*nc; | ||
15 | |||
16 | J = []; | ||
17 | |||
18 | for j=1:nb, | ||
19 | J = [J,reshape(I(:,:,j)',n,1)]; | ||
20 | end | ||
21 | |||
22 | J = reshape(J',nb*n,1); | ||
23 | |||
24 | fprintf(fid,'%f ',J); | ||
25 | fclose(fid); | ||
26 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filtersQuad/doog1.m b/SD-VBS/common/toolbox/toolbox_basic/filtersQuad/doog1.m new file mode 100755 index 0000000..dd8e87b --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filtersQuad/doog1.m | |||
@@ -0,0 +1,32 @@ | |||
1 | function H=doog1(sig,r,th,N); | ||
2 | % H=doog1(sig,r,th,N); | ||
3 | |||
4 | |||
5 | % by Serge Belongie | ||
6 | |||
7 | no_pts=N; % no. of points in x,y grid | ||
8 | |||
9 | [x,y]=meshgrid(-(N/2)+1/2:(N/2)-1/2,-(N/2)+1/2:(N/2)-1/2); | ||
10 | |||
11 | phi=pi*th/180; | ||
12 | sigy=sig; | ||
13 | sigx=r*sig; | ||
14 | R=[cos(phi) -sin(phi); sin(phi) cos(phi)]; | ||
15 | C=R*diag([sigx,sigy])*R'; | ||
16 | |||
17 | X=[x(:) y(:)]; | ||
18 | |||
19 | Gb=gaussian(X,[0 0]',C); | ||
20 | Gb=reshape(Gb,N,N); | ||
21 | |||
22 | m=R*[0 sig]'; | ||
23 | |||
24 | a=1; | ||
25 | b=-1; | ||
26 | |||
27 | % make odd-symmetric filter | ||
28 | Ga=gaussian(X,m/2,C); | ||
29 | Ga=reshape(Ga,N,N); | ||
30 | Gb=rot90(Ga,2); | ||
31 | H=a*Ga+b*Gb; | ||
32 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filtersQuad/doog2.m b/SD-VBS/common/toolbox/toolbox_basic/filtersQuad/doog2.m new file mode 100755 index 0000000..a0511cb --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filtersQuad/doog2.m | |||
@@ -0,0 +1,38 @@ | |||
1 | function G=doog2(sig,r,th,N); | ||
2 | % G=doog2(sig,r,th,N); | ||
3 | % Make difference of offset gaussians kernel | ||
4 | % theta is in degrees | ||
5 | % (see Malik & Perona, J. Opt. Soc. Amer., 1990) | ||
6 | % | ||
7 | % Example: | ||
8 | % >> imagesc(doog2(1,12,0,64,1)) | ||
9 | % >> colormap(gray) | ||
10 | |||
11 | % by Serge Belongie | ||
12 | |||
13 | no_pts=N; % no. of points in x,y grid | ||
14 | |||
15 | [x,y]=meshgrid(-(N/2)+1/2:(N/2)-1/2,-(N/2)+1/2:(N/2)-1/2); | ||
16 | |||
17 | phi=pi*th/180; | ||
18 | sigy=sig; | ||
19 | sigx=r*sig; | ||
20 | R=[cos(phi) -sin(phi); sin(phi) cos(phi)]; | ||
21 | C=R*diag([sigx,sigy])*R'; | ||
22 | |||
23 | X=[x(:) y(:)]; | ||
24 | |||
25 | Gb=gaussian(X,[0 0]',C); | ||
26 | Gb=reshape(Gb,N,N); | ||
27 | |||
28 | m=R*[0 sig]'; | ||
29 | Ga=gaussian(X,m,C); | ||
30 | Ga=reshape(Ga,N,N); | ||
31 | Gc=rot90(Ga,2); | ||
32 | |||
33 | a=-1; | ||
34 | b=2; | ||
35 | c=-1; | ||
36 | |||
37 | G = a*Ga + b*Gb + c*Gc; | ||
38 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filtersQuad/make_filterbank_even2.m b/SD-VBS/common/toolbox/toolbox_basic/filtersQuad/make_filterbank_even2.m new file mode 100755 index 0000000..f7f4527 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filtersQuad/make_filterbank_even2.m | |||
@@ -0,0 +1,45 @@ | |||
1 | function FB = make_filterbank(num_ori,filter_scales,wsz,enlong) | ||
2 | % | ||
3 | % F = make_filterbank(num_ori,num_scale,wsz) | ||
4 | % | ||
5 | |||
6 | if nargin<4, | ||
7 | enlong = 3; | ||
8 | end | ||
9 | |||
10 | enlong = 2*enlong; | ||
11 | |||
12 | % definine filterbank | ||
13 | %num_ori=6; | ||
14 | %num_scale=3; | ||
15 | |||
16 | num_scale = length(filter_scales); | ||
17 | |||
18 | M1=wsz; % size in pixels | ||
19 | M2=M1; | ||
20 | |||
21 | ori_incr=180/num_ori; | ||
22 | ori_offset=ori_incr/2; % helps with equalizing quantiz. error across filter set | ||
23 | |||
24 | FB=zeros(M1,M2,num_ori,num_scale); | ||
25 | |||
26 | % elongated filter set | ||
27 | counter = 1; | ||
28 | |||
29 | for m=1:num_scale | ||
30 | for n=1:num_ori | ||
31 | % r=12 here is equivalent to Malik's r=3; | ||
32 | f=doog2(filter_scales(m),enlong,ori_offset+(n-1)*ori_incr,M1); | ||
33 | FB(:,:,n,m)=f; | ||
34 | end | ||
35 | end | ||
36 | |||
37 | FB=reshape(FB,M1,M2,num_scale*num_ori); | ||
38 | total_num_filt=size(FB,3); | ||
39 | |||
40 | for j=1:total_num_filt, | ||
41 | F = FB(:,:,j); | ||
42 | a = sum(sum(abs(F))); | ||
43 | FB(:,:,j) = FB(:,:,j)/a; | ||
44 | end | ||
45 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filtersQuad/make_filterbank_odd2.m b/SD-VBS/common/toolbox/toolbox_basic/filtersQuad/make_filterbank_odd2.m new file mode 100755 index 0000000..0059dca --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filtersQuad/make_filterbank_odd2.m | |||
@@ -0,0 +1,46 @@ | |||
1 | function FB = make_filterbank(num_ori,filter_scales,wsz,enlong) | ||
2 | % | ||
3 | % F = make_filterbank(num_ori,num_scale,wsz) | ||
4 | % | ||
5 | |||
6 | if nargin<4, | ||
7 | enlong = 3; | ||
8 | end | ||
9 | |||
10 | enlong = enlong*2; | ||
11 | |||
12 | % definine filterbank | ||
13 | %num_ori=6; | ||
14 | %num_scale=3; | ||
15 | |||
16 | num_scale = length(filter_scales); | ||
17 | |||
18 | M1=wsz; % size in pixels | ||
19 | M2=M1; | ||
20 | |||
21 | ori_incr=180/num_ori; | ||
22 | ori_offset=ori_incr/2; % helps with equalizing quantiz. error across filter set | ||
23 | |||
24 | FB=zeros(M1,M2,num_ori,num_scale); | ||
25 | |||
26 | |||
27 | % elongated filter set | ||
28 | counter = 1; | ||
29 | |||
30 | for m=1:num_scale | ||
31 | for n=1:num_ori | ||
32 | % r=12 here is equivalent to Malik's r=3; | ||
33 | f=doog1(filter_scales(m),enlong,ori_offset+(n-1)*ori_incr,M1); | ||
34 | FB(:,:,n,m)=f; | ||
35 | end | ||
36 | end | ||
37 | |||
38 | FB=reshape(FB,M1,M2,num_scale*num_ori); | ||
39 | total_num_filt=size(FB,3); | ||
40 | |||
41 | for j=1:total_num_filt, | ||
42 | F = FB(:,:,j); | ||
43 | a = sum(sum(abs(F))); | ||
44 | FB(:,:,j) = FB(:,:,j)/a; | ||
45 | end | ||
46 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/filtersQuad/quadedgep2.m b/SD-VBS/common/toolbox/toolbox_basic/filtersQuad/quadedgep2.m new file mode 100755 index 0000000..5041377 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/filtersQuad/quadedgep2.m | |||
@@ -0,0 +1,188 @@ | |||
1 | % function [xs,ys,gx,gy,par,threshold,mag,mage,g,FIe,FIo,mago] = quadedgep(I,par,threshold); | ||
2 | % Input: | ||
3 | % I = image | ||
4 | % par = vector for 4 parameters | ||
5 | % [number of filter orientations, number of scale, filter size, elongation] | ||
6 | % To use default values, put 0. | ||
7 | % threshold = threshold on edge strength | ||
8 | % Output: | ||
9 | % [x,y,gx,gy] = locations and gradients of an ordered list of edgels | ||
10 | % x,y could be horizontal or vertical or 45 between pixel sites | ||
11 | % but it is guaranteed that there [floor(y) + (floor(x)-1)*nr] | ||
12 | % is ordered and unique. In other words, each edgel has a unique pixel id. | ||
13 | % par = actual par used | ||
14 | % threshold = actual threshold used | ||
15 | % mag = edge magnitude | ||
16 | % mage = phase map | ||
17 | % g = gradient map at each pixel | ||
18 | % [FIe,FIo] = odd and even filter outputs | ||
19 | % mago = odd filter output of optimum orientation | ||
20 | |||
21 | % Stella X. Yu, 2001 | ||
22 | |||
23 | % This is the multi scale version of the filtering | ||
24 | % For the moment the parameters are defined by default. See line 34 | ||
25 | |||
26 | |||
27 | function [x,y,gx,gy,par,threshold,mag_s,mage,g,FIe,FIo,mago] = quadedgep2(I,par,data,threshold); | ||
28 | |||
29 | |||
30 | if nargin<4 | isempty(threshold), | ||
31 | threshold = 0.1; | ||
32 | end | ||
33 | |||
34 | [r,c] = size(I); | ||
35 | def_par = [4,30,3]; | ||
36 | |||
37 | display_on = 1; | ||
38 | |||
39 | % take care of parameters, any missing value is substituted by a default value | ||
40 | if nargin<2 | isempty(par), | ||
41 | par = def_par; | ||
42 | end | ||
43 | % par(end+1:4)=0; | ||
44 | % par = par(:); | ||
45 | % j = (par>0); | ||
46 | % have_value = [ j, 1-j ]; | ||
47 | % j = 1; n_filter = have_value(j,:) * [par(j); def_par(j)]; | ||
48 | % j = 2; n_scale = have_value(j,:) * [par(j); def_par(j)]; | ||
49 | % j = 3; winsz = have_value(j,:) * [par(j); def_par(j)]; | ||
50 | % j = 4; enlong = have_value(j,:) * [par(j); def_par(j)]; | ||
51 | |||
52 | n_ori = par(1); %if it doesn't work, par<-def_par | ||
53 | |||
54 | winsz = par(2); | ||
55 | enlong = par(3); | ||
56 | |||
57 | % always make filter size an odd number so that the results will not be skewed | ||
58 | j = winsz/2; | ||
59 | if not(j > fix(j) + 0.1), | ||
60 | winsz = winsz + 1; | ||
61 | end | ||
62 | |||
63 | % filter the image with quadrature filters | ||
64 | if (isempty(data.W.scales)) | ||
65 | error ('no scales entered'); | ||
66 | end | ||
67 | |||
68 | n_scale=length(data.W.scales); | ||
69 | filter_scales=data.W.scales; | ||
70 | % | ||
71 | % if strcmp(data.dataWpp.mode,'multiscale') | ||
72 | % n_scale=size((data.dataWpp.scales),2); | ||
73 | % filter_scales=data.dataWpp.scales; | ||
74 | % else | ||
75 | % filter_scales=data.dataWpp.scales(1); | ||
76 | % n_scale=1; | ||
77 | % end | ||
78 | % if n_scale>0&&strcmp(data.dataWpp.mode,'multiscale') | ||
79 | % if (~isempty(data.dataWpp.scales)) | ||
80 | % filter_scales=data.dataWpp.scales; | ||
81 | % else | ||
82 | % filter_scales=zeros(1,n_scale); | ||
83 | % | ||
84 | % for i=1:n_scale, | ||
85 | % filter_scales(i)=(sqrt(2))^(i-1); | ||
86 | % end | ||
87 | % data.dataWpp.scales=filter_scales; | ||
88 | % end | ||
89 | % else filter_scale=1; | ||
90 | % data.dataWpp.scales=filter_scales; | ||
91 | % end | ||
92 | % | ||
93 | % %%%%%%% juste pour que ca tourne | ||
94 | % if ~strcmp(data.dataWpp.mode,'multiscale') | ||
95 | % filter_scales=data.dataWpp.scales(1); | ||
96 | % n_scale=4; | ||
97 | % end | ||
98 | % %%%%%%%%%%%% | ||
99 | |||
100 | FBo = make_filterbank_odd2(n_ori,filter_scales,winsz,enlong); | ||
101 | FBe = make_filterbank_even2(n_ori,filter_scales,winsz,enlong); | ||
102 | n = ceil(winsz/2); | ||
103 | f = [fliplr(I(:,2:n+1)), I, fliplr(I(:,c-n:c-1))]; | ||
104 | f = [flipud(f(2:n+1,:)); f; flipud(f(r-n:r-1,:))]; | ||
105 | FIo = fft_filt_2(f,FBo,1); | ||
106 | FIo = FIo(n+[1:r],n+[1:c],:); | ||
107 | FIe = fft_filt_2(f,FBe,1); | ||
108 | FIe = FIe(n+[1:r],n+[1:c],:); | ||
109 | |||
110 | % compute the orientation energy and recover a smooth edge map | ||
111 | % pick up the maximum energy across scale and orientation | ||
112 | % even filter's output: as it is the second derivative, zero cross localize the edge | ||
113 | % odd filter's output: orientation | ||
114 | |||
115 | [nr,nc,nb] = size(FIe); | ||
116 | |||
117 | FIe = reshape(FIe, nr,nc,n_ori,length(filter_scales)); | ||
118 | FIo = reshape(FIo, nr,nc,n_ori,length(filter_scales)); | ||
119 | |||
120 | mag_s = zeros(nr,nc,n_scale); | ||
121 | mag_a = zeros(nr,nc,n_ori); | ||
122 | |||
123 | mage = zeros(nr,nc,n_scale); | ||
124 | mago = zeros(nr,nc,n_scale); | ||
125 | mage = zeros(nr,nc,n_scale); | ||
126 | mago = zeros(nr,nc,n_scale); | ||
127 | |||
128 | |||
129 | |||
130 | for i = 1:n_scale, | ||
131 | mag_s(:,:,i) = sqrt(sum(FIo(:,:,:,i).^2,3)+sum(FIe(:,:,:,i).^2,3)); | ||
132 | mag_a = sqrt(FIo(:,:,:,i).^2+FIe(:,:,:,i).^2); | ||
133 | [tmp,max_id] = max(mag_a,[],3); | ||
134 | |||
135 | base_size = nr * nc; | ||
136 | id = [1:base_size]'; | ||
137 | mage(:,:,i) = reshape(FIe(id+(max_id(:)-1)*base_size+(i-1)*base_size*n_ori),[nr,nc]); | ||
138 | mago(:,:,i) = reshape(FIo(id+(max_id(:)-1)*base_size+(i-1)*base_size*n_ori),[nr,nc]); | ||
139 | |||
140 | mage(:,:,i) = (mage(:,:,i)>0) - (mage(:,:,i)<0); | ||
141 | |||
142 | if display_on, | ||
143 | ori_incr=pi/n_ori; % to convert jshi's coords to conventional image xy | ||
144 | ori_offset=ori_incr/2; | ||
145 | theta = ori_offset+([1:n_ori]-1)*ori_incr; % orientation detectors | ||
146 | % [gx,gy] are image gradient in image xy coords, winner take all | ||
147 | |||
148 | ori = theta(max_id); | ||
149 | ori = ori .* (mago(:,:,i)>0) + (ori + pi).*(mago(:,:,i)<0); | ||
150 | gy{i} = mag_s(:,:,i) .* cos(ori); | ||
151 | gx{i} = -mag_s(:,:,i) .* sin(ori); | ||
152 | g = cat(3,gx{i},gy{i}); | ||
153 | |||
154 | % phase map: edges are where the phase changes | ||
155 | mag_th = max(max(mag_s(:,:,i))) * threshold; | ||
156 | eg = (mag_s(:,:,i)>mag_th); | ||
157 | h = eg & [(mage(2:r,:,i) ~= mage(1:r-1,:,i)); zeros(1,nc)]; | ||
158 | v = eg & [(mage(:,2:c,i) ~= mage(:,1:c-1,i)), zeros(nr,1)]; | ||
159 | [y{i},x{i}] = find(h | v); | ||
160 | k = y{i} + (x{i}-1) * nr; | ||
161 | h = h(k); | ||
162 | v = v(k); | ||
163 | y{i} = y{i} + h * 0.5; % i | ||
164 | x{i} = x{i} + v * 0.5; % j | ||
165 | t = h + v * nr; | ||
166 | gx{i} = g(k) + g(k+t); | ||
167 | k = k + (nr * nc); | ||
168 | gy{i} = g(k) + g(k+t); | ||
169 | |||
170 | % figure(1); | ||
171 | % clf; | ||
172 | % imagesc(I);colormap(gray); | ||
173 | % hold on; | ||
174 | % quiver(x,y,gx,gy); hold off; | ||
175 | % title(sprintf('scale = %d, press return',i)); | ||
176 | |||
177 | % pause; | ||
178 | 0; | ||
179 | else | ||
180 | x = []; | ||
181 | y = []; | ||
182 | gx = []; | ||
183 | gy =[]; | ||
184 | g= []; | ||
185 | end | ||
186 | end | ||
187 | |||
188 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/io/convert422.m b/SD-VBS/common/toolbox/toolbox_basic/io/convert422.m new file mode 100755 index 0000000..919e82e --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/io/convert422.m | |||
@@ -0,0 +1,27 @@ | |||
1 | image_current = '/hid/jshi'; | ||
2 | |||
3 | image_dir = 'vr05_5 '; | ||
4 | pg_path = '/hid/jshi/422toppm/422toppm'; | ||
5 | |||
6 | cm = sprintf('cd %s',image_dir); | ||
7 | disp(cm); | ||
8 | eval(cm); | ||
9 | |||
10 | d = dir('seq*'); | ||
11 | filename = char(sort({d.name})); | ||
12 | |||
13 | for j=1:size(filename), | ||
14 | cm = sprintf('!%s %s',pg_path,deblank(filename(j,:))); | ||
15 | disp(cm); | ||
16 | eval(cm); | ||
17 | end | ||
18 | |||
19 | |||
20 | %%% change back | ||
21 | cm = sprintf('cd %s',image_current); | ||
22 | disp(cm);eval(cm); | ||
23 | |||
24 | |||
25 | if 0, | ||
26 | deblank(filename(f,:)); | ||
27 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/io/im_vd.m b/SD-VBS/common/toolbox/toolbox_basic/io/im_vd.m new file mode 100755 index 0000000..590cd9b --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/io/im_vd.m | |||
@@ -0,0 +1,6 @@ | |||
1 | function J = im_vd(I); | ||
2 | |||
3 | J(:,:,1) = I(1:2:end,1:2:end); | ||
4 | J(:,:,2) = I(2:2:end,1:2:end); | ||
5 | |||
6 | montage2(J); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/io/imread2.m b/SD-VBS/common/toolbox/toolbox_basic/io/imread2.m new file mode 100755 index 0000000..27a5e4b --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/io/imread2.m | |||
@@ -0,0 +1,45 @@ | |||
1 | function I = imread2(fname,im_dir); | ||
2 | % | ||
3 | % I = imread2(fname,im_dir); | ||
4 | % | ||
5 | |||
6 | cur_dir = pwd; | ||
7 | |||
8 | if nargin>1, | ||
9 | cd(im_dir); | ||
10 | end | ||
11 | |||
12 | %%% put on the necessary extension | ||
13 | d = dir(fname); | ||
14 | |||
15 | if isempty(d), | ||
16 | d = dir([fname,'*']); | ||
17 | end | ||
18 | |||
19 | if isempty(d), | ||
20 | I = []; | ||
21 | else | ||
22 | |||
23 | fname = d.name; | ||
24 | |||
25 | %%% find extension | ||
26 | k = findstr(fname,'.'); | ||
27 | ext = fname(k(end)+1:end); | ||
28 | |||
29 | if (ext == 'bz2'), | ||
30 | cm = sprintf('!bzip2 -d %s',fname); | ||
31 | disp(cm);eval(cm); | ||
32 | I = imread2(fname(1:k(end-1)-1)); | ||
33 | cm = sprintf('!bzip2 %s',fname(1:k(end)-1)); | ||
34 | disp(cm);eval(cm); | ||
35 | elseif (ext == 'ppm'); | ||
36 | I = readppm(fname); | ||
37 | elseif (ext == 'pgm'); | ||
38 | I = readpgm(fname); | ||
39 | else | ||
40 | I = imread(fname); | ||
41 | I = double(I)/255; | ||
42 | end | ||
43 | end | ||
44 | |||
45 | cd(cur_dir); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/io/peek_pgm_size.m b/SD-VBS/common/toolbox/toolbox_basic/io/peek_pgm_size.m new file mode 100755 index 0000000..13e54cd --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/io/peek_pgm_size.m | |||
@@ -0,0 +1,19 @@ | |||
1 | function [nr,nc] = peek_pgm_size(filename) | ||
2 | % function [nr,nc] = peek_pgm_size(filename) | ||
3 | % this is my version of pgmread for the pgm file created by XV. | ||
4 | % | ||
5 | % this program also corrects for the shifts in the image from pm file. | ||
6 | |||
7 | |||
8 | fid = fopen(filename,'r'); | ||
9 | fscanf(fid, 'P5\n'); | ||
10 | cmt = '#'; | ||
11 | while findstr(cmt, '#'), | ||
12 | cmt = fgets(fid); | ||
13 | if length(findstr(cmt, '#')) ~= 1, | ||
14 | YX = sscanf(cmt, '%d %d'); | ||
15 | nc = YX(1); nr = YX(2); | ||
16 | end | ||
17 | end | ||
18 | |||
19 | fclose(fid); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/io/pgmread.m b/SD-VBS/common/toolbox/toolbox_basic/io/pgmread.m new file mode 100755 index 0000000..49a35a8 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/io/pgmread.m | |||
@@ -0,0 +1,24 @@ | |||
1 | function [img,header] = pgmread(filename) | ||
2 | % | ||
3 | % [img,header] = pgmread(filename) | ||
4 | |||
5 | [fid, msg] = fopen(filename, 'r'); | ||
6 | if fid == -1, | ||
7 | error(msg) | ||
8 | end | ||
9 | |||
10 | head = []; | ||
11 | good = 0; | ||
12 | while (good == 0) , | ||
13 | l = fgetl(fid); | ||
14 | if (length(l) == 3), | ||
15 | if (l == '255'), | ||
16 | good = 1; | ||
17 | sze = sscanf(header,'%d'); | ||
18 | end | ||
19 | end | ||
20 | header= l; | ||
21 | end | ||
22 | |||
23 | img = fread(fid, sze', 'uchar')'; | ||
24 | fclose(fid); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/io/ppmtojpg.m b/SD-VBS/common/toolbox/toolbox_basic/io/ppmtojpg.m new file mode 100755 index 0000000..ce47e45 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/io/ppmtojpg.m | |||
@@ -0,0 +1,25 @@ | |||
1 | function []= ppm2jpg(fname,dlm,ori) | ||
2 | % | ||
3 | % ppm2jpg(fname,dlm,ori) | ||
4 | % | ||
5 | % dlm =1, remove the file extension from fname | ||
6 | % before convert | ||
7 | % ori =1, transpose the image | ||
8 | % | ||
9 | |||
10 | if dlm, | ||
11 | dlm = findstr(fname,'.'); | ||
12 | fname = fname(1:dlm(end)-1); | ||
13 | end | ||
14 | |||
15 | fname_1 = sprintf('%s.ppm',fname); | ||
16 | I = readppm(fname_1); | ||
17 | |||
18 | if ori == 1, | ||
19 | I = permute(I,[2 1 3]); | ||
20 | end | ||
21 | |||
22 | |||
23 | fname_2 = sprintf('%s.jpg',fname); | ||
24 | imwrite(I,fname_2,'jpeg','Quality',90); | ||
25 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/io/read422.m b/SD-VBS/common/toolbox/toolbox_basic/io/read422.m new file mode 100755 index 0000000..31a27f9 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/io/read422.m | |||
@@ -0,0 +1,45 @@ | |||
1 | function I = read422(fname,nc); | ||
2 | % | ||
3 | % I = read422(fname,width); | ||
4 | % | ||
5 | % read in a .422 file, need to pass image width, default = 640 | ||
6 | % | ||
7 | |||
8 | % assume image width = 640 | ||
9 | if nargin<2, | ||
10 | nc = 640; | ||
11 | end | ||
12 | |||
13 | %% find the image size | ||
14 | fid = fopen(fname); | ||
15 | fseek(fid,0,1); | ||
16 | fsize = ftell(fid); | ||
17 | |||
18 | nr = fsize/nc/2; | ||
19 | fseek(fid,0,-1); | ||
20 | |||
21 | %% read in Ybr data | ||
22 | data = fread(fid,fsize,'uchar'); | ||
23 | |||
24 | %%% extract Y, Cb, Cr | ||
25 | Y1 = data(1:2:end); Y1 = reshape(Y1,nc,nr)'; | ||
26 | Cb1 = data(2:4:end); Cb1 = reshape(Cb1,nc/2,nr)'; | ||
27 | Cr1 = data(4:4:end); Cr1 = reshape(Cr1,nc/2,nr)'; | ||
28 | |||
29 | Cb = zeros(size(Y1)); | ||
30 | Cr = zeros(size(Y1)); | ||
31 | |||
32 | Cb(:,1:2:end) = Cb1; Cb(:,2:2:end) = Cb1; | ||
33 | %Cb(:,2:2:end) = 0.5*(Cb1+[Cb1(:,2:end),Cb1(:,end)]); | ||
34 | |||
35 | Cr(:,1:2:end) = Cr1; Cr(:,2:2:end) = Cr1; | ||
36 | %Cr(:,2:2:end) = 0.5*(Cr1+[Cr1(:,2:end),Cr1(:,end)]); | ||
37 | |||
38 | %%% convert to r,g,b | ||
39 | r = 1.164*(Y1-16.0) + 1.596*(Cr-128.0); | ||
40 | g = 1.164*(Y1-16.0) - 0.813*(Cr-128.0) - 0.391*(Cb-128.0); | ||
41 | b = 1.164*(Y1-16.0) + 2.018*(Cb-128.0); | ||
42 | |||
43 | I = cat(3,r,g,b); | ||
44 | I = max(0,min(I,255)); | ||
45 | I = I/255; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/io/read422f.m b/SD-VBS/common/toolbox/toolbox_basic/io/read422f.m new file mode 100755 index 0000000..0063000 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/io/read422f.m | |||
@@ -0,0 +1,50 @@ | |||
1 | function I = read422(fname,nc); | ||
2 | % | ||
3 | % I = read422(fname,width); | ||
4 | % | ||
5 | % read in a .422 file, need to pass image width, default = 640 | ||
6 | % | ||
7 | |||
8 | % assume image width = 640 | ||
9 | if nargin<2, | ||
10 | nc = 640; | ||
11 | end | ||
12 | |||
13 | %% find the image size | ||
14 | fid = fopen(fname); | ||
15 | fseek(fid,0,1); | ||
16 | fsize = ftell(fid); | ||
17 | |||
18 | nr = fsize/nc/2; | ||
19 | |||
20 | fseek(fid,0,-1); | ||
21 | |||
22 | %% read in Ybr data | ||
23 | data = fread(fid,fsize,'uchar'); | ||
24 | |||
25 | %%% extract Y, Cb, Cr | ||
26 | Y1 = data(1:2:end); Y1 = reshape(Y1,nc,nr)'; | ||
27 | Cb1 = data(2:4:end); Cb1 = reshape(Cb1,nc/2,nr)'; | ||
28 | Cr1 = data(4:4:end); Cr1 = reshape(Cr1,nc/2,nr)'; | ||
29 | |||
30 | Cb = zeros(size(Y1)); | ||
31 | Cr = zeros(size(Y1)); | ||
32 | |||
33 | Cb(:,1:2:end) = Cb1; Cb(:,2:2:end) = Cb1; | ||
34 | %Cb(:,2:2:end) = 0.5*(Cb1+[Cb1(:,2:end),Cb1(:,end)]); | ||
35 | |||
36 | Cr(:,1:2:end) = Cr1; Cr(:,2:2:end) = Cr1; | ||
37 | %Cr(:,2:2:end) = 0.5*(Cr1+[Cr1(:,2:end),Cr1(:,end)]); | ||
38 | |||
39 | %%% convert to r,g,b | ||
40 | r = 1.164*(Y1-16.0) + 1.596*(Cr-128.0); | ||
41 | g = 1.164*(Y1-16.0) - 0.813*(Cr-128.0) - 0.391*(Cb-128.0); | ||
42 | b = 1.164*(Y1-16.0) + 2.018*(Cb-128.0); | ||
43 | |||
44 | r = flipud(max(0,min(r,255))); | ||
45 | g = flipud(max(0,min(g,255))); | ||
46 | b = flipud(max(0,min(b,255))); | ||
47 | |||
48 | I = cat(3,r,g,b); | ||
49 | |||
50 | I = permute(I/255,[2,1,3]); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/io/read_cimgs.m b/SD-VBS/common/toolbox/toolbox_basic/io/read_cimgs.m new file mode 100755 index 0000000..d5df7f5 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/io/read_cimgs.m | |||
@@ -0,0 +1,40 @@ | |||
1 | function Is = read_imgs(homedir,imgdir,prename,postname,digits,startid,endid,step_img) | ||
2 | % | ||
3 | % Is = read_imgs(homedir,imgdir,prename,postname,digits,startid,endid,step_img) | ||
4 | % | ||
5 | |||
6 | |||
7 | |||
8 | command = ['%s%s%s%.',num2str(digits),'d%s']; | ||
9 | |||
10 | fname = sprintf(command,homedir,imgdir,prename,startid,postname); | ||
11 | disp(fname); | ||
12 | if (strcmp('.ppm',postname)), | ||
13 | I1 = readppm(fname); | ||
14 | else | ||
15 | I1 = imread(fname); | ||
16 | end | ||
17 | |||
18 | |||
19 | Is = zeros(size(I1,1),size(I1,2),size(I1,3),1+floor((endid-startid)/step_img)); | ||
20 | Is(:,:,:,1) = I1; | ||
21 | im_id = 1; | ||
22 | for j = startid+step_img:step_img:endid, | ||
23 | command = ['%s%s%s%.',num2str(digits),'d%s']; | ||
24 | fname = sprintf(command,homedir,imgdir,prename,j,postname); | ||
25 | disp(fname); | ||
26 | im_id = im_id+1; | ||
27 | |||
28 | if (strcmp('.ppm',postname)), | ||
29 | Is(:,:,:,im_id) = readppm(fname); | ||
30 | else | ||
31 | a = imread(fname); | ||
32 | Is(:,:,:,im_id) = a; | ||
33 | end | ||
34 | end | ||
35 | |||
36 | |||
37 | |||
38 | |||
39 | |||
40 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/io/read_ev_pgm.m b/SD-VBS/common/toolbox/toolbox_basic/io/read_ev_pgm.m new file mode 100755 index 0000000..3f7b69d --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/io/read_ev_pgm.m | |||
@@ -0,0 +1,26 @@ | |||
1 | function [evs,ev_info] = read_ev_pgm(basename,start_id,end_id,neigs) | ||
2 | % | ||
3 | % evs = read_ev_pgm(basename,start_id,end_id,neigs) | ||
4 | % | ||
5 | % | ||
6 | |||
7 | fname = sprintf('%s_ev_%.2d.%.2d.pgm',basename,start_id,1) | ||
8 | [nr,nc] = peek_pgm_size(fname); | ||
9 | |||
10 | evs = zeros(nr,nc,neigs-1,start_id-end_id+1); | ||
11 | ev_info = zeros(4,neigs-1,start_id-end_id+1); | ||
12 | |||
13 | for j=start_id:end_id, | ||
14 | for k=1:neigs-1, | ||
15 | |||
16 | fname = sprintf('%s_ev_%.2d.%.2d.pgm',basename,j,k); | ||
17 | [I,info] = readpgm_evinfo(fname); | ||
18 | |||
19 | if (length(info)<4) | ||
20 | info = [0;0;0;0]; | ||
21 | end | ||
22 | |||
23 | evs(:,:,k,j-start_id+1) = I; | ||
24 | ev_info(:,k,j-start_id+1) = info'; | ||
25 | end | ||
26 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/io/read_ev_pgm2.m b/SD-VBS/common/toolbox/toolbox_basic/io/read_ev_pgm2.m new file mode 100755 index 0000000..b0cc3f9 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/io/read_ev_pgm2.m | |||
@@ -0,0 +1,29 @@ | |||
1 | function [evs,ev_info] = read_ev_pgm2(basename,start_id,end_id,neigs) | ||
2 | % | ||
3 | % evs = read_ev_pgm(basename,start_id,end_id,neigs) | ||
4 | % | ||
5 | % read_ev_pgm.m modified by SXY in Feb. 2001. | ||
6 | % The first eigenvector is also included | ||
7 | |||
8 | fname = sprintf('%s_ev_%.2d.%.2d.pgm',basename,start_id,1) | ||
9 | [nr,nc] = peek_pgm_size(fname); | ||
10 | |||
11 | evs = zeros(nr,nc,neigs,start_id-end_id+1); | ||
12 | ev_info = zeros(4,neigs,start_id-end_id+1); | ||
13 | |||
14 | for j=start_id:end_id, | ||
15 | |||
16 | for k=1:neigs, | ||
17 | |||
18 | fname = sprintf('%s_ev_%.2d.%.2d.pgm',basename,j,k-1); | ||
19 | |||
20 | [I,info] = readpgm_evinfo(fname); | ||
21 | |||
22 | if (length(info)<4) | ||
23 | info = [0;0;0;0]; | ||
24 | end | ||
25 | |||
26 | evs(:,:,k,j-start_id+1) = I; | ||
27 | ev_info(:,k,j-start_id+1) = info'; | ||
28 | end | ||
29 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/io/read_ev_pgm_real.m b/SD-VBS/common/toolbox/toolbox_basic/io/read_ev_pgm_real.m new file mode 100755 index 0000000..d985679 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/io/read_ev_pgm_real.m | |||
@@ -0,0 +1,30 @@ | |||
1 | function [evs,ev_info] = read_ev_pgm(basename,start_id,end_id,neigs) | ||
2 | % | ||
3 | % evs = read_ev_pgm(basename,start_id,end_id,neigs) | ||
4 | % | ||
5 | % | ||
6 | |||
7 | fname = sprintf('%s_ev_%.2d.%.2d.pgm',basename,start_id,1); | ||
8 | [nr,nc] = peek_pgm_size(fname); | ||
9 | |||
10 | evs = zeros(nr,nc,neigs-1,start_id-end_id+1); | ||
11 | ev_info = zeros(4,neigs-1,start_id-end_id+1); | ||
12 | |||
13 | for j=start_id:end_id, | ||
14 | for k=1:neigs, | ||
15 | |||
16 | fname = sprintf('%s_ev_%.2d.%.2d.pgm',basename,j,k-1); | ||
17 | [I,info] = readpgm_evinfo(fname); | ||
18 | |||
19 | evs(:,:,k,j-start_id+1) = I; | ||
20 | ev_info(:,k,j-start_id+1) = info'; | ||
21 | end | ||
22 | end | ||
23 | |||
24 | evs = squeeze(evs); | ||
25 | |||
26 | for j=1:neigs, | ||
27 | evs(:,:,j) = (evs(:,:,j)/ev_info(3,j)) +ev_info(1,j); | ||
28 | %evs(:,:,j) = evs(:,:,j)/norm(reshape(evs(:,:,j),nr*nc,1)); | ||
29 | end | ||
30 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/io/read_imgs.m b/SD-VBS/common/toolbox/toolbox_basic/io/read_imgs.m new file mode 100755 index 0000000..f84486c --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/io/read_imgs.m | |||
@@ -0,0 +1,47 @@ | |||
1 | function Is = read_imgs(homedir,imgdir,prename,postname,digits,startid,endid,step_img) | ||
2 | % | ||
3 | % Is = read_imgs(homedir,imgdir,prename,postname,digits,startid,endid,step_img) | ||
4 | % | ||
5 | |||
6 | |||
7 | |||
8 | command = ['%s%s%s%.',num2str(digits),'d%s']; | ||
9 | |||
10 | fname = sprintf(command,homedir,imgdir,prename,startid,postname); | ||
11 | disp(fname); | ||
12 | if (strcmp('.pgm',postname)), | ||
13 | I1 = readpgm(fname); | ||
14 | elseif (strcmp('.ppm',postname)) | ||
15 | a = readppm(fname); | ||
16 | I1 = sum(a,3); | ||
17 | else | ||
18 | a = imread(fname); a = sum(double(a),3); | ||
19 | I1 = a; | ||
20 | end | ||
21 | |||
22 | |||
23 | Is = zeros(size(I1,1),size(I1,2),1+floor((endid-startid)/step_img)); | ||
24 | Is(:,:,1) = I1; | ||
25 | im_id = 1; | ||
26 | for j = startid+step_img:step_img:endid, | ||
27 | command = ['%s%s%s%.',num2str(digits),'d%s']; | ||
28 | fname = sprintf(command,homedir,imgdir,prename,j,postname); | ||
29 | disp(fname); | ||
30 | im_id = im_id+1; | ||
31 | |||
32 | if (strcmp('.pgm',postname)), | ||
33 | Is(:,:,im_id) = readpgm(fname); | ||
34 | elseif (strcmp('.ppm',postname)) | ||
35 | a = readppm(fname); | ||
36 | Is(:,:,im_id) = sum(a,3); | ||
37 | else | ||
38 | a = imread(fname); a = sum(double(a),3); | ||
39 | Is(:,:,im_id) = a; | ||
40 | end | ||
41 | end | ||
42 | |||
43 | |||
44 | |||
45 | |||
46 | |||
47 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/io/read_pmm.m b/SD-VBS/common/toolbox/toolbox_basic/io/read_pmm.m new file mode 100755 index 0000000..9e2eed1 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/io/read_pmm.m | |||
@@ -0,0 +1,12 @@ | |||
1 | function I = read_pmm(fname) | ||
2 | |||
3 | fid = fopen(fname,'r'); | ||
4 | |||
5 | [A] = fscanf(fid,'%d\n',3); | ||
6 | |||
7 | I = fscanf(fid,'%d',prod(A)); | ||
8 | |||
9 | |||
10 | I = reshape(I,A(2),A(1))'; | ||
11 | |||
12 | I = squeeze(I); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/io/read_scan.m b/SD-VBS/common/toolbox/toolbox_basic/io/read_scan.m new file mode 100755 index 0000000..6ad818a --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/io/read_scan.m | |||
@@ -0,0 +1,42 @@ | |||
1 | function [img,sizeinfo] = pgmread(filename) | ||
2 | % function img = pgmread(filename) | ||
3 | % this is my version of pgmread for the pgm file created by XV. | ||
4 | % | ||
5 | % this program also corrects for the shifts in the image from pm file. | ||
6 | |||
7 | |||
8 | fname_header = sprintf('%s.h01',filename); | ||
9 | fname_data = sprintf('%s.i01',filename); | ||
10 | |||
11 | fid = fopen(fname_header,'r'); | ||
12 | |||
13 | |||
14 | done = 0; | ||
15 | while done~=3, | ||
16 | cmt = fgets(fid) | ||
17 | if (findstr(cmt,'!matrix size[1]')), | ||
18 | nc = sscanf(cmt,'!matrix size[1] :=%d'); | ||
19 | done = done+1; | ||
20 | elseif (findstr(cmt,'!matrix size[2]')), | ||
21 | nr = sscanf(cmt,'!matrix size[2] :=%d'); | ||
22 | done = done+1; | ||
23 | elseif (findstr(cmt,'!matrix size[3]')), | ||
24 | ns = sscanf(cmt,'!matrix size[3] :=%d'); | ||
25 | done = done+1; | ||
26 | end | ||
27 | end | ||
28 | fclose(fid); | ||
29 | |||
30 | fid = fopen(fname_data,'r'); | ||
31 | |||
32 | %img = fscanf(fid,'%d',size); | ||
33 | %img = img'; | ||
34 | |||
35 | img = fread(fid,nc*nr*ns,'uint8'); | ||
36 | img = reshape(img,nc,nr,ns); | ||
37 | |||
38 | sizeinfo(1) = nr; | ||
39 | sizeinfo(2) = nc; | ||
40 | sizeinfo(3) = ns; | ||
41 | |||
42 | fclose(fid); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/io/read_seg_file.m b/SD-VBS/common/toolbox/toolbox_basic/io/read_seg_file.m new file mode 100755 index 0000000..a056ebc --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/io/read_seg_file.m | |||
@@ -0,0 +1,36 @@ | |||
1 | function [seg_map,seg] = read_seg(filename) | ||
2 | % | ||
3 | % function seg = read_seg(filename) | ||
4 | % | ||
5 | |||
6 | fid = fopen(filename,'r'); | ||
7 | if (fid < 0), | ||
8 | error(sprintf('can not find file: %s',filename)); | ||
9 | end | ||
10 | |||
11 | header_done =0; | ||
12 | while ~header_done, | ||
13 | |||
14 | cmt = fgets(fid); | ||
15 | if length(findstr(cmt,'#')) ~=1, | ||
16 | header_done = 1; | ||
17 | cmt = fgets(fid); | ||
18 | nc = sscanf(cmt,'width %d\n'); | ||
19 | cmt = fgets(fid); | ||
20 | nr = sscanf(cmt,'height %d\n'); | ||
21 | cmt = fgets(fid); | ||
22 | mseg = sscanf(cmt,'segments %d\n'); | ||
23 | cmt = fgets(fid); | ||
24 | end | ||
25 | end | ||
26 | |||
27 | seg = fscanf(fid,'%d',100*nr); | ||
28 | tmp = length(seg(:))/4; | ||
29 | seg = reshape(seg,4,tmp)'; | ||
30 | |||
31 | seg_map = zeros(nr,nc); | ||
32 | |||
33 | for j=1:tmp, | ||
34 | seg_map(seg(j,2)+1,1+seg(j,3):1+seg(j,4)) = seg(j,1); | ||
35 | end | ||
36 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/io/readlines.m b/SD-VBS/common/toolbox/toolbox_basic/io/readlines.m new file mode 100755 index 0000000..90bc944 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/io/readlines.m | |||
@@ -0,0 +1,30 @@ | |||
1 | function [lines,indexes] = readlines(fname) | ||
2 | % | ||
3 | % [lines,indexes] = readlines(fname) | ||
4 | % Read Edges points from .Ins file produced by "getlines" | ||
5 | % lines: a num_pointsx2 matrix of the edge points | ||
6 | % indexes: the braking point the lines | ||
7 | % | ||
8 | |||
9 | fid = fopen(fname,'r'); | ||
10 | |||
11 | done = 0; | ||
12 | lines = []; | ||
13 | indexes = []; | ||
14 | |||
15 | first_line = fscanf(fid,'%s',1); | ||
16 | |||
17 | while (~done), | ||
18 | num_lines = sscanf(first_line(3:length(first_line)),'%d'); | ||
19 | disp(num_lines); | ||
20 | indexes = [indexes,num_lines]; | ||
21 | a = fscanf(fid,'%f',[2,num_lines]); | ||
22 | lines = [lines;a']; | ||
23 | |||
24 | first_line = fscanf(fid,'%s',1); | ||
25 | if (first_line == []), | ||
26 | done = 1; | ||
27 | end | ||
28 | end | ||
29 | |||
30 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/io/readpdm3.m b/SD-VBS/common/toolbox/toolbox_basic/io/readpdm3.m new file mode 100755 index 0000000..c21fc48 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/io/readpdm3.m | |||
@@ -0,0 +1,16 @@ | |||
1 | function I = readpdm(filename) | ||
2 | |||
3 | fid = fopen(filename,'r'); | ||
4 | |||
5 | A = fscanf(fid,'%d',3) | ||
6 | A(3) = max(1,A(3)); | ||
7 | |||
8 | I = fscanf(fid,'%d',[A(1)*A(2)*A(3)]); | ||
9 | |||
10 | %I = fscanf(fid,'%f',A(2)*A(1));I = reshape(I,A(1),A(2)); | ||
11 | |||
12 | I = reshape(I,A(2),A(1),A(3)); | ||
13 | |||
14 | I = permute(I,[2,1,3]); | ||
15 | |||
16 | fclose(fid); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/io/readpdmc.m b/SD-VBS/common/toolbox/toolbox_basic/io/readpdmc.m new file mode 100755 index 0000000..37910b9 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/io/readpdmc.m | |||
@@ -0,0 +1,12 @@ | |||
1 | function I = readpfm(filename) | ||
2 | |||
3 | fid = fopen(filename,'r'); | ||
4 | |||
5 | A = fscanf(fid,'%d',2); | ||
6 | I = fscanf(fid,'%d',[A(2),A(1)]); | ||
7 | %I = fscanf(fid,'%d',[300,1000]); | ||
8 | I = I'; | ||
9 | |||
10 | %I = fscanf(fid,'%f',A(2)*A(1));I = reshape(I,A(1),A(2)); | ||
11 | |||
12 | fclose(fid); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/io/readpfm.m b/SD-VBS/common/toolbox/toolbox_basic/io/readpfm.m new file mode 100755 index 0000000..48ecd78 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/io/readpfm.m | |||
@@ -0,0 +1,10 @@ | |||
1 | function I = readpfm(filename) | ||
2 | |||
3 | fid = fopen(filename,'r'); | ||
4 | |||
5 | A = fscanf(fid,'%d',2); | ||
6 | I = fscanf(fid,'%f',[A(1),A(2)]); | ||
7 | |||
8 | %I = fscanf(fid,'%f',A(2)*A(1));I = reshape(I,A(1),A(2)); | ||
9 | |||
10 | fclose(fid); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/io/readpfm3.m b/SD-VBS/common/toolbox/toolbox_basic/io/readpfm3.m new file mode 100755 index 0000000..15ba959 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/io/readpfm3.m | |||
@@ -0,0 +1,17 @@ | |||
1 | function I = readpfm(filename) | ||
2 | |||
3 | fid = fopen(filename,'r'); | ||
4 | |||
5 | A = fscanf(fid,'%d',3); | ||
6 | A(3) = max(1,A(3)); | ||
7 | |||
8 | I = fscanf(fid,'%f',[A(1)*A(2)*A(3)]); | ||
9 | |||
10 | %I = fscanf(fid,'%f',A(2)*A(1));I = reshape(I,A(1),A(2)); | ||
11 | |||
12 | I = reshape(I,A(2),A(1),A(3)); | ||
13 | I = permute(I,[2,1,3]); | ||
14 | |||
15 | I = squeeze(I); | ||
16 | |||
17 | fclose(fid); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/io/readpfmc.m b/SD-VBS/common/toolbox/toolbox_basic/io/readpfmc.m new file mode 100755 index 0000000..2039002 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/io/readpfmc.m | |||
@@ -0,0 +1,11 @@ | |||
1 | function I = readpfm(filename) | ||
2 | |||
3 | fid = fopen(filename,'r'); | ||
4 | |||
5 | A = fscanf(fid,'%d',2); | ||
6 | I = fscanf(fid,'%f',[A(2),A(1)]); | ||
7 | I = I'; | ||
8 | |||
9 | %I = fscanf(fid,'%f',A(2)*A(1));I = reshape(I,A(1),A(2)); | ||
10 | |||
11 | fclose(fid); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/io/readpgm.m b/SD-VBS/common/toolbox/toolbox_basic/io/readpgm.m new file mode 100755 index 0000000..7aaf998 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/io/readpgm.m | |||
@@ -0,0 +1,30 @@ | |||
1 | function img = pgmread(filename) | ||
2 | % function img = pgmread(filename) | ||
3 | % this is my version of pgmread for the pgm file created by XV. | ||
4 | % | ||
5 | % this program also corrects for the shifts in the image from pm file. | ||
6 | |||
7 | |||
8 | fid = fopen(filename,'r'); | ||
9 | if (fid < 0), | ||
10 | error(sprintf('can not find file: %s',filename)); | ||
11 | end | ||
12 | |||
13 | fscanf(fid, 'P5\n'); | ||
14 | cmt = '#'; | ||
15 | while findstr(cmt, '#'), | ||
16 | cmt = fgets(fid); | ||
17 | if length(findstr(cmt, '#')) ~= 1, | ||
18 | YX = sscanf(cmt, '%d %d'); | ||
19 | y = YX(1); x = YX(2); | ||
20 | end | ||
21 | end | ||
22 | |||
23 | fgets(fid); | ||
24 | |||
25 | %img = fscanf(fid,'%d',size); | ||
26 | %img = img'; | ||
27 | |||
28 | img = fread(fid,[y,x],'uint8'); | ||
29 | img = img'; | ||
30 | fclose(fid); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/io/readpgm_evinfo.m b/SD-VBS/common/toolbox/toolbox_basic/io/readpgm_evinfo.m new file mode 100755 index 0000000..69f80ba --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/io/readpgm_evinfo.m | |||
@@ -0,0 +1,35 @@ | |||
1 | function [img,ev_info] = pgmread_evinfo(filename) | ||
2 | % function img = pgmread(filename) | ||
3 | % this is my version of pgmread for the pgm file created by XV. | ||
4 | % | ||
5 | % return the information in line # | ||
6 | |||
7 | |||
8 | fid = fopen(filename,'r'); | ||
9 | |||
10 | if (fid <0), | ||
11 | error(sprintf('can not find file %s',filename)); | ||
12 | end | ||
13 | |||
14 | fscanf(fid, 'P5\n'); | ||
15 | cmt = '#'; | ||
16 | while findstr(cmt, '#'), | ||
17 | cmt = fgets(fid); | ||
18 | if findstr(cmt,'#'), | ||
19 | ev_info = sscanf(cmt,'# minv: %f, maxv: %f, scale: %f, eigval: %f'); | ||
20 | end | ||
21 | if length(findstr(cmt, '#')) ~= 1, | ||
22 | YX = sscanf(cmt, '%d %d'); | ||
23 | y = YX(1); x = YX(2); | ||
24 | end | ||
25 | end | ||
26 | |||
27 | fgets(fid); | ||
28 | |||
29 | %img = fscanf(fid,'%d',size); | ||
30 | %img = img'; | ||
31 | |||
32 | img = fread(fid,[y,x],'uint8'); | ||
33 | img = img'; | ||
34 | fclose(fid); | ||
35 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/io/readpmm.m b/SD-VBS/common/toolbox/toolbox_basic/io/readpmm.m new file mode 100755 index 0000000..88fe907 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/io/readpmm.m | |||
@@ -0,0 +1,22 @@ | |||
1 | function I=readpmm(name) | ||
2 | % | ||
3 | % I=writepmm(name) | ||
4 | % | ||
5 | % I is a mul-band image | ||
6 | % | ||
7 | fid = fopen(name,'r'); | ||
8 | |||
9 | if (fid <0), | ||
10 | error(sprintf('can not find file %s',name)); | ||
11 | end | ||
12 | |||
13 | a = fscanf(fid,'%d',3); | ||
14 | nr = a(1);nc = a(2);nb = a(3); | ||
15 | |||
16 | |||
17 | I = fscanf(fid, '%f\n', nr*nc*nb); | ||
18 | |||
19 | I = reshape(I,nc,nr,nb)'; | ||
20 | I = squeeze(I); | ||
21 | |||
22 | fclose(fid); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/io/readppm.m b/SD-VBS/common/toolbox/toolbox_basic/io/readppm.m new file mode 100755 index 0000000..b9dd566 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/io/readppm.m | |||
@@ -0,0 +1,23 @@ | |||
1 | function [I,r, g, b] = readppm(name) | ||
2 | |||
3 | fid = fopen(name, 'r'); | ||
4 | fscanf(fid, 'P6\n'); | ||
5 | cmt = '#'; | ||
6 | while findstr(cmt, '#'), | ||
7 | cmt = fgets(fid); | ||
8 | if length(findstr(cmt, '#')) ~= 1 | ||
9 | YX = sscanf(cmt, '%d %d'); | ||
10 | y = YX(1); x = YX(2); | ||
11 | end | ||
12 | end | ||
13 | fgets(fid); | ||
14 | packed = fread(fid,[3*y,x],'uint8')'; | ||
15 | r = packed(:,1:3:3*y); | ||
16 | g = packed(:,2:3:3*y); | ||
17 | b = packed(:,3:3:3*y); | ||
18 | fclose(fid); | ||
19 | |||
20 | I(:,:,1) = r; | ||
21 | I(:,:,2) = g; | ||
22 | I(:,:,3) = b; | ||
23 | I = I/255; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/io/writepgm.m b/SD-VBS/common/toolbox/toolbox_basic/io/writepgm.m new file mode 100755 index 0000000..113cb18 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/io/writepgm.m | |||
@@ -0,0 +1,8 @@ | |||
1 | function I = writepgm(name,I) | ||
2 | |||
3 | [y,x] = size(I); | ||
4 | |||
5 | fid = fopen(name, 'w'); | ||
6 | fprintf(fid, 'P5\n%d %d\n255\n', x,y); | ||
7 | fwrite(fid, I', 'uint8'); | ||
8 | fclose(fid); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/io/writeppm.m b/SD-VBS/common/toolbox/toolbox_basic/io/writeppm.m new file mode 100755 index 0000000..3d2fed1 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/io/writeppm.m | |||
@@ -0,0 +1,14 @@ | |||
1 | function writeppm(name,I) | ||
2 | |||
3 | [y,x,nb] = size(I); | ||
4 | |||
5 | fid = fopen(name, 'w'); | ||
6 | fprintf(fid, 'P6\n%d %d\n255\n', x,y); | ||
7 | |||
8 | I1 = reshape(I(:,:,1)',1,x*y); | ||
9 | I2 = reshape(I(:,:,2)',1,x*y); | ||
10 | I3 = reshape(I(:,:,3)',1,x*y); | ||
11 | |||
12 | fwrite(fid, [I1;I2;I3], 'uint8'); | ||
13 | fclose(fid); | ||
14 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/matching/pub/contrib/v5/optim/assignprob/Contents.m b/SD-VBS/common/toolbox/toolbox_basic/matching/pub/contrib/v5/optim/assignprob/Contents.m new file mode 100755 index 0000000..3ddb232 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/matching/pub/contrib/v5/optim/assignprob/Contents.m | |||
@@ -0,0 +1,26 @@ | |||
1 | %Functions related to the assignment problem. | ||
2 | %Version 1.0, 25-May-1999. | ||
3 | % | ||
4 | %Copyright (c) 1995-1999 Niclas Borlin, Dept. of Computing Science, | ||
5 | % Umea University, SE-901 87 UMEA, Sweden. | ||
6 | % Niclas.Borlin@cs.umu.se. | ||
7 | % www.cs.umu.se/~niclas. | ||
8 | % | ||
9 | %All standard disclaimers apply. | ||
10 | % | ||
11 | %You are free to use this code as you wish. If you use it for a | ||
12 | %publication or in a commercial package, please include an | ||
13 | %acknowledgement and/or at least send me an email. (Looks good in my CV :-). | ||
14 | % | ||
15 | %Main functions: | ||
16 | % hungarian - calculate a solution of the square assignment | ||
17 | % problem. See HELP for a reference. | ||
18 | % condass - calculate a condition number of the solution to the | ||
19 | % assignment problem. See HELP for a reference. | ||
20 | % allcosts - calculate the costs of all possible assignments. | ||
21 | % allperms - calculate all possible permutations/assignments of a | ||
22 | % given problem size. | ||
23 | % | ||
24 | %Test/demo functions. | ||
25 | % demo - short demonstration of the main functions. | ||
26 | % test - test/verification of the main functions. | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/matching/pub/contrib/v5/optim/assignprob/allcosts.m b/SD-VBS/common/toolbox/toolbox_basic/matching/pub/contrib/v5/optim/assignprob/allcosts.m new file mode 100755 index 0000000..ffdb8b9 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/matching/pub/contrib/v5/optim/assignprob/allcosts.m | |||
@@ -0,0 +1,17 @@ | |||
1 | function [c,p]=allcosts(C) | ||
2 | %ALLCOSTS Calculate all costs for an assignment problem. | ||
3 | % | ||
4 | %[c,p]=allcosts(C) | ||
5 | %c returns the costs, p the corresponding permutations. | ||
6 | |||
7 | % v1.0 95-07-18. Niclas Borlin, niclas@cs.umu.se. | ||
8 | |||
9 | p=allperm(size(C,1)); | ||
10 | |||
11 | c=zeros(size(p,1),1); | ||
12 | |||
13 | I=eye(size(C,1)); | ||
14 | |||
15 | for i=1:size(p,1) | ||
16 | c(i)=sum(C(logical(sparse(p(i,:),1:size(C,1),1)))); | ||
17 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/matching/pub/contrib/v5/optim/assignprob/allperm.m b/SD-VBS/common/toolbox/toolbox_basic/matching/pub/contrib/v5/optim/assignprob/allperm.m new file mode 100755 index 0000000..b8d419e --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/matching/pub/contrib/v5/optim/assignprob/allperm.m | |||
@@ -0,0 +1,17 @@ | |||
1 | function p=allperm(n) | ||
2 | %ALLPERM All permutation matrix. | ||
3 | % | ||
4 | %p=allperm(n) | ||
5 | %Returns a matrix with all permutations of 1:n stored row-wise. | ||
6 | |||
7 | % v1.0 95-07-18. Niclas Borlin, niclas@cs.umu.se. | ||
8 | |||
9 | if (n<=1) | ||
10 | p=1; | ||
11 | else | ||
12 | q=allperm(n-1); | ||
13 | p=[]; | ||
14 | for i=1:n | ||
15 | p=[p;i*ones(size(q,1),1) q+(q>=i)]; | ||
16 | end | ||
17 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/matching/pub/contrib/v5/optim/assignprob/condass.m b/SD-VBS/common/toolbox/toolbox_basic/matching/pub/contrib/v5/optim/assignprob/condass.m new file mode 100755 index 0000000..82552e7 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/matching/pub/contrib/v5/optim/assignprob/condass.m | |||
@@ -0,0 +1,54 @@ | |||
1 | function [k,C1,T1,C2,T2]=condass(A) | ||
2 | %CONDASS Calculate condition number of the assigment problem. | ||
3 | % | ||
4 | %[k,C1,T1,C2,T2]=condass(A) | ||
5 | %A - A square cost matrix. | ||
6 | %k - The condition number of the assigment problem. | ||
7 | %C1 - The best assigment. | ||
8 | %T1 - The lowest cost. | ||
9 | %C2 - The second best assignment. | ||
10 | %T2 - The second lowest cost. | ||
11 | % | ||
12 | %The condition number is calculated as the relative difference between | ||
13 | %the best and second best solutions, as described in Nystrom, Soderkvist, | ||
14 | %and Wedin, "A Note on some Identification Problems Arising in Roentgen | ||
15 | %Stereo Photogrammetric Analysis", J of Biomechanics, 27(10):1291-1294, | ||
16 | %1994. | ||
17 | |||
18 | % v1.0 96-09-14. Niclas Borlin, niclas@cs.umu.se. | ||
19 | |||
20 | % A substantial effort was put into this code. If you use it for a | ||
21 | % publication or otherwise, please include an acknowledgement and notify | ||
22 | % me by email. /Niclas | ||
23 | |||
24 | % Create a large number used to block selected assignments. | ||
25 | big=sum(sum(A))+1; | ||
26 | |||
27 | % Get best assigment. | ||
28 | [C1,T1]=hungarian(A); | ||
29 | |||
30 | % Initialize second best solution. | ||
31 | T2=inf; | ||
32 | C2=zeros(size(C1)); | ||
33 | |||
34 | % Create a work matrix. | ||
35 | B=A; | ||
36 | for i=1:length(C1) | ||
37 | % Block assigment in column i. | ||
38 | B(C1(i),i)=big; | ||
39 | % Get best assigment with this one blocked. | ||
40 | [C,T]=hungarian(B); | ||
41 | if (T<T2) | ||
42 | % Remember it if it's the best so far. | ||
43 | T2=T; | ||
44 | C2=C; | ||
45 | end | ||
46 | % Remove blocking in column i. | ||
47 | B(C1(i),i)=A(C1(i),i); | ||
48 | end | ||
49 | |||
50 | % Calculate difference... | ||
51 | mu=T2-T1; | ||
52 | |||
53 | % ...and condition number. | ||
54 | k=T1/mu; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/matching/pub/contrib/v5/optim/assignprob/demo.m b/SD-VBS/common/toolbox/toolbox_basic/matching/pub/contrib/v5/optim/assignprob/demo.m new file mode 100755 index 0000000..2d34e37 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/matching/pub/contrib/v5/optim/assignprob/demo.m | |||
@@ -0,0 +1,38 @@ | |||
1 | A=magic(10); | ||
2 | B=A(4:7,4:7); | ||
3 | disp('Cost matrix:') | ||
4 | disp(B) | ||
5 | disp('Calculating best assignment...'); | ||
6 | [c,t]=hungarian(B); | ||
7 | disp('Best assignment (as row indices):') | ||
8 | disp(c) | ||
9 | disp('Best assignment (as logical matrix):') | ||
10 | disp(logical(full(sparse(c,1:4,1)))) | ||
11 | disp('Lowest cost:') | ||
12 | disp(t) | ||
13 | |||
14 | disp(sprintf('\nCalculating condition number for solution...')); | ||
15 | [k,c1,t1,c2,t2]=condass(B); | ||
16 | disp('Lowest cost (should be same as above): ') | ||
17 | disp(t1) | ||
18 | disp('corresponding assignment (should be same as above):') | ||
19 | disp(c1) | ||
20 | disp('Second lowest cost: ') | ||
21 | disp(t2) | ||
22 | disp('corresponding assignment:') | ||
23 | disp(c2) | ||
24 | disp('Condition number for solution:') | ||
25 | disp(k) | ||
26 | |||
27 | disp(sprintf('\nCalculating all possible costs...')); | ||
28 | [c,p]=allcosts(B); | ||
29 | % Sort by cost. | ||
30 | [y,i]=sort(c); | ||
31 | disp('The three lowest costs:') | ||
32 | disp(c(i(1:3))) | ||
33 | disp('Corresponding assignments:') | ||
34 | disp(p(i(1:3),:)) | ||
35 | disp('The three highest costs:') | ||
36 | disp(c(i(end+[-2:0]))) | ||
37 | disp('Corresponding assignments:') | ||
38 | disp(p(i(end+[-2:0]),:)) | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/matching/pub/contrib/v5/optim/assignprob/hungarian.m b/SD-VBS/common/toolbox/toolbox_basic/matching/pub/contrib/v5/optim/assignprob/hungarian.m new file mode 100755 index 0000000..0b493f0 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/matching/pub/contrib/v5/optim/assignprob/hungarian.m | |||
@@ -0,0 +1,464 @@ | |||
1 | function [C,T]=hungarian(A) | ||
2 | %HUNGARIAN Solve the Assignment problem using the Hungarian method. | ||
3 | % | ||
4 | %[C,T]=hungarian(A) | ||
5 | %A - a square cost matrix. | ||
6 | %C - the optimal assignment. | ||
7 | %T - the cost of the optimal assignment. | ||
8 | |||
9 | % Adapted from the FORTRAN IV code in Carpaneto and Toth, "Algorithm 548: | ||
10 | % Solution of the assignment problem [H]", ACM Transactions on | ||
11 | % Mathematical Software, 6(1):104-111, 1980. | ||
12 | |||
13 | % v1.0 96-06-14. Niclas Borlin, niclas@cs.umu.se. | ||
14 | % Department of Computing Science, Umeå University, | ||
15 | % Sweden. | ||
16 | % All standard disclaimers apply. | ||
17 | |||
18 | % A substantial effort was put into this code. If you use it for a | ||
19 | % publication or otherwise, please include an acknowledgement or at least | ||
20 | % notify me by email. /Niclas | ||
21 | |||
22 | [m,n]=size(A); | ||
23 | |||
24 | if (m~=n) | ||
25 | error('HUNGARIAN: Cost matrix must be square!'); | ||
26 | end | ||
27 | |||
28 | % Save original cost matrix. | ||
29 | orig=A; | ||
30 | |||
31 | % Reduce matrix. | ||
32 | A=hminired(A); | ||
33 | |||
34 | % Do an initial assignment. | ||
35 | [A,C,U]=hminiass(A); | ||
36 | |||
37 | % Repeat while we have unassigned rows. | ||
38 | while (U(n+1)) | ||
39 | % Start with no path, no unchecked zeros, and no unexplored rows. | ||
40 | LR=zeros(1,n); | ||
41 | LC=zeros(1,n); | ||
42 | CH=zeros(1,n); | ||
43 | RH=[zeros(1,n) -1]; | ||
44 | |||
45 | % No labelled columns. | ||
46 | SLC=[]; | ||
47 | |||
48 | % Start path in first unassigned row. | ||
49 | r=U(n+1); | ||
50 | % Mark row with end-of-path label. | ||
51 | LR(r)=-1; | ||
52 | % Insert row first in labelled row set. | ||
53 | SLR=r; | ||
54 | |||
55 | % Repeat until we manage to find an assignable zero. | ||
56 | while (1) | ||
57 | % If there are free zeros in row r | ||
58 | if (A(r,n+1)~=0) | ||
59 | % ...get column of first free zero. | ||
60 | l=-A(r,n+1); | ||
61 | |||
62 | % If there are more free zeros in row r and row r in not | ||
63 | % yet marked as unexplored.. | ||
64 | if (A(r,l)~=0 & RH(r)==0) | ||
65 | % Insert row r first in unexplored list. | ||
66 | RH(r)=RH(n+1); | ||
67 | RH(n+1)=r; | ||
68 | |||
69 | % Mark in which column the next unexplored zero in this row | ||
70 | % is. | ||
71 | CH(r)=-A(r,l); | ||
72 | end | ||
73 | else | ||
74 | % If all rows are explored.. | ||
75 | if (RH(n+1)<=0) | ||
76 | % Reduce matrix. | ||
77 | [A,CH,RH]=hmreduce(A,CH,RH,LC,LR,SLC,SLR); | ||
78 | end | ||
79 | |||
80 | % Re-start with first unexplored row. | ||
81 | r=RH(n+1); | ||
82 | % Get column of next free zero in row r. | ||
83 | l=CH(r); | ||
84 | % Advance "column of next free zero". | ||
85 | CH(r)=-A(r,l); | ||
86 | % If this zero is last in the list.. | ||
87 | if (A(r,l)==0) | ||
88 | % ...remove row r from unexplored list. | ||
89 | RH(n+1)=RH(r); | ||
90 | RH(r)=0; | ||
91 | end | ||
92 | end | ||
93 | |||
94 | % While the column l is labelled, i.e. in path. | ||
95 | while (LC(l)~=0) | ||
96 | % If row r is explored.. | ||
97 | if (RH(r)==0) | ||
98 | % If all rows are explored.. | ||
99 | if (RH(n+1)<=0) | ||
100 | % Reduce cost matrix. | ||
101 | [A,CH,RH]=hmreduce(A,CH,RH,LC,LR,SLC,SLR); | ||
102 | end | ||
103 | |||
104 | % Re-start with first unexplored row. | ||
105 | r=RH(n+1); | ||
106 | end | ||
107 | |||
108 | % Get column of next free zero in row r. | ||
109 | l=CH(r); | ||
110 | |||
111 | % Advance "column of next free zero". | ||
112 | CH(r)=-A(r,l); | ||
113 | |||
114 | % If this zero is last in list.. | ||
115 | if(A(r,l)==0) | ||
116 | % ...remove row r from unexplored list. | ||
117 | RH(n+1)=RH(r); | ||
118 | RH(r)=0; | ||
119 | end | ||
120 | end | ||
121 | |||
122 | % If the column found is unassigned.. | ||
123 | if (C(l)==0) | ||
124 | % Flip all zeros along the path in LR,LC. | ||
125 | [A,C,U]=hmflip(A,C,LC,LR,U,l,r); | ||
126 | % ...and exit to continue with next unassigned row. | ||
127 | break; | ||
128 | else | ||
129 | % ...else add zero to path. | ||
130 | |||
131 | % Label column l with row r. | ||
132 | LC(l)=r; | ||
133 | |||
134 | % Add l to the set of labelled columns. | ||
135 | SLC=[SLC l]; | ||
136 | |||
137 | % Continue with the row assigned to column l. | ||
138 | r=C(l); | ||
139 | |||
140 | % Label row r with column l. | ||
141 | LR(r)=l; | ||
142 | |||
143 | % Add r to the set of labelled rows. | ||
144 | SLR=[SLR r]; | ||
145 | end | ||
146 | end | ||
147 | end | ||
148 | |||
149 | % Calculate the total cost. | ||
150 | T=sum(orig(logical(sparse(C,1:size(orig,2),1)))); | ||
151 | |||
152 | |||
153 | function A=hminired(A) | ||
154 | %HMINIRED Initial reduction of cost matrix for the Hungarian method. | ||
155 | % | ||
156 | %B=assredin(A) | ||
157 | %A - the unreduced cost matris. | ||
158 | %B - the reduced cost matrix with linked zeros in each row. | ||
159 | |||
160 | % v1.0 96-06-13. Niclas Borlin, niclas@cs.umu.se. | ||
161 | |||
162 | [m,n]=size(A); | ||
163 | |||
164 | % Subtract column-minimum values from each column. | ||
165 | colMin=min(A); | ||
166 | A=A-colMin(ones(n,1),:); | ||
167 | |||
168 | % Subtract row-minimum values from each row. | ||
169 | rowMin=min(A')'; | ||
170 | A=A-rowMin(:,ones(1,n)); | ||
171 | |||
172 | % Get positions of all zeros. | ||
173 | [i,j]=find(A==0); | ||
174 | |||
175 | % Extend A to give room for row zero list header column. | ||
176 | A(1,n+1)=0; | ||
177 | for k=1:n | ||
178 | % Get all column in this row. | ||
179 | cols=j(k==i)'; | ||
180 | % Insert pointers in matrix. | ||
181 | A(k,[n+1 cols])=[-cols 0]; | ||
182 | end | ||
183 | |||
184 | |||
185 | function [A,C,U]=hminiass(A) | ||
186 | %HMINIASS Initial assignment of the Hungarian method. | ||
187 | % | ||
188 | %[B,C,U]=hminiass(A) | ||
189 | %A - the reduced cost matrix. | ||
190 | %B - the reduced cost matrix, with assigned zeros removed from lists. | ||
191 | %C - a vector. C(J)=I means row I is assigned to column J, | ||
192 | % i.e. there is an assigned zero in position I,J. | ||
193 | %U - a vector with a linked list of unassigned rows. | ||
194 | |||
195 | % v1.0 96-06-14. Niclas Borlin, niclas@cs.umu.se. | ||
196 | |||
197 | [n,np1]=size(A); | ||
198 | |||
199 | % Initalize return vectors. | ||
200 | C=zeros(1,n); | ||
201 | U=zeros(1,n+1); | ||
202 | |||
203 | % Initialize last/next zero "pointers". | ||
204 | LZ=zeros(1,n); | ||
205 | NZ=zeros(1,n); | ||
206 | |||
207 | for i=1:n | ||
208 | % Set j to first unassigned zero in row i. | ||
209 | lj=n+1; | ||
210 | j=-A(i,lj); | ||
211 | |||
212 | % Repeat until we have no more zeros (j==0) or we find a zero | ||
213 | % in an unassigned column (c(j)==0). | ||
214 | |||
215 | while (C(j)~=0) | ||
216 | % Advance lj and j in zero list. | ||
217 | lj=j; | ||
218 | j=-A(i,lj); | ||
219 | |||
220 | % Stop if we hit end of list. | ||
221 | if (j==0) | ||
222 | break; | ||
223 | end | ||
224 | end | ||
225 | |||
226 | if (j~=0) | ||
227 | % We found a zero in an unassigned column. | ||
228 | |||
229 | % Assign row i to column j. | ||
230 | C(j)=i; | ||
231 | |||
232 | % Remove A(i,j) from unassigned zero list. | ||
233 | A(i,lj)=A(i,j); | ||
234 | |||
235 | % Update next/last unassigned zero pointers. | ||
236 | NZ(i)=-A(i,j); | ||
237 | LZ(i)=lj; | ||
238 | |||
239 | % Indicate A(i,j) is an assigned zero. | ||
240 | A(i,j)=0; | ||
241 | else | ||
242 | % We found no zero in an unassigned column. | ||
243 | |||
244 | % Check all zeros in this row. | ||
245 | |||
246 | lj=n+1; | ||
247 | j=-A(i,lj); | ||
248 | |||
249 | % Check all zeros in this row for a suitable zero in another row. | ||
250 | while (j~=0) | ||
251 | % Check the in the row assigned to this column. | ||
252 | r=C(j); | ||
253 | |||
254 | % Pick up last/next pointers. | ||
255 | lm=LZ(r); | ||
256 | m=NZ(r); | ||
257 | |||
258 | % Check all unchecked zeros in free list of this row. | ||
259 | while (m~=0) | ||
260 | % Stop if we find an unassigned column. | ||
261 | if (C(m)==0) | ||
262 | break; | ||
263 | end | ||
264 | |||
265 | % Advance one step in list. | ||
266 | lm=m; | ||
267 | m=-A(r,lm); | ||
268 | end | ||
269 | |||
270 | if (m==0) | ||
271 | % We failed on row r. Continue with next zero on row i. | ||
272 | lj=j; | ||
273 | j=-A(i,lj); | ||
274 | else | ||
275 | % We found a zero in an unassigned column. | ||
276 | |||
277 | % Replace zero at (r,m) in unassigned list with zero at (r,j) | ||
278 | A(r,lm)=-j; | ||
279 | A(r,j)=A(r,m); | ||
280 | |||
281 | % Update last/next pointers in row r. | ||
282 | NZ(r)=-A(r,m); | ||
283 | LZ(r)=j; | ||
284 | |||
285 | % Mark A(r,m) as an assigned zero in the matrix . . . | ||
286 | A(r,m)=0; | ||
287 | |||
288 | % ...and in the assignment vector. | ||
289 | C(m)=r; | ||
290 | |||
291 | % Remove A(i,j) from unassigned list. | ||
292 | A(i,lj)=A(i,j); | ||
293 | |||
294 | % Update last/next pointers in row r. | ||
295 | NZ(i)=-A(i,j); | ||
296 | LZ(i)=lj; | ||
297 | |||
298 | % Mark A(r,m) as an assigned zero in the matrix . . . | ||
299 | A(i,j)=0; | ||
300 | |||
301 | % ...and in the assignment vector. | ||
302 | C(j)=i; | ||
303 | |||
304 | % Stop search. | ||
305 | break; | ||
306 | end | ||
307 | end | ||
308 | end | ||
309 | end | ||
310 | |||
311 | % Create vector with list of unassigned rows. | ||
312 | |||
313 | % Mark all rows have assignment. | ||
314 | r=zeros(1,n); | ||
315 | rows=C(C~=0); | ||
316 | r(rows)=rows; | ||
317 | empty=find(r==0); | ||
318 | |||
319 | % Create vector with linked list of unassigned rows. | ||
320 | U=zeros(1,n+1); | ||
321 | U([n+1 empty])=[empty 0]; | ||
322 | |||
323 | |||
324 | function [A,C,U]=hmflip(A,C,LC,LR,U,l,r) | ||
325 | %HMFLIP Flip assignment state of all zeros along a path. | ||
326 | % | ||
327 | %[A,C,U]=hmflip(A,C,LC,LR,U,l,r) | ||
328 | %Input: | ||
329 | %A - the cost matrix. | ||
330 | %C - the assignment vector. | ||
331 | %LC - the column label vector. | ||
332 | %LR - the row label vector. | ||
333 | %U - the | ||
334 | %r,l - position of last zero in path. | ||
335 | %Output: | ||
336 | %A - updated cost matrix. | ||
337 | %C - updated assignment vector. | ||
338 | %U - updated unassigned row list vector. | ||
339 | |||
340 | % v1.0 96-06-14. Niclas Borlin, niclas@cs.umu.se. | ||
341 | |||
342 | n=size(A,1); | ||
343 | |||
344 | while (1) | ||
345 | % Move assignment in column l to row r. | ||
346 | C(l)=r; | ||
347 | |||
348 | % Find zero to be removed from zero list.. | ||
349 | |||
350 | % Find zero before this. | ||
351 | m=find(A(r,:)==-l); | ||
352 | |||
353 | % Link past this zero. | ||
354 | A(r,m)=A(r,l); | ||
355 | |||
356 | A(r,l)=0; | ||
357 | |||
358 | % If this was the first zero of the path.. | ||
359 | if (LR(r)<0) | ||
360 | ...remove row from unassigned row list and return. | ||
361 | U(n+1)=U(r); | ||
362 | U(r)=0; | ||
363 | return; | ||
364 | else | ||
365 | |||
366 | % Move back in this row along the path and get column of next zero. | ||
367 | l=LR(r); | ||
368 | |||
369 | % Insert zero at (r,l) first in zero list. | ||
370 | A(r,l)=A(r,n+1); | ||
371 | A(r,n+1)=-l; | ||
372 | |||
373 | % Continue back along the column to get row of next zero in path. | ||
374 | r=LC(l); | ||
375 | end | ||
376 | end | ||
377 | |||
378 | |||
379 | function [A,CH,RH]=hmreduce(A,CH,RH,LC,LR,SLC,SLR) | ||
380 | %HMREDUCE Reduce parts of cost matrix in the Hungerian method. | ||
381 | % | ||
382 | %[A,CH,RH]=hmreduce(A,CH,RH,LC,LR,SLC,SLR) | ||
383 | %Input: | ||
384 | %A - Cost matrix. | ||
385 | %CH - vector of column of 'next zeros' in each row. | ||
386 | %RH - vector with list of unexplored rows. | ||
387 | %LC - column labels. | ||
388 | %RC - row labels. | ||
389 | %SLC - set of column labels. | ||
390 | %SLR - set of row labels. | ||
391 | % | ||
392 | %Output: | ||
393 | %A - Reduced cost matrix. | ||
394 | %CH - Updated vector of 'next zeros' in each row. | ||
395 | %RH - Updated vector of unexplored rows. | ||
396 | |||
397 | % v1.0 96-06-14. Niclas Borlin, niclas@cs.umu.se. | ||
398 | |||
399 | n=size(A,1); | ||
400 | |||
401 | % Find which rows are covered, i.e. unlabelled. | ||
402 | coveredRows=LR==0; | ||
403 | |||
404 | % Find which columns are covered, i.e. labelled. | ||
405 | coveredCols=LC~=0; | ||
406 | |||
407 | r=find(~coveredRows); | ||
408 | c=find(~coveredCols); | ||
409 | |||
410 | % Get minimum of uncovered elements. | ||
411 | m=min(min(A(r,c))); | ||
412 | |||
413 | % Subtract minimum from all uncovered elements. | ||
414 | A(r,c)=A(r,c)-m; | ||
415 | |||
416 | % Check all uncovered columns.. | ||
417 | for j=c | ||
418 | % ...and uncovered rows in path order.. | ||
419 | for i=SLR | ||
420 | % If this is a (new) zero.. | ||
421 | if (A(i,j)==0) | ||
422 | % If the row is not in unexplored list.. | ||
423 | if (RH(i)==0) | ||
424 | % ...insert it first in unexplored list. | ||
425 | RH(i)=RH(n+1); | ||
426 | RH(n+1)=i; | ||
427 | % Mark this zero as "next free" in this row. | ||
428 | CH(i)=j; | ||
429 | end | ||
430 | % Find last unassigned zero on row I. | ||
431 | row=A(i,:); | ||
432 | colsInList=-row(row<0); | ||
433 | if (length(colsInList)==0) | ||
434 | % No zeros in the list. | ||
435 | l=n+1; | ||
436 | else | ||
437 | l=colsInList(row(colsInList)==0); | ||
438 | end | ||
439 | % Append this zero to end of list. | ||
440 | A(i,l)=-j; | ||
441 | end | ||
442 | end | ||
443 | end | ||
444 | |||
445 | % Add minimum to all doubly covered elements. | ||
446 | r=find(coveredRows); | ||
447 | c=find(coveredCols); | ||
448 | |||
449 | % Take care of the zeros we will remove. | ||
450 | [i,j]=find(A(r,c)<=0); | ||
451 | |||
452 | i=r(i); | ||
453 | j=c(j); | ||
454 | |||
455 | for k=1:length(i) | ||
456 | % Find zero before this in this row. | ||
457 | lj=find(A(i(k),:)==-j(k)); | ||
458 | % Link past it. | ||
459 | A(i(k),lj)=A(i(k),j(k)); | ||
460 | % Mark it as assigned. | ||
461 | A(i(k),j(k))=0; | ||
462 | end | ||
463 | |||
464 | A(r,c)=A(r,c)+m; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/matching/pub/contrib/v5/optim/assignprob/test.m b/SD-VBS/common/toolbox/toolbox_basic/matching/pub/contrib/v5/optim/assignprob/test.m new file mode 100755 index 0000000..4c238f2 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/matching/pub/contrib/v5/optim/assignprob/test.m | |||
@@ -0,0 +1,87 @@ | |||
1 | disp('Testing hungarian...'); | ||
2 | A=magic(10); | ||
3 | B=A(4:7,4:7); | ||
4 | [c,t]=hungarian(B); | ||
5 | if (any(c~=[2 1 3 4])) | ||
6 | disp('Wrong coupling!'); | ||
7 | elseif (t~=77) | ||
8 | disp('Wrong solution!'); | ||
9 | else | ||
10 | disp('Hungarian appears OK.'); | ||
11 | end | ||
12 | |||
13 | disp('Testing condass...'); | ||
14 | [k,c1,t1,c2,t2]=condass(B); | ||
15 | if (any(c1~=[2 1 3 4])) | ||
16 | disp('Wrong best coupling!'); | ||
17 | elseif (t1~=77) | ||
18 | disp('Wrong lowest cost!'); | ||
19 | elseif (any(c2~=[1 2 3 4])) | ||
20 | disp('Wrong second best coupling!'); | ||
21 | elseif (t2~=102) | ||
22 | disp('Wrong second lowest cost!'); | ||
23 | elseif (k~=t1/(t2-t1)) | ||
24 | disp('Wrong condition number!'); | ||
25 | else | ||
26 | disp('condass appears OK.'); | ||
27 | end | ||
28 | |||
29 | disp('Testing allcosts...'); | ||
30 | [c,p]=allcosts(B); | ||
31 | cTrue=[ 102 | ||
32 | 127 | ||
33 | 202 | ||
34 | 227 | ||
35 | 222 | ||
36 | 222 | ||
37 | 77 | ||
38 | 102 | ||
39 | 182 | ||
40 | 202 | ||
41 | 202 | ||
42 | 197 | ||
43 | 177 | ||
44 | 202 | ||
45 | 182 | ||
46 | 202 | ||
47 | 302 | ||
48 | 297 | ||
49 | 202 | ||
50 | 202 | ||
51 | 207 | ||
52 | 202 | ||
53 | 307 | ||
54 | 302 | ||
55 | ]; | ||
56 | pTrue=[ 1 2 3 4 | ||
57 | 1 2 4 3 | ||
58 | 1 3 2 4 | ||
59 | 1 3 4 2 | ||
60 | 1 4 2 3 | ||
61 | 1 4 3 2 | ||
62 | 2 1 3 4 | ||
63 | 2 1 4 3 | ||
64 | 2 3 1 4 | ||
65 | 2 3 4 1 | ||
66 | 2 4 1 3 | ||
67 | 2 4 3 1 | ||
68 | 3 1 2 4 | ||
69 | 3 1 4 2 | ||
70 | 3 2 1 4 | ||
71 | 3 2 4 1 | ||
72 | 3 4 1 2 | ||
73 | 3 4 2 1 | ||
74 | 4 1 2 3 | ||
75 | 4 1 3 2 | ||
76 | 4 2 1 3 | ||
77 | 4 2 3 1 | ||
78 | 4 3 1 2 | ||
79 | 4 3 2 1 | ||
80 | ]; | ||
81 | if (any(c~=cTrue)) | ||
82 | disp('Wrong costs!'); | ||
83 | elseif (any(p~=pTrue)) | ||
84 | disp('Wrong permutations!'); | ||
85 | else | ||
86 | disp('allcosts appears OK.'); | ||
87 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/pyramid/091399fbn-jets.3.jpg b/SD-VBS/common/toolbox/toolbox_basic/pyramid/091399fbn-jets.3.jpg new file mode 100755 index 0000000..b91732f --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/pyramid/091399fbn-jets.3.jpg | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/pyramid/expand.m b/SD-VBS/common/toolbox/toolbox_basic/pyramid/expand.m new file mode 100755 index 0000000..64e9fda --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/pyramid/expand.m | |||
@@ -0,0 +1,8 @@ | |||
1 | function J = expand(I) | ||
2 | % | ||
3 | % | ||
4 | |||
5 | [sy,sx] = size(I); | ||
6 | [x,y] = meshgrid(1:2*sx+1,1:2*sy+1); | ||
7 | |||
8 | nx = \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/pyramid/gauss_lowpass.m b/SD-VBS/common/toolbox/toolbox_basic/pyramid/gauss_lowpass.m new file mode 100755 index 0000000..87ad4f1 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/pyramid/gauss_lowpass.m | |||
@@ -0,0 +1,9 @@ | |||
1 | function J = gauss_lowpass(I,a) | ||
2 | |||
3 | if (nargin < 2), | ||
4 | a = 0.4; | ||
5 | end | ||
6 | |||
7 | w = gen_w(a); | ||
8 | |||
9 | J = conv2(conv2(I,w,'same'),w','same'); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/pyramid/gen_w.m b/SD-VBS/common/toolbox/toolbox_basic/pyramid/gen_w.m new file mode 100755 index 0000000..b255751 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/pyramid/gen_w.m | |||
@@ -0,0 +1,12 @@ | |||
1 | function w = gen_w(a) | ||
2 | % | ||
3 | |||
4 | if (nargin == 0), | ||
5 | a = 0.4; | ||
6 | end | ||
7 | |||
8 | w(3) = a; | ||
9 | w(1) = 1/4 - a/2; | ||
10 | w(5) = 1/4 - a/2; | ||
11 | w(2) = 1/4; | ||
12 | w(4) = 1/4; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/pyramid/reduce.m b/SD-VBS/common/toolbox/toolbox_basic/pyramid/reduce.m new file mode 100755 index 0000000..6837e8a --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/pyramid/reduce.m | |||
@@ -0,0 +1,7 @@ | |||
1 | function J = reduce(I) | ||
2 | |||
3 | [nr,nc,nb] = size(I); | ||
4 | for j=1:nb, | ||
5 | tmp = gauss_lowpass(I(:,:,j)); | ||
6 | J(:,:,j) = tmp(1:2:nr,1:2:nc); | ||
7 | end \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/pyramid/session.m b/SD-VBS/common/toolbox/toolbox_basic/pyramid/session.m new file mode 100755 index 0000000..9d0aa6c --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/pyramid/session.m | |||
@@ -0,0 +1,26 @@ | |||
1 | %image_dir = '/home/barad-dur/d/malik/jshi/'; | ||
2 | %I = gifread([image_dir,'tape9/t9a1_L.40.gif']); | ||
3 | I = pgmread('car100x100_0001'); | ||
4 | Io = I; | ||
5 | |||
6 | B = []; | ||
7 | |||
8 | done = 0; | ||
9 | st = 2; | ||
10 | sz = size(I); | ||
11 | while (~done), | ||
12 | w = max(1,round(0.05*size(I,1))); | ||
13 | b = zeros(round(0.5*size(Io)),round(0.5*size(I))); | ||
14 | %J = smooth(I,w); | ||
15 | %I = J(1:st:size(J,1),1:st:size(J,2)); | ||
16 | I = reduce(I); | ||
17 | sz = [sz;size(I)]; | ||
18 | b(1:size(I,1),1:size(I,2)) = I; | ||
19 | disp(int2str(size(I,1))); | ||
20 | |||
21 | B = [B,b]; | ||
22 | |||
23 | if (size(I,1) < 8), | ||
24 | done = 1; | ||
25 | end | ||
26 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/pyramid/startup.m b/SD-VBS/common/toolbox/toolbox_basic/pyramid/startup.m new file mode 100755 index 0000000..f86f9f4 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/pyramid/startup.m | |||
@@ -0,0 +1,5 @@ | |||
1 | home_dir = '/home/nef0/malik/jshi/jshi/matlab/'; | ||
2 | path([home_dir,'toolbox/io'], path) | ||
3 | path([home_dir,'toolbox/filter'],path) | ||
4 | path(path,[home_dir,'vision/vision94/tracking/']) | ||
5 | clear home_dir \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/remap_angle.m b/SD-VBS/common/toolbox/toolbox_basic/remap_angle.m new file mode 100755 index 0000000..09f8cff --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/remap_angle.m | |||
@@ -0,0 +1,4 @@ | |||
1 | function a = remap_angle(theta,min,max) | ||
2 | |||
3 | a = (theta<=min).*(theta+pi) + (theta>=max).*(theta-pi) +... | ||
4 | ((theta>min)&(theta<max)).*theta; \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/spmtimesd.c b/SD-VBS/common/toolbox/toolbox_basic/spmtimesd.c new file mode 100755 index 0000000..a98dc0a --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/spmtimesd.c | |||
@@ -0,0 +1,141 @@ | |||
1 | /*================================================================ | ||
2 | * spmtimesd.c | ||
3 | * This routine computes a sparse matrix times a diagonal matrix | ||
4 | * whose diagonal entries are stored in a full vector. | ||
5 | * | ||
6 | * Examples: | ||
7 | * spmtimesd(m,d,[]) = diag(d) * m, | ||
8 | * spmtimesd(m,[],d) = m * diag(d) | ||
9 | * spmtimesd(m,d1,d2) = diag(d1) * m * diag(d2) | ||
10 | * m could be complex, but d is assumed real | ||
11 | * | ||
12 | * Stella X. Yu's first MEX function, Nov 9, 2001. | ||
13 | |||
14 | % test sequence: | ||
15 | |||
16 | m = 1000; | ||
17 | n = 2000; | ||
18 | a=sparse(rand(m,n)); | ||
19 | d1 = rand(m,1); | ||
20 | d2 = rand(n,1); | ||
21 | tic; b=spmtimesd(a,d1,d2); toc | ||
22 | tic; bb = spdiags(d1,0,m,m) * a * spdiags(d2,0,n,n); toc | ||
23 | e = (bb-b); | ||
24 | max(abs(e(:))) | ||
25 | |||
26 | *=================================================================*/ | ||
27 | |||
28 | # include "mex.h" | ||
29 | |||
30 | void mexFunction( | ||
31 | int nargout, | ||
32 | mxArray *out[], | ||
33 | int nargin, | ||
34 | const mxArray *in[] | ||
35 | ) | ||
36 | { | ||
37 | /* declare variables */ | ||
38 | int i, j, k, m, n, nzmax, cmplx, xm, yn; | ||
39 | int *pir, *pjc, *qir, *qjc; | ||
40 | double *x, *y, *pr, *pi, *qr, *qi; | ||
41 | |||
42 | /* check argument */ | ||
43 | if (nargin != 3) { | ||
44 | mexErrMsgTxt("Three input arguments required"); | ||
45 | } | ||
46 | if (nargout>1) { | ||
47 | mexErrMsgTxt("Too many output arguments."); | ||
48 | } | ||
49 | if (!(mxIsSparse(in[0]))) { | ||
50 | mexErrMsgTxt("Input argument #1 must be of type sparse"); | ||
51 | } | ||
52 | if ( mxIsSparse(in[1]) || mxIsSparse(in[2]) ) { | ||
53 | mexErrMsgTxt("Input argument #2 & #3 must be of type full"); | ||
54 | } | ||
55 | |||
56 | /* computation starts */ | ||
57 | m = mxGetM(in[0]); | ||
58 | n = mxGetN(in[0]); | ||
59 | pr = mxGetPr(in[0]); | ||
60 | pi = mxGetPi(in[0]); | ||
61 | pir = mxGetIr(in[0]); | ||
62 | pjc = mxGetJc(in[0]); | ||
63 | |||
64 | i = mxGetM(in[1]); | ||
65 | j = mxGetN(in[1]); | ||
66 | xm = ((i>j)? i: j); | ||
67 | |||
68 | i = mxGetM(in[2]); | ||
69 | j = mxGetN(in[2]); | ||
70 | yn = ((i>j)? i: j); | ||
71 | |||
72 | if ( xm>0 && xm != m) { | ||
73 | mexErrMsgTxt("Row multiplication dimension mismatch."); | ||
74 | } | ||
75 | if ( yn>0 && yn != n) { | ||
76 | mexErrMsgTxt("Column multiplication dimension mismatch."); | ||
77 | } | ||
78 | |||
79 | |||
80 | nzmax = mxGetNzmax(in[0]); | ||
81 | cmplx = (pi==NULL ? 0 : 1); | ||
82 | out[0] = mxCreateSparse(m,n,nzmax,cmplx); | ||
83 | if (out[0]==NULL) { | ||
84 | mexErrMsgTxt("Not enough space for the output matrix."); | ||
85 | } | ||
86 | |||
87 | qr = mxGetPr(out[0]); | ||
88 | qi = mxGetPi(out[0]); | ||
89 | qir = mxGetIr(out[0]); | ||
90 | qjc = mxGetJc(out[0]); | ||
91 | |||
92 | /* left multiplication */ | ||
93 | x = mxGetPr(in[1]); | ||
94 | if (yn==0) { | ||
95 | for (j=0; j<n; j++) { | ||
96 | qjc[j] = pjc[j]; | ||
97 | for (k=pjc[j]; k<pjc[j+1]; k++) { | ||
98 | i = pir[k]; | ||
99 | qir[k] = i; | ||
100 | qr[k] = x[i] * pr[k]; | ||
101 | if (cmplx) { | ||
102 | qi[k] = x[i] * pi[k]; | ||
103 | } | ||
104 | } | ||
105 | } | ||
106 | qjc[n] = k; | ||
107 | return; | ||
108 | } | ||
109 | |||
110 | /* right multiplication */ | ||
111 | y = mxGetPr(in[2]); | ||
112 | if (xm==0) { | ||
113 | for (j=0; j<n; j++) { | ||
114 | qjc[j] = pjc[j]; | ||
115 | for (k=pjc[j]; k<pjc[j+1]; k++) { | ||
116 | qir[k] = pir[k]; | ||
117 | qr[k] = pr[k] * y[j]; | ||
118 | if (cmplx) { | ||
119 | qi[k] = qi[k] * y[j]; | ||
120 | } | ||
121 | } | ||
122 | } | ||
123 | qjc[n] = k; | ||
124 | return; | ||
125 | } | ||
126 | |||
127 | /* both sides */ | ||
128 | for (j=0; j<n; j++) { | ||
129 | qjc[j] = pjc[j]; | ||
130 | for (k=pjc[j]; k<pjc[j+1]; k++) { | ||
131 | i = pir[k]; | ||
132 | qir[k]= i; | ||
133 | qr[k] = x[i] * pr[k] * y[j]; | ||
134 | if (cmplx) { | ||
135 | qi[k] = x[i] * qi[k] * y[j]; | ||
136 | } | ||
137 | } | ||
138 | qjc[n] = k; | ||
139 | } | ||
140 | |||
141 | } | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/stella/afromncut.m b/SD-VBS/common/toolbox/toolbox_basic/stella/afromncut.m new file mode 100755 index 0000000..ec014d0 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/stella/afromncut.m | |||
@@ -0,0 +1,73 @@ | |||
1 | % function a = afromncut(v,s,d,visimg,no_rep,pixel_loc) | ||
2 | % Input: | ||
3 | % v = eigenvectors of d*a*d, starting from the second. | ||
4 | % (the first is all one over some constant determined by d) | ||
5 | % s = eigenvalues | ||
6 | % d = normalization matrix 1/sqrt(rowsum(abs(a))) | ||
7 | % visimg = 1/0 if each eigenvector is/not 2D (so v is 3D) | ||
8 | % no_rep = 1 (default), affinity has attraction only | ||
9 | % if 1, the first column of v is the second eigenvector | ||
10 | % if 0, the first column of v is the first eigenvector. | ||
11 | % pixel_loc = nx1 matrix, each is a pixel location | ||
12 | % Output: | ||
13 | % a = diag(1/d) * na * diag(1/d); | ||
14 | % If pixel_loc = []; a is returned, if not out of memory | ||
15 | % otherwise, only rows of a at pixel_loc are returned. | ||
16 | % | ||
17 | % This routine is used to estimate the original affinity matrix | ||
18 | % through the first few eigenvectors and its normalization matrix. | ||
19 | |||
20 | % A test sequence includes: | ||
21 | % a = randsym(5); | ||
22 | % [na,d] = normalize(a); | ||
23 | % [v,s] = ncut(a,5); | ||
24 | % v = v(:,2:end); s = s(2:end); | ||
25 | % aa = afromncut(v,s,d); | ||
26 | % max(abs(aa(:) - a(:))) | ||
27 | |||
28 | % Stella X. Yu, 2000. | ||
29 | |||
30 | function a = afromncut(v,s,d,visimg,no_rep,pixel_loc) | ||
31 | |||
32 | [nr,nc,nv] = size(v); | ||
33 | if nargin<4 | isempty(visimg), | ||
34 | visimg = (nv>1); | ||
35 | end | ||
36 | |||
37 | if nargin<5 | isempty(no_rep), | ||
38 | no_rep = 1; | ||
39 | end | ||
40 | |||
41 | if visimg, | ||
42 | nr = nr * nc; | ||
43 | else | ||
44 | nv = nc; | ||
45 | end | ||
46 | |||
47 | if nargin<6 | isempty(pixel_loc), | ||
48 | pixel_loc = 1:nr; | ||
49 | end | ||
50 | |||
51 | % D^(1/2) | ||
52 | d = 1./(d(:)+eps); | ||
53 | |||
54 | % first recover the first eigenvector | ||
55 | if no_rep, | ||
56 | u = (1/norm(d)) + zeros(nr,1); | ||
57 | s = [1;s(:)]; | ||
58 | nv = nv + 1; | ||
59 | else | ||
60 | u = []; | ||
61 | end | ||
62 | |||
63 | % the full set of generalized eigenvectors | ||
64 | v = [u, reshape(v,[nr,nv-no_rep])]; | ||
65 | |||
66 | % This is the real D, row sum | ||
67 | d = d.^2; | ||
68 | |||
69 | % an equivalent way to compute v = diag(d) * v; | ||
70 | v = v .* d(:,ones(nv,1)); % to avoid using a big matrix diag(d) | ||
71 | |||
72 | % synthesis | ||
73 | a = v(pixel_loc,:)*diag(s)*v'; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/stella/dispimg.m b/SD-VBS/common/toolbox/toolbox_basic/stella/dispimg.m new file mode 100755 index 0000000..4e419a0 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/stella/dispimg.m | |||
@@ -0,0 +1,65 @@ | |||
1 | % function dispimg(g,fmt,lgd,cmap) display multiple images in one figure. | ||
2 | % Input: | ||
3 | % g = a cell and fmt is a 1x2 vector specifying the layout. | ||
4 | % lgd = a string cell for the title of each image. | ||
5 | % cmap = the colormap (default is the gray, -1 for the inverted gray). | ||
6 | % ishori = a vector of 1/0 to display real and imag parts horizontally / vertically | ||
7 | |||
8 | % Stella X. Yu, 2000. | ||
9 | |||
10 | function dispimg(g,fmt,lgd,cmap,ishori); | ||
11 | |||
12 | cellg = iscell(g); | ||
13 | if cellg, | ||
14 | num_fig = length(g); | ||
15 | else | ||
16 | num_fig = size(g,3); | ||
17 | end; | ||
18 | |||
19 | if nargin<2 | isempty(fmt), | ||
20 | m = ceil(sqrt(num_fig)); | ||
21 | n = ceil(num_fig / m); | ||
22 | else | ||
23 | m = fmt(1); | ||
24 | n = fmt(2); | ||
25 | end | ||
26 | |||
27 | if nargin<3 | isempty(lgd), | ||
28 | lgd = 1:num_fig; | ||
29 | end | ||
30 | if isnumeric(lgd), | ||
31 | lgd = cellstr(num2str(lgd(:),3)); | ||
32 | end | ||
33 | i = size(lgd); | ||
34 | if i(1)==1, | ||
35 | lgd = [lgd, cell(1,num_fig-i(2))]; | ||
36 | else | ||
37 | lgd = [lgd; cell(num_fig-i(1),1)]; | ||
38 | end | ||
39 | |||
40 | if nargin<5 | isempty(ishori), | ||
41 | ishori = ones(num_fig,1); | ||
42 | end | ||
43 | ishori(end+1:num_fig) = ishori(end); | ||
44 | |||
45 | for k=1:num_fig, | ||
46 | subplot(m,n,k); | ||
47 | if cellg, | ||
48 | showim(g{k},[],ishori(k)); | ||
49 | else | ||
50 | showim(g(:,:,k),[],ishori(k)); | ||
51 | end | ||
52 | title(lgd{k}); | ||
53 | end | ||
54 | |||
55 | if nargin<4 | isempty(cmap), | ||
56 | cmap = gray; | ||
57 | end | ||
58 | if length(cmap)==1, | ||
59 | if cmap==1, | ||
60 | cmap = gray; | ||
61 | else | ||
62 | cmap = flipud(gray); | ||
63 | end | ||
64 | end | ||
65 | colormap(cmap); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/stella/firstncut.m b/SD-VBS/common/toolbox/toolbox_basic/stella/firstncut.m new file mode 100755 index 0000000..a22077d --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/stella/firstncut.m | |||
@@ -0,0 +1,67 @@ | |||
1 | % function [v,s,d] = firstncut(base_name,rec_num) | ||
2 | % Input: | ||
3 | % base_name = image name | ||
4 | % rec_num = parameter record number | ||
5 | % Output: | ||
6 | % v = eigenvectors | ||
7 | % s = eigenvalues | ||
8 | % d = normalization matrix d = 1/sqrt(rowsum(abs(a))) | ||
9 | % Convert Jianbo Shi's Ncut Ccode results from images to matlab matrices. | ||
10 | |||
11 | % Stella X. Yu, 2000. | ||
12 | |||
13 | function [v,s,d] = firstncut(base_name,rec_num); | ||
14 | |||
15 | if nargin<2 | isempty(rec_num), | ||
16 | rec_num = 1; | ||
17 | end | ||
18 | |||
19 | cur_dir = pwd; | ||
20 | globalenvar; | ||
21 | cd(IMAGE_DIR); | ||
22 | cd(base_name); | ||
23 | feval([base_name,'_par']); | ||
24 | j = length(p); | ||
25 | if rec_num>j, | ||
26 | disp(sprintf('parameter record number %d out of range %d, check %s!',rec_num,j,[base_name,'_par.m'])); | ||
27 | Qlabel = []; | ||
28 | v = []; | ||
29 | s = []; | ||
30 | ev_info = []; | ||
31 | return; | ||
32 | end | ||
33 | nv = p(rec_num).num_eigvecs; | ||
34 | no_rep = (p(rec_num).offset<1e-6); | ||
35 | |||
36 | % read the image | ||
37 | cm=sprintf('I = readppm(''%s.ppm'');',base_name); | ||
38 | eval(cm); | ||
39 | |||
40 | % read eigenvectors | ||
41 | base_name_hist = sprintf('%s_%d_IC',base_name,rec_num); | ||
42 | if no_rep, | ||
43 | [v,ev_info] = read_ev_pgm(base_name_hist,1,1,nv); | ||
44 | else | ||
45 | [v,ev_info] = read_ev_pgm2(base_name_hist,1,1,nv); | ||
46 | end | ||
47 | s = ev_info(4,:)'; | ||
48 | |||
49 | % read the normalization matrix | ||
50 | d = readpfmc(sprintf('%s_%d_D_IC.pfm',base_name,rec_num)); | ||
51 | cd(cur_dir); | ||
52 | |||
53 | % D^(1/2) | ||
54 | dd = (1./(d(:)+eps)); | ||
55 | |||
56 | % recover real eigenvectors | ||
57 | for j = 1:nv-no_rep, | ||
58 | vmin = ev_info(1,j); | ||
59 | vmax = ev_info(2,j); | ||
60 | y = v(:,:,j).*((vmax - vmin)/256) + vmin; | ||
61 | %validity check: x = D^(1/2)y should be normalized | ||
62 | x = norm(y(:).*dd); | ||
63 | v(:,:,j) = y./x; | ||
64 | end | ||
65 | |||
66 | dispimg(cat(3,mean(I,3),v),[],[{'image'};cellstr(num2str(s,3))]); | ||
67 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/stella/getfnames.m b/SD-VBS/common/toolbox/toolbox_basic/stella/getfnames.m new file mode 100755 index 0000000..4990451 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/stella/getfnames.m | |||
@@ -0,0 +1,47 @@ | |||
1 | % function [fn,dn] = getfnames(direc,opt) | ||
2 | % Input: | ||
3 | % direc = directory | ||
4 | % opt = wildcat | ||
5 | % Output: | ||
6 | % fn = a cell with all filenames under direc and with opt | ||
7 | % dn = a cell with all directory names under direc and with opt | ||
8 | % For example, getfnames('19990910','*.jpg'); | ||
9 | % Set IS_PC according to your platform in globalenvar.m | ||
10 | |||
11 | % Stella X. Yu, 2000. | ||
12 | |||
13 | function [fn,dn] = getfnames(direc,opt) | ||
14 | |||
15 | if (nargin<1 | isempty(direc)), | ||
16 | direc = '.'; | ||
17 | end | ||
18 | |||
19 | if nargin<2 | isempty(opt), | ||
20 | opt = []; | ||
21 | end | ||
22 | |||
23 | fn = {}; | ||
24 | dn = {}; | ||
25 | |||
26 | cur_dir = pwd; | ||
27 | cd(direc); | ||
28 | s = dir(opt); | ||
29 | if isempty(s), | ||
30 | disp('getfnames: no data'); | ||
31 | return; | ||
32 | end | ||
33 | |||
34 | n = length(s); | ||
35 | i = 1; | ||
36 | j = 1; | ||
37 | for k=1:n, | ||
38 | if s(k).isdir, | ||
39 | dn{j,1} = s(k).name; | ||
40 | j = j + 1; | ||
41 | else | ||
42 | fn{i,1} = s(k).name; | ||
43 | i = i + 1; | ||
44 | end | ||
45 | end | ||
46 | cd(cur_dir) | ||
47 | %[fn{1:n,1}]=deal(s.name); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/stella/getimage2.m b/SD-VBS/common/toolbox/toolbox_basic/stella/getimage2.m new file mode 100755 index 0000000..945ddd2 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/stella/getimage2.m | |||
@@ -0,0 +1,46 @@ | |||
1 | % function f = getimage2(imagefile) returns a normalized intensity image. | ||
2 | % If the file postfix is not given, then I will search any possible image file | ||
3 | % under the IMAGE_DIR. | ||
4 | |||
5 | % Stella X. Yu, March 1999 | ||
6 | |||
7 | function f = getimage2(imagefile) | ||
8 | |||
9 | if exist(imagefile)==2, | ||
10 | g = {imagefile}; | ||
11 | else | ||
12 | g = {}; | ||
13 | end | ||
14 | globalenvar; | ||
15 | g = [g; getfnames(IMAGE_DIR,[imagefile,'.*'])]; | ||
16 | |||
17 | j = 1; | ||
18 | for i=1:length(g), | ||
19 | k = findstr(g{i},'.'); | ||
20 | gp = g{i}(k(end)+1:end); | ||
21 | if strcmp(gp,'ppm'), | ||
22 | f = double(readppm(g{i})); | ||
23 | j = 0; | ||
24 | elseif sum(strcmp(gp,{'jpg','tif','jpeg','tiff','bmp','png','hdf','pcx','xwd'}))>0, | ||
25 | f = double(imread(g{i})); | ||
26 | j = 0; | ||
27 | end | ||
28 | if j==0, | ||
29 | disp(sprintf('This is an image read from %s under %s',g{i},IMAGE_DIR)); | ||
30 | break; | ||
31 | end | ||
32 | end | ||
33 | if j, | ||
34 | f = []; | ||
35 | disp('Image not found'); | ||
36 | return; | ||
37 | end | ||
38 | |||
39 | if size(f,3)>1, | ||
40 | %f = sum(f,3)./3; | ||
41 | f = rgb2ntsc(f); | ||
42 | f = f(:,:,1); | ||
43 | end | ||
44 | minf = min(f(:)); | ||
45 | maxf = max(f(:)); | ||
46 | f = (f - minf) ./ (maxf - minf); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/stella/globalenvar.m b/SD-VBS/common/toolbox/toolbox_basic/stella/globalenvar.m new file mode 100755 index 0000000..1e61b61 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/stella/globalenvar.m | |||
@@ -0,0 +1,6 @@ | |||
1 | % globalenvar | ||
2 | |||
3 | HOME_DIR = '/hid/jshi/Research/walking/stella'; | ||
4 | IMAGE_DIR = '/hid/jshi/test_images'; | ||
5 | C_DIR = '/hid/jshi/Research/Ncut_code_C'; | ||
6 | IS_PC = 0; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/stella/jshincut.m b/SD-VBS/common/toolbox/toolbox_basic/stella/jshincut.m new file mode 100755 index 0000000..d0f11cb --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/stella/jshincut.m | |||
@@ -0,0 +1,94 @@ | |||
1 | % function [par, rec_num] = jshincut(par,image_dir) | ||
2 | % Input: | ||
3 | % par = a structure with parameters for command_ncut.tex | ||
4 | % image_dir = the directory where the imagefile is stored | ||
5 | % Output: | ||
6 | % par = parameters used | ||
7 | % rec_num = record number in the NCut database | ||
8 | % Jianbo Shi's ncut_IC is applied to the image | ||
9 | % (If there is no .ppm format for the named image, | ||
10 | % conversion from related files would be attempted.) | ||
11 | % Results are organized according to the parameters. | ||
12 | % Example: jshincut('240018s'); | ||
13 | % See also: jshincutdefpar; ncutcheckin | ||
14 | % Set IS_PC according to your platform in globalenvar.m | ||
15 | |||
16 | % Stella X. Yu, 2000. | ||
17 | |||
18 | function [par,rec_num] = jshincut(par,image_dir) | ||
19 | |||
20 | rec = jshincutdefpar; | ||
21 | |||
22 | fields = fieldnames(rec); | ||
23 | nf = length(fields); | ||
24 | |||
25 | if ischar(par), | ||
26 | imagename = par; | ||
27 | par = rec; | ||
28 | par.fname_base = imagename; | ||
29 | end | ||
30 | |||
31 | globalenvar; | ||
32 | |||
33 | if nargin<2 | isempty(image_dir), | ||
34 | image_dir = IMAGE_DIR; | ||
35 | end | ||
36 | |||
37 | imagename = getfield(par,fields{1}); | ||
38 | for i=2:nf, | ||
39 | t = getfield(par,fields{i}); | ||
40 | if isempty(t), | ||
41 | par = setfield(par,fields{i},getfield(rec,fields{i})); | ||
42 | end | ||
43 | end | ||
44 | |||
45 | % dir and filename | ||
46 | catchar = {'/','\'}; | ||
47 | catchar = catchar{IS_PC+1}; | ||
48 | |||
49 | % first check if there is a ppm file for this image | ||
50 | if not(exist([image_dir,catchar,imagename,'.ppm'])), | ||
51 | j = getfnames(image_dir,[imagename,'.*']); | ||
52 | if isempty(j), | ||
53 | disp('Image not found.'); | ||
54 | return; | ||
55 | end | ||
56 | k = 0; | ||
57 | for i=1:length(j), | ||
58 | k = k + not(isempty(im2ppm(j{i},image_dir))); | ||
59 | if k==1, | ||
60 | disp(sprintf('%s -> %s.ppm succeeded.',j{i},imagename)); | ||
61 | break; | ||
62 | end | ||
63 | end | ||
64 | if k==0, | ||
65 | disp('Sorry. Attempt to convert your named image into ppm format failed.'); | ||
66 | return; | ||
67 | end | ||
68 | end | ||
69 | |||
70 | cd(C_DIR); | ||
71 | |||
72 | % generate command_ncut.tex file | ||
73 | fn = 'command_ncut.tex'; | ||
74 | fid = fopen(fn,'w'); | ||
75 | fprintf(fid,'%21s\t%s%c%s\n',fields{1},image_dir,catchar,imagename); | ||
76 | for i=2:nf, | ||
77 | t = getfield(par,fields{i}); | ||
78 | if isnumeric(t), | ||
79 | t = num2str(t); | ||
80 | end | ||
81 | fprintf(fid,['%21s\t%s\n'],fields{i},t); | ||
82 | end | ||
83 | fclose(fid); | ||
84 | %disp('You can check and modify command_ncut.tex before I run ncut_IC on it. Good?');pause(1); | ||
85 | |||
86 | % run ncut_IC | ||
87 | unix(['.',catchar,'ncut_IC']); | ||
88 | cd(HOME_DIR); | ||
89 | |||
90 | % check in | ||
91 | copyfile([C_DIR,catchar,fn],[image_dir,catchar,fn]); | ||
92 | rec_num = ncutcheckin(fn,image_dir,image_dir); | ||
93 | %delete([image_dir,catchar,imagename,'.ppm']); | ||
94 | %delete([image_dir,catchar,fn]); | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/stella/jshincutdefpar.m b/SD-VBS/common/toolbox/toolbox_basic/stella/jshincutdefpar.m new file mode 100755 index 0000000..4f07192 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/stella/jshincutdefpar.m | |||
@@ -0,0 +1,20 @@ | |||
1 | % function rec = jshincutdefpar; | ||
2 | % default parameter setting for Jianbo Shi's NCut C codes | ||
3 | |||
4 | % Stella X. Yu, 2000. | ||
5 | |||
6 | function rec = jshincutdefpar; | ||
7 | |||
8 | rec.fname_base = '240018s'; | ||
9 | rec.fname_ext = 'ppm'; | ||
10 | rec.num_eigvecs = 15; | ||
11 | rec.spatial_neighborhood_x=20; | ||
12 | rec.sigma_x= 10; | ||
13 | rec.sig_I= -0.16; | ||
14 | rec.sig_IC= 0.01; | ||
15 | rec.hr= 2; | ||
16 | rec.eig_blk_sze= 3; | ||
17 | rec.power_D= 1; | ||
18 | rec.offset = 0.0; | ||
19 | rec.sig_filter = 1.0; | ||
20 | rec.elong_filter = 3.0; | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/stella/ncutcheckin.m b/SD-VBS/common/toolbox/toolbox_basic/stella/ncutcheckin.m new file mode 100755 index 0000000..cd82ee5 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/stella/ncutcheckin.m | |||
@@ -0,0 +1,136 @@ | |||
1 | % function rec_num = ncutcheckin(fn,sdir,tdir) | ||
2 | % Input: | ||
3 | % fn = parameter file name, default = 'command_ncut.tex' | ||
4 | % sdir = source dir for fn as well as data files | ||
5 | % tdir = target dir to check in, both default = IMAGE_DIR | ||
6 | % Output: | ||
7 | % rec_num = the number of current parameter records | ||
8 | % The imagefile_par.m is updated if fn contains a new | ||
9 | % parameter set. Data files are tagged and copied over to | ||
10 | % a subdir under tdir. | ||
11 | % Example: ncutcheckin; | ||
12 | % Set IS_PC, IMAGE_DIR according to your platform in globalenvar.m | ||
13 | |||
14 | % Stella X. Yu, 2000. | ||
15 | |||
16 | function rec_num = ncutcheckin(fn,sdir,tdir) | ||
17 | |||
18 | globalenvar; | ||
19 | |||
20 | cur_dir = pwd; | ||
21 | |||
22 | if nargin<1 | isempty(fn), | ||
23 | fn = 'command_ncut.tex'; | ||
24 | end | ||
25 | |||
26 | if nargin<2 | isempty(sdir), | ||
27 | sdir = IMAGE_DIR; | ||
28 | end | ||
29 | |||
30 | if nargin<3 | isempty(tdir), | ||
31 | tdir = IMAGE_DIR; | ||
32 | end | ||
33 | |||
34 | rec = jshincutdefpar; | ||
35 | |||
36 | % first, generate a parameter record from fn | ||
37 | cd(sdir); | ||
38 | [names,values] = textread(fn,'%s %s','commentstyle','shell'); | ||
39 | n = length(names); | ||
40 | s = rec; | ||
41 | for i=1:n, | ||
42 | j = str2num(values{i}); | ||
43 | if isempty(j), | ||
44 | s = setfield(s,names{i},values{i}); | ||
45 | else | ||
46 | s = setfield(s,names{i},j); | ||
47 | end | ||
48 | end | ||
49 | cd(cur_dir); | ||
50 | |||
51 | % special care to extract the image file name | ||
52 | imagename = getfield(s,names{1}); | ||
53 | catchar = {'/','\'}; | ||
54 | catchar = catchar{IS_PC + 1}; | ||
55 | k = max([0,findstr(imagename,catchar)]); | ||
56 | imagename = imagename(k+1:end); | ||
57 | s = setfield(s,names{1},imagename); | ||
58 | |||
59 | % second, check if the target dir contains a profile for the image | ||
60 | cd(tdir); | ||
61 | if not(exist(imagename,'dir')), | ||
62 | mkdir(imagename); | ||
63 | cd(cur_dir); | ||
64 | j = [catchar,imagename,'.',getfield(s,names{2})]; | ||
65 | copyfile([sdir,j],[tdir,catchar,imagename,j]); | ||
66 | cd(tdir); | ||
67 | end | ||
68 | cd(imagename); | ||
69 | j = [imagename,'_par']; | ||
70 | if not(exist(j)), | ||
71 | rec_num = 1; | ||
72 | p = s; | ||
73 | else | ||
74 | % load par file | ||
75 | feval(j); | ||
76 | rec_num = length(p); | ||
77 | i = 1; | ||
78 | while (i<=rec_num), | ||
79 | k = 0; | ||
80 | for j=1:n, | ||
81 | k = k + sum(getfield(s,names{j})-getfield(p(i),names{j})); | ||
82 | end | ||
83 | if k==0, | ||
84 | if not(isempty(input(['Data already existed as record # ',num2str(i),... | ||
85 | '\nPress any non-return key to Overwrite'],'s'))), | ||
86 | break; | ||
87 | else | ||
88 | rec_num = i; % have checked in already, no update | ||
89 | cd(cur_dir); | ||
90 | return; | ||
91 | end | ||
92 | else | ||
93 | i = i + 1; | ||
94 | end | ||
95 | end | ||
96 | rec_num = i; % new parameter setting | ||
97 | p(rec_num)=s; | ||
98 | end | ||
99 | tdir = [tdir,catchar,imagename]; | ||
100 | cd(cur_dir); | ||
101 | |||
102 | % third, check in data files | ||
103 | % leave .ppm and _edgecon, _phase files | ||
104 | % if not(exist([tdir,catchar,imagename,'.ppm'])), | ||
105 | % copyfile([sdir,catchar,imagename,'.ppm'],[tdir,catchar,imagename,'.ppm']); | ||
106 | % end | ||
107 | |||
108 | % IC files only | ||
109 | dn = getfnames(sdir,[imagename,'*_IC*.*']); | ||
110 | header = sprintf('%s%c%s_%d_',tdir,catchar,imagename,rec_num); | ||
111 | j = length(imagename)+2; | ||
112 | k = length(dn); | ||
113 | for i=1:k, | ||
114 | copyfile([sdir,catchar,dn{i}],[header,dn{i}(j:end)]); | ||
115 | delete([sdir,catchar,dn{i}]); | ||
116 | end | ||
117 | disp(sprintf('%d files checked in as record #%d',k,rec_num)); | ||
118 | |||
119 | |||
120 | % finally, update parameter file | ||
121 | cd(tdir); | ||
122 | fid = fopen([imagename,'_par.m'],'w'); | ||
123 | fprintf(fid,'%% Last checked in at %s\n\n',datestr(now)); | ||
124 | for i=1:rec_num, | ||
125 | for j=1:n, | ||
126 | k = getfield(p(i),names{j}); | ||
127 | if ischar(k), | ||
128 | fprintf(fid,'p(%d).%s=\''%s\'';\n',i,names{j},k); | ||
129 | else | ||
130 | fprintf(fid,'p(%d).%s=%s;\n',i,names{j},num2str(k)); | ||
131 | end | ||
132 | end | ||
133 | fprintf(fid,'\n'); | ||
134 | end | ||
135 | fclose(fid); | ||
136 | cd(cur_dir); \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/stella/openfigure.m b/SD-VBS/common/toolbox/toolbox_basic/stella/openfigure.m new file mode 100755 index 0000000..e677014 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/stella/openfigure.m | |||
@@ -0,0 +1,52 @@ | |||
1 | % function openfigure(m,n,caption,isnew) | ||
2 | function h = openfigure(m,n,caption,isnew) | ||
3 | |||
4 | if nargin<3, | ||
5 | caption = ' '; | ||
6 | end | ||
7 | |||
8 | if nargin<4, | ||
9 | isnew = 1; | ||
10 | end | ||
11 | |||
12 | if (m<=0 | n<=0) | ||
13 | return; | ||
14 | end | ||
15 | |||
16 | if isnew, | ||
17 | h = figure; colormap(gray); | ||
18 | else | ||
19 | h = gcf; | ||
20 | end | ||
21 | clf | ||
22 | |||
23 | subplot('position',[0,0,0.1,0.1]); axis off; | ||
24 | text(0.1,0.15,sprintf('S. X. Yu, %s',date),'FontSize',8); | ||
25 | |||
26 | subplot('position',[0,0.96,0.1,0.1]); axis off; | ||
27 | text(0.1,0.15,caption,'FontSize',8); | ||
28 | |||
29 | subplot(m,n,1); | ||
30 | %return | ||
31 | |||
32 | if (m==1 & n==1), | ||
33 | return; | ||
34 | end | ||
35 | |||
36 | %set(gcf,'PaperPosition',[0.25, 8, 8,2.5*m]); | ||
37 | % set(gcf,'PaperPosition',[0.25,0.25,8,10.5]); | ||
38 | %return | ||
39 | |||
40 | if (m<=n), | ||
41 | set(gcf,'PaperOrientation','landscape','PaperPosition',[0.25,0.25,10.5,8]); | ||
42 | else | ||
43 | set(gcf,'PaperPosition',[0.25,0.25,8,10.5]); | ||
44 | end | ||
45 | |||
46 | % comment on PaperPosition | ||
47 | % [a,b,c,d] | ||
48 | % (a,b) is the coordinate of the lower-left corner of the figure | ||
49 | % (a,b) = (0,0) is the lower-left corner of the paper | ||
50 | % (c,d) is the coordinate of the upper-right corner of the figure relative to the lower-left corner of the figure | ||
51 | % Therefore, c>=a, d>=b | ||
52 | % Full paper position would be [0,0,8.5,11] in inches | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/stella/showim.m b/SD-VBS/common/toolbox/toolbox_basic/stella/showim.m new file mode 100755 index 0000000..10db297 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/stella/showim.m | |||
@@ -0,0 +1,36 @@ | |||
1 | % function showim(f,cmap) display real or complex image. | ||
2 | % When it is complex, the real part and imaginary part | ||
3 | % are displayed as [real,imag] in one image. | ||
4 | % cmap is the colormap. default = gray, -1 = inverted gray. | ||
5 | |||
6 | % Stella X. Yu, 2000. | ||
7 | |||
8 | function showim(f,cmap,ishori) | ||
9 | |||
10 | if not(isreal(f)), | ||
11 | i = [real(f(:)); imag(f(:))]; | ||
12 | j = [min(i), max(i)]; | ||
13 | [nr,nc] = size(f); | ||
14 | if nargin<3 | isempty(ishori), | ||
15 | ishori = nr>nc; | ||
16 | end | ||
17 | if ishori, | ||
18 | i = zeros(nr,1); | ||
19 | f = [real(f), [i+j(1),i+j(2)], imag(f)]; | ||
20 | else | ||
21 | i = zeros(1,nc); | ||
22 | f = [real(f); [i+j(1);i+j(2)]; imag(f)]; | ||
23 | end | ||
24 | end | ||
25 | imagesc(f); axis off; axis image; | ||
26 | |||
27 | if nargin<2 | isempty(cmap), | ||
28 | return; | ||
29 | end | ||
30 | |||
31 | if cmap==1, | ||
32 | cmap = gray; | ||
33 | elseif cmap==-1, | ||
34 | cmap = flipud(gray); | ||
35 | end | ||
36 | colormap(cmap); \ No newline at end of file | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/stella/showncut.m b/SD-VBS/common/toolbox/toolbox_basic/stella/showncut.m new file mode 100755 index 0000000..b1fe1f4 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/stella/showncut.m | |||
@@ -0,0 +1,92 @@ | |||
1 | % function [g,lgd,v,s,dd] = showncut(fn,rec_num) | ||
2 | % Input: | ||
3 | % fn = file / image name | ||
4 | % rec_num = Ncut record number | ||
5 | % Output: | ||
6 | % g = a cell contains 1D, 2D and 3D embeddings | ||
7 | % lgd = legend for g | ||
8 | % v = eigenvectors | ||
9 | % s = eigenvalues | ||
10 | % dd = normalization matrix = 1/sqrt(rowsum(abs(a))) | ||
11 | % an image is displayed | ||
12 | |||
13 | function [g,lgd,v,s,dd] = showncut(fn,rec_num) | ||
14 | |||
15 | globalenvar; cd(IMAGE_DIR);cd(fn); feval([fn,'_par']);cd(HOME_DIR); | ||
16 | par = p(rec_num); | ||
17 | no_rep = (par.offset<1e-6); | ||
18 | |||
19 | [v,s,dd] = firstncut(fn,rec_num); | ||
20 | [m,n,nc] = size(v); | ||
21 | |||
22 | % generate images for display | ||
23 | nr = 5; | ||
24 | num_plots = nc * nr; | ||
25 | g = cell(num_plots,1); | ||
26 | lgd = g; | ||
27 | names = {'r','\theta','\phi'}; | ||
28 | x = cell(3,1); | ||
29 | for j=1:nc, | ||
30 | g{j} = v(:,:,j); | ||
31 | lgd{j} = sprintf('%s_{%d} = %1.2f','\lambda', j+no_rep, s(j)); | ||
32 | |||
33 | if j<nc, | ||
34 | [x{2},x{1}] = cart2pol(v(:,:,j),v(:,:,j+1)); | ||
35 | k = j; | ||
36 | for t=1:2, | ||
37 | k = k + nc; | ||
38 | g{k} = x{t}; | ||
39 | lgd{k} = sprintf('%s_{%d,%d}',names{t},j+[0:1]+no_rep); | ||
40 | end | ||
41 | |||
42 | if j<nc-1, | ||
43 | [x{2},x{3},x{1}] = cart2sph(v(:,:,j),v(:,:,j+1),v(:,:,j+2)); | ||
44 | for t=[1,3], % theta must be the same as 2D embedding, so ignore it | ||
45 | k = k + nc; | ||
46 | g{k} = x{t}; | ||
47 | lgd{k} = sprintf('%s_{%d,%d,%d}',names{t},j+[0:2]+no_rep); | ||
48 | end | ||
49 | end | ||
50 | end | ||
51 | end | ||
52 | |||
53 | % fill in slots by image f and affinity pattern | ||
54 | j = nc + nc; g{j} = getimage2(fn); lgd{j} = sprintf('%d x %d image',m,n); | ||
55 | j = nr * nc; g{j} = readpcm([fn,'_phase.pfm']); lgd{j} = 'phase'; | ||
56 | j = j - 1; g{j} = exp(-(readpfmc([fn,'_edgecon.pfm'])/(255*par.sig_IC)).^2); lgd{j} = 'IC'; | ||
57 | |||
58 | i = round(m*[1;3]./4); | ||
59 | %i = i([1,1,2,2]); | ||
60 | j = round(n*[1;3]./4); | ||
61 | %j = j([1,2,1,2]); | ||
62 | k = m * (j-1) + i; | ||
63 | |||
64 | a = afromncut(v,s,dd,1,no_rep,k); | ||
65 | |||
66 | y = [4*nc-1, 4*nc, 5*nc-1, 5*nc, 6*nc-1, 6*nc]; | ||
67 | for t=1:length(k), | ||
68 | g{y(t)} = reshape(a(t,:),[m,n]); | ||
69 | lgd{y(t)} = sprintf('a at (%d,%d)',i(t),j(t)); | ||
70 | end | ||
71 | |||
72 | % find parameters | ||
73 | fg_title = sprintf('%s: %s=%d, %s=%d, %s=%3.2f, %s=%3.2f',... | ||
74 | par.fname_base,... | ||
75 | 'r_x', par.spatial_neighborhood_x,... | ||
76 | '\sigma_x',par.sigma_x,... | ||
77 | '\sigma_{IC}',par.sig_IC,... | ||
78 | 'repulsion',par.offset); | ||
79 | |||
80 | openfigure(nr,nc,fg_title,0); | ||
81 | dispimg(g,[nr,nc],lgd); | ||
82 | |||
83 | % fix | ||
84 | subplot(nr,nc,nc*3); | ||
85 | plot(s,'ro'); title('\lambda'); | ||
86 | axis square; axis tight; set(gca,'XTick',[]); | ||
87 | for t=1:length(k), | ||
88 | subplot(nr,nc,y(t)); | ||
89 | hold on; | ||
90 | text(j(t),i(t),'+'); | ||
91 | end | ||
92 | hold off | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/stella/startup.m b/SD-VBS/common/toolbox/toolbox_basic/stella/startup.m new file mode 100755 index 0000000..262429a --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/stella/startup.m | |||
@@ -0,0 +1,18 @@ | |||
1 | globalenvar; | ||
2 | |||
3 | addpath(IMAGE_DIR); | ||
4 | |||
5 | addpath(HOME_DIR); | ||
6 | |||
7 | path(path,['/hid/jshi/Research/walking']); | ||
8 | |||
9 | tb_dir = ['/hid/jshi/matlab/toolbox/']; | ||
10 | |||
11 | path(path,[tb_dir,'io']); | ||
12 | path(path,[tb_dir,'filter']); | ||
13 | path(path,[tb_dir,'filter_hist']); | ||
14 | path(path,[tb_dir,'disp']); | ||
15 | path(path,[tb_dir,'common']); | ||
16 | path(path,[tb_dir,'textons']); | ||
17 | path(path,[tb_dir,'pyramid']); | ||
18 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/stella/test_ncutm.m b/SD-VBS/common/toolbox/toolbox_basic/stella/test_ncutm.m new file mode 100755 index 0000000..c9b46ab --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/stella/test_ncutm.m | |||
@@ -0,0 +1,38 @@ | |||
1 | fn = 'walk1'; | ||
2 | |||
3 | repulsion_test = 1; | ||
4 | |||
5 | if 1, | ||
6 | f = getimage2(fn); | ||
7 | par = jshincutdefpar; | ||
8 | par.fname_base = fn; | ||
9 | par.spatial_neighborhood_x = 10; | ||
10 | par.sigma_x = 3 * par.spatial_neighborhood_x; | ||
11 | par.sig_IC = 0.03; | ||
12 | par.num_eigvecs = 10; | ||
13 | par.offset = 0.00; | ||
14 | par.sig_filter = 1.0; | ||
15 | par.elong_filter = 3.0; | ||
16 | [par,rec_num] = jshincut(par); | ||
17 | [g,lgd,v,s,dd] = showncut(fn,rec_num); | ||
18 | |||
19 | if repulsion_test, | ||
20 | par.offset = 0.1; | ||
21 | [par,rec_num] = jshincut(par); | ||
22 | figure; | ||
23 | [g,lgd,v,s,dd] = showncut(fn,rec_num); | ||
24 | end | ||
25 | end | ||
26 | |||
27 | if 0, | ||
28 | x = v(:,:,1); | ||
29 | y = v(:,:,2); | ||
30 | figure; | ||
31 | subplot(2,1,1); plot(x(:),y(:),'ro'); | ||
32 | r = sqrt(x.^2+y.^2); | ||
33 | x = x./r; | ||
34 | y = y./r; | ||
35 | subplot(2,1,2); im([x,y]*[x,y]'); | ||
36 | % mask = (x>0) & y>0; | ||
37 | % showmask(f,mask); | ||
38 | end | ||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/tars/TOOLBOX_calib.tar b/SD-VBS/common/toolbox/toolbox_basic/tars/TOOLBOX_calib.tar new file mode 100755 index 0000000..bb418a5 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/tars/TOOLBOX_calib.tar | |||
Binary files differ | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/textons/dist2.m b/SD-VBS/common/toolbox/toolbox_basic/textons/dist2.m new file mode 100755 index 0000000..f2d93e1 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/textons/dist2.m | |||
@@ -0,0 +1,27 @@ | |||
1 | function n2 = dist2(x, c) | ||
2 | %DIST2 Calculates squared distance between two sets of points. | ||
3 | % | ||
4 | % Description | ||
5 | % D = DIST2(X, C) takes two matrices of vectors and calculates the | ||
6 | % squared Euclidean distance between them. Both matrices must be of | ||
7 | % the same column dimension. If X has M rows and N columns, and C has | ||
8 | % L rows and N columns, then the result has M rows and L columns. The | ||
9 | % I, Jth entry is the squared distance from the Ith row of X to the | ||
10 | % Jth row of C. | ||
11 | % | ||
12 | % See also | ||
13 | % GMMACTIV, KMEANS, RBFFWD | ||
14 | % | ||
15 | |||
16 | % Copyright (c) Christopher M Bishop, Ian T Nabney (1996, 1997) | ||
17 | |||
18 | [ndata, dimx] = size(x); | ||
19 | [ncentres, dimc] = size(c); | ||
20 | if dimx ~= dimc | ||
21 | error('Data dimension does not match dimension of centres') | ||
22 | end | ||
23 | |||
24 | n2 = (ones(ncentres, 1) * sum((x.^2)', 1))' + ... | ||
25 | ones(ndata, 1) * sum((c.^2)',1) - ... | ||
26 | 2.*(x*(c')); | ||
27 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/textons/find_textons.m b/SD-VBS/common/toolbox/toolbox_basic/textons/find_textons.m new file mode 100755 index 0000000..e7fa4b0 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/textons/find_textons.m | |||
@@ -0,0 +1,46 @@ | |||
1 | function [centers,label,post,d2]=find_textons(FIw,ncenters,centers_in,n_iter); | ||
2 | % [centers,label,post,d2]=find_textons(FIw,ncenters,centers_in,n_iter); | ||
3 | % | ||
4 | % find textons using kmeans for windowed portion FIw of filtered image | ||
5 | % | ||
6 | % to start with centers pulled randomly from image, set centers_in=[] | ||
7 | |||
8 | % define number of textons | ||
9 | %ncenters=25; | ||
10 | |||
11 | [N1,N2,N3]=size(FIw); | ||
12 | % reshape filtered image stack into a long array of feature vectors | ||
13 | fv=reshape(FIw,N1*N2,N3); | ||
14 | % (each row is a feature vector) | ||
15 | |||
16 | %centers=.01^2*randn(ncenters,N3); | ||
17 | % take centers randomly from within image | ||
18 | if isempty(centers_in) | ||
19 | rndnum=1+floor(N1*N2*rand(1,ncenters)); | ||
20 | centers_in=fv(rndnum,:); | ||
21 | end | ||
22 | |||
23 | options = foptions; | ||
24 | options(1)=1; % Prints out error values. | ||
25 | options(5) = 0; | ||
26 | if nargin<4 | ||
27 | n_iter=15; | ||
28 | end | ||
29 | options(14) = n_iter; % Number of iterations. | ||
30 | |||
31 | [centers,options,d2,post]=kmeans2(centers_in,fv,options); | ||
32 | |||
33 | % reshuffle the centers so that the one closest to the origin | ||
34 | % (featureless) comes last | ||
35 | norms=sum(centers.^2,2); | ||
36 | [sortval,sortind]=sort(-norms); | ||
37 | centers=centers(sortind,:); | ||
38 | d2=reshape(d2,N1,N2,ncenters); | ||
39 | post=reshape(post,N1,N2,ncenters); | ||
40 | d2=d2(:,:,sortind); | ||
41 | post=post(:,:,sortind); | ||
42 | |||
43 | |||
44 | % retrieve cluster number assigned to each feature vector | ||
45 | [minval,label]=min(d2,[],3); | ||
46 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/textons/find_textons1.m b/SD-VBS/common/toolbox/toolbox_basic/textons/find_textons1.m new file mode 100755 index 0000000..b192015 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/textons/find_textons1.m | |||
@@ -0,0 +1,37 @@ | |||
1 | function [centers,label,post,d2]=find_textons(fv,ncenters,centers_in,n_iter); | ||
2 | % [centers,label,post,d2]=find_textons(FIw,ncenters,centers_in,n_iter); | ||
3 | % | ||
4 | % find textons using kmeans for windowed portion FIw of filtered image | ||
5 | % | ||
6 | % to start with centers pulled randomly from image, set centers_in=[] | ||
7 | |||
8 | [N1,N2] =size(fv); | ||
9 | |||
10 | % take centers randomly from within image | ||
11 | if isempty(centers_in) | ||
12 | rndnum=1+floor(N1*rand(1,ncenters)); | ||
13 | centers_in=fv(rndnum,:); | ||
14 | end | ||
15 | |||
16 | options = foptions; | ||
17 | options(1)=1; % Prints out error values. | ||
18 | options(5) = 0; | ||
19 | if nargin<4 | ||
20 | n_iter=15; | ||
21 | end | ||
22 | options(14) = n_iter; % Number of iterations. | ||
23 | |||
24 | [centers,options,d2,post]=kmeans2(centers_in,fv,options); | ||
25 | |||
26 | |||
27 | % retrieve cluster number assigned to each feature vector | ||
28 | [minval,label]=min(d2,[],2); | ||
29 | |||
30 | |||
31 | h = hist(label(:),[1:max(label(:))]); | ||
32 | a = h>0; | ||
33 | a = cumsum(a); | ||
34 | |||
35 | [nr,nc] = size(label); | ||
36 | label = reshape(a(label(:)),nr,nc); | ||
37 | |||
diff --git a/SD-VBS/common/toolbox/toolbox_basic/textons/kmeans2.m b/SD-VBS/common/toolbox/toolbox_basic/textons/kmeans2.m new file mode 100755 index 0000000..0bd87b2 --- /dev/null +++ b/SD-VBS/common/toolbox/toolbox_basic/textons/kmeans2.m | |||
@@ -0,0 +1,127 @@ | |||
1 | function [centres, options, d2, post, errlog] = kmeans2(centres, data, options) | ||
2 | %KMEANS Trains a k means cluster model. | ||
3 | % | ||
4 | % Description | ||
5 | % CENTRES = KMEANS(CENTRES, DATA, OPTIONS) uses the batch K-means | ||
6 | % algorithm to set the centres of a cluster model. The matrix DATA | ||
7 | % represents the data which is being clustered, with each row | ||
8 | % corresponding to a vector. The sum of squares error function is used. | ||
9 | % The point at which a local minimum is achieved is returned as | ||
10 | % CENTRES. The error value at that point is returned in OPTIONS(8). | ||
11 | % | ||
12 | % [CENTRES, OPTIONS, POST, ERRLOG] = KMEANS(CENTRES, DATA, OPTIONS) | ||
13 | % also returns the cluster number (in a one-of-N encoding) for each | ||
14 | % data point in POST and a log of the error values after each cycle in | ||
15 | % ERRLOG. The optional parameters have the following | ||
16 | % interpretations. | ||
17 | % | ||
18 | % OPTIONS(1) is set to 1 to display error values; also logs error | ||
19 | % values in the return argument ERRLOG. If OPTIONS(1) is set to 0, then | ||
20 | % only warning messages are displayed. If OPTIONS(1) is -1, then | ||
21 | % nothing is displayed. | ||
22 | % | ||
23 | % OPTIONS(2) is a measure of the absolute precision required for the | ||
24 | % value of CENTRES at the solution. If the absolute difference between | ||
25 | % the values of CENTRES between two successive steps is less than | ||
26 | % OPTIONS(2), then this condition is satisfied. | ||
27 | % | ||
28 | % OPTIONS(3) is a measure of the precision required of the error | ||
29 | % function at the solution. If the absolute difference between the | ||
30 | % error functions between two successive steps is less than OPTIONS(3), | ||
31 | % then this condition is satisfied. Both this and the previous | ||
32 | % condition must be satisfied for termination. | ||
33 | % | ||
34 | % OPTIONS(14) is the maximum number of iterations; default 100. | ||
35 | % | ||
36 | % See also | ||
37 | % GMMINIT, GMMEM | ||
38 | % | ||
39 | |||
40 | % Copyright (c) Christopher M Bishop, Ian T Nabney (1996, 1997) | ||
41 | |||
42 | [ndata, data_dim] = size(data); | ||
43 | [ncentres, dim] = size(centres); | ||
44 | |||
45 | if dim ~= data_dim | ||
46 | error('Data dimension does not match dimension of centres') | ||
47 | end | ||
48 | |||
49 | if (ncentres > ndata) | ||
50 | error('More centres than data') | ||
51 | end | ||
52 | |||
53 | % Sort out the options | ||
54 | if (options(14)) | ||
55 | niters = options(14); | ||
56 | else | ||
57 | niters = 100; | ||
58 | end | ||
59 | |||
60 | store = 0; | ||
61 | if (nargout > 3) | ||
62 | store = 1; | ||
63 | errlog = zeros(1, niters); | ||
64 | end | ||
65 | |||
66 | % Check if centres and posteriors need to be initialised from data | ||
67 | if (options(5) == 1) | ||
68 | % Do the initialisation | ||
69 | perm = randperm(ndata); | ||
70 | perm = perm(1:ncentres); | ||
71 | |||
72 | % Assign first ncentres (permuted) data points as centres | ||
73 | centres = data(perm, :); | ||
74 | end | ||
75 | % Matrix to make unit vectors easy to construct | ||
76 | id = eye(ncentres); | ||
77 | |||
78 | % Main loop of algorithm | ||
79 | for n = 1:niters | ||
80 | |||
81 | % Save old centres to check for termination | ||
82 | old_centres = centres; | ||
83 | |||
84 | % Calculate posteriors based on existing centres | ||
85 | d2 = dist2(data, centres); | ||
86 | % Assign each point to nearest centre | ||
87 | [minvals, index] = min(d2', [], 1); | ||
88 | post = id(index,:); | ||
89 | |||
90 | num_points = sum(post, 1); | ||
91 | % Adjust the centres based on new posteriors | ||
92 | for j = 1:ncentres | ||
93 | if (num_points(j) > 0) | ||
94 | centres(j,:) = sum(data(find(post(:,j)),:), 1)/num_points(j); | ||
95 | end | ||
96 | end | ||
97 | |||
98 | % Error value is total squared distance from cluster centres | ||
99 | e = sum(minvals); | ||
100 | tmp = sort(minvals); | ||
101 | e95 = sqrt(tmp(round(length(tmp) * 0.95))); | ||
102 | erms = sqrt(e/ndata); | ||
103 | if store | ||
104 | errlog(n) = e; | ||
105 | end | ||
106 | if options(1) > 0 | ||
107 | fprintf(1, ' Cycle %4d RMS Error %11.6f 95-tier Error %11.6f\n', n, erms,e95); | ||
108 | end | ||
109 | |||
110 | if n > 1 | ||
111 | % Test for termination | ||
112 | if max(max(abs(centres - old_centres))) < options(2) & ... | ||
113 | abs(old_e - e) < options(3) | ||
114 | options(8) = e; | ||
115 | return; | ||
116 | end | ||
117 | end | ||
118 | old_e = e; | ||
119 | end | ||
120 | |||
121 | % If we get here, then we haven't terminated in the given number of | ||
122 | % iterations. | ||
123 | options(8) = e; | ||
124 | %if (options(1) >= 0) | ||
125 | % disp('Warning: Maximum number of iterations has been exceeded'); | ||
126 | %end | ||
127 | |||